python - pandas roll_apply 处理 pandas.TimeGrouper 等对象类型

标签 python pandas

相关于Fun with Pandas `rolling_apply` and TypeErrorUsing rolling_apply on a DataFrame object

假设 F 是一个返回函数的函数,df 是一个带有日期时间索引的 Series。

以下似乎有效:

df.groupby(pandas.TimeGrouper('10d')).apply(F)

虽然以下结果会导致 TypeError,因为 moving_apply 似乎期望 float 作为返回值。

pandas.rolling_apply(df, 10, F)

我实际上想要后者,因为我想按 10 天可用天的每个窗口进行分组,而不是像我认为的 TimeGrouper 那样按每个 10 天窗口的可用数据进行分组。

有没有直接的方法可以使用其他函数来做到这一点?

举一个具体的例子,这似乎有效:

from statsmodels.tools.tools import ECDF
s = pandas.Series(randn(1000))
s.index = pandas.date_range('2012-01-01', periods=s.shape[0], freq='D')
f = s.groupby(pandas.TimeGrouper('30D')).apply(ECDF)
f.apply(lambda x: x(0.1)).head()

最佳答案

好吧,这是一个黑客,但你至少可以像这样实现你的目标:

import numpy as np
import pandas as pd
from statsmodels.tools.tools import ECDF

s = pd.Series(np.random.randn(1000))
s.index = pd.date_range('2012-01-01', periods=s.shape[0], freq='D')
result = []
pd.rolling_apply(s, 10, lambda grp: result.append(ECDF(grp)) or 1)
print([f(0.1) for f in result])

lambda 函数

lambda grp: result.append(ECDF(grp)) or 1

将 ECDF 存储在结果列表中。由于 result.append 返回 None,因此表达式 result.append(ECDF(grp)) or 1 解析为数值 1,因此 pd.rolling_apply 不会引发错误。

关于python - pandas roll_apply 处理 pandas.TimeGrouper 等对象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25613100/

相关文章:

python - 我可以给不同的月份上色吗?

python - 如何在Google Colab中播放mp4视频

Python 看门狗不触发所有事件

python - 安卓 Python 编程

python - 从排列生成器中随机选择?

python - Pandas :返回数据帧的每个二级索引的前 N ​​行

python - 使用预定义的列转换数据帧 Pandas

python - 在docker容器中运行时无法将geopandas导入python

python - 使用 pandas 根据另一个数据帧的行值填充列值

python-3.x - 连接具有不同列顺序的数据帧