import datetime
import pandas.io.data
sp = pd.io.data.get_data_yahoo('^IXIC',start = datetime.datetime(1972, 1, 3),
end = datetime.datetime(2010, 1, 3))
我已经使用了上面的示例,但是当我想拉每周时,它只会将DAILY数据拉入数据框。它似乎不像get_data_yahoo
有一个参数,您可以选择每日,每周或每月,就像雅虎本身提供的选项一样。您知道的任何其他包或想法可能会促进这一点吗?
答案 0 :(得分:4)
您可以使用asfreq
方法进行缩减采样:
sp = sp.asfreq('W-FRI', method='pad')
pad
方法将向前传播最后一次有效观察。
使用resample
(如@tshauck所示)是另一种可能性。
如果要保证下采样中的值是原始数据集中的值,请使用asfreq
。如果您希望聚合原始数据集中的行组(例如,通过取平均值),请使用resample
。如果原始数据集在reindex指定的日期没有值,则reindex
可能会引入NaN值 - 尽管(如@ behzad.nouri指出的那样)您可以使用method=pad
传播上次观察在这里。
答案 1 :(得分:3)
如果你在github上检查最新的pandas source code,你会看到间隔参数包含在最新的主分支中。您可以通过覆盖Site-Packages / pandas / io文件夹下的相同data.py来手动修改本地副本
答案 2 :(得分:2)
您可以随时重新索引到所需频率:
sp.reindex( pd.date_range( start=sp.index.min( ),
end=sp.index.max( ),
freq='W-WED' ) ) # weekly, Wednesdays
修改:您可以添加, method='ffill'
来转发填充NaN
值。
作为一个建议,请采取星期三,因为它往往具有最少的缺失值。 (即周三纽约证券交易所假期减少)。我认为雅虎每周数据给出每周一的股票价格,这是基于2000年以后的S& P数据的最差每周频率:
import pandas.io.data as web
sp = web.DataReader("^GSPC", "yahoo", start=dt.date( 2000, 1, 1 ) )
weekday = { 0:'MON', 1:'TUE', 2:'WED', 3:'THU', 4:'FRI' }
sp[ 'weekday' ] = list( map( weekday.get, sp.index.dayofweek ) )
sp.weekday.value_counts( )
输出:
WED 722
TUE 717
THU 707
FRI 705
MON 659
答案 3 :(得分:1)
一种选择是在你想要的那一天掩盖。
sp[sp.index.dayofweek == 0]
另一种选择是重新取样。
sp.resample('W', how='mean')
答案 4 :(得分:0)
这就是我每天转换为每周价格数据的方式:
import datetime
import pandas as pd
import pandas_datareader.data as web
start = datetime.datetime(1972, 1, 3)
end = datetime.datetime(2010, 1, 3)
stock_d = web.DataReader('^IXIC', 'yahoo', start, end)
def week_open(array_like):
return array_like[0]
def week_close(array_like):
return array_like[-1]
stock_w = stock_d.resample('W',
how={'Open': week_open,
'High': 'max',
'Low': 'min',
'Close': week_close,
'Volume': 'sum'},
loffset=pd.offsets.timedelta(days=-6))
stock_w = stock_w[['Open', 'High', 'Low', 'Close', 'Volume']]
更多信息:
https://pandas-datareader.readthedocs.io/en/latest/remote_data.html#yahoo-finance https://gist.github.com/prithwi/339f87bf9c3c37bb3188