不确定我的问题的标题是否正确,请建议编辑
我有以下数据帧:
df_dict={'startDate':
['2015-01-01','2015-01-05','2015-01-18','2015-01-25',
'2015-02-02','2015-02-03','2015-02-04','2015-02-17',
'2015-03-03','2015-03-04','2015-03-07','2015-03-11',
'2015-04-04','2015-04-05','2015-04-17','2015-04-19'],
'price':[200,250,270,240,100,120,130,140,300,310,330,370,400,410,420,440],
'250_index': [1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2]}
df=pd.DataFrame(df_dict)
我需要在我的数据集中找到第一个可用的日期,在本例中是2015-01-01
,然后创建30day
间隔,例如:2015-01-01
,2015-01-31
,2015-03-02
,2015-04-01
,然后对于每个间隔和250_index
组合计算过去的30day
60_day
和90day
平均价格。
得到的数据帧应该如下所示,第一个间隔的过去平均值是0
,因为我们没有关于发生了什么的信息,但是对于第二个间隔2015-01-31
,我们需要根据2015-01-01
和2015-01-31
之间的价格计算past_30_avg
,其他间隔也是如此:
time_interval index past_30_avg past_60_avg past_90_avg
'2015-01-01' 1 0 0 0
2 0 0 0
'2015-01-31' 1 235 0 0
2 245 0 0
'2015-03-02' 1 115 175 0
2 130 187 0
'2015-04-01' 1 315 240 221
2 340 235 238
我正在寻找一种通用的方法,因为它只是我的数据集的一部分。
发布于 2018-06-08 05:20:04
考虑pd.Grouper
的30天平均值(每月聚合),然后考虑使用rolling()
的transform()
60天和90天:
tdf = df.groupby([pd.Grouper(key='startDate', freq='30D', label='right'), '250_index']).mean()\
.reset_index().rename(columns={'price': 'past_30_avg'})
print(tdf)
tdf['past_60_avg'] = tdf.groupby('250_index')['past_30_avg'].transform(lambda x: x.rolling(2).mean())
tdf['past_90_avg'] = tdf.groupby('250_index')['past_30_avg'].transform(lambda x: x.rolling(3).mean())
# startDate 250_index past_30_avg past_60_avg past_90_avg
# 0 2015-01-31 1 235 NaN NaN
# 1 2015-01-31 2 245 NaN NaN
# 2 2015-03-02 1 115 175.0 NaN
# 3 2015-03-02 2 130 187.5 NaN
# 4 2015-04-01 1 315 215.0 221.666667
# 5 2015-04-01 2 340 235.0 238.333333
# 6 2015-05-01 1 410 362.5 280.000000
# 7 2015-05-01 2 425 382.5 298.333333
https://stackoverflow.com/questions/50740435
复制相似问题