pandas数据框架将函数应用于具有nans的列



我有一个大熊猫数据帧,它有许多不同长度的时间序列,看起来像这样:

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 

我想在每个时间序列上应用来自statsmodel的统计过滤器,但module无法处理缺失的值,并返回一个充满NaN的数据帧。

import statsmodels.api as sm
df_cycles, df_trend = sm.tsa.filters.cffilter(df, low=6, high=40)

从第一次非nan观测开始,是否有一种干净的方法将函数单独应用于每一列?我不想排除缺少值的行。

这个线程可能对您有用。通常,statsmodel有一个"missing"关键字,但正如链接的上一个StackOverflow答案中所详细说明的,情况并非总是如此。帖子的作者提出了这个解决方案:

import statsmodels.formula.api as smf
available_data = all_data.loc[:,['y', 'x', 'groupid']].dropna(how='any')
model  = smf.ols('y ~ x', data = available_data)

当与您的代码一起使用时不会产生错误:

import pandas as pd
import numpy as np
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
# Change here
available_data = df.dropna(how="any")
import statsmodels.api as sm
df_cycles, df_trend = sm.tsa.filters.cffilter(available_data, low=6, high=40)

您可以为每一列应用过滤器,并将结果存储在某个对象中。在这种情况下,我正在制作一个以列名为关键字、循环和包含趋势和结果的数据帧为值的字典。

filtered = {}
for c in df.columns:
cycles, trend = sm.tsa.filters.cffilter(
df[c].astype(float).dropna(),
low=6,
high=40
)
filtered[c] = pd.DataFrame({'cycles':cycles, 'trend':trend})

print(filtered['series1'])
#                  cycles  trend
#date                           
#2015-12-31  8.881784e-16   11.0
#2016-03-31  6.661338e-16   11.0
#...

print(filtered['series3'])
#            cycles  trend
#date                     
#2013-03-31     0.0    0.0
#2013-06-30     0.0    0.0
#...

正如您所看到的,对于每一列,包含NaN的行都被删除,而不会影响其他列。

最新更新