熊猫在数据框的两列上同时滚动应用功能

时间:2020-05-17 14:25:21

标签: python pandas numpy dataframe

我有一个包含两列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列做出决定。

我该如何解决?

1 个答案:

答案 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'])