From 2e515d2e7a75a4d5ea4107a724f76ae249d34e73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Lipt=C3=A1k?= Date: Tue, 1 Mar 2016 18:57:28 -0500 Subject: [PATCH] Refactor GoogleQuotesReader --- docs/source/remote_data.rst | 28 ++++++++++++++++++++++++++ docs/source/whatsnew/v0.2.3.txt | 1 + pandas_datareader/google/quotes.py | 12 +++++++---- pandas_datareader/tests/test_google.py | 21 +++++++++++++++++++ 4 files changed, 58 insertions(+), 4 deletions(-) diff --git a/docs/source/remote_data.rst b/docs/source/remote_data.rst index 983748e9..68b9cf86 100644 --- a/docs/source/remote_data.rst +++ b/docs/source/remote_data.rst @@ -73,6 +73,20 @@ Historical dividends from Yahoo! Finance. f = web.DataReader("F", 'yahoo-dividends', start, end) f +.. _remote_data.yahoo_quotes: + +Yahoo! Finance Quotes +---------------------- +***Experimental*** + +The YahooQuotesReader class allows to get quotes data from Yahoo! Finance. + +.. ipython:: python + + import pandas_datareader.data as web + amzn = web.get_quote_yahoo('AMZN') + amzn + .. _remote_data.yahoo_options: Yahoo! Finance Options @@ -145,6 +159,20 @@ Google Finance f = web.DataReader("F", 'google', start, end) f.ix['2010-01-04'] +.. _remote_data.google_quotes: + +Google Finance Quotes +---------------------- +***Experimental*** + +The GoogleQuotesReader class allows to get quotes data from Google Finance. + +.. ipython:: python + + import pandas_datareader.data as web + q = web.get_quote_google(['AMZN', 'GOOG']) + q + .. _remote_data.google_options: Google Finance Options diff --git a/docs/source/whatsnew/v0.2.3.txt b/docs/source/whatsnew/v0.2.3.txt index 6c1d587d..e019e20a 100644 --- a/docs/source/whatsnew/v0.2.3.txt +++ b/docs/source/whatsnew/v0.2.3.txt @@ -20,6 +20,7 @@ New features - ``DataReader`` now supports pulling data for the TSP. - ``DataReader`` now supports Google options data source, see :ref:`here` (:issue:`148`). +- ``DataReader`` now supports Google quotes, see :ref:`here` (:pull:`188`). .. _whatsnew_023.api_breaking: diff --git a/pandas_datareader/google/quotes.py b/pandas_datareader/google/quotes.py index 99042f09..efdccb2b 100644 --- a/pandas_datareader/google/quotes.py +++ b/pandas_datareader/google/quotes.py @@ -1,4 +1,7 @@ -import pandas +import pandas as pd +from dateutil.parser import parse +import numpy as np + from pandas_datareader.base import _BaseReader import json import re @@ -14,7 +17,7 @@ def url(self): @property def params(self): - if isinstance(self.symbols, pandas.compat.string_types): + if isinstance(self.symbols, pd.compat.string_types): sym_list = self.symbols else: sym_list = ','.join(self.symbols) @@ -25,5 +28,6 @@ def _read_lines(self, out): buffer = out.read() m = re.search('// ', buffer) result = json.loads(buffer[m.start() + len('// '):]) - return pandas.DataFrame([float(x['l']) for x in result], - index=[x['t'] for x in result]) + return pd.DataFrame([[float(x['cp']), float(x['l']), np.datetime64(parse(x['lt']).isoformat())] + for x in result], columns=['change_pct', 'last', 'time'], + index=[x['t'] for x in result]) diff --git a/pandas_datareader/tests/test_google.py b/pandas_datareader/tests/test_google.py index a0249c91..8d625c52 100644 --- a/pandas_datareader/tests/test_google.py +++ b/pandas_datareader/tests/test_google.py @@ -56,9 +56,30 @@ def test_google(self): self.assertRaises(Exception, web.DataReader, "NON EXISTENT TICKER", 'google', start, end) + def assert_option_result(self, df): + """ + Validate returned quote data has expected format. + """ + self.assertTrue(isinstance(df, pd.DataFrame)) + self.assertTrue(len(df) > 0) + + exp_columns = pd.Index(['change_pct', 'last', 'time']) + tm.assert_index_equal(df.columns, exp_columns) + + dtypes = [np.dtype(x) for x in ['float64', 'float64', 'datetime64[ns]']] + tm.assert_series_equal(df.dtypes, pd.Series(dtypes, index=exp_columns)) + + def test_get_quote_string(self): + df = web.get_quote_google('GOOG') + self.assertTrue(df.ix['GOOG']['last'] > 0.0) + tm.assert_index_equal(df.index, pd.Index(['GOOG'])) + self.assert_option_result(df) + def test_get_quote_stringlist(self): df = web.get_quote_google(['GOOG', 'AMZN', 'GOOG']) assert_series_equal(df.ix[0], df.ix[2]) + tm.assert_index_equal(df.index, pd.Index(['GOOG', 'AMZN', 'GOOG'])) + self.assert_option_result(df) def test_get_goog_volume(self): for locale in self.locales: