【问题标题】:how to optimize the performance of pandas retrieving stock quotes from yahoo feed如何优化 pandas 从 yahoo feed 中检索股票报价的性能
【发布时间】:2014-03-07 15:46:08
【问题描述】:

我的代码是关于循环 1200 多个股票代码并从 yahoo 提要中检索历史报价(160~200 天)。因为这需要时间,我将引号存储在 csv 中,只需下载时间增量的引号,即日期差异的任何引号或任何引号 csv 文件都丢失了......我使用了 pandas 函数调用 get_data_yahoo(stocknum ,开始,结束)。

但是,我发现整个过程所花的时间没有什么区别,似乎一天的 d/l 报价与 200 天的报价相同……熊猫是如何处理雅虎的股票报价的?还有其他更好的饲料吗?我可以提出任何建议或改进以加快该过程吗?

这里是我为检索股票报价所做的函数调用。

def readStockPrice(stock,period=200,delay=1):

#define the period for stock filtering
now=dt.date.today()
end=now.strftime("%Y-%m-%d")
#start=(now-dt.timedelta(days=period)).strftime("%Y-%m-%d")

if os.path.isfile('cache/'+stock+'.csv'):
    df=pd.read_csv('cache/'+stock+'.csv',index_col=0,parse_dates=True)
    lastrecorddate=df.index.to_pydatetime()[-1].date()
    delta=(now-lastrecorddate).days
    if delta>delay:

        #print("retrieving "+stock+" quotes from the web")
        start=(lastrecorddate+dt.timedelta(days=1)).strftime("%Y-%m-%d")
        try:
            df_delta=web.get_data_yahoo(stock,start,end)
            df=df.append(df_delta)
            df_delta.to_csv('cache/'+stock+'.csv',header=False,mode='a')
        except IOError:
            return pd.DataFrame()
else:
    #print("retrieving "+stock+" quotes from the web")
    start=(now-dt.timedelta(days=period)).strftime("%Y-%m-%d")
    try:
        df=web.get_data_yahoo(stock,start,end)
        if not df.empty:
            df.to_csv('cache/'+stock+'.csv')
    except IOError:
        return pd.DataFrame()

return df

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    Pandas 使用 _get_hist_yahoo 在 pandas/io/data.py 中获取您的数据,如下所示:

    def _get_hist_yahoo(sym, start, end, retry_count, pause):
    """
    Get historical data for the given name from yahoo.
    Date format is datetime
    
    Returns a DataFrame.
    """
    start, end = _sanitize_dates(start, end)
    url = (_HISTORICAL_YAHOO_URL + 's=%s' % sym +
           '&a=%s' % (start.month - 1) +
           '&b=%s' % start.day +
           '&c=%s' % start.year +
           '&d=%s' % (end.month - 1) +
           '&e=%s' % end.day +
           '&f=%s' % end.year +
           '&g=d' +
           '&ignore=.csv')
    return _retry_read_url(url, retry_count, pause, 'Yahoo!')
    

    我认为它将从 ulr 转移到类似的 SQL 查询中

    where date between START_TIME and END_TIME
    

    如果 Yahoo 将索引放在日期列上,它可以使用索引,因此响应时间与时间段无关。

    【讨论】:

    • 我的代码是从存储的 csv 中检索报价(任何一只股票的完整报价),或者从 yahoo 下载。因此我需要一个时间窗口,即天数,我从现在回去多远。这就是为什么它只关心开始而不是结束。
    • @timeislove 对不起,我之前误解了你的问题,现在我检查了熊猫的源代码并重新编辑了我的答案,请看看它是否有帮助。
    • 这接近我的猜测......但即使是雅虎也只是输入参数(你猜的索引),要下载的数据块的长度差别很大,我说的是大约 1:200数据框(有 6~7 个列,例如开盘、高点...调整收盘等)时间 1200+ 个股票!!!不应该有任何性能差异吗?而且,如果您的猜测是正确的,我可以做些什么来缩短下载时间(性能)?
    • 或者我从存储的 csv 中检索报价的开销甚至比我从网上下载的还要多?!!!我的脚本在 Lubuntu 下的 SSD 驱动器上由 python3 运行。
    • @timeislove 数据有多大?我认为查询时间并没有因为索引而有所不同,但是考虑到下载时间之后真的很奇怪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多