python - 计算年份数据的逐月和逐年变化

标签 python pandas dataframe time-series

我有一个经济系列的数据框,它的值每个月都可以修改,为给定日期添加一个新值并通过 realtime_start 对其进行索引。 (见下面的数据框)。 realtime_start表示 value 的日期对于 date变得有效。这value一旦另一个取代它,它就会过期。

<表类="s-表"> <头> <日>日期 实时开始 值 <正文> 2020-11-01 2020-12-04 142629.0 2020-11-01 2021-01-08 142764.0 2020-11-01 2021-02-05 142809.0 2020-12-01 2021-01-08 142624.0 2020-12-01 2021-02-05 142582.0 2020-12-01 2021-03-05 142503.0 2021-01-01 2021-02-05 142631.0 2021-01-01 2021-03-05 142669.0 2021-01-01 2021-04-02 142736.0 2021-02-01 2021-03-05 143048.0 2021-02-01 2021-04-02 143204.0 2021-03-01 2021-04-02 144120.0

我想要一种简单的方法来计算 value 中的月度变化 |基于最后一个已知条目 date .

计算方法:取第n月的第一个发布(基于realtime_start)减去第n-1个月的相关发布。相关版本是其 realtime_start 的最新版本日期不超过第n月。

在下面查看所需的输出

<表类="s-表"> <头> <日>日期 环比变化 <正文> 2020-11-01 NaN 2020-12-01 -140 2021-01-01 49 2021-02-01 379 2021-03-01 916

对于 2021-03-01 , MoM 变化值为 144120.0 - 143204.0 = 916.0
对于 2021-02-01 , MoM 变化值为 143048.0 - 142669.0 = 379.0
对于 2021-01-01 , MoM 变化值为 142631.0 - 142582.0 = 49.0

同样,我想根据 date 处的最后已知值计算同比变化。 (实际数据框架进一步延伸到过去)。我还想根据 date 处的最后已知值计算 3 个月(滚动)月度变化的平均值。 .

economic series dataframe

最佳答案

解决方案

df = df.set_index('date')

first = df.groupby(level=0).first()
m = df['realtime_start'].le(first['realtime_start'].shift(-1))
last_val = df['value'].mask(~m).groupby(level=0).last().shift()

mom_change = (first['value'] - last_val).reset_index(name='MoM change')

说明

将数据帧的 index 设置为 date 列,然后将数据帧group level=0 并使用 first 聚合以选择每个唯一 date

的第一行
>>> first
           realtime_start     value
date                               
2020-11-01     2020-12-04  142629.0
2020-12-01     2021-01-08  142624.0
2021-01-01     2021-02-05  142631.0
2021-02-01     2021-03-05  143048.0
2021-03-01     2021-04-02  144120.0

移动first数据帧中的realtime_start列,然后将其与df中的realtime_start列进行比较以创建 bool 掩码 m

>>> m

date
2020-11-01     True
2020-11-01     True
2020-11-01    False
2020-12-01     True
2020-12-01     True
2020-12-01    False
2021-01-01     True
2021-01-01     True
2021-01-01    False
2021-02-01     True
2021-02-01     True
2021-03-01    False
Name: realtime_start, dtype: bool

现在使用上面的 bool 掩码屏蔽 value 列中的值,然后将此屏蔽列分组到 level=0 并使用 last 聚合以选择每个唯一的最后一行编号

>>> last

date
2020-11-01         NaN
2020-12-01    142764.0
2021-01-01    142582.0
2021-02-01    142669.0
2021-03-01    143204.0
Name: value, dtype: float64

从计算的last_val 列中减去first 数据框中的value 列以计算MoM 变化

>>> mom_change

        date  MoM change
0 2020-11-01         NaN
1 2020-12-01      -140.0
2 2021-01-01        49.0
3 2021-02-01       379.0
4 2021-03-01       916.0

PS:数据框必须在 date 列排序,以便此解决方案正常工作

关于python - 计算年份数据的逐月和逐年变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67155907/

相关文章:

python - pandas 使用同一列中的值进行分组并计算结果(包括 R 等效项)

python - 如果值是数据框中的 int 类型并选择不正确的行,则逐行检查

python - 将索引重命名为数据帧中的连续字符串?

apache-spark - SPARK数据帧: Remove MAX value in a group

python - 读取 txt 文件时交换位置

python - 无法使用从 python 中同一目录中的另一个文件访问的类

python - Python 模块名称前的前导下划线

python - 引用python中的列表容器理解for循环

python - 为 Pandas 数据框中的下一个连续行添加新列

python - 带有 Groupby 的 Pandas 滚动函数