看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
滚动时间数据分析适用于时间序列数据,例如股票价格、气象数据、传感器数据、经济指标等。它可以帮助识别趋势、季节性模式、周期性变化和异常值,并提供对数据动态性的更全面理解。本例我们用 pandas 来完成按分组进行操作。
我们的源数据如下:
from io import StringIO
import pandas as pd
data = '''
A B C
a 2021-01-01 1
a 2021-01-02 2
a 2021-01-03 3
a 2021-01-04 5
a 2021-01-05 6
a 2021-01-06 10
a 2021-01-07 12
a 2021-01-08 14
a 2021-01-09 12
a 2021-01-10 30
b 2022-01-01 1
b 2022-01-02 2
b 2022-01-03 3
b 2022-01-04 4
b 2022-01-05 5
b 2022-01-06 6
b 2022-01-07 7
b 2022-01-08 8
'''
df = pd.read_csv(StringIO(data), sep=r'\s+')
df
# ...
df = df.astype({'B': 'datetime64[ns]'})
df.dtypes
'''
A object
B datetime64[ns]
C int64
dtype: object
'''
按数据源 A 列分组,目的表 C 列的结果等于数据源 B 列 T+1~T+3 阶段的数据源 C 列的平均值。
由于需要按组来进行操作,我们先对数据分析,然后每个组的 DataFrame 由一个函数来完成。接下来我们来分析这个函数如何写。
在函数中,我们先定义一个时长为一天的时间间隔对象,在 DataFrame 中查询当前时间的 T+1~T+3 数据,筛选完成后再求 C 列的平均值。
根据思路,我们先测试一个单例。先定义一个一天的时间间隔对象:
day = pd.offsets.Day(1)
day
# <Day>
随机取一个固定的时间:
t = df.loc[0, 'B']
t
# Timestamp('2021-01-01 00:00:00')
筛选时间区间的数据:
df[df.B.between(t+day, t+day*3)]
'''
A B C
1 a 2021-01-02 2
2 a 2021-01-03 3
3 a 2021-01-04 5
'''
求 C 列的平均值:
df[df.B.between(t+day, t+day*3)].C.mean()
# 3.3333333333333335
将以上逻辑封装成一个函数:
def func(d: pd.DataFrame) -> pd.Series:
day = pd.offsets.Day(1)
foo = d.apply(lambda x: d[d.B.between(x.B+day, x.B+day*3)].C.mean(), axis=1)
return foo
计算:
d = df.groupby('A', group_keys=False).apply(func).fillna(0)
d
'''
0 3.333333
1 4.666667
2 7.000000
3 9.333333
4 12.000000
5 12.666667
6 18.666667
7 21.000000
8 30.000000
9 0.000000
10 3.000000
11 4.000000
12 5.000000
13 6.000000
14 7.000000
15 7.500000
16 8.000000
17 0.000000
dtype: float64
'''
增加到源数据的列:
df.assign(D=d)
'''
A B C D
0 a 2021-01-01 1 3.333333
1 a 2021-01-02 2 4.666667
2 a 2021-01-03 3 7.000000
3 a 2021-01-04 5 9.333333
4 a 2021-01-05 6 12.000000
5 a 2021-01-06 10 12.666667
6 a 2021-01-07 12 18.666667
7 a 2021-01-08 14 21.000000
8 a 2021-01-09 12 30.000000
9 a 2021-01-10 30 0.000000
10 b 2022-01-01 1 3.000000
11 b 2022-01-02 2 4.000000
12 b 2022-01-03 3 5.000000
13 b 2022-01-04 4 6.000000
14 b 2022-01-05 5 7.000000
15 b 2022-01-06 6 7.500000
16 b 2022-01-07 7 8.000000
17 b 2022-01-08 8 0.000000
'''
这样就完成了这个需求。
(完)
更新时间:2024-08-19 12:16:06 标签:pandas python 滚动 平均值