声明给予'浮动'对象没有属性' __ getitem __'使用numpy的错误

时间:2014-07-10 15:14:45

标签: python-2.7 numpy

我正在尝试计算已从.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

1 个答案:

答案 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))