熊猫滚动同时对数据帧的两列应用功能



我有一个包含两列 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'])

这是一个玩具函数,它使用 means 来保持示例简单,但实际上我正在检查每个滑动窗口的 A 和 B 上的 DTW,然后返回一个决定。

def my_function(entry):
if (entry['A'].mean() > entry['B'].mean()):
return(1)
else:
return(0)

尝试下面的行代码时,我得到:

使用"raw=True"时出现"KeyError: 'A'">错误,以及

"IndexError:只有整数、切片 (:(、省略号 (...(、numpy.newaxis (None( 和整数或布尔数组是有效的索引:">当使用 "raw=False">

df['decision'] = df.rolling(window='4s',min_periods=80).apply(my_function, raw=False)

我之前在熊猫重新采样中使用过这种方法(条目['A](,它奏效了。 阅读 pandas 文档时,我发现滚动应用不返回数据帧,而是返回 ndarray (raw=True( 或序列 (raw=False(。

所以我修改了函数如下以调试:

def my_function(entry):
print(entry.shape)
print(entry)
return(99)

上面的问题是"my_function"正在接收 A 列的滑动窗口(一个接一个(,然后才接收 B 列的滑动窗口(一个接一个(。

因此,我无法根据每个滑动窗口的 A 列和 B 列做出决定。

我该如何解决这个问题?

您可以执行以下操作:

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

最新更新