2014-07-10 2 views
0

.csv 파일에서 읽고 파싱 한 데이터 시리즈의 평균 True 범위를 계산하려고합니다. 다음과 같이 내 코드는 다음과 같습니다'float'명령문에 numpy를 사용하는 '__getitem__'속성이 없습니다.

나는 다음과 같은 오류 메시지가 무엇입니까 그러나
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

오류 메시지는 '[x]'로 색인하려고하는 'TR'에 대한 입력 중 하나가 숫자가 아니라 배열임을 나타냅니다. 'TR'을 사용하기 전에'for line in fhand :'블록이 원하는 값 (숫자 목록?)을 생성하는지 확인하십시오. 그 변수는 문자열 일 수 있습니다. – hpaulj

답변

1

작동하는 코드에서 높음 낮음과 닫기는 모든 배열이므로 날짜별로 색인 할 수 있습니다. 예를 들어 (나는 목록 대신 배열을 사용하지만 유사) :

hi = [10, 11, 12] 
print hi[0] 
# 10 

을 코드에서 당신이 그들을 버리고 다음이 값이 떠 변환, 파일 전체를 반복하고 있습니다. 다음은 간단한 예를 입증하는 것입니다 각각의 할당은 기존 x을 대체하고 새로운 float로 x을 설정

for value in ['10', '11', '12'] 
    x = float(value) 
print x 
# 12 

공지 사항. 마지막으로 x을 인쇄하면 할당 된 마지막 항목을 얻습니다. 모든 값을 저장하려면 텍스트 파일의 구문 분석을 다시 작성해야합니다. 아마도 다음과 같을 것입니다 :

+0

감사합니다. 각 개별 "열기, 높음, 낮음, 닫음, 날짜"를 별도의 배열 o = [], h = [], l = [] 등에 추가하도록 코드를 변경했습니다. 이제 그 행을 지나칠 수 있습니다. 행에서 "인덱스 범위를 벗어남"오류가 발생합니다.> 61 a [: window] = a [window]. 하지만 다른 페이지에 대한 질문입니다 ... 도움을 주셔서 대단히 감사합니다! – s666

관련 문제