问题:
我有一个具有不规则间隔的timeseries数据集,我希望计算每个规则时间间隔的平均值。
用Python做这件事的最好方法是什么?
示例:
下面是一个简化的数据集,作为Pandas系列:
base = pd.to_datetime('2021-01-01 12:00')
mydict = {
base: 5,
base + timedelta(minutes=5): 10,
base + timedelta(minutes=7): 12,
base + timedelta(minutes=12): 6,
base + timedelta(minutes=25): 8
}
series = pd.Series(mydict)
返回:
2021-01-01 12:00:00 5
2021-01-01 12:05:00 10
2021-01-01 12:07:00 12
2021-01-01 12:12:00 6
2021-01-01 12:25:00 8
我的解决方案:
我想把这个重采样到15分钟的间隔,然后取平均值。我可以先重采样到非常小的间隔(秒),然后重采样到15分钟:
series.resample('S').ffill().resample('15T').mean()
返回:
2021-01-01 12:00:00 8.200000
2021-01-01 12:15:00 6.003328
在取样到所需的间隔之前,先重采样到一个小的间隔,这感觉不像毕多诺。而且我预计,对于需要高精度的大型数据集,它也会变得非常慢。有更好的方法吗?
P.S.,如果您想知道:如果您立即重采样到15分钟,您将无法得到预期的结果:
series.resample('15T').mean()
返回:
2021-01-01 12:00:00 8.25
2021-01-01 12:15:00 8.00
发布于 2021-11-01 10:52:35
如果数据中的时间戳表示间隔之间的断点,则数据描述一个step函数。您可以使用一个名为楼梯的包,它构建在pandas
和numpy
的基础上,用于使用step函数进行分析。
使用您提供的设置代码,从staircase.Stairs
创建一个series
对象。这些对象将step函数表示为staircase
,Series
表示为pandas
。
import staircase as sc
sf = sc.Stairs.from_values(initial_value=0, values=series)
对于楼梯对象,你可以做很多事情,包括绘图。
sf.plot(style="hlines")
然后创建15分钟的回收箱,如
bins = pd.date_range(base, periods=5, freq="15min")
bins
看起来像这样
DatetimeIndex(['2021-01-01 12:00:00', '2021-01-01 12:15:00',
'2021-01-01 12:30:00', '2021-01-01 12:45:00',
'2021-01-01 13:00:00'],
dtype='datetime64[ns]', freq='15T')
接下来,我们把分步函数和回收箱分成几个部分,然后取平均值。这类似于熊猫群对数据的应用。
means = sf.slice(bins).mean()
means
是一个pandas.Series
,它由带有平均值的回收箱( pandas.IntervalIndex
)索引。
[2021-01-01 12:00:00, 2021-01-01 12:15:00) 8.200000
[2021-01-01 12:15:00, 2021-01-01 12:30:00) 6.666667
[2021-01-01 12:30:00, 2021-01-01 12:45:00) 8.000000
[2021-01-01 12:45:00, 2021-01-01 13:00:00) 8.000000
dtype: float64
如果您只想将间隔的起点作为索引,那么可以这样做。
means.index = means.index.left
或者类似地,使用端点。如果要将这些数据输入到ML算法中,则使用端点来避免数据泄漏。
摘要
import staircase as sc
sf = sc.Stairs.from_values(initial_value=0, values=series)
bins = pd.date_range(base, periods=5, freq="15min")
means = sf.slice(bins).mean()
注意:我是楼梯的创造者。如果您有任何反馈或问题,请随时与您联系。
https://stackoverflow.com/questions/69795625
复制相似问题