如何重新采样产生几何平均值的时间序列?

use*_*528 0 python mean pandas

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

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

例如:

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

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

ts.resample('5min', how='mean')
Run Code Online (Sandbox Code Playgroud)

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

ts.resample('5min', how='gmean')
Run Code Online (Sandbox Code Playgroud)

Phi*_*oud 6

您可以将可调用对象(在本例中为函数)传递给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
Run Code Online (Sandbox Code Playgroud)

请注意,您必须在item此处调用此方法以获取标量结果(因为取决于您可能获得的值MaskedConstant).pandas不认为单个元素Series是标量.

另外,请注意包含nans或值的计算结果,其中计算几何平均值可能会返回一个复数值(例如,负数的第4个根;这将返回nannumpy).

gmean当你调用item方法时,会把这样的计算变成0 .

例如,这就是为什么在2000-01-07和处有零2000-01-09.

2000-01-07大熊猫填写nan第二天(记住我们在2D这里做)所以几何平均值计算为ma.exp(ma.mean(ma.log([-1.156, nan]))).这两个值不是"有效"输入ma.log(因此它们被屏蔽)所以ma.mean()返回MaskedConstant_data属性为的0,因此其item方法返回0.