在pandas数据集中为多列创建滚动平均值



我有一个pandas数据集,包含多列数据,如下所示:

code    country_region  date        retail  transit work    res
CA      Canada          2020-02-15   4       3      1        0
CA      Canada          2020-02-16   13      4      0       -2
CA      Canada          2020-02-17  -12     -28    -52       11
CA      Canada          2020-02-18  -1      -1     -1        1
CA      Canada          2020-02-19   1       0      0        0
CA      Canada          2020-02-20   6      -1      1        0
CA      Canada          2020-02-21   2      -1     -3        1
CA      Canada          2020-02-22   8       6      6       -1
CA      Canada          2020-02-23   7      -5      5        6
...
US      United States   2020-02-15   6       3      1        0
US      United States   2020-02-16   13      4      0       -2
...

我的目标是为每个代码/country_region值中的每个数值计算7天的平均值(我已经确认数据中没有遗漏日期(。这在Excel中使用范围平均值会很容易,但不幸的是,我的表中有很多记录。

我还需要首先将日期字段转换为日期对象,因为日期是文本。我可以利用循环来执行此操作,但保留";最后6天";对于每个数字列。我已经看过df.rolling((函数,但很少有使用group_by语句的例子,也很少有使用多列的例子。是否有一种python(即非循环(方式来执行此求和?

编辑:我已使用将日期列转换为正确的日期字段

df['date_fmt'] = pd.to_datetime(df['date']).apply(lambda t: datetime.datetime.fromisoformat(str(t)))
df = df.assign(date=pd.to_datetime(df.date)).set_index('date').groupby(['code','country_region']).rolling('7D').mean().reset_index()
print(df)
code country_region       date    retail   transit       work       res
0    CA         Canada 2020-02-15  4.000000  3.000000   1.000000  0.000000
1    CA         Canada 2020-02-16  8.500000  3.500000   0.500000 -1.000000
2    CA         Canada 2020-02-17  1.666667 -7.000000 -17.000000  3.000000
3    CA         Canada 2020-02-18  1.000000 -5.500000 -13.000000  2.500000
4    CA         Canada 2020-02-19  1.000000 -4.400000 -10.400000  2.000000
5    CA         Canada 2020-02-20  1.833333 -3.833333  -8.500000  1.666667
6    CA         Canada 2020-02-21  1.857143 -3.428571  -7.714286  1.571429
7    CA         Canada 2020-02-22  2.428571 -3.000000  -7.000000  1.428571
8    CA         Canada 2020-02-23  1.571429 -4.285714  -6.285714  2.571429
9    US  United States 2020-02-15  6.000000  3.000000   1.000000  0.000000
10   US  United States 2020-02-16  9.500000  3.500000   0.500000 -1.000000

IIUC,您可以使用panda。DataFrame.rolling for this:

df['date'] = pd.to_datetime(df.date)
df.set_index('date').groupby('code').rolling('7D').mean()

输出:

retail   transit       work       res
code date                                               
CA   2020-02-15  4.000000  3.000000   1.000000  0.000000
2020-02-16  8.500000  3.500000   0.500000 -1.000000
2020-02-17  1.666667 -7.000000 -17.000000  3.000000
2020-02-18  1.000000 -5.500000 -13.000000  2.500000
2020-02-19  1.000000 -4.400000 -10.400000  2.000000
2020-02-20  1.833333 -3.833333  -8.500000  1.666667
2020-02-21  1.857143 -3.428571  -7.714286  1.571429
2020-02-22  2.428571 -3.000000  -7.000000  1.428571
2020-02-23  1.571429 -4.285714  -6.285714  2.571429
US   2020-02-15  6.000000  3.000000   1.000000  0.000000
2020-02-16  9.500000  3.500000   0.500000 -1.000000

最新更新