2014-05-13 4 views
4

1,500,000 개의 행을 가진 dataFrame이 있습니다. QuantQuote.com에서 구입 한 1 분 단위의 주식 시장 데이터. (열기, 높음, 낮음, 닫기, 볼륨). 나는 주식 시장 거래 전략의 몇 가지 집에서 만든 백 테스트를 실행하려고합니다. 트랜잭션을 처리하는 직선 Python 코드가 너무 느리고 Numba를 사용하여 작업 속도를 높이려고했습니다. 문제는 Numba가 팬더 기능을 사용하지 못하는 것입니다. https://groups.google.com/a/continuum.io/forum/#!topic/numba-users/ZNfJtXeH2Lc효율적인 방법으로 팬더 처리하기 Numba로 데이터 프레임 timeseries

Google 검색을 사용하면 numba를 팬더와 함께 사용하는 것에 대한 놀라운 정보가 누설됩니다. 내가 그것을 고려하여 실수를 저지르고 있는지 궁금하게 만든다.

내 설정은 Numba 0.13.0-1, Pandas 0.13.1-1입니다. 윈도우 7, PTVS, 파이썬 2.7와 MS VS2013, Enthought 캐노피

내 기존 파이썬 + 팬더 innerloop는 다음과 같은 일반적인 구조를 pd.ewma, pd.rolling_max, PD와

계산 "표시"열을 (가지고 있습니다. rolling_min etc.) 이동 평균 십자가, 새로운 최고 등과 같은 미리 결정된 이벤트에 대한 "이벤트"열을 계산하십시오.

그런 다음 DataFrame.iterrows를 사용하여 DataFrame을 처리합니다.

나는 다양한 최적화를 시도했지만 여전히 내가 원하는만큼 빠르지는 않았다. 그리고 최적화가 버그를 일으키고 있습니다.

행을 처리하기 위해 Numba를 사용하고 싶습니다. 접근 방법이 있습니까?

내 DataFrame은 실제로는 수레의 사각형이기 때문에 DataFrame.values와 같은 것을 사용하여 데이터에 액세스 한 다음 numba를 사용하여 행에 액세스하는 일련의 함수를 작성했습니다. 하지만 그것은 모든 타임 스탬프를 제거하고 그것이 가역적 동작이라고 생각하지 않습니다. DataFrame.values에서 가져온 값 행렬이 데이터의 복사본이 아닌지 여부는 확실하지 않습니다.

도움을 주시면 대단히 감사하겠습니다.

+0

코드를 별도의 질문으로 게시하고 여기 사람들이 벡터화에 도움이되는지 확인해야합니다. IMHO 실제로 numba를 판다로 사용하는 많은 이유가 벡터화 (반복 없음)로 훨씬 더 많은 작업을 수행 할 수 있습니다.pandas는 대부분의 작업이 최적화되도록 후드에서 cython을 사용합니다. 코드를 수정 한 다음 최적화하십시오. 질문에 대답하기 위해''df.values''를 사용하여 원하는 경우 기본 배열을 얻고 처리 할 수 ​​있지만 원하는 경우 DataFrame으로 다시 변환 할 책임이 있습니다. – Jeff

+0

완전히 벡터화 된 방식으로 데이터를 처리 할 수 ​​없습니다. 그리고 결과를 분석하기 위해이 https://www.dropbox.com/s/p66mvp54dymi7hv/TABLE_AAPL.TXT.png처럼 보이는 매우 큰 PNG 파일을 생성합니다. 나는 Chaco와 함께 고문을해서 이러한 것들을 빠르게 계획한다. 보시다시피, 중간 결과를 저장하기 위해 많은 열이 생성됩니다. 단일 거래의 처리는 이제 80 줄 길이의 함수입니다. 내 전형적인 전략에 대한 내부 루프는 현재 비선형 파이썬 + 팬더의 약 350 행입니다. 이 상황에서 버그를 피하기가 어렵습니다. 그 최적화에 의해 비 대한. 나는 모두가 벡터화 보이는 것으로, 카피 – JasonEdinburgh

+0

@Jeff http://pastebin.com/AaifFYnk – JasonEdinburgh

답변

3

Numba는 NumPy를 인식하는 Just-In-Time 컴파일러입니다. NumPy 배열을 Numba로 컴파일 된 함수에 매개 변수로 전달할 수 있지만 Pandas 시리즈에는 전달할 수 없습니다.

여전히 유일한 옵션은 2017-06-27 현재의 NumPy 배열 인 팬더 시리즈 값을 사용하는 것입니다.

또한 값이 ""이 아닌 것으로 보장 된 인지 묻습니다. 제 생각에는

import pandas 


df = pandas.DataFrame([0, 1, 2, 3]) 
df.values[2] = 8 
print(df) # Should show you the value `8` 

이 Numba 시장 데이터를 처리에 큰 (그렇지 않으면 최고) 방식이며, 당신은 단지 파이썬에 충실하려는 : 그들은 복사하지 않습니다, 당신은을 확인할 수 있습니다. 훌륭한 성능 향상을 원할 경우 @numba.jit(nopython=True)을 사용해야합니다 (JIT 컴파일 함수 내에서 사전 및 기타 Python 유형을 사용할 수는 없지만 코드 실행 속도는 훨씬 빠름).

작업중인 지표 중 일부는 이미 Pandas에서 효율적인 구현을 이미 가지고있을 수 있으므로 Pandas로 사전 계산 한 다음 Numba의 백 테스트 기능에 값 (NumPy 배열)을 전달하십시오.

+0

numba와 팬더의 호환성에 대한 최신은 여기에서 찾을 수 있어야합니다은 https : // 판다. pydata.org/pandas-docs/stable/enhancingperf.html#using-numba – feetwet