第一次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
答案 0 :(得分: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]
您可以使用enumerate
获取(基于1的)索引:
>>> 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]
或者在Python 3.4中使用statistics
,或者在3.1-3.3中使用其后端/前任stats
:
>>> 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]
答案 1 :(得分: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))
答案 2 :(得分: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)
使用累积系列是一种非常有用的方法来处理系列的部分和。
答案 3 :(得分:0)