pandas - 相对于 pandas 中其他 2 列的组,日期列上 4 天的滚动平均值

标签 pandas pandas-groupby window-functions rolling-average

我正在尝试计算以下数据集 4 天的滚动平均值。结果还应根据其他 2 列的组进行计算。

例如:

df_time = pd.DataFrame({'A': [123, 123, 278, 278, 278, 123, 345, 278, 123,278, 278],
                        'B': [1, 2, 2, 2, 2, 1, 3, 2, 1, 2, 2],
                        'C': [0, 4, 2, 0, 4, 5, 3, 2, 1, 3, 2],
                       'D' : [pd.Timestamp('20130101'),
                                pd.Timestamp('20130102'),
                                pd.Timestamp('20130101'),
                                pd.Timestamp('20130102'),
                                pd.Timestamp('20130103'),
                                pd.Timestamp('20130103'),
                                pd.Timestamp('20130104'),
                                pd.Timestamp('20130104'),
                                pd.Timestamp('20130105'),
                                pd.Timestamp('20130106'),
                                pd.Timestamp('20130109')],
                       'rol_avg': [0, 2, 2, 1, 2, 5, 3, 3, 3, 2, 2.5] } )

df_time.sort_values(by='D')

sum_df = df_time.groupby(by=['A', 'B', 'D'])['C'].sum()

rolling_average_series = sum_df.groupby(level=[0, 1]).rolling(4, min_periods=1).mean()

返回

enter image description here

它正在查找 A 列和 B 列过去 4 次出现的滚动平均值。但我需要的是相对于日期列“D”并按列“A”和“B”分组的 4 天的滚动平均值

这里,对于 09-01-2013 的 A=278 和 B=2,我们只有 06-01-2013,它属于 4 天滚动平均值,因此平均值应为 (2+3)/2 = 2.5 我如何实现这个功能? 非常感谢任何帮助

最佳答案

我希望我已经很好地理解了你的问题。您可以在 .rolling() 中使用 on= 指定列,然后指定 window="4D" - 您想要 4 天的滚动窗口:

df_time = df_time.sort_values(by="D")
sum_df = df_time.groupby(by=["A", "B", "D"], as_index=False)["C"].sum()

rolling_average_series = (
    sum_df.groupby(["A", "B"])
    .rolling(on="D", window="4D", min_periods=1)
    .mean()
)

print(rolling_average_series)

打印:

                  D    C
A   B                   
123 1 0  2013-01-01  0.0
      1  2013-01-03  2.5
      2  2013-01-05  3.0
    2 3  2013-01-02  4.0
278 2 4  2013-01-01  2.0
      5  2013-01-02  1.0
      6  2013-01-03  2.0
      7  2013-01-04  2.0
      8  2013-01-06  3.0
      9  2013-01-09  2.5
345 3 10 2013-01-04  3.0

关于pandas - 相对于 pandas 中其他 2 列的组,日期列上 4 天的滚动平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72853895/

相关文章:

python - Pandas 按多列分组并将结果作为新列放入 map 中

mysql - 为什么我不能对 SQL 'rank scores' 使用 dense_rank?

SQL:计算自上次成功以来的天数

sql - 条件超前/滞后函数 PostgreSQL?

python - 当在每一行中需要使用整个数据进行比较时,在 Pandas 中使用矢量化

python - Pandas 选择具有特定列中前 2 个值之一的所有行

python - 在 Python Polars 中获取每个 groupby/apply 的相关性

python - 如何创建一个函数来执行标签编码

python - 使用groupby agg后索引变化

python - 如何在 Pandas 的 groupby 对象中获取组数?