pandas滚动窗口apply调用时报'dict object is not callable'错误解决
项目中需要通过已采集的IBI(心跳间期)数据获取细粒度连续的心率变异性指标,因此需要对数据使用pandas大小为30s的滚动窗口进行处理。
首先按如下方式定义DataFrame:
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 |
当前已将数据过滤为仅保留1号参与者的数据,问题代码如下:
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"]))
将timestamp设为索引列后尝试调用get_time_domain_features()函数,抛出报错:
TypeError: 'dict' object is not callable
查阅过往相关帖子,尝试了多种语法调整都无法解决问题:
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"]))
解决方案
代码报错有两个原因:
.apply函数对输出多值/字典的场景支持不好,get_time_domain_features会返回包含多组指标的字典,与apply的要求冲突- 滚动窗口没有正确适配DataFrame首尾的窗口计算,首尾15行数据无法满足30秒窗口的取值要求
修复后的可用代码如下:
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封装到仅返回单值的自定义函数中,满足.apply()的输出约束;同时设置min_periods=30,指定窗口的最小行数要求。
内容的提问来源于stack exchange,提问作者Hamzah Ziadeh
相关产品推荐
相关产品推荐

