Python:移动平均和空间划分

时间:2014-03-19 21:00:49

标签: python io average

我正在试图找出一组预测的平均值(我的模型创建的0到1之间的值。但是,预测值会移动,如果有10个数据值,则预测会在一套三个像这样:

0.6825 0.7022 0.7023
0.6193 0.6410 0.6389
0.5934 0.6159 0.6145
0.5966 0.6191 0.6184
0.3331 0.3549 0.3500
0.1862 0.2015 0.1999
0.1165 0.1270 0.1267
0.1625 0.1761 0.1740

其中这些值对应的索引如下:

1   2   3
2   3   4
3   4   5
4   5   6
5   6   7
6   7   8
7   8   9
8   9   10

我正在尝试编写一个脚本,以便逐行读取输入并输出适合每个索引的平均预测值(平均两个二,三个,三个四等)这样每行就有一个:

0.6825
0.7001
etc...

但是,我不确定如何读取数据,以便我能够区分第1行中的0.6825和0.7022。我如何读取信息,以便我能够将它存储在一个连续的数组中?

就逻辑而言,我认为我可以为第一个,第二个,最后一个和倒数第二个值设置特殊情况,并为其余值运行循环。

2 个答案:

答案 0 :(得分:2)

def linereader(fName):
    with open(fName) as f:
        for line in f:
            yield map(float, line.split())


result = []
data = []
for i, line in enumerate(linereader('values.txt')):
    data.append(line)
    if i == 0:
        result.append(data[0][0])
    elif i == 1:
        result.append((data[0][1] + data[1][0])/2)
    else:
        result.append((data[i-2][2] + data[i-1][1] + data[i][0])/3)

result.append((data[-2][2] + data[-2][1])/2)
result.append(data[-1][2])

print result
#[0.6825, 0.66075, 0.6455666666666667, 0.6171333333333333, 0.5222333333333333, 0.3865, 0.22266666666666668, 0.16313333333333332, 0.12685000000000002, 0.174]

答案 1 :(得分:1)

我会这样做:

  • 首先将值汇总到index:values字典(使用defaultdict
  • 然后创建一个新字典,其中平均值是该字典中的值的平均值

例如:

from collections import defaultdict
from pprint import pprint

aggregated = defaultdict(list)

with open('predictions.txt') as data:
    for i, line in enumerate(data, start=1):
        values = [float(v) for v in line.split()]
        for offset, value in enumerate(values):
            index = i + offset
            aggregated[index].append(value)


averaged = {}

for index, values in aggregated.items():
    averaged[index] = sum(values) / float(len(values))

pprint(averaged)

输出:

{1: 0.6825,
 2: 0.66075,
 3: 0.6455666666666667,
 4: 0.6171333333333333,
 5: 0.5222333333333333,
 6: 0.3865,
 7: 0.22266666666666668,
 8: 0.16313333333333332,
 9: 0.1514,
 10: 0.174}

另请参阅defaultdictenumerate

的文档