Python 平均不同长度的时间序列

Python 平均不同长度的时间序列,python,numpy,scipy,Python,Numpy,Scipy,我有许多列表(时间序列) 我想对另一个进行平均: merged = {'m': [2.33,2.33,3.66,4.0,4.0]} 有没有聪明的方法找到这个 如果列表有不同的长度,我希望得到可用列表的平均值,或者假设所有列表都发生在同一时间范围内,尽管数据点的数量不同?鉴于您用numpy和scipy标记了它,我假设可以使用scientific python函数。完成第一项任务的简单方法是 $ ipython --pylab >>> dictionary = {'a': [1,

我有许多列表(时间序列)

我想对另一个进行平均:

merged = {'m': [2.33,2.33,3.66,4.0,4.0]}
有没有聪明的方法找到这个


如果列表有不同的长度,我希望得到可用列表的平均值,或者假设所有列表都发生在同一时间范围内,尽管数据点的数量不同?

鉴于您用numpy和scipy标记了它,我假设可以使用scientific 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”的字典中,并对结果进行四舍五入,以指定的形式获得结果

至于处理缺失值或不同长度的数组, 您首先需要决定如何处理丢失的数据。
你问第二个问题的方式感觉太模糊了。

一个简单的方法就是

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]}
对于较旧的Python3版本,用
sum(values)/len(values)
替换
statistics.mean
。对于Python2,您需要从未来导入分区
或使用
浮点(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.0和1.0

计算2是因为只有两个数组有第6个元素,它们的值是3和1,所以(3+1)/2=2


计算1是因为只有一个数组有第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]}

缩短为
np.asarray(dictionary.values()).mean(0)
,用于python 3需求列表或来自iter。谢谢,我一直在寻找类似的内容。关于不同的长度,如上面的答复中所述,我希望最终得到一个长度等于最大列表长度的数组。端点应始终相互映射,不同长度的数组应假定为con具有不同分辨率的连续信号。这有意义吗?我确信有数学工具用于此,但我不知道它们被称为什么。如果它们的长度不同,您对数据点的时间分布有何假设?是否“发生在同一时间帧内”假设第一个和最后一个数据点在所有时间序列中同时发生,其余数据点均匀分布?正确的解决方案将取决于这些假设。事实上,我假设第一个和最后一个数据点在所有时间序列中同时发生,其余数据点均匀分布。
[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]
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]}