pandas 中的pct_change的用法

本文详细介绍了 Pandas 中的 pct_change 函数,包括其参数含义、使用方法及应用场景。通过实例展示了如何计算 DataFrame 或 Series 中各元素相对于前一个元素的百分比变化,以及如何指定计算周期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文章已经生成可运行项目,

(1)df.pct_change()
DataFrame.pct_change(periods=1, fill_method=‘pad’, limit=None, freq=None, **kwargs)
表示当前元素与先前元素的相差百分比,当然指定periods=n,表示当前元素与先前n 个元素的相差百分比。
参考文档
例子:

df = pd.DataFrame({
   'FR': [4.0405, 4.0963, 4.3149],
    'GR': [1.7246, 1.7482, 1.8519],
     'IT': [804.74, 810.01, 860.13]},
     index=['1980-01-01', '1980-02-01', '1980-03-01'])
print(df)
print(df.pct_change())
print(df.pct_change(axis='columns'))#可以指定按照行还是列进行计算的

结果如下:

                FR      GR      IT
1980-01-01  4.0405  1.7246  804.74
1980-02-01  4.0963  1.7482  810.01
1980-03-01  4.3149  1.8519  860.13
                  FR        GR        IT
1980-01-01       NaN       NaN       NaN
1980-02-01  0.013810  0.013684  0.006549
1980-03-01  0.053365  0.059318  0.061876
            FR        GR          IT
1980-01-01 NaN -0.573172  465.624145
1980-02-01 NaN -0.573225  462.339435
1980-03-01 NaN -0.570813  463.458124

再举一个列子就是:

s = pd.Series([90, 91, 85])
s.pct_change(periods=2)#表示当前元素与先前两个元素百分比

结果:

0         NaN
1         NaN
2   -0.055556
dtype: float64

也就是(85-90)/90=-0.055556
在pandas 中的series 以及dataframe的pct_change的用法是基本相同的可以参照官方文档查看详细内容。
再看看它们的用法把。参考
Series.diff
DataFrame.diff
Series.shift
DataFrame.shift

本文章已经生成可运行项目
C:\Users\matianht\AppData\Local\Temp\ipykernel_15348\3792745989.py:2: FutureWarning: The default fill_method='pad' in Series.pct_change is deprecated and will be removed in a future version. Either fill in any non-leading NA values prior to calling pct_change or specify 'fill_method=None' to not fill NA values. df1[f"{col}_pct"] = df1[col].pct_change(1) C:\Users\matianht\AppData\Local\Temp\ipykernel_15348\3792745989.py:2: FutureWarning: The default fill_method='pad' in Series.pct_change is deprecated and will be removed in a future version. Either fill in any non-leading NA values prior to calling pct_change or specify 'fill_method=None' to not fill NA values. df1[f"{col}_pct"] = df1[col].pct_change(1) C:\Users\matianht\AppData\Local\Temp\ipykernel_15348\3792745989.py:2: FutureWarning: The default fill_method='pad' in Series.pct_change is deprecated and will be removed in a future version. Either fill in any non-leading NA values prior to calling pct_change or specify 'fill_method=None' to not fill NA values. df1[f"{col}_pct"] = df1[col].pct_change(1) C:\Users\matianht\AppData\Local\Temp\ipykernel_15348\3792745989.py:2: FutureWarning: The default fill_method='pad' in Series.pct_change is deprecated and will be removed in a future version. Either fill in any non-leading NA values prior to calling pct_change or specify 'fill_method=None' to not fill NA values. df1[f"{col}_pct"] = df1[col].pct_change(1) C:\Users\matianht\AppData\Local\Temp\ipykernel_15348\3792745989.py:2: FutureWarning: The default fill_method='pad' in Series.pct_change is deprecated and will be removed in a future version. Either fill in any non-leading NA values prior to calling pct_change or specify 'fill_method=None' to not fill NA values. df1[f"{col}_pct"] = df1[col].pct_change(1) C:\Users\matianht\AppData\Local\Temp\ipykernel_15348\3792745989.py:2: FutureWarning: The default fill_method='pad' in Series.pct_change is deprecated and will be removed in a future version. Either fill in any non-leading NA values prior to calling pct_change or specify 'fill_method=None' to not fill NA values. df1[f"{col}_pct"] = df1[col].pct_change(1) C:\Users\matianht\AppData\Local\Temp\ipykernel_15348\3792745989.py:2: FutureWarning: The default fill_method='pad' in Series.pct_change is deprecated and will be removed in a future version. Either fill in any non-leading NA values prior to calling pct_change or specify 'fill_method=None' to not fill NA values. df1[f"{col}_pct"] = df1[col].pct_change(1) C:\Users\matianht\AppData\Local\Temp\ipykernel_15348\3792745989.py:2: FutureWarning: The default fill_method='pad' in Series.pct_change is deprecated and will be removed in a future version. Either fill in any non-leading NA values prior to calling pct_change or specify 'fill_method=None' to not fill NA values. df1[f"{col}_pct"] = df1[col].pct_change(1) C:\Users\matianht\AppData\Local\Temp\ipykernel_15348\3792745989.py:2: FutureWarning: The default fill_method='pad' in Series.pct_change is deprecated and will be removed in a future version. Either fill in any non-leading NA values prior to calling pct_change or specify 'fill_method=None' to not fill NA values. df1[f"{col}_pct"] = df1[col].pct_change(1) C:\Users\matianht\AppData\Local\Temp\ipykernel_15348\3792745989.py:2: FutureWarning: The default fill_method='pad' in Series.pct_change is deprecated and will be removed in a future version. Either fill in any non-leading NA values prior to calling pct_change or specify 'fill_method=None' to not fill NA values. df1[f"{col}_pct"] = df1[col].pct_change(1) C:\Users\matianht\AppData\Local\Temp\ipykernel_15348\3792745989.py:2: FutureWarning: The default fill_method='pad' in Series.pct_change is deprecated and will be removed in a future version. Either fill in any non-leading NA values prior to calling pct_change or specify 'fill_method=None' to not fill NA values. df1[f"{col}_pct"] = df1[col].pct_change(1) 这个警告是什么意思
最新发布
08-08
<think>我们遇到了多个关于`pct_change`方法的FutureWarning警告。这个警告的意思是:在`pct_change`方法中,默认的填充非前导NA值的方式(`fill_method='pad'`)已经被弃用,并将在未来的版本中被移除。 ### 警告解释: - **问题根源**:在计算百分比变化时,如果数据中存在非前导的NA值(即不是第一行,而是中间出现的缺失值),默认行为是使用前向填充(pad,即用前面的值填充后面的NA)来处理这些NA,然后再计算变化率。 - **弃用警告**:Pandas开发团队认为这种隐式的填充行为可能不是用户期望的,因此决定在未来版本中移除默认填充,要求用户显式处理缺失值。 ### 解决方案: 有两种方法可以消除此警告: #### 方法1:显式填充缺失值(推荐) 在调用`pct_change`之前,先处理缺失值(例如使用前向填充): ```python for col in df1.columns: # 先填充该列的缺失值(这里用前向填充,您可以选择其他方法) filled_series = df1[col].fillna(method='ffill') # 再计算百分比变化,并指定fill_method=None(不填充) df1[f"{col}_pct"] = filled_series.pct_change(1, fill_method=None) ``` #### 方法2:在`pct_change`中指定`fill_method=None` 如果您的数据没有缺失值,或者您希望保留NaN(即不填充),可以显式设置`fill_method=None`: ```python for col in df1.columns: # 明确指定fill_method=None,避免使用默认填充 df1[f"{col}_pct"] = df1[col].pct_change(1, fill_method=None) ``` ### 注意事项: 1. **数据完整性**:如果数据中有NaN,方法2会在NaN的位置以及变化计算后产生NaN(因为无法计算变化率)。例如: - 原始数据:[1, NaN, 3] - 变化率:[NaN, NaN, NaN](因为从NaN到3的变化无法计算) 2. **填充策略选择**:根据业务需求选择填充方式: - 前向填充:`df[col].fillna(method='ffill')` - 后向填充:`df[col].fillna(method='bfill')` - 固定值填充:`df[col].fillna(0)` ### 完整代码示例(推荐方式): ```python # 处理缺失值并计算百分比变化(避免警告) for col in df1.columns: # 步骤1:填充缺失值(这里使用前向填充,您可以根据需要修改) filled_data = df1[col].ffill() # 步骤2:计算百分比变化(不填充,因为已经填充过了) df1[f"{col}_pct"] = filled_data.pct_change(1, fill_method=None) # 或者,如果数据没有缺失值,直接: # for col in df1.columns: # df1[f"{col}_pct"] = df1[col].pct_change(1, fill_method=None) ``` ### 为什么推荐先填充再计算? - 避免未来版本升级后代码失效(当前默认行为会消失) - 使缺失值处理更透明,便于维护 §§相关问题§§ 1. 在Pandas中,除了前向填充(ffill)外,还有哪些常用的缺失值填充方法? 2. 当时间序列数据中存在间断日期时,如何确保`pct_change`计算的是相邻日期的变化率而非跳过缺失日期? 3. 在计算金融数据的百分比变化时,为什么有时会使用对数收益率(log return)而不是简单百分比变化? 4. 如果数据中存在0值(如交易量为0),使用`pct_change`计算变化率会出现什么问题?如何避免? 5. 除了`pct_change`,Pandas中还有哪些内置函数可以用于计算时间序列数据的统计特征(如滚动均值、滚动标准差等)?</think>### 警告解释与解决方案 这个警告是 Pandas 关于 `pct_change()` 方法默认行为即将改变的提示: #### 警告含义: 1. **默认填充行为变更**: - 当前版本中,`pct_change()` 默认使用 `fill_method='pad'`(前向填充)处理非首行的 NA/NaN 值 - 未来版本将**移除**此默认填充行为 - 从 Pandas 2.2 开始,此警告已出现,预计在 Pandas 3.0 正式移除 2. **潜在风险**: - 如果数据中有中间缺失值(非首行),当前版本会隐式填充 - 未来版本将不再自动填充,可能导致计算结果不同 #### 解决方案(两种方式): ##### 方法1:显式处理缺失值(推荐) ```python for col in df1.columns: # 先处理缺失值 clean_series = df1[col].fillna(method='ffill') # 前向填充 # 再计算百分比变化(禁用自动填充) df1[f"{col}_pct"] = clean_series.pct_change(1, fill_method=None) ``` ##### 方法2:直接禁用自动填充 ```python for col in df1.columns: # 明确指定不要填充缺失值 df1[f"{col}_pct"] = df1[col].pct_change(1, fill_method=None) # 然后自行处理缺失值(可选) df1[f"{col}_pct"].fillna(0, inplace=True) # 用0填充NaN ``` ### 为什么需要关注此警告? 1. **数据准确性**:自动填充可能扭曲真实变化率 2. **未来兼容性**:当前代码在 Pandas 升级后会中断 3. **结果一致性**:移除自动填充后,相同数据的计算结果可能变化 ### 完整的最佳实践: ```python # 步骤1:检查缺失值 print("缺失值统计:") print(df1.isnull().sum()) # 步骤2:处理缺失值(根据业务逻辑选择方式) # 选项1:前向填充 df1_filled = df1.ffill() # 选项2:用0填充 # df1_filled = df1.fillna(0) # 选项3:插值 # df1_filled = df1.interpolate() # 步骤3:安全计算百分比变化 for col in df1_filled.columns: df1[f"{col}_pct"] = df1_filled[col].pct_change(1, fill_method=None) # 步骤4:处理结果中的无穷值(如除0情况) import numpy as np for col in df1.columns: if '_pct' in col: df1[col] = df1[col].replace([np.inf, -np.inf], np.nan) df1[col].fillna(0, inplace=True) # 或其他适当值 ``` ### 各填充方法对比: | 方法 | 描述 | 适用场景 | |------|------|----------| | `fillna(0)` | 缺失值设为0 | 金融数据、交易量 | | `ffill()` | 用前值填充 | 连续时间序列 | | `bfill()` | 用后值填充 | 实时数据流 | | `interpolate()` | 线性插值 | 平滑变化的数据 | | 删除缺失行 | `dropna()` | 数据量大且缺失少时 |
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值