From 21772aec75d908c72dc0ccd6b2a6fbf46d50b296 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Lipt=C3=A1k?= Date: Tue, 23 Feb 2016 20:56:52 -0500 Subject: [PATCH] Implement Google quote functionality --- pandas_datareader/data.py | 6 ++++- pandas_datareader/google/quotes.py | 35 +++++++++++++++++++++------- pandas_datareader/tests/test_data.py | 6 ++--- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/pandas_datareader/data.py b/pandas_datareader/data.py index 06930415..0a1163c9 100644 --- a/pandas_datareader/data.py +++ b/pandas_datareader/data.py @@ -5,7 +5,7 @@ import warnings from pandas_datareader.google.daily import GoogleDailyReader -from pandas_datareader.google.quotes import _get_data as get_quote_google # noqa +from pandas_datareader.google.quotes import GoogleQuotesReader from pandas_datareader.yahoo.daily import YahooDailyReader from pandas_datareader.yahoo.quotes import YahooQuotesReader @@ -44,6 +44,10 @@ def get_quote_yahoo(*args, **kwargs): return YahooQuotesReader(*args, **kwargs).read() +def get_quote_google(*args, **kwargs): + return GoogleQuotesReader(*args, **kwargs).read() + + def DataReader(name, data_source=None, start=None, end=None, retry_count=3, pause=0.001, session=None): """ diff --git a/pandas_datareader/google/quotes.py b/pandas_datareader/google/quotes.py index c410cfe6..f9383b3d 100644 --- a/pandas_datareader/google/quotes.py +++ b/pandas_datareader/google/quotes.py @@ -1,10 +1,29 @@ -def _get_data(symbols): - """ - Get current yahoo quote +import pandas +from pandas_datareader.base import _BaseReader +import json +import re - (Should) Returns a DataFrame - ToDo: Not implemented - """ - msg = "Google Finance doesn't have this functionality - can't get quote for %s" % symbols - raise NotImplementedError(msg) +class GoogleQuotesReader(_BaseReader): + + """Get current google quote""" + + @property + def url(self): + return 'http://www.google.com/finance/info' + + @property + def params(self): + if isinstance(self.symbols, pandas.compat.string_types): + sym_list = self.symbols + else: + sym_list = ','.join(self.symbols) + params = {'q': sym_list} + return params + + def _read_lines(self, out): + buffer = out.read() + m = re.search('// ', buffer) + result = json.loads(buffer[m.start() + len('// '):]) + return pandas.DataFrame(map(lambda x: float(x['l']), result), + index=map(lambda x: x['t'], result)) diff --git a/pandas_datareader/tests/test_data.py b/pandas_datareader/tests/test_data.py index a801e3c7..6d16b800 100644 --- a/pandas_datareader/tests/test_data.py +++ b/pandas_datareader/tests/test_data.py @@ -72,9 +72,9 @@ def test_google(self): self.assertRaises(Exception, web.DataReader, "NON EXISTENT TICKER", 'google', start, end) - def test_get_quote_fails(self): - self.assertRaises(NotImplementedError, web.get_quote_google, - pd.Series(['GOOG', 'AAPL', 'GOOG'])) + def test_get_quote_stringlist(self): + df = web.get_quote_google(['GOOG', 'AMZN', 'GOOG']) + assert_series_equal(df.ix[0], df.ix[2]) def test_get_goog_volume(self): for locale in self.locales: