2013-05-13 3 views
0

저는 방금 파이썬을 배우기 시작했습니다. 소금 유입 평균을 계산하는 스크립트를 작성하는 데 사용하고 있습니다. 그파이썬을 사용하여 롤링 평균을 계산합니다.

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. 사람이 오류가 될 수있는 것을 알고 있나요을? 죄송합니다. 이것은 긴 스크립트입니다. 나는 그것을 단축하는 방법을 모른다. 라인 (65)에

+1

어떤 줄이 73 줄인지 아는 것이 도움이 될 것입니다. –

+0

# 73 행을 # Line73으로 표시했습니다. 이것은 코드의 마지막 부분에 있습니다. – Amylee

답변

2

는,로 조건을 변경

당신이 라인 73의 목록의 끝으로 반복과 같은 문제가
elif r > (len(table) - 5): 

, 당신은 목록에서 다음 5 개 데이터 포인트를 얻기 위해 노력하고 있습니다 만, 목록에 남은 데이터 포인트는 4 개 뿐이므로 목록의 길이를 초과하여 인덱싱하므로 예외가 발생합니다.

+0

그 대답은 실제로 왜 그렇게하고 싶은지를 설명하고 가장 중요한 것은 롤링 평균을 계산할 때 그 의미가 무엇인지 설명하는 경우 유용 할 수 있습니다. –

2

코드를 모함과 도심이 질문에 대한 답변을 사용하여 시작하십시오 Rolling Average to calculate rainfall intensity

이 코드가 작동하지 않을 수 없음,하지만 파이썬에서 Fortan 코드를 작성할 필요가 없습니다. 제가 링크 된 질문은 파이썬 기능을보다 잘 사용하게하고, 인터폴레이션 클래스 Linear Interpolation - Python 을 사용하여 질문에 대한 링크를 따라 가면서 작업한다면, 고생 할 시간을 절약 할 수 있습니다.

모든 실수를 스스로 할 필요가 없습니다. 마스터를 모방하여 시작한 다음 필요에 맞게 기술을 사용자 정의하고 몇 년 안에 파이썬의 마스터가 될 것입니다.

+0

나는 원칙에 동의하지만, 나는 [pandas] (http://pandas.pydata.org) 기반 솔루션이 연결된 대답보다 강력하고 쉽다고 생각한다. – DSM

+0

나는 동의한다. 그러나 사람들이 코드를 작성하는 법을 배우기 위해 스택 오버 플로우가 발생한다. Amylee이 파이썬 프로그램을 작동 시키면 NumPy, PANDAS, HDF5 등의 경이로움을 탐구 할 가치가 있습니다. 누구나 어딘가에서 시작해야하지만, 파이썬을 사용하는 2013 년에는 시작 부분에 목록 내장과 with 키워드 등이 포함되어야합니다. –

+0

감사합니다. 나는 그것을 시도 할 것이다. 특히 파이썬뿐만 아니라 프로그래밍 언어에 익숙하지 않아서 시간이 걸립니다. 지난주에야 시작 했어. – Amylee

관련 문제