2017-02-17 2 views
0

나는 야후에서 재고 데이터를 가져 오는 팬더 df를 만들었습니다. 백분율 변경 열을 추가하고 df를 필터링하면 백분율 변경> 0.02입니다. 여기에는 문제가 없습니다. 이제 df를 출력 할 수있는 추가 선택 매개 변수를 추가하여 이전 조건이 True 인 날짜 (pct_change> 0.02) 을 조건을 평가 한 날짜의 10 일 및 10 일 후에 볼 수 있습니다 (pct_change> 0.02)를 True로 설정하십시오. 나는 시작하는 법을 정말로 고집하지 못합니다. 어떤 도움을 주시면 감사하겠습니다. 지금까지 내 코드 :Pandas 시계열 날짜 범위가 열의 값을 기준으로 슬라이스

import pandas_datareader.data as web 
import datetime 
start = datetime.datetime(2010, 1, 1) 
end = datetime.datetime(2017, 1, 27) 
gspc2 = web.DataReader("^GSPC", 'yahoo', start, end) 
gspc2.rename(columns={'Adj Close' :'Adj_Close'}, inplace=True) gspc2['pct_change'] = gspc2['Adj_Close'].pct_change() 
gspc2 = gspc2.ix[(gspc2['pct_change'] > 0.0200)] 

답변

0

하나의 아이디어는 다음과 같습니다

  1. 이 범위
  2. 필터링에 따라 행 인덱스를 확장하고 criterian을 충족 행 인덱스를 가져 오기는
를 복제

예를 들어 도움이되기를 바랍니다.

import pandas as pd 
import numpy as np 

data = { 'a' : range(10, 24) } 
df = pd.DataFrame(data) 
df['b'] = (df.a % 5 == 0) # marks row 0, and 5 

# number to look back and forward 
n = 1 

# find the rows meet cretiria, row 0 and 5 
rows = np.where(df.b)[0] 

# expand 
rows = [x for row in rows for x in range(row-n, row+n+1) if x>= 0] 

# filter 
rows = list(set(rows)) 

print df.loc[rows] 

출력은 다음과 같습니다

 a  b 
0 10 True 
1 11 False 
4 14 False 
5 15 True 
6 16 False 
9 19 False 
10 20 True 
11 21 False 
+0

감사 아이디어에 대한 많은 날을 제공하는 작업을했다, 신화 Hunag, 내가 테스트하지 않았습니다 아직 그것은 흥미 롭습니다. 나는 그것이 어떻게 가는지 곧 알려줄 것이다. 건배 – kuatroka

+0

정상적인 인덱스에서는 작동하지만 시계열 인덱스에서는 실패합니다. 나는 약간 수정했지만 여전히 오류가 발생한다. 행 x = 범위 x (행 -pd.DateOffset (일 = 1), 행 + pd.DateOffset (일 수 = 0)에 대한 x 행에 대한 행에 대한 행 = gspc2.index [gspc2 [ 'pct_change'] == 0.000000] = 1)) if x> = 0] 인쇄 (행) – kuatroka

0

내가 그것을 티베트 황의 코드에있는

import pandas_datareader.data as web 
import datetime 
import itertools 

# bringing stock data 
start = datetime.datetime(2010, 1, 1) 
end = datetime.datetime(2017, 3, 27) 
gspc2 = web.DataReader("UNG", 'yahoo', start, end) 
gspc2.rename(columns={'Adj Close' :'Adj_Close'}, inplace=True) 
gspc2['pct_change'] = gspc2['Adj_Close'].pct_change() 


# gspc2['std_dev2'] = gspc2['pct_change'].std()*2 
# gspc2['pct_change_mean'] = gspc2['pct_change'].mean() 

# setting filter condition 
condition = -0.07 
row_filter, gspc2['row_filter'] = gspc2.index[gspc2['pct_change'] <= condition ], (gspc2['pct_change'] <= condition) 

# window of days before and after the selected date 
n = 3 

selected_rows = [(pd.date_range(i - pd.DateOffset(days=n), periods=n*2+1)) for i in row_filter] 
selected_rows = list(itertools.chain.from_iterable(selected_rows)) 

# cumulative return n-2 days later after the day on which condition occured, without counting return on the day itself 
gspc2['cum_pct_change_ndays_after'] = gspc2.Adj_Close.shift(-(n-2))/gspc2.Adj_Close - 1 
gspc2['n_days_avg_return'] = gspc2.cum_pct_change_ndays_after.mean() 

final_df = gspc2.loc[selected_rows].dropna().drop_duplicates().sort_index(ascending=False) 



#print(row_filter) 
# removing nan due to mismatch in market days vs calendar days and removing duplicates 

print(final_df) 
print(final_df[final_df.row_filter]) 
관련 문제