我有一组像这样的元组:
timeseries_array = [
(datetime.datetime(2017, 4, 18, 16, 57, 21, 888778), 10),
(datetime.datetime(2017, 4, 18, 16, 57, 35, 712351), 36),
(datetime.datetime(2017, 4, 18, 16, 57, 46, 831850), 70),
(datetime.datetime(2017, 4, 18, 16, 58, 0, 255499), 52),
(datetime.datetime(2017, 4, 18, 16, 58, 11, 138477), 34),
(datetime.datetime(2017, 4, 18, 16, 58, 22, 902610), 44),
(datetime.datetime(2017, 4, 18, 16, 58, 38, 206132), 106),
(datetime.datetime(2017, 4, 18, 16, 58, 53, 624415), 81),
(datetime.datetime(2017, 4, 18, 16, 59, 6, 301157), 56),
]
每个元组都是(日期,值)。
一旦我们将新数据添加到此数组并且它是新分钟的数据,我想查看最后两分钟并比较他们的数据平均值。
因此,对于这个例子,一旦我们在第59分钟添加数据,我想找到在分钟58和分钟57内找到的数据的平均值,并比较两者。
分钟57的平均值为38.7,分钟58的平均值为63.4。
最好的办法是什么?也许我应该使用一个python库?
答案 0 :(得分:1)
这是一种方法:
from __future__ import division
def timeseries_averages(timeseries_array):
unique_minutes = set(m[0].minute for m in timeseries_array)
for v in unique_minutes:
print 'The average of the {} minute value is {}'.format(v, sum([m[1] for m in timeseries_array if m[0].minute == v])/len([m[1] for m in timeseries_array if m[0].minute == v]))
The average of the 57 minute value is 38.6666666667
The average of the 58 minute value is 63.4
The average of the 59 minute value is 56.0
答案 1 :(得分:1)
这是[itertools.groupby
] [1]的完美应用。当您向列表中添加值时,请保持已经看到的“高水位”分钟。当新的分钟值到达时,使用groupby
仅处理列表的最后部分(索引大于高水位线)以将列表分成块。在每个块上计算你想要的任何东西。
import datetime
import itertools
timeseries_array = []
timeseries_mark = len(timeseries_array)
last_minute = 57
for new_value in [
(datetime.datetime(2017, 4, 18, 16, 57, 21, 888778), 10),
(datetime.datetime(2017, 4, 18, 16, 57, 35, 712351), 36),
(datetime.datetime(2017, 4, 18, 16, 57, 46, 831850), 70),
(datetime.datetime(2017, 4, 18, 16, 58, 0, 255499), 52),
(datetime.datetime(2017, 4, 18, 16, 58, 11, 138477), 34),
(datetime.datetime(2017, 4, 18, 16, 58, 22, 902610), 44),
(datetime.datetime(2017, 4, 18, 16, 58, 38, 206132), 106),
(datetime.datetime(2017, 4, 18, 16, 58, 53, 624415), 81),
(datetime.datetime(2017, 4, 18, 16, 59, 6, 301157), 56),
# Minute 00
(datetime.datetime(2017, 4, 18, 17, 00, 1, 000), 33),
]:
minute = new_value[0].minute
if minute != last_minute:
tail = timeseries_array[timeseries_mark:]
advance = None
for m, group in itertools.groupby(tail, key=lambda tpl: tpl[0].minute):
values = list(group)
total = sum([tpl[1] for tpl in values])
avg = total / len(values)
print("Average at minute {} is {}".format(m, avg))
if advance is None:
advance = len(values)
if advance is None:
print("Advance is none. Why?")
else:
timeseries_mark += advance
last_minute = minute
timeseries_array.append(new_value)