【问题标题】:How to resample a time series producing its geometric mean?如何重新采样产生其几何平均值的时间序列?
【发布时间】:2013-10-14 08:25:47
【问题描述】:

我是 Python 新手,在使用 pandas 重新采样一些数据时遇到了一个棘手的问题。

当我想对我的时间序列数据重新采样时,应用算术平均函数非常简单。

例如:

假设ts 是分钟频率的时间序列数据(在pandas 中,它被封装在pandas.Series 对象中,带有DatetimeIndex)。

要获得每组 5 分钟时间段的算术平均值,只需:

ts.resample('5min', how='mean')

但是,我将如何以这种方式计算几何平均值?有没有像上面这样简单的解决方案,例如:

ts.resample('5min', how='gmean')

【问题讨论】:

  • ts 是什么类?您是否使用任何非内置库? numpy、scipy 等?
  • 一个简单的查找方法可能是阅读文档,也可能是代码。
  • ts 可能代表时间序列。
  • 你的代码中的一些额外上下文会让你更容易回答你的问题

标签: python pandas mean


【解决方案1】:

您可以将可调用对象(在本例中为函数)传递给how,只要它返回一个标量:

In [31]: from scipy.stats.mstats import gmean

In [32]: import pandas.util.testing as tm

In [33]: ts = tm.makeTimeSeries()[:10]

In [34]: ts
Out[34]:
2000-01-03    0.605
2000-01-04   -0.167
2000-01-05    0.365
2000-01-06   -0.206
2000-01-07   -1.156
2000-01-10   -0.219
2000-01-11    1.704
2000-01-12   -0.148
2000-01-13    1.169
2000-01-14    0.823
Freq: B, dtype: float64

In [35]: ts.resample('2D', how=lambda x: gmean(x).item())
Out[35]:
2000-01-03    0.605
2000-01-05    0.365
2000-01-07    0.000
2000-01-09    0.000
2000-01-11    1.704
2000-01-13    0.981
dtype: float64

请注意,您必须在此处调用item 方法才能获得标量结果(因为根据值您可能会获得MaskedConstant)。 pandas 不会将单个元素 Series 视为标量。

此外,请注意包含nans 的计算结果或计算几何平均值可能返回复数的值(例如,负数的第四根;这将在numpy 中返回nan)。

当您调用item 方法时,gmean 会将这样的计算变成 0。

例如,这就是为什么 2000-01-072000-01-09 有零的原因。

2000-01-07,pandas 会在第二天填写nan(请记住,我们在这里填写的是2D),因此几何平均值计算为ma.exp(ma.mean(ma.log([-1.156, nan])))。这两个值不是ma.log 的“有效”输入(因此它们被屏蔽),因此ma.mean() 返回一个MaskedConstant,其_data 属性为0,因此其item 方法返回0。

【讨论】:

    猜你喜欢
    • 2019-09-17
    • 2021-11-23
    • 2022-11-27
    • 1970-01-01
    • 2021-04-07
    • 2016-02-21
    • 2021-08-01
    • 2021-01-02
    • 1970-01-01
    相关资源
    最近更新 更多