我正在尝试计算已从.csv文件中读取和解析的数据系列的平均真实范围。我的代码如下:
import datetime
import time
import matplotlib.pyplot as plt
import numpy as np
fhand = open('C:\Users\Stuart\Desktop\FX Programming\EURUSD_hour.csv', 'r')
for line in fhand:
line = line.split(',')
fxpair, _date, _time, _open, _high, _low, _close = line[0], line[1], line[2], line[3], float(line[4]), float(line[5]), float(line[6])
date_time = datetime.datetime.strptime('{} {}'.format(_date.partition(' ')[0], _time),'%Y%m%d %H:%M:%S')
#define Average True Range function
def TR(d,c,h,l,o,yc):
x = h-l
y = abs(h-yc)
z = abs(l-yc)
print x
print y
print z
if y <= x >= z:
TR = x
elif x <= y >= z:
TR = y
elif x <= z >= y:
TR = z
print d, TR
return d, TR
x = 1
TRDates = []
TrueRanges = []
while x < len(_date):
TRDate, TrueRange = TR(_date[x],_close[x],_high[x],_low[x],_open[x],_close[x-1])
TRDates.append(TRDate)
TrueRanges.append(TrueRange)
x+=1
def ExpMovingAverage(values, window):
weights = np.exp(np.linspace(-1., 0., window))
weights /= weights.sum()
a = np.convolve(values, weights, mode='full')[:len(values)]
a[:window] = a[window]
return a
print len(TrueRanges)
ATR = ExpMovingAverage(TrueRanges,14)
print ATR
但是我收到以下错误消息:
46 while x < len(line):
---> 47 TRDate, TrueRange = TR(_date[x],_close[x],_high[x],_low[x],_open[x],_close[x-1])
48 TRDates.append(TRDate)
49 TrueRanges.append(TrueRange)
TypeError: 'float' object has no attribute '__getitem__'
因此,while语句显然有问题,并且它不会像我想要的那样迭代_date。 我也尝试过使用date_time而不是_date,但后来我得到了:
---> 46 while x < len(date_time):
47 TRDate, TrueRange = TR(date_time[x],_close[x],_high[x],_low[x],_open[x],_close[x-1])
48 TRDates.append(TRDate)
TypeError: object of type 'datetime.datetime' has no len()
有人可以帮我解决这个问题吗?
我有一个非常类似的代码,我在下面粘贴了实际可行的代码,它使用不同的文本文件作为数据并以不同的方式解压缩。有人可以帮助我调和这两个,以便顶级代码有效吗?
import numpy as np
sampleData = open('C:\\Users\\Stuart\\Desktop\\FX Programming\\sampleData.txt','r').read()
splitData = sampleData.split('\n')
date,closep,highp,lowp,openp,volume = np.loadtxt(splitData, delimiter=',',unpack=True)
def TR(d,c,h,l,o,yc):
x = h-l
y = abs(h-yc)
z = abs(l-yc)
print x
print y
print z
if y <= x >= z:
TR = x
elif x <= y >= z:
TR = y
elif x <= z >= y:
TR = z
print d, TR
return d, TR
x = 1
TRDates = []
TrueRanges = []
while x < len(date):
TRDate, TrueRange = TR(date[x],closep[x],highp[x],lowp[x],openp[x],closep[x-1])
TRDates.append(TRDate)
TrueRanges.append(TrueRange)
x+=1
################
def ExpMovingAverage(values, window):
weights = np.exp(np.linspace(-1., 0., window))
weights /= weights.sum()
a = np.convolve(values, weights, mode='full')[:len(values)]
a[:window] = a[window]
return a
print len(TrueRanges)
ATR = ExpMovingAverage(TrueRanges,14)
print ATR
答案 0 :(得分:1)
在有效的代码中,high low和close都是数组,因此您可以按日期索引它们。例如(我使用的是列表而不是数组,但它类似):
hi = [10, 11, 12]
print hi[0]
# 10
在您的代码中,您循环遍历文件,将这些值转换为浮动然后丢弃它们。这是一个简单的例子来说明:
for value in ['10', '11', '12']
x = float(value)
print x
# 12
请注意,每个分配都会替换现有的x
,并将x
设置为新的float。当您最终打印x
时,您将获得分配给它的最后一件事。您需要重写文本文件的解析以保存所有值。也许是这样的:
x = []
for value in ['10', '11', '12']
x.append(float(value))