我有一个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