【问题标题】:pandas rolling apply function on two columns of a dataframe concurrently熊猫同时在数据框的两列上滚动应用功能
【发布时间】:2020-05-18 02:29:33
【问题描述】:

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

这是一个玩具函数,它使用 mean 来保持示例简单,但实际上我在每个滑动窗口的 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) 和整数或布尔数组是有效的索引:" 使用时“原始=假”

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

我之前在 pandas resample 中使用过这种方法(entry['A])并且它有效。阅读 pandas 文档后,我发现滚动应用不会返回数据框,而是返回 ndarray (raw=True) 或系列 (raw=False)。

所以我将函数修改如下进行调试:

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

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

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

我该如何解决这个问题?

【问题讨论】:

  • 什么是nb?时期?
  • 这个答案有帮助吗? stackoverflow.com/a/38879051 。您可能需要对其进行一些调整以使用您的日期时间滚动,但我认为您需要的所有核心想法都在那里。
  • @Scott Boston,道歉,nb=200。

标签: python pandas numpy dataframe


【解决方案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'])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    相关资源
    最近更新 更多