看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
商品类型总共包含 A,B,C 三类,但并不是每天的数据都包含所有商品类型,参考以下的数据集。由于数据集中有多个商品类型,我们不能对时间进行排序直接算出环比,需要按类型先进行分组,在分组内按日期求得当前日期对比前一日期的变化比例。
商品源数据如下:
'''
时间 类型 销售额
2021/10/26 A 13.34827619
2021/10/26 B 86.92582545
2021/10/26 C 69.955569
2021/10/27 A 79.96022902
2021/10/27 B 83.94702123
2021/10/28 A 70.55949574
2021/10/28 B 40.0521712
2021/10/28 C 16.17825062
2021/10/29 A 12.8097718
2021/10/30 A 17.12582533
2021/10/30 C 91.12357503
2021/10/31 A 5.909534462
2021/10/31 B 78.56672937
2021/10/31 C 54.02725342
'''
df = pd.read_clipboard()
df.head()
需求方期望在以上数据集的基础上增加一列展示日环比,此外不能改变原数据的形状。
先将日期转换为时间类型,方便后续按日期对比求得变化值。为了方便使用 pct_change()
方法,需要将时列转为索引。接着按类型进行分组,然后在各组应用 pct_change()
方法,对比频率参数传入 freq='D'
表示按日期进行。
解决代码:
mapping = (
df.astype({'时间': 'datetime64[ns]'})
.set_index('时间')
.groupby('类型')
.apply(lambda x: x.销售额.pct_change(freq='D'))
# .reset_index()
)
mapping
'''
类型 时间
A 2021-10-26 NaN
2021-10-27 4.990304
2021-10-28 -0.117568
2021-10-29 -0.818454
2021-10-30 0.336934
2021-10-31 -0.654934
B 2021-10-26 NaN
2021-10-27 -0.034268
2021-10-28 -0.522888
2021-10-31 NaN
C 2021-10-26 NaN
2021-10-28 NaN
2021-10-30 NaN
2021-10-31 -0.407099
Name: 销售额, dtype: float64
'''
这样我们就得到了一个关于指定商品在的指定日期的变化情况的映射数据集,我们可以通过以下查询方法得到这个具体值:
mapping.loc[('A', '2021-10-30')]
# 0.3369344588948884
最后增加需要中的一列,增加时要应用上边的映射数据集和查询方法,同时需要将源数据的时间列转换为时间类型以与映射数据集匹配。
rate = (
df.astype({'时间': 'datetime64[ns]'})
.apply(lambda x: mapping.loc[(x.类型, x.时间)], axis=1)
)
df.assign(环比=rate)
'''
时间 类型 销售额 环比
0 2021/10/26 A 13.348276 NaN
1 2021/10/26 B 86.925825 NaN
2 2021/10/26 C 69.955569 NaN
3 2021/10/27 A 79.960229 4.990304
4 2021/10/27 B 83.947021 -0.034268
5 2021/10/28 A 70.559496 -0.117568
6 2021/10/28 B 40.052171 -0.522888
7 2021/10/28 C 16.178251 NaN
8 2021/10/29 A 12.809772 -0.818454
9 2021/10/30 A 17.125825 0.336934
10 2021/10/30 C 91.123575 NaN
11 2021/10/31 A 5.909534 -0.654934
12 2021/10/31 B 78.566729 NaN
13 2021/10/31 C 54.027253 -0.407099
'''
最终就得到了需求结果。
(完)
更新时间:Aug. 18, 2024, 3:38 p.m. 标签:pandas 环比