使用应用函数滚动 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,我设法找到了可行的解决方案。我的代码不起作用有两个原因:
- .apply 函数在输出多个包含值的 values/adict 时经常遇到困难。所以传递一个像get_time_domain_features这样的函数,其中returns一整套数据与函数冲突。
- .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 任何东西。
对于我的项目,我需要通过我收集的 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,我设法找到了可行的解决方案。我的代码不起作用有两个原因:
- .apply 函数在输出多个包含值的 values/adict 时经常遇到困难。所以传递一个像get_time_domain_features这样的函数,其中returns一整套数据与函数冲突。
- .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 任何东西。