我認爲問題的定義非常簡單,但我正在尋找適合於非常大型數據集(20億以上)的解決方案。Python:將時間序列數據平均到給定時間段的箱子中
我有兩個列表:stamps
包含N
時間戳和values
包含N
標量值。
我可以很容易地繪製這些數據有時間序列圖。
現在我想將values
的平均值放入1分鐘長的箱子中(我通常每分鐘有50個值,但有些是空的)。空值導致空箱應該使該箱的平均值等於零。
我怎樣纔能有效地做到這一點與最少的代碼?
我認爲問題的定義非常簡單,但我正在尋找適合於非常大型數據集(20億以上)的解決方案。Python:將時間序列數據平均到給定時間段的箱子中
我有兩個列表:stamps
包含N
時間戳和values
包含N
標量值。
我可以很容易地繪製這些數據有時間序列圖。
現在我想將values
的平均值放入1分鐘長的箱子中(我通常每分鐘有50個值,但有些是空的)。空值導致空箱應該使該箱的平均值等於零。
我怎樣纔能有效地做到這一點與最少的代碼?
minute_bins = {}
averages = {}
for i in range(len(values)):
# Integer division
minute = stamps[i] // 60
if minute in minute_bins:
minute_bins[minute].append(values[i])
else:
minute_bins[minute] = [values[i]]
for key in minute_bins:
minute_values = minute_bins[key]
averages[key] = float(sum(minute_values))/len(minute_values)
假設你有一個數字形式的時間戳。我使用time.time()
來測試我的代碼,但任何兩個時間戳間隔相差1秒的格式都應該這樣做。
我有我的時間戳作爲'datetime.datetime'對象,所以'stamp.timestamp()'應該做的。非常感謝! –
塞德里克。由於您的數據集非常大,我認爲您需要一個解決方案,不需要將所有值讀入列表中,然後再對其進行平均。我會使用一個簡單的平均值的類,計算平均運行,是這樣的:
import collections
class averager(object):
def __init__(self):
self.avg = 0
self.n = 0
def add(self, x):
self.avg = ((self.avg * self.n) + x)/(self.n + 1)
self.n += 1
d = collections.defaultdict(averager)
for timestamp, value in zip(stamps, values):
d[timestamp // 60].add(value)
for k in sorted(list(d.keys())):
print(k, d[k].avg, sep="\t")
你的問題似乎也適合於並行處理 - 分割你的數據集成塊,計算並行運行的每個塊的平均值,然後將平均值平均在一起。
希望這會有所幫助。
我會嘗試在問題儘快發佈初始部分解決方案。 –
你想用空值完成什麼?將它們視爲0,仍然平均超過50?或平均超過(數量每個bin - 空數量)? – Simon
空值導致空箱應該使該箱的平均值等於零。 –