Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 18 additions & 2 deletions pandas_datareader/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
from pandas_datareader.google.daily import GoogleDailyReader
from pandas_datareader.google.quotes import GoogleQuotesReader

from pandas_datareader.quandl.daily import QuandlDailyReader

from pandas_datareader.yahoo.daily import YahooDailyReader
from pandas_datareader.yahoo.quotes import YahooQuotesReader
from pandas_datareader.yahoo.actions import (YahooActionReader, YahooDivReader)
Expand Down Expand Up @@ -40,6 +42,10 @@ def get_data_yahoo(*args, **kwargs):
return YahooDailyReader(*args, **kwargs).read()


def get_data_quandl(*args, **kwargs):
return QuandlDailyReader(*args, **kwargs).read()


def get_data_enigma(*args, **kwargs):
return EnigmaReader(*args, **kwargs).read()

Expand All @@ -61,7 +67,8 @@ def DataReader(name, data_source=None, start=None, end=None,
"""
Imports data from a number of online sources.

Currently supports Yahoo! Finance, Google Finance, St. Louis FED (FRED),
Currently supports Yahoo! Finance, Google Finance, Quandl, St.
Louis FED (FRED),
Kenneth French's data library, and the SEC's EDGAR Index.

Parameters
Expand All @@ -71,7 +78,7 @@ def DataReader(name, data_source=None, start=None, end=None,
accept a list of names.
data_source: {str, None}
the data source ("yahoo", "yahoo-actions", "yahoo-dividends",
"google", "fred", "ff", or "edgar-index")
"google", "quandl", "fred", "ff", or "edgar-index")
start : {datetime, None}
left boundary for range (defaults to 1/1/2010)
end : {datetime, None}
Expand All @@ -97,6 +104,9 @@ def DataReader(name, data_source=None, start=None, end=None,
# Data from Google Finance
aapl = DataReader("AAPL", "google")

# Data from Quandl
aapl = DataReader("AAPL", "quandl")

# Data from FRED
vix = DataReader("VIXCLS", "fred")

Expand Down Expand Up @@ -132,6 +142,12 @@ def DataReader(name, data_source=None, start=None, end=None,
retry_count=retry_count, pause=pause,
session=session).read()

elif data_source == "quandl":
return QuandlDailyReader(symbols=name, start=start, end=end,
chunksize=25,
retry_count=retry_count, pause=pause,
session=session).read()

elif data_source == "enigma":
return EnigmaReader(datapath=name, api_key=access_key).read()

Expand Down
Empty file.
42 changes: 42 additions & 0 deletions pandas_datareader/quandl/daily.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
from pandas_datareader.base import _DailyBaseReader


class QuandlDailyReader(_DailyBaseReader):

"""
Returns DataFrame/Panel of historical stock prices from symbols, over date
range, start to end. To avoid being penalized by Google Finance servers,
pauses between downloading 'chunks' of symbols can be specified.

Parameters
----------
symbols : string, array-like object (list, tuple, Series), or DataFrame
Single stock symbol (ticker), array-like object of symbols or
DataFrame with index containing stock symbols.
start : string, (defaults to '1/1/2010')
Starting date, timestamp. Parses many different kind of date
representations (e.g., 'JAN-01-2010', '1/1/10', 'Jan, 1, 1980')
end : string, (defaults to today)
Ending date, timestamp. Same format as starting date.
retry_count : int, default 3
Number of times to retry query request.
pause : int, default 0
Time, in seconds, to pause between consecutive queries of chunks. If
single value given for symbol, represents the pause between retries.
chunksize : int, default 25
Number of symbols to download consecutively before intiating pause.
session : Session, default None
requests.sessions.Session instance to be used
"""

@property
def url(self):
# https://www.quandl.com/api/v3/datasets/WIKI/AAPL.csv?start_date=1985-05-01&end_date=1997-07-01
return 'https://www.quandl.com/api/v3/datasets/WIKI/%s.csv' % (self.symbols)

def _get_params(self, symbol):
params = {
'start_date': self.start.strftime('%Y-%m-%d'),
'end_date': self.end.strftime('%Y-%m-%d'),
}
return params
Empty file.
34 changes: 34 additions & 0 deletions pandas_datareader/tests/quandl/test_quandl.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import pytest

import pandas_datareader.data as web

from datetime import datetime

import pandas.util.testing as tm

class TestQuandl(object):

@classmethod
def setup_class(cls):
cls.locales = tm.get_locales(prefix='en_US')
if not cls.locales: # pragma: no cover
pytest.skip("US English locale not available for testing")

@classmethod
def teardown_class(cls):
del cls.locales

def test_quandl(self):
# asserts that google is minimally working and that it throws
# an exception when DataReader can't get a 200 response from
# google
start = datetime(2010, 1, 1)
end = datetime(2013, 1, 27)

for locale in self.locales:
with tm.set_locale(locale):
panel = web.DataReader("F", 'quandl', start, end)
assert panel.Close[-1] == 13.68

with pytest.raises(Exception):
web.DataReader('NON EXISTENT TICKER', 'quandl', start, end)