You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pandas滚动窗口apply调用时报'dict object is not callable'错误解决

项目中需要通过已采集的IBI(心跳间期)数据获取细粒度连续的心率变异性指标,因此需要对数据使用pandas大小为30s的滚动窗口进行处理。

首先按如下方式定义DataFrame:

py_physio_Data = pd.DataFrame(py_physio_DF)

数据样例如下:

ParticipantIBITimestamp
15262021-11-10 10:54:15
16582021-11-10 10:54:15
17002021-11-10 10:54:16
16952021-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:06:08