使用应用函数滚动 window 在 pandas 数据框中返回 "dict object is not callable"

Rolling window with apply function reutrns "dict object is not callable" in pandas data frame

对于我的项目,我需要通过我收集的 IBI(心跳间隔)数据对心率变异性进行非常精细和连续的测量。为此,我需要 window 我的数据应用 pandas 滚动 window(大小 = 30s)。我这样定义我的数据框:

py_physio_Data = pd.DataFrame(py_physio_DF)

产生的结果(这只是一小部分数据):

Participant IBI Timestamp
1 526 2021-11-10 10:54:15
1 658 2021-11-10 10:54:15
1 700 2021-11-10 10:54:16
1 695 2021-11-10 10:54:17

现在我将数据过滤为仅包括参与者一。所以这是有问题的代码:

import hrvanalysis as hrv
py_physio_Data.index = pd.to_datetime(py_physio_Data["Timestamp"])
py_physio_Data.rolling("30s").apply(func = hrv.get_time_domain_features(py_physio_Data["IBI"]))

我将时间戳设置为索引列,然后尝试应用函数 get_time_domain_features()。

TypeError: 'dict' object is not callable

我不知道问题是什么,如何解决。我查阅了以前的帖子,尝试了各种语法(示例见下文),但我无法找出错误。任何帮助将不胜感激:D

py_physio_Data.rolling("30s").apply(func = hrv.get_time_domain_features(py_physio_Data))
py_physio_Data.rolling("30s").apply(func = hrv.get_time_domain_features())
py_physio_Data["IBI"].rolling("30s").apply(func = hrv.get_time_domain_features(py_physio_Data["IBI"]))

用解决方案编辑

感谢 Koala,我设法找到了可行的解决方案。我的代码不起作用有两个原因:

  1. .apply 函数在输出多个包含值的 values/adict 时经常遇到困难。所以传递一个像get_time_domain_features这样的函数,其中returns一整套数据与函数冲突。
  2. .rolling 函数没有将 windowing 正确应用到数据框的开头和结尾。可能是因为前 15 行和后 15 行数据的值不足 30 秒 window.

无论如何,这是工作代码:

def calc_time(window):
  print(hrv.get_time_domain_features(window))
  print("========")
  return 0


py_physio_Data["IBI"].rolling("30s", min_periods = 30).apply(func = calc_time)

为了修复错误,我只需要将 get_time_domain_features 放在一个函数中,returns 只有一个值来满足 .apply() 约束。其次,我指定一个window的长度不能少于30行。

试试这个:

py_physio_Data["IBI"].rolling("30s").apply(hrv.get_time_domain_features);

您正在做的是应用 get_time_domain() 函数的 result,您总是使用整个“IBI”列调用该函数。相反,如果您仅将函数指定为可调用对象,则滚动将使用包含该迭代的“IBI”数据的 Pandas 系列填充它,并且它将 return 结果字典。在您 调用 字典 return 之前,就好像它是一个函数一样,这就是为什么它没有 return 任何东西。