我的数据框df
如下所示。
dates = pd.date_range('2000-01-01', '2001-01-01')
df1 = pd.DataFrame({'date':dates, 'value':np.random.normal(size = len(dates)), 'market':'GOLD'})
df2 = pd.DataFrame({'date':dates, 'value':np.random.normal(size = len(dates)), 'market':'SILVER'})
df = pd.concat([df1, df2])
df = df.sort('date')
date market value
0 2000-01-01 GOLD -1.361360
0 2000-01-01 SILVER 0.255830
1 2000-01-02 SILVER 0.196953
1 2000-01-02 GOLD 1.422454
2 2000-01-03 GOLD -0.827672
...
我希望为每个市场添加另一列作为价值的10d移动平均值。
是否有一个简单的df.groupby('market').???
可以实现这一目标?或者我是否必须将工作台转动为宽幅,平滑每根色谱柱,然后再熔化?
答案 0 :(得分:3)
您可以使用groupby/rolling/mean
:
result = (df.set_index('date')
.groupby('market')['value']
.rolling(10).mean()
.unstack('market'))
产量
market GOLD SILVER
date
2000-01-01 NaN NaN
2000-01-02 NaN NaN
2000-01-03 NaN NaN
2000-01-04 NaN NaN
2000-01-05 NaN NaN
2000-01-06 NaN NaN
2000-01-07 NaN NaN
2000-01-08 NaN NaN
2000-01-09 NaN NaN
2000-01-10 0.310077 0.582063
2000-01-11 0.312008 0.752218
2000-01-12 0.151159 0.877230
2000-01-13 0.213611 0.742156
2000-01-14 0.440113 0.614720
2000-01-15 0.551360 0.649967
...
答案 1 :(得分:1)
这是基于@ unutbu的答案,并将结果作为新列添加回原始数据框。
result = df.set_index('date').groupby('market')['value'].rolling(10).mean()
现在如果df
按market
首先然后date
排序,则结果应该是同步的,我们可以只返回值
df.sort_values(['market','date'], inplace = True)
df['value10d_1'] = result.values
但是,如果你像我一样偏执,merge
应该让人高枕无忧,
df = pd.merge(df, result.reset_index().rename(columns = {'value':'value10d_2'}), on = ['market','date'])
df['value10d_1'] - df['value10d_2'] # all 0