使用Python计算滚动平均值
我刚开始学习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.
有谁知道错误可能是什么?对不起,这是一个很长的脚本。我不知道如何缩短它。
第65行,条件更改为:
elif r > (len(table) - 5):
的问题是,你对上线73的列表的末尾迭代,你正设法在列表中的下一个5个数据点,但列表中只剩下4个数据点,因此您将索引超出列表的长度,因此引发异常。
如果你真的解释了为什么要这样做,最重要的是,这在计算滚动平均值的意义上意味着什么,那么这个答案可能很有用。 – 2013-05-13 02:26:40
请一次性代码,并重新开始使用这个问题的答案为基础: Rolling Average to calculate rainfall intensity
不是你的代码不能工作,但也没有必要写代码FORTAN在Python。我所链接的问题更好地利用了Python的功能,如果你通过这个工作,包括跟随Interpolate类Linear Interpolation - Python 问题的链接,那么你将为自己节省数不清的时间。
不需要自己犯所有的错误。首先模仿大师,然后自定义他们的技术以满足您的需求,并且在几年之内,您也将成为Python大师。
我同意这个原则,但我认为基于[pandas](http://pandas.pydata.org)的解决方案将比任何一个链接的答案更加强大和简单。 – DSM 2013-05-13 02:50:09
我同意,但这是堆栈溢出,人们来学习如何编写代码。一旦Amylee得到一些Python程序的工作,那么NumPy,PANDAS,HDF5等等的奇迹将值得探索。每个人都需要从某处开始,但在2013年使用Python时,该开始应该包括列表解析,with关键字等等。 – 2013-05-13 03:52:48
谢谢大家。我会试一试。这确实需要时间,因为我对编程语言不熟悉,特别是对Python不熟悉。上周才开始。 – Amylee 2013-05-13 04:35:43
知道哪一行是第73行会有帮助。 – 2013-05-13 02:18:48
我刚刚用#Line73标出了第73行。这是代码的最后一位。 – Amylee 2013-05-13 02:24:41