我公司擁有一批名單(時間序列)平均時間序列長度不同
dictionary = {'a': [1,2,3,4,5], 'b': [5,2,3,4,1], 'c': [1,3,5,4,6]}
,我想以平均另一個的:
merged = {'m': [2.33,2.33,3.66,4.0,4.0]}
有沒有發現這是一個聰明的辦法?
如果列表的長度不同,我想從可用的平均值或假裝所有列表發生在同一時間範圍內,儘管數據點數量不同?
我公司擁有一批名單(時間序列)平均時間序列長度不同
dictionary = {'a': [1,2,3,4,5], 'b': [5,2,3,4,1], 'c': [1,3,5,4,6]}
,我想以平均另一個的:
merged = {'m': [2.33,2.33,3.66,4.0,4.0]}
有沒有發現這是一個聰明的辦法?
如果列表的長度不同,我想從可用的平均值或假裝所有列表發生在同一時間範圍內,儘管數據點數量不同?
鑑於你用numpy和scipy標記了這個,我假設可以使用科學的python函數。完成第一個任務一個簡潔的辦法就是再
$ ipython --pylab
>>> dictionary = {'a': [1,2,3,4,5], 'b': [5,2,3,4,1], 'c': [1,3,5,4,6]}
>>> map(mean, np.array(dictionary.values()).transpose())
[2.3333333333333335, 2.3333333333333335, 3.6666666666666665, 4.0, 4.0]
你當然也可以把這個變成一個字典,鍵「m」和四捨五入的結果,得到的結果在您指定的形式。
至於處理丟失的值或不同長度的數組, 您首先需要決定如何處理丟失的數據。 你問第二個問題的方式太模糊了。
縮短爲'np.asarray(dictionary.values())。mean(0)',對於python 3需要list或from_iter。 – user333700
謝謝,我正在尋找這樣的事情。關於不同的長度,正如在上面的回覆中提到的,我想最終得到一個長度等於最大列表長度的數組。端點應該總是相互映射,並且不同長度的數組應該被假定爲具有不同分辨率的連續信號。那有意義嗎?我確信有這樣的數學工具,但我不知道他們叫什麼。 – frogpool
的漂亮數據的簡單方法就是
from statistics import mean
dictionary = {'a': [1,2,3,4,5], 'b': [5,2,3,4,1], 'c': [1,3,5,4,6]}
merged = {'m': [mean(values) for values in zip(*dictionary.values())]}
merged
#>>> {'m': [2.3333333333333335, 2.3333333333333335, 3.6666666666666665, 4.0, 4.0]}
對於老的Python 3版本,與sum(values)/len(values)
更換statistics.mean
。對於Python 2,您需要from __future__ import division
或使用float(len(values)
。
如果你想線性插值,這是相當容易的事:
from statistics import mean
import numpy
dictionary = {'a': [1,2,3,4,5], 'b': [5,2,3,1], 'c': [1,3,5,4,6]}
def interpolate_many(lists):
maxlen = max(map(len, lists))
interpolation_target = numpy.linspace(0, 1, maxlen)
for lst in lists:
x_values = numpy.linspace(0, 1, len(lst))
yield numpy.interp(interpolation_target, x_values, lst)
interpolated = interpolate_many(dictionary.values())
merged = {'m': [mean(values) for values in zip(*interpolated)]}
merged
#>>> {'m': [2.3333333333333335, 2.5833333333333335, 3.5, 3.5, 4.0]}
這一切確實是前處理的列表,以便短的人已經發揮到了最大長度(maxlen
,可如果被改變你希望)。然後它運行之前的代碼。
以下代碼根據找到的元素數量對數組進行平均。
dictionary = {'a': [1,2,3,4,5], 'b': [5,2,3,4,1], 'c': [1,3,5,4,6]}
mergerd = {'m': []}
i = 0
count = 0
num = len(dictionary)
while True:
mergerd['m'].append(0)
for key in dictionary: #for each entry in the dictionary
if (len(dictionary[key]) <= i): #if the list for that entry doesn't have a element
continue
mergerd['m'][i] += dictionary[key][i]
count += 1
if count == 0: #if there were no more elements
mergerd['m'].pop()
break
mergerd['m'][i] = mergerd['m'][i]/count
count = 0
i += 1
print(mergerd['m'])
產生以下輸出
[2.3333333333333335, 2.3333333333333335, 3.6666666666666665, 4.0, 4.0]
if dictionary was equal to {'a': [1,2,3,4,5,3], 'b': [5,2,3,4,1,1,1], 'c': [1,3,5,4,6]}
# then the following would be output
[2.3333333333333335, 2.3333333333333335, 3.6666666666666665, 4.0, 4.0, 2.0, 1.0]
到合併完畢數組的最後兩個元件是2.0和1.0
2,因爲僅存在兩個陣列具有一個第六元件被加工出來,它們的值是3和1,所以(3 + 1)/ 2 = 2
因爲只有一個具有第7個元素的數組,所以它的值爲1,所以1/1 = 1
您可以使用基本的列表理解:
import numpy
dictionary = {'a': [1,2,3,4,5], 'b': [5,2,3,4,1], 'c': [1,3,5,4,6]}
vals = [dictionary.values()[i][j] for j in range(5) for i in range(3)]
vals = [vals[i:i+3] for i in range(0, len(vals), 3)]
merged = {}
merged['m'] = [numpy.mean(item) for item in vals)]
print merged #{'m': [2.3333333333333335, 2.3333333333333335, 3.6666666666666665, 4.0, 4.0]}
在它們的長度不同的情況下,你認爲對的數據點在時間上的分佈是什麼?是否「在同一時間段內發生」假設第一個和最後一個數據點在所有時間序列中同時發生,其餘均勻分佈?正確的解決方案將取決於這些假設。 – Jsl
事實上,我假設第一個和最後一個數據點在所有時間序列中同時發生,其餘的均勻分佈。 – frogpool