你如何从雅虎财经中提取每周的历史数据?

时间:2013-12-14 14:43:04

标签: python pandas time-series yahoo-finance

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有一个参数,您可以选择每日,每周或每月,就像雅虎本身提供的选项一样。您知道的任何其他包或想法可能会促进这一点吗?

5 个答案:

答案 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