[英]Selecting specific columns from multiple data-frame if the column name is same as the dataframe name
[英]Selecting specific date from pandas data-frame
從每日股票價格數據中,我想采樣並選擇月底價格。 我正在完成使用以下代碼。
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)
上面的行選擇月末數據,這是輸出。
如果要選擇月份的倒數第二個值,可以使用以下代碼來完成。
mon_data=pd.DataFrame(data['Adj Close'].resample('M').apply(lambda x: x[-2]))
這是輸出。
但是,索引顯示月末值。 當我選擇月份的倒數第二個值時,我希望索引為2015-12-30而不是2015-12-31。 請提出前進的方向。 希望我的問題清楚。
感謝你在期待。
問候,Abhishek
我不確定是否有辦法重新采樣。 但是,您可以使用groupby和TimeGrouper獲得所需的內容。
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')
)
最簡單的解決方案是獲取新創建的數據框的索引,然后減去要返回的天數:
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)
同樣,看到您的數據,我認為您不應該重新采樣到“月末頻率”,而應該重新采樣到“業務月末頻率”:
.resample('BM')
但這還不能涵蓋全部內容,因為例如2017年12月29日是一個工作月的結束日期,但是該日期不會出現在您的數據中(該日期在2017年12月8日結束)。 因此,您可以為此添加一個小修正(假設原始數據按日期排序):
end_of_months = mon_data.index.tolist()
end_of_months[-1] = data.index[-1]
mon_data.index = end_of_months
因此,完整的代碼如下所示:
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)
引發錯誤,因為data
和mon_data
的維數不同( mon_data
是每月grouped_by)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.