如何为含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
相关产品推荐
相关产品推荐

