不规则时间序列的值与连续记录的时间差成正比

时间:2019-09-15 09:45:14

标签: python time-series

要在不规则的时间间隔上创建时间序列模型。数据看起来像:

时间|值

5/1/2018 1:45:00 | 10

5/1/2018 1:50:00 | 20

5/1/2018 2:00:00 | 25

5/1/2018 2:30:00 | 35

5/1/2018 2:45:00 | 20

5/1/2018 3:45:00 | 40

5/1/2018 3:46:00 | 2

存在的值与连续行的时间间隔成正比,即连续行之间的时间差越大,该值越大。例如,在1:45:00到1:50:00之间,客户购买了20种产品;在3:45:00到3:46:00之间,客户仅购买了2种产品。

我想用线性插值对不规则时间序列进行正则化。

我所知道的是绝对值数据,可以通过以下代码进行转换:

ts = traces.TimeSeries([
    (datetime(1992, 8, 27, 7, 46, 48), 28.0),
    (datetime(1992, 8, 27, 8, 0, 48), 28.2),
    ...
    (datetime(1992, 8, 27, 9, 3, 48), 30.0),
])

ts.sample(
    sampling_period=timedelta(minutes=15),
    start=datetime(1992, 8, 27, 8),
    end=datetime(1992, 8, 27, 9),
    interpolate='linear',
)

如何修改它并将其用于上述我的特定数据。

1 个答案:

答案 0 :(得分:0)

这不是完整的答案,而是开始对输入数据进行条件处理...

以小时为单位的时间应该可以进行每小时单位的内插/外推。

基本上,程序将输入转换为由日期时间对象和值组成的元组列表,例如

[(datetime.datetime(2018, 5, 1, 1, 45), 10), (datetime.datetime(2018, 5, 1, 1, 50), 20), (datetime.datetime(2018, 5, 1, 2, 0), 25), ...]

然后可以在元组之间进行比较。

import datetime

time_observations = []

with open('input.txt', 'rt') as f:

    for line in f:
        try:
            _time, _val = line.split('|')
            _time = datetime.datetime.strptime(_time.strip(), '%m/%d/%Y %H:%M:%S')
            time_observations.append((_time, int(_val)))

        except ValueError:
            pass

for i in range(len(time_observations) - 1):
    time_1 = time_observations[i][0].timestamp()
    time_2 = time_observations[i+1][0].timestamp()
    time_difference = (datetime.timedelta(seconds=time_2) -
                       datetime.timedelta(seconds=time_1))
    print(f'{time_observations[i+1][1]} items in {time_difference.seconds/3600:.2f} hours')

结果:

20 items in 0.08 hours
25 items in 0.17 hours
35 items in 0.50 hours
20 items in 0.25 hours
40 items in 1.00 hours
2 items in 0.02 hours

首先将所有输入内容放入文件input.txt中。