我有一个包含两列A和B的数据框,并且想使用rolling.apply函数基于每个滑动窗口中A和B的值来做出决定。
这是示例代码:
import numpy as np
import pandas as pd
np.random.seed(101)
nb=200
df = pd.DataFrame(np.random.rand(200,2),
index=pd.date_range('2020-05-15', freq='50ms', periods=nb),columns=['A','B'])
这是一个玩具函数,它使用均值保持示例简单,但实际上,我正在检查每个滑动窗口的A和B上的DTW,然后返回一个决定。
def my_function(entry):
if (entry['A'].mean() > entry['B'].mean()):
return(1)
else:
return(0)
尝试下面的行代码时,我得到:
“ KeyError:'A'” 错误,使用“ raw = True”时,
“ IndexError:只有整数,切片(:
),省略号(...
),numpy.newaxis(None
)和整数或布尔数组是有效索引:” 使用“ raw = False”时
df['decision'] = df.rolling(window='4s',min_periods=80).apply(my_function, raw=False)
在对熊猫重新采样之前,我已经使用了此方法(entry ['A]),并且可以正常工作。阅读熊猫文档,我发现滚动应用不会返回数据帧,而是返回ndarray(raw = True)或一系列(raw = False)。
因此,我将功能修改如下以进行调试:
def my_function(entry):
print(entry.shape)
print(entry)
return(99)
上述问题是“ my_function”正在接收列A的滑动窗口(一对一),然后才接收列B的滑动窗口(一对一)。
因此,我无法根据每个滑动窗口的A列和B列做出决定。
我该如何解决?
答案 0 :(得分:1)
您可以执行以下操作:
import numpy as np
import pandas as pd
np.random.seed(101)
df = pd.DataFrame(np.random.rand(200,2),
index=pd.date_range('2020-05-15', freq='50ms', periods=200),columns=['A','B'])
df['decision'] = np.where(~df.rolling(window='4s',min_periods=80)['A'].mean().isna(),0,np.nan)
df['decision'] = np.where((df.rolling(window='4s',min_periods=80)['A'].mean()>df.rolling(window='4s',min_periods=80)['B'].mean()),1,df['decision'])