【发布时间】:2020-03-10 09:46:23
【问题描述】:
假设我有一组包含日期和值的组和子组。
我最终需要的是在窗口 2 中逐月评估值的滚动平均值(使用过去 2 个月评估当前月份的值)。
如果我将数据帧减少两个连续的 groupby,我可以做到这一点:
- 第一个评估每个组的值总和(groupby 组|日期,总和)
- 第二个评估月滚动平均值的方法 group (groupby group|month, transform, rolling)
但这会减少我的数据。
我需要使用转换操作来完成这一切,这样我就可以将我的结果作为原始数据帧上的一列。
让我们看看这个虚拟数据:
values = [100, 100, 200, 200, 300, 300]
dates = ['2017-01-01', '2017-02-01',
'2018-01-01', '2018-02-01',
'2019-01-01', '2019-02-01']
df1 = pd.DataFrame({'date': dates, 'value': values})
df1['subgroup'] = 'subgroup1'
df2 = df1.copy()
df2['subgroup'] = 'subgroup2'
df2['value'] = df2.value *2
df_g1 = pd.concat([df1, df2], axis=0)
df_g1['group'] = 'group1'
df_g2 = df_g1.copy()
df_g2['group'] = 'group2'
df_g2['value'] = df_g2.value *2
df = pd.concat([df_g1, df_g2], axis=0)
df['date'] = pd.to_datetime(df.date)
现在是第一个 groupby 操作:
df_total_by_group = df.groupby(['group', 'date'], as_index=False)[['value']].sum()
df_total_by_group['month'] = df_total_by_group['date'].dt.month
现在滚动的意思是:
def rolling_mean(serie):
return serie.shift(1).rolling(2, min_periods=1).mean()
df_total_by_group['month_rolling_mean_by_group'] = (df_total_by_group
.groupby(['group', 'month'])['value']
.transform(rolling_mean)
)
# display results
df_total_by_group.sort_values(by=['group', 'month'])
我在这里得到了正确的结果, 但我需要它们作为原始数据框中的一列。
我迷路了。有什么建议吗?
【问题讨论】: