2013-05-13 295 views
0

我剛開始學習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.有誰知道錯誤可能是什麼?對不起,這是一個很長的腳本。我不知道如何縮短它。

+1

知道哪一行是第73行會有幫助。 – 2013-05-13 02:18:48

+0

我剛剛用#Line73標出了第73行。這是代碼的最後一位。 – Amylee 2013-05-13 02:24:41

回答

2

第65行,條件更改爲:

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

的問題是,你對上線73的列表的末尾迭代,你正設法在列表中的下一個5個數據點,但列表中只剩下4個數據點,因此您將索引超出列表的長度,因此引發異常。

+0

如果你真的解釋了爲什麼要這樣做,最重要的是,這在計算滾動平均值的意義上意味着什麼,那麼這個答案可能很有用。 – 2013-05-13 02:26:40

2

請一次性代碼,並重新開始使用這個問題的答案爲基礎: Rolling Average to calculate rainfall intensity

不是你的代碼不能工作,但也沒有必要寫代碼FORTAN在Python。我所鏈接的問題更好地利用了Python的功能,如果你通過這個工作,包括跟隨Interpolate類Linear Interpolation - Python 問題的鏈接,那麼你將爲自己節省數不清的時間。

不需要自己犯所有的錯誤。首先模仿大師,然後自定義他們的技術以滿足您的需求,並且在幾年之內,您也將成爲Python大師。

+0

我同意這個原則,但我認爲基於[pandas](http://pandas.pydata.org)的解決方案將比任何一個鏈接的答案更加強大和簡單。 – DSM 2013-05-13 02:50:09

+0

我同意,但這是堆棧溢出,人們來學習如何編寫代碼。一旦Amylee得到一些Python程序的工作,那麼NumPy,PANDAS,HDF5等等的奇蹟將值得探索。每個人都需要從某處開始,但在2013年使用Python時,該開始應該包括列表解析,with關鍵字等等。 – 2013-05-13 03:52:48

+0

謝謝大家。我會試一試。這確實需要時間,因爲我對編程語言不熟悉,特別是對Python不熟悉。上週纔開始。 – Amylee 2013-05-13 04:35:43