从创建列表中的平均运行

问题描述 投票:0回答:4

第一次Python的用户,我很失落。我需要从显示的日平均气温和平均运行温度可达那天列表中创建一个表。

xData = arange(1,32)    
tData = [86,87,84,86,86,86,84,83,90,89,88,85,86,79,83,81, \
     75,80,81,85,81,88,89,87,84,85,86,88,88,90,90]
avg = [86.]  # First value for monthly avg high temp is just the Day 1 temp
python moving-average
4个回答
5
投票

移动平均值就是,在列表中的每个值,平均所有值最多的那一个。为了您的例子的精简版本:

>>> tData = [86,87,84,86]

移动平均是86/1(86+87)/2(86+87+84)/3(86+87+84+86)/4

因此,每个索引处,运行平均值是运行总计,由(索引+ 1)除以。

你可以用accumulate的运行总计:

>>> list(accumulate(tData))
[86, 173, 257, 343]

你可以得到(1型)与enumerate指标:

>>> list(enumerate(accumulate(tData, start=1))
[(1, 86), (2, 73), (3, 257), (4, 343)]

所以,仅仅划分:

>>> [total / index for index, total in enumerate(accumulate(tData, start=1))]
[86.0, 86.5, 85.66666666666667, 85.75]

或使用statistics在Python 3.4,或者其反向移植/前身为stats 3.1-3.3:

>>> from stats import running_average
>>> running_average(tData)
[86, 86.5, 85.66666666666667, 85.75]

当然,你总是可以做到这一点明确的,如果你喜欢:

>>> running_sum, running_sums = 0, []
>>> for value in tData:
...     running_sum += value
...     running_sum.append(running_sum)
>>> [value / index for index, value in enumerate(running_sums, start=1)]
[86, 86.5, 85.66666666666667, 85.75]

… 甚至:

>>> running_sum, running_averages = 0, []
>>> for index, value in enumerate(tData, start=1):
...     running_sum += value
...     running_averages.append(running_sum / index)
>>> running_averages
[86, 86.5, 85.66666666666667, 85.75]

0
投票

我想这个去:

def runningAvgs(data):
    avg = data[0]
    for i, d in enumerate(data[1:], start=1):
        yield avg
        avg = ((i * avg) + d) / (i + 1.0)
    yield avg

tData = [86,87,84,86,86,86,84,83,90,89,88,85,86,79,83,81, \
     75,80,81,85,81,88,89,87,84,85,86,88,88,90,90]

print list(runningAvgs(tData))

0
投票

这里是另一种方式来做到这一点:

def cumSeries(series):
    result = [0]
    for s in series:
        result.append(s + result[-1])
    return result

def runningAvg(series):
    cs = cumSeries(series)
    return [(cs[i] - cs[0]) / float(i) for i in range(1, len(cs))]


tData = [86,87,84,86,86,86,84,83,90,89,88,85,86,79,83,81, \
     75,80,81,85,81,88,89,87,84,85,86,88,88,90,90]

print runningAvg(tData)

用累加系列是在一系列的部分资金工作的一个非常有用的方式。


0
投票

这里有一个办法做到这一点使用itertoolsoperators

from itertools import starmap, accumulate
from operator import add

def moving_average(data):
   moving_sum = enumerate(accumulate(data, add)), start=1)
   return starmap(lambda index, elem: elem / index, moving_sum)
© www.soinside.com 2019 - 2024. All rights reserved.