2014-02-16 3 views
0

나는 팬더를 처음 사용하고 일부 SAS 코드를 변환하려고합니다. 두 개의 데이터 세트가 있는데 첫 번째 (header_mf)에는 crsp_fundno 및 caldt (펀드 ID와 날짜)에 의해 색인 된 뮤추얼 펀드 정보가 들어 있습니다. 두 번째 데이터 (ret_mf) 세트에서 동일한 인덱스의 펀드 리턴 (mret 열)이 있습니다. 첫 번째 데이터 집합의 각 항목을 지난 12 개월의 수익과 병합하려고합니다. 나는 다음 단계에서 범위를 벗어난 관측을 제외 희망 만 crsp_fundno에있는 두 개의 데이터 프레임에 합류 시도, 파이썬에서팬더의 조건부 합치기

proc sql; 
    create table temp_mf3 as 
    select a.*, b.mret from header_mf as a, 
    ret_mf as b where 
    a.crsp_fundno=b.crsp_fundno and 
    ((year(a.caldt)=year(b.caldt) and month(a.caldt)>month(b.caldt)) or 
    (year(a.caldt)=(year(b.caldt)+1) and month(a.caldt)<=month(b.caldt))); 
    quit; 

: SAS, 나는이 뭔가를 할 수 있습니다. 그러나 결과는 빠르게 처리하기에는 너무 커져서 메모리가 부족합니다 (나는 15 년 이상의 데이터를 사용하고 있습니다).

팬더에서 조건부 병합을 효과적으로 수행 할 수 있습니까?

답변

1

죄송합니다.이 회신이 늦어지면 죄송합니다. 조건부 합병을 원한다고 생각하지 않습니다 (적어도 상황을 정확하게 이해한다면). 나는 당신이 원하는 결과를 header_mf와 ret_mf를 합쳐서 ['fundno','caldt']에 넣은 다음 팬더에 shift 연산자를 사용하여 과거의 결과를 생성한다고 생각합니다.

그래서 나는 당신의 데이터는 기본적으로 다음과 같은 생각 :

import pandas as pd 
header = pd.read_csv('header.csv') 
print header 

    fundno  caldt foo 
0  1 1986-06-30 100 
1  1 1986-07-31 110 
2  1 1986-08-29 120 
3  1 1986-09-30 115 
4  1 1986-10-31 110 
5  1 1986-11-28 125 
6  1 1986-12-31 137 
7  2 1986-06-30 130 
8  2 1986-07-31 204 
9  2 1986-08-29 192 
10  2 1986-09-30 180 
11  2 1986-10-31 200 
12  2 1986-11-28 205 
13  2 1986-12-31 205 

ret_mf = pd.read_csv('ret_mf.csv') 
print ret_mf 

    fundno  caldt mret 
0  1 1986-06-30 0.05 
1  1 1986-07-31 0.01 
2  1 1986-08-29 -0.01 
3  1 1986-09-30 0.10 
4  1 1986-10-31 0.04 
5  1 1986-11-28 -0.02 
6  1 1986-12-31 -0.06 
7  2 1986-06-30 -0.04 
8  2 1986-07-31 0.03 
9  2 1986-08-29 0.07 
10  2 1986-09-30 0.00 
11  2 1986-10-31 -0.05 
12  2 1986-11-28 0.09 
13  2 1986-12-31 0.04 

물론, 헤더 파일 (내 만들어 foo 변수 외에) 거기에 많은 변수가있을 수 있습니다. 이것은 기본적으로 다음 데이터의 특성을 캡처하지만, 난 그냥 shift['fundno','caldt']에 병합 한 후 사용할 수 있습니다 생각 :

mf = header.merge(ret_mf,how='left',on=['fundno','caldt']) 
print mf 

    fundno  caldt foo mret 
0  1 1986-06-30 100 0.05 
1  1 1986-07-31 110 0.01 
2  1 1986-08-29 120 -0.01 
3  1 1986-09-30 115 0.10 
4  1 1986-10-31 110 0.04 
5  1 1986-11-28 125 -0.02 
6  1 1986-12-31 137 -0.06 
7  2 1986-06-30 130 -0.04 
8  2 1986-07-31 204 0.03 
9  2 1986-08-29 192 0.07 
10  2 1986-09-30 180 0.00 
11  2 1986-10-31 200 -0.05 
12  2 1986-11-28 205 0.09 
13  2 1986-12-31 205 0.04 

은 이제 과거의 반환 변수를 만들 수 있습니다. 나는 그런 작은 예 패널을 생성하기 때문에, 나는 단지 과거 수익률 3 개월을 할 것입니다 : 나는 당신의 데이터를 오해

for lag in range(1,4): 
    good = mf['fundno'] == mf['fundno'].shift(lag) 
    mf['ret' + str(lag)] = mf['mret'].shift(lag).where(good) 
print mf 

    fundno  caldt foo mret ret1 ret2 ret3 
0  1 1986-06-30 100 0.05 NaN NaN NaN 
1  1 1986-07-31 110 0.01 0.05 NaN NaN 
2  1 1986-08-29 120 -0.01 0.01 0.05 NaN 
3  1 1986-09-30 115 0.10 -0.01 0.01 0.05 
4  1 1986-10-31 110 0.04 0.10 -0.01 0.01 
5  1 1986-11-28 125 -0.02 0.04 0.10 -0.01 
6  1 1986-12-31 137 -0.06 -0.02 0.04 0.10 
7  2 1986-06-30 130 -0.04 NaN NaN NaN 
8  2 1986-07-31 204 0.03 -0.04 NaN NaN 
9  2 1986-08-29 192 0.07 0.03 -0.04 NaN 
10  2 1986-09-30 180 0.00 0.07 0.03 -0.04 
11  2 1986-10-31 200 -0.05 0.00 0.07 0.03 
12  2 1986-11-28 205 0.09 -0.05 0.00 0.07 
13  2 1986-12-31 205 0.04 0.09 -0.05 0.00 

나의 사과합니다.