2017-12-04 11 views
1

私は大量の株式およびETFの宇宙の過去データを毎日取り込みます。 Quandlは米国株をかなり自由にカバーしていますが、ETFの履歴データはありませんので、QuandlのバックアップとしてGoogle APIを使用しています。 Googleの資金調達のためのPandas DataReaderの回避策

最近のGoogleのファイナンス「リノベーション」

は素晴らしい選択肢を私に残されていないので、私は、シンボルの リストにブラッド・ソロモンの仕事(おかげでブラッド、下記のリンク)を適用しようとしています。 URLを作成していることを条件にループがないとは考えにくいとします。どんな賢いアイディアも大歓迎です。

関連質問:How come pandas_datareader for google doesn't work?

感謝。

+0

Githubの問題は[こちら](https://github.com/pydata/pandas-datareader/issues/424)です。私は今までパッケージに貢献したことはありませんが、今週末にいくつかのプルリクエストを試みようとします。 –

答えて

1

pandas-datareaderは、あなたが渡した各シンボルを1つずつ順番にループしていきます。

googleとyahooの関連クラスが継承する基底クラスの関数は次のとおりです。base._DailyBaseReader._dl_mult_symbols

魔法は、これらがリストに追加されてから、パンダPanelに集約されることです。

しかし、Panelは廃止予定であり、技術的には2次元ですが実際には高次元を再現する構造のMultiIndexを使用してDataFrameで同じ機能を利用することができます。

ここでは、あなたができることのベアボーンを以下に示します。 ご注意ください私はparsing string dates to datetimeのようなパッケージの中に埋め込まれた多くの機能をスキップしています。

import datetime 
from io import StringIO 

import requests 
from pandas.io.common import urlencode 
import pandas as pd 

BASE = 'http://finance.google.com/finance/historical' 


def get_params(sym, start, end): 
    params = { 
     'q': sym, 
     'startdate': start.strftime('%Y/%m/%d'), 
     'enddate': end.strftime('%Y/%m/%d'), 
     'output': "csv" 
    } 
    return params 


def build_url(sym, start, end): 
    params = get_params(sym, start, end) 
    return BASE + '?' + urlencode(params) 


def get_one_data(sym, start=None, end=None): 
    if not start: 
     start = datetime.datetime(2010, 1, 1) 
    if not end: 
     end = datetime.datetime.today() 
    url = build_url(sym, start, end) 
    data = requests.get(url).text 
    return pd.read_csv(StringIO(data), index_col='Date', 
         parse_dates=True).sort_index() 


def get_multiple(sym, start=None, end=None, return_type='Panel'): 
    if isinstance(sym, str): 
     return get_one_data(sym, start=start, end=end) 
    elif isinstance(sym, (list, tuple, set)): 
     res = {} 
     for s in sym: 
      res[s] = get_one_data(s, start, end) 
     # The actual module also implements a 'passed' and 'failed' 
     #  check here and also using chunking to get around 
     #  data retreival limits (I believe) 

    if return_type.lower() == 'panel': 
     return pd.Panel(res).swapaxes('items', 'minor') 
    elif return_type.lower() == 'mi': # MultiIndex DataFrame 
     return pd.concat((res), axis=1) 

例:あなたはそれを追跡したい場合

syms = ['AAPL', 'GE'] 
data = get_multiple(syms, return_type='mi') 

# Here's how you would filter down to Close prices 
# on MultiIndex columns 
data.xs('Close', axis=1, level=1) 

       AAPL  GE 
Date      
2010-01-04 30.57 15.45 
2010-01-05 30.63 15.53 
2010-01-06 30.14 15.45 
2010-01-07 30.08 16.25 
2010-01-08 30.28 16.60 
... 
+1

Bradさん、ありがとうございました。不完全さにもかかわらず、大規模なデータセットではパネルがマルチインデックス化されたdfsより高速であることがわかりました。ホッピング・アレイはすぐに成熟する。あなたの時間を感謝します。 – MJS

関連する問題