2017-12-11 3 views
0

일별 주가 데이터에서 샘플 가격을 선택하고 월말 가격을 선택합니다. 나는 다음 코드를 사용하여 성취 중이다.팬더 데이터 프레임에서 특정 날짜 선택

import datetime 
from pandas_datareader import data as pdr 
import pandas as pd 

end = datetime.date.today() 

begin=end-pd.DateOffset(365*2) 

st=begin.strftime('%Y-%m-%d') 

ed=end.strftime('%Y-%m-%d') 


data = pdr.get_data_yahoo("AAPL",st,ed) 

mon_data=pd.DataFrame(data['Adj Close'].resample('M').apply(lambda x: x[-2])).set_index(data.index) 

위의 행은 월 데이터의 끝을 선택하고 출력합니다.

Output of resampled data-frame

나는 달의 끝에서 두 번째 값을 선택하려면, 나는 다음과 같은 코드를 사용하여 그것을 할 수 있습니다.

mon_data=pd.DataFrame(data['Adj Close'].resample('M').apply(lambda x: x[-2])) 

다음은 출력물입니다.

enter image description here

그러나 인덱스는 월 값의 끝을 보여줍니다. 매월 두 번째 가치를 선택하면 2015-12-31 대신 2015-12-30의 색인을 원합니다. 앞으로 나아갈 길을 제안하십시오. 나는 나의 질문이 분명하기를 바랍니다.

귀하를 진심으로 감사드립니다. 리 샘플과 함께 할 수있는 방법이 있는지

감사합니다, Abhishek

답변

2

나는 확실하지 않다. 그러나 groupby 및 TimeGrouper를 사용하여 원하는 것을 얻을 수 있습니다.

n = 1 
mon_data=pd.DataFrame(data['Adj Close'].resample('M').apply(lambda x: x[-1-n])) 
mon_data.index = mon_data.index - datetime.timedelta(days=n) 

또한, 데이터를보고, 내가 당신을 생각 :

import datetime 
from pandas_datareader import data as pdr 
import pandas as pd 

end = datetime.date.today() 
begin = end - pd.DateOffset(365*2) 
st = begin.strftime('%Y-%m-%d') 
ed = end.strftime('%Y-%m-%d') 

data = pdr.get_data_yahoo("AAPL",st,ed) 

data['Date'] = data.index 
mon_data = (
    data[['Date', 'Adj Close']] 
     .groupby(pd.TimeGrouper(freq='M')).nth(-2) 
     .set_index('Date') 
) 
0


간단한 해결 방법은 다시 가고 싶은 일 수를 새로 만든 dataframe의 인덱스를 가지고 빼기하는 것입니다 하지 '월말 주파수'뿐만 아니라 '비즈니스 월말 주파수'에 다시 샘플링해야합니다, 심지어

.resample('BM') 

하지만이 모든 것을 커버하지 않습니다에 대한 때문에 2017 년 12 월 29 일의 입장은 영업 월말이지만이 날짜는 귀하의 데이터에 표시되지 않습니다 (2017 년 12 월 8 일 종료). BTW

n = 1 
mon_data=pd.DataFrame(data['Adj Close'].resample('BM').apply(lambda x: x[-1-n])) 

end_of_months = mon_data.index.tolist() 
end_of_months[-1] = data.index[-1] 
mon_data.index = end_of_months 

mon_data.index = mon_data.index - datetime.timedelta(days=n) 

: 당신의 .set_index(data.index) 던져

end_of_months = mon_data.index.tolist() 
end_of_months[-1] = data.index[-1] 
mon_data.index = end_of_months 

때문에, 전체 코드는 다음과 같이 표시됩니다 그래서 당신은 그에게 작은 수정 (날짜별로 정렬 된 원본 데이터를 가정)를 추가 할 수 있습니다 오류는 datamon_data이 서로 다른 차원 (mon_data은 월 단위 grouped_by 임)

+0

멋진 솔루션입니다. OP는 "이달의 두 번째 가치"를 요구했다. 해당 월의 마지막 영업일 전날에 "월말로부터 두 번째 어미로부터 두 번째 값"이 나오지 않으면이 솔루션이 작동하지 않습니다. – Sina

+0

당신 말이 맞아요. 귀하의 솔루션이 더 좋습니다. 이 TimeGrouper에 대해 알게되어 매우 기뻤습니다. 그러한 유용한 도구. –

+0

신속한 응답을 보내 주셔서 감사합니다. 시나 솔루션으로 갈거야. Idon이 내 코드에서 오류를 지적 해 주셔서 감사합니다. –

관련 문제