You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为含NaN的Pandas列逐列应用Statsmodels滤波函数?

解决方案

要实现逐列从第一个非缺失值开始应用Christiano-Fitzgerald滤波,同时保留原DataFrame的所有行,可以通过逐列独立处理+结果重索引的方式实现,具体代码如下:

import pandas as pd
import numpy as np
import statsmodels.api as sm

# 构造示例数据(用户提供的代码)
df = pd.DataFrame({'date': pd.date_range(start='2013-01-01', periods=30, freq='Q'),
                   'series1': range(30), 
                   'series2': range(30), 
                   'series3': range(30)}).set_index('date')

df.loc[:11, 'series1'] = np.nan
df.loc[:6, 'series2'] = np.nan 

# 定义单序列处理函数
def process_single_series(series):
    # 获取第一个非NaN值的索引
    first_valid_idx = series.first_valid_index()
    # 处理全NaN的情况
    if first_valid_idx is None:
        empty_series = pd.Series([np.nan]*len(series), index=series.index)
        return empty_series, empty_series
    # 提取有效子序列并滤波
    valid_subseries = series.loc[first_valid_idx:]
    cycle, trend = sm.tsa.filters.cffilter(valid_subseries, low=6, high=40)
    # 重索引回原序列长度,自动填充前面的NaN
    cycle_full = cycle.reindex(series.index)
    trend_full = trend.reindex(series.index)
    return cycle_full, trend_full

# 初始化结果DataFrame
df_cycles = pd.DataFrame(index=df.index)
df_trend = pd.DataFrame(index=df.index)

# 逐列处理并填充结果
for col in df.columns:
    col_cycle, col_trend = process_single_series(df[col])
    df_cycles[col] = col_cycle
    df_trend[col] = col_trend

关键逻辑说明

  • 定位有效起始点:用first_valid_index()自动获取每列第一个非缺失值的位置,无需手动计算索引位置
  • 独立滤波:仅对每列的有效子序列应用滤波,避开前面的缺失值,解决Statsmodels无法处理含NaN序列的问题
  • 结果对齐:通过reindex()将滤波结果扩展到原DataFrame的索引长度,前面的位置自动填充NaN,保证结果与原数据的行完全对齐
  • 容错处理:针对全NaN的列做了特殊处理,避免报错

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 07:35:22