2012-10-21 4 views
1

날짜 계열은 다음과 유사합니다.Python Pandas : 벡터화 된 연산 버그?

In [89]: 
db.close[:5] 

Out[89]: 
datetime 
2012-06-28 23:58:00 1.243925 
2012-06-28 23:59:00 1.244125 
2012-06-29 00:00:00 1.244065 
2012-06-29 00:01:00 1.243875 
2012-06-29 00:02:00 1.243865 
Name: close 

각 요소에서 이전 요소를 뺍니다.

In [93]: 
db.close[1:5] - db.close[:4] 

Out[93]: 
datetime 
2012-06-28 23:58:00 NaN 
2012-06-28 23:59:00  0 
2012-06-29 00:00:00  0 
2012-06-29 00:01:00  0 
2012-06-29 00:02:00 NaN 
Name: close 

배열은 오프셋없이 뺍니다.

하지만 배열 요소를 비교할 때 ...

N [94]

db.close[1:5] == db.close[:4] 
Out[94]: 
datetime 
2012-06-28 23:59:00 False 
2012-06-29 00:00:00 False 
2012-06-29 00:01:00 False 
2012-06-29 00:02:00 False 
Name: close 

답변

3

이것은 실제로 의도적이다. 산술 연산은 데이터 정렬을 수행하지만 비교는 수행하지 않습니다. 나는 과거에 그것을 변경하는 것을 고려했지만 너무 많은 문제를 일으킨다는 것을 발견했다. (예를 들어 Series를 NumPy 배열을 기대하는 함수에 전달할 때, 예를 들어 numpy.diff).

편집 : 정렬을 얻기 위해, 당신은 손으로 정렬을 수행 할 수 있습니다

In [10]: numpy.equal(*a.align(b)) 
Out[10]: 
2000-01-03 False 
2000-01-04  True 
2000-01-05  True 
2000-01-06  True 
2000-01-07  True 
2000-01-10 False 
Freq: B 
+0

감사합니다. 반복을 피하고 싶습니다. 따라서 벡터로 필요한 것을 만들 수 있습니까? – user1763885

+0

수정 사항보기 ...... –

0

내가 내 자신의 질문에 대한 답을 발견했다. 누군가에게 유용 할 수 있습니다.

In [38]: 
db.close.shift(periods=1).head() - db.close.head() 

Out[38]: 
datetime 
2012-06-28 23:58:00  NaN 
2012-06-28 23:59:00 -0.00020 
2012-06-29 00:00:00 0.00006 
2012-06-29 00:01:00 0.00019 
2012-06-29 00:02:00 0.00001 
Freq: T, Name: close 

불행히도, 일반적인 산술 연산보다 2-3 배 느립니다.

In [40]: 

%timeit db.close.shift(periods=1) - db.close 
1000 loops, best of 3: 1.64 ms per loop 

%timeit db.close - db.open 
1000 loops, best of 3: 700 us per loop 
관련 문제