【问题标题】:pandas rolling_apply to handle object types like pandas.TimeGrouperpandas rolling_apply 处理像 pandas.TimeGrouper 这样的对象类型
【发布时间】:2014-09-04 06:02:01
【问题描述】:

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

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

以下似乎有效:

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

虽然以下结果会导致 TypeError,因为 rolling_apply 似乎期望浮点数作为返回值。

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()

【问题讨论】:

  • 如果F 是一个返回函数的函数,那么我不确定df.groupby(pandas.TimeGrouper('10d')).apply(F) 将如何工作。能举个具体的例子吗?
  • 我添加了一个返回函数的示例。

标签: python pandas


【解决方案1】:

嗯,这是一个 hack,但你至少可以像这样实现你的目标:

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 列表中。由于result.append 返回None,表达式result.append(ECDF(grp)) or 1 解析为数值1,因此pd.rolling_apply 不会引发错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-18
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    相关资源
    最近更新 更多