2014-10-23 5 views
0

정보를 복사하고 다음 변수가 변경 될 때까지 팬더 DataFrames가 작동하는 방식을 이해하려고합니다 ... 특히 아래의 경우 Share_Amt_To_Buy를 내 신호 또는 Signal_Diff가 1에서 0으로 전환됩니까?python pandas 데이터 프레임, 값 조작

Share_Amt_To_Buy에서 .cumsum()을 사용하면 값을 낮추고 정확히 무엇을하고 싶은지 축적합니다.

내 목표는 신호가 0에서 1로 변경 될 때 Share_Amt_To_Buy가 계산되어 Signal이 0으로 전환 될 때까지 복사된다는 것입니다. 그런 다음 Signal이 1로 다시 바뀌면 Share_Amt_To_Buy가 해당 시점을 기준으로 다시 계산되기를 원합니다.

희망 사항은 의미가 있습니다. 알려 주시기 바랍니다. (위치)와 0 = 무역 (또는 위치) 1 = 무역

Signal_Diff은 :

Signal Signal_Diff Share_Amt_To_Buy (Correctly) Share_Amt_To_Buy (Currently) 
0  0   0        0 
0  0   0        0 
0  0   0        0 
1  1   100       100 
1  0   100       100 
1  0   100       100 
0  -1   0        100 
0  0   0        100 
1  1   180       280 
1  0   180       280 

하면 알 수 있듯이, 내 신호는 0에서 1로 대체하고,이 기능은 다음 수단 0에서 1 I 사용한 신호에 변화가 본

012,351,641를 계산하는 예를 들어 다음의 경우 열의 Share_Amt_To_Buy '가 계산된다

portfolio['Signal_Diff'] = portfolio['Signal'].diff().fillna(0.0) 

를 다음과 같이 계산

initial_cap = 100000.0 
portfolio['close'] = my stock's closing prices as a float 
portfolio['Share_Amt'] = np.where(variables['Signal']== 1.0, np.round(initial_cap/portfolio['close'] *  0.25 * portfolio['Signal']), 0.0).cumsum() 

portfolio['Share_Amt_To_Buy'] = (portfolio['Share_Amt']*portfolio['Signal']) 

답변

0

내가 이해 한 바로는 팬더 용 내장 공식 모듈이 없습니다. 열, 셀, 배열에 대한 수식을 수행하고 각기 다른 배열이나 값을 생성 할 수 있습니다 (df [column] .count()가 그 예입니다). 그런 식으로 많은 작업을 수행 할 수 있지만 배열을 동적으로 업데이트 할 수있는 방법은 없습니다 (Excel 수식과 같은) 배열의 다른 값을 기반으로합니다.

당신은 항상 반복적 절차를 수행하고 말할 수 :

>>> for index in df.index: 
>>>  if df['Signal_Diff'] == 0: 
>>>   df.loc[index, 'Signal_Diff'] = some_value 
>>>  elif df['Signal_Diff'] == 1: 
>>>   df.loc[index, 'Signal_Diff'] = some_other_value 

또는지도 도구를 통해 사용자 정의 함수를 만들 수 있습니다 https://stackoverflow.com/a/19226745/4131059

편집 :

또 다른 해결책은하는 것 이전 배열의 값 1과 배열의 일부 변경시 새로운 배열에 대한 쿼리 :

>>> df_old_list = df[df.Signal_Diff == 1].index.tolist() 
>>> ... 
>>> df_new_list = df[df.Signal_Diff == 1].index.tolist() 
>>> 
>>> for x in df_old_list: 
>>>  if x in df_new_list: 
>>>   df_new_list.remove(x) 

그런 다음 df_new_list의 인덱스 만 다시 계산하십시오.

+0

for 루프의 첫 번째 옵션이 마음에 든다. 내 신호 시리즈를 검사하고 내 share_amt 시리즈에서 계산 된 값을 채우는 for 루프를 사용하여 3 번째 시리즈를 만들고이 행마다 반복됩니까? –

+0

예, for 루프를 사용하여 어떤 값이 변경되었는지 확인한 다음이를 사용하여 share_amt 시리즈를 다시 계산합니다. 모든 인덱스의 모든 값을 반복하고 다시 계산할 때 영원히 걸리므로 목록을 신속하게 반복 한 다음 변경된 인덱스 만 확인하는 것이 더 빠릅니다. –

+0

예를 들어 한 열의 모든 값을 검사하여 값이 특정 값과 같은지 확인하려면 10,000 열 데이터 프레임에 대해 1.8 ~ 18.8 밀리 초가 걸립니다 (따라서 2 배, 상한은 모두 참인 경우 낮은 값은 모두 false 인 경우), 값을 제거하는 데 2가 소요됩니다.35 ms-664 ms (모든 거짓 인 경우 낮은 값), 다시 계산할 때마다 100 μs가 걸리지 만 각 값을 다시 정의하면 인덱스 당 120 μs가 소요되므로 값이 2/3 이하라고 가정 할 때 더 빠릅니다 (~ 5 ms 값이 변경되지 않으면 모든 변경 사항이있는 경우 1.6 초, 모든 사항을 확인하는 경우 1 초). –

관련 문제