2017-03-31 2 views
3

롤링 계산을 수행하는 5000000 개가 넘는 큰 데이터 프레임이 있습니다.다른 길이의 판다 데이터 프레임이있는 롤 창에서 가중 합 계산

df = pd.DataFrame(np.randn(10000,1), columns = ['rand']) 
sum_abs = df.rolling(5).sum() 

같은 계산을하고 싶지만 가중 합계를 추가하고 싶습니다.

df2 = pd.DataFrame(pd.Series([1,2,3,4,5]), name ='weight')) 
df3 = df.mul(df2.set_index(df.index)).rolling(5).sum() 

그러나 길이 불일치 예상 축에 5 개의 요소 오류가 발생합니다. 모든 것을 목록으로 변환하면 가능하면 [a *b for a, b in zip(L, weight)]과 같은 것을 할 수 있지만 데이터 프레임에 보관하고 싶습니다. 서로 다른 크기의 프레임에 대해 곱할 수있는 방법이 있습니까? 아니면 내가 곱셈 한 데이터 집합의 길이를 숫자 집합으로 반복해야합니까? 이 작업을 수행하는

답변

5

쉬운 방법은

w = np.arange(1, 6) 
df.rolling(5).apply(lambda x: (x * w).sum()) 

사용하여 덜 쉬운 방법입니다 strides

from numpy.lib.stride_tricks import as_strided as strided 

v = df.values 
n, m = v.shape 
s1, s2 = v.strides 
k = 5 
w = np.arange(1, 6).reshape(1, 1, k) 
pd.DataFrame(
    (strided(v, (n - k + 1, m, k), (s1, s2, s1)) * w).sum(-1), 
    df.index[k - 1:], df.columns) 

순진 시간 테스트

enter image description here

+1

두 번째 해결책은 정말 멋지다. 그렇게 생각할 수있는 소품. – user3170242

+0

@ user3170242 감사합니다! – piRSquared

관련 문제