You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Pandas计算面板数据中的百分比变化

解决面板数据按组计算价格百分比变化的问题

嘿,我来帮你搞定这个面板数据的价格环比百分比计算需求!针对你的长格式面板数据,我们可以用Python的Pandas库轻松实现,正好能满足每个supermkt+product组合自动丢失第一条观测值的要求。

核心思路

我们需要按supermktproduct对数据分组,然后在每个组内,基于时间维度(date)计算price环比百分比变化——也就是当前价格相对于上一个时间点价格的变动比例。Pandas的pct_change()方法正好做这件事:它会自动计算当前元素与前一个元素的百分比差值,每组的第一个值会返回NaN(因为没有前序数据),完美符合你说的“每个组合丢失一条观测值”的要求。

具体实现步骤

1. 准备示例数据(模拟你的数据集)

首先我们构造一个和你结构一致的示例DataFrame,方便演示:

import pandas as pd

# 构造面板数据
data = {
    'date': ['2023-01-01', '2023-02-01', '2023-03-01', '2023-01-01', '2023-02-01'],
    'supermkt': [1, 1, 1, 2, 2],
    'product': [1, 1, 1, 1, 1],
    'price': [100, 105, 102, 50, 55]
}
df = pd.DataFrame(data)

# 关键:将date转为日期类型,并确保每组内按时间排序
df['date'] = pd.to_datetime(df['date'])
df = df.sort_values(by=['supermkt', 'product', 'date']).reset_index(drop=True)

2. 计算价格百分比变化

直接通过分组+pct_change()实现:

# 按supermkt和product分组,计算price的百分比变化,转成百分比格式(乘100)
df['price_pct_change'] = df.groupby(['supermkt', 'product'])['price'].pct_change() * 100

3. 查看supermkt=1、product=1的结果

运行下面的代码就能得到你要的预期输出:

target_df = df[(df['supermkt'] == 1) & (df['product'] == 1)]
print(target_df.round(2))  # 保留两位小数更直观

预期输出

date  supermkt  product  price  price_pct_change
0 2023-01-01         1        1    100                NaN
1 2023-02-01         1        1    105               5.00
2 2023-03-01         1        1    102              -2.86

重要注意事项

  • 时间排序必须正确:一定要确保每个supermkt+product组内的date是按升序排列的,否则pct_change()会计算错误的相邻值。上面的代码里已经用sort_values()做了这件事。
  • 处理缺失值:如果你的原始数据里有缺失的日期或价格,可能需要先做填充或过滤,避免影响计算结果。
  • 自定义精度:如果需要调整百分比的小数位数,可以用round(n)方法,比如示例里的round(2)保留两位小数。

内容的提问来源于stack exchange,提问作者Uruguayo

火山引擎 最新活动