我正在尝试创建一个名为
对于每一行: - 过滤DataFrame,只保留与当前行的
使用iterrows方法可以实现,但不具有可扩展性。 您有没有想过以更"向量化"的方式来降低复杂度?
以下是生成类似DataFrame的代码片段:
rolling_median
的列,具体如下:对于每一行: - 过滤DataFrame,只保留与当前行的
Date_A
之前且Category
相同的行
- 对这个过滤后的DataFrame按Date_B
进行排序
- 使用最后N个符合过滤条件的行来计算Value
的中位数。例如,如果N=2,则使用最后2行来估计当前行的平均值使用iterrows方法可以实现,但不具有可扩展性。 您有没有想过以更"向量化"的方式来降低复杂度?
以下是生成类似DataFrame的代码片段:
import pandas as pd
import numpy as np
# Sample DataFrame (replace this with your actual DataFrame)
data = {
'Category': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'],
'Date_A': ['2023-07-08', '2023-07-09', '2023-07-11', '2023-07-12', '2023-07-13', '2023-07-08', '2023-07-09', '2023-07-11', '2023-07-12', '2023-07-13'],
'Date_B': ['2023-07-08', '2023-07-10', '2023-07-12', '2023-07-12', '2023-07-13', '2023-07-08', '2023-07-10', '2023-07-12', '2023-07-12', '2023-07-13'],
'Value': [10, 15, 20, 25, 30, 35, 40, 45, 50, 55]
}
df = pd.DataFrame(data)
# Convert 'Date_A' and 'Date_B' columns to datetime type
df['Date_A'] = pd.to_datetime(df['Date_A'])
df['Date_B'] = pd.to_datetime(df['Date_B'])
df['rolling_mean'] = np.nan
# Last 2 values
N=2
for category in df.Category.unique():
df_cat = df[df.Category==category]
for idx, row in df_cat.iterrows():
rm = df_cat[df_cat.Date_B < row.Date_A][:N].Value.mean()
df.at[idx, 'rolling_mean'] = rm
df
Category Date_A Date_B Value rolling_mean
0 A 2023-07-08 2023-07-08 10 NaN
1 A 2023-07-09 2023-07-10 15 10.0
2 A 2023-07-11 2023-07-12 20 12.5
3 A 2023-07-12 2023-07-12 25 12.5
4 A 2023-07-13 2023-07-13 30 12.5
5 B 2023-07-08 2023-07-08 35 NaN
6 B 2023-07-09 2023-07-10 40 35.0
7 B 2023-07-11 2023-07-12 45 37.5
8 B 2023-07-12 2023-07-12 50 37.5
9 B 2023-07-13 2023-07-13 55 37.5
N
。 - mozwayN
。 - mozwayN
。 - undefined