使用python计算滚动平均值

时间:2013-05-13 02:14:17

标签: python

我刚开始学习python。我用它写一个脚本来计算盐流入滚动平均值。我有这样的数据

Date    A4260502_Flow   A4261051_Flow   A4260502_EC A4261051_EC
25/02/1970  1304    0   411 0   1304            
26/02/1970  1331    0   391 0   1331            
27/02/1970  0   0   420 411 0           
28/02/1970  0   0   400 391 0           
1/03/1970   0   0   0   420 0           
2/03/1970   1351    1304    405 400 1327.5      
3/03/1970   2819    1331    415 405 2075        
4/03/1970   2816    0   413 0   2816            
5/03/1970   0   1351    0   415 1351            
6/03/1970   0   0   0   0   0           
7/03/1970   0   2819    0   413 2819            
8/03/1970   0   0   0   0   0           
9/03/1970   0   2816    0   412 2816

我的剧本是

inputfilename = "output.csv"
outputfilename = "SI_calculation.csv"

# Open files
infile = open(inputfilename,"r+")
outfile = open(outputfilename,'w')

# Initialise variables  
EC_conversion = 0.000525
rolling_avg = 5
flow_avg_list = []
SI_list = []
SI_ra_list = []
SI_ra1 = []

# Import module
import csv
import numpy                 #L20


table = []
reader = csv.reader(infile)         #read
for row in csv.reader(infile):
    table.append(row)
infile.close()

for r in range(1,len(table)):        
    for c in range(1,len(row)): #l30
        table[r][c] = float(table[r][c])


#Calculating flow average
for r in range(1,len(table)):

    flow1 = table[r][1]
    flow2 = table[r][2]
    if flow1 == 0.0:                 
        flow_avg = flow2            #l40
    elif flow2 == 0.0:
        flow_avg = flow1
    else:
        flow_avg = (flow1+flow2)/2
    flow_avg_list.append(flow_avg)

#Calculating salt inflow
for r in range(1,len(table)):
    s1 = table[r][3]                               
    s2 = table[r][4]        #l50
    if s1 == 0.0 or s2 == 0.0 or flow_avg_list[r-1] == 0.0:
        SI = 0.0
    else:
        SI = EC_conversion*flow_avg_list[r-1]*(s2-s1)
    SI_list.append(SI)
print SI_list    

#Calculating rolling average salt inflow
for r in range(1,len(table)):                 
    if r < 5:       #rolling-avg = 5
        for i in range(0,r+5):      #l60
            S = SI_list[i]
            SI_ra1.append(S)
        SI_ra = numpy.mean(SI_ra1)
        SI_ra_list.append(SI_ra)
    elif r > (len(table) - 4):
        for i in range(r-5,len(table)-1):
            S = SI_list[i]
            SI_ra1.append(S)
        SI_ra = numpy.mean(SI_ra1)
        SI_ra_list.append(SI_ra)    #l70
    else:
        for i in range(r-5,r+5):
            S = SI_list[i]       #Line 73
            SI_ra1.append(S)
        SI_ra = numpy.mean(SI_ra1)
        SI_ra_list.append(SI_ra)
print SI_ra_list

当我运行脚本时,它给了我错误:Line 73: list index out of range.有谁知道错误是什么?对不起,这是一个很长的脚本。我不知道如何缩短它。

2 个答案:

答案 0 :(得分:2)

在第65行,将条件更改为:

elif r > (len(table) - 5):

问题是当您在第73行的列表末尾迭代时,您正试图获取列表中的下5个数据点,但列表中只剩下4个数据点,因此您的索引超出了长度列表,因此抛出异常。

答案 1 :(得分:2)

请丢弃您的代码并重新开始使用此问题的答案作为基础: Rolling Average to calculate rainfall intensity

不是说您的代码无法正常工作,而是不需要在Python中编写Fortan代码。我链接到的问题更好地利用了Python功能,如果您解决了这个问题,包括使用Interpolate类Linear Interpolation - Python跟进问题的链接 那么你将拯救自己无数个小时的挣扎。

不需要自己犯下所有错误。首先模仿大师,然后根据自己的需要定制他们的技术,几年后,你也将成为Python的大师。