2017-12-29 23 views
2

컨텍스트 : 주식 거래 전략 백 테스터를 구축 중입니다. OHLCV 데이터가 포함 된 2446 개의 CSV가 있습니다. 각 CSV는 데이터의 1 거래일입니다. 퍼포먼스가 문제가 된 후에도이 파일들을 약 140 만 줄의 단일 CSV로 연결했습니다. 나중에 그 이상.격렬하게 변화하는 판다의 데이터 프레임리스트 반복의 성능

개발 초기에는 pd.read_csv를 사용하여 각 파일을 한 번에 하나씩 읽고 각 데이터 프레임을 목록에 추가했습니다. 그런 다음 데이터 프레임 목록에서 시뮬레이션을 실행합니다. 이 기술을 사용하여 시뮬레이션 자체 만 ~ 97 초 걸립니다.

all_days = [] 
for file in (os.listdir("C:/Users/XYZ/Desktop/EURUSD/CSV")): 
    all_days.append(pd.read_csv("C:/Users/XYZ/Desktop/EURUSD/CSV/"+file)) 

나는 빠르게 실행하기 위해 전체 프로그램을 원했다. 그래서 저는 하나의 CSV를 만들고 groupby를 사용하여 매일 데이터를 분리했습니다. 물론, 데이터 프레임 목록 작성은 훨씬 빠릅니다. 그러나 여기에 내가 루프를 던져 버릴 곳이있다 : 시뮬레이션이 상당히 느려졌다.과 마찬가지로 데이터 프레임 목록을 여전히 수신하고 있더라도 시뮬레이션에는 ~ 172 초 이 필요합니다. 또한 시뮬레이션이 똑같은 결과를 산출한다는 점도 주목할 가치가 있습니다.

df = pd.read_csv("C:/Users/XYZ/Desktop/EURUSD/Concatenated CSVs/EURUSD.csv", 
index_col=0,parse_dates=True) 
df['Time'] = pd.to_datetime(df['Time']) 

all_days = [] 
for each in df.groupby(pd.Grouper(key='Time',freq='D')): 
    if each[1].empty is False: 
     all_days.append(each[1]) 

성능이 저하 될 수있는 요인은 무엇입니까?

+0

좋아, 내가 뭔가있을 것 같아. 두 번째 코드 블록의 for 루프 내에서 목록에 추가하기 전에 데이터 프레임의 인덱스를 재설정하면 시뮬레이션 실행 시간이 ~ 172 초에서 ~ 82 초로 단축되었습니다. 팬더 스 전문가의 말을 듣고 싶습니다. – jnic1989

답변

1

왜 더 빠를 것이라고 생각하십니까?

각 파일을 개별적으로 열지 않아도되기 때문에 약간의 오버 헤드가 절약되지만 궁극적으로 똑같은 양의 데이터를 메모리에 계속 읽습니다.

하지만 두 번째 예에서는 팬더가 140 만 개의 데이터 행을 모두 스캔하여 더 작은 데이터 프레임을 만들 것을 요청합니다.

두 번째 예제가 데이터 프레임을 구성하는 데 걸리는 시간과 반복하는 데 걸리는 시간을 시험해보십시오.

+0

명확히하기 위해, 나는 ** 시뮬레이션 ** 코드가 어떤 수정도하지 않았음에도 느린 이유는 알고 싶습니다. 데이터 프레임 목록 생성은 확실히 빠릅니다. – jnic1989