|
| 1 | +import pandas_datareader.data as web |
| 2 | +from pandas_datareader._utils import RemoteDataError |
| 3 | +from pandas_datareader._testing import skip_on_exception |
| 4 | + |
| 5 | + |
| 6 | +class TestQuandl(object): |
| 7 | + # we test data from 10 years back where possible, 2 years otherwise, or... |
| 8 | + start10 = "2007-01-01" # over ten years back |
| 9 | + end10 = "2007-01-05" |
| 10 | + day10 = "2007-01-04" |
| 11 | + start2 = "2015-01-01" # over two years back |
| 12 | + end2 = "2015-01-05" |
| 13 | + day2 = "2015-01-02" |
| 14 | + |
| 15 | + def check_headers(self, df, expected_cols): |
| 16 | + expected_cols = frozenset(expected_cols) |
| 17 | + act_cols = frozenset(df.columns.tolist()) |
| 18 | + assert expected_cols == act_cols, "unexpected cols: " + str(act_cols) |
| 19 | + |
| 20 | + @skip_on_exception(RemoteDataError) |
| 21 | + def test_db_wiki_us(self): |
| 22 | + df = web.DataReader('F', 'quandl', self.start10, self.end10) |
| 23 | + self.check_headers(df, ['Open', 'High', 'Low', 'Close', 'Volume', |
| 24 | + 'ExDividend', 'SplitRatio', 'AdjOpen', |
| 25 | + 'AdjHigh', 'AdjLow', 'AdjClose', 'AdjVolume']) |
| 26 | + assert df.Close.at[self.day10] == 7.70 |
| 27 | + |
| 28 | + @skip_on_exception(RemoteDataError) |
| 29 | + def test_db_fse_frankfurt(self): |
| 30 | + # ALV_X: Allianz SE |
| 31 | + df = web.DataReader('FSE/ALV_X', 'quandl', self.start10, self.end10) |
| 32 | + self.check_headers(df, ['Open', 'High', 'Low', 'Close', 'Change', |
| 33 | + 'TradedVolume', 'Turnover', |
| 34 | + 'LastPriceoftheDay', 'DailyTradedUnits', |
| 35 | + 'DailyTurnover']) |
| 36 | + assert df.Close.at[self.day10] == 159.45 |
| 37 | + |
| 38 | + @skip_on_exception(RemoteDataError) |
| 39 | + def test_db_sse_de_stuttgart(self): |
| 40 | + # ALV: Allianz SE |
| 41 | + df = web.DataReader('SSE/ALV', 'quandl', self.start2, self.end2) |
| 42 | + self.check_headers(df, [ |
| 43 | + "High", "Low", "Last", "PreviousDayPrice", "Volume"]) |
| 44 | + # as of 2017-06-11: PreviousDayPrice can be outside Low/High range; |
| 45 | + # Volume can be NaN |
| 46 | + assert df.Last.at[self.day2] == 136.47 |
| 47 | + df2 = web.DataReader('ALV.DE', 'quandl', self.start2, self.end2) |
| 48 | + assert (df.Last == df2.Last).all() |
| 49 | + |
| 50 | + @skip_on_exception(RemoteDataError) |
| 51 | + def test_db_euronext_be_fr_nl_pt(self): |
| 52 | + # FP: Total SA |
| 53 | + # as of 2017-06-11, some datasets end a few months after their start, |
| 54 | + # e.g. ALVD, BASD |
| 55 | + df = web.DataReader('EURONEXT/FP', 'quandl', self.start2, self.end2) |
| 56 | + self.check_headers(df, [ |
| 57 | + "Open", "High", "Low", "Last", "Turnover", "Volume"]) |
| 58 | + assert df.Last.at[self.day2] == 42.525 |
| 59 | + df2 = web.DataReader('FP.FR', 'quandl', self.start2, self.end2) |
| 60 | + assert (df.Last == df2.Last).all() |
| 61 | + |
| 62 | + @skip_on_exception(RemoteDataError) |
| 63 | + def test_db_lse_uk(self): |
| 64 | + # RBS: Royal Bank of Scotland |
| 65 | + df = web.DataReader('LSE/RBS', 'quandl', self.start10, self.end10) |
| 66 | + self.check_headers(df, ["High", "Low", "LastClose", "Price", |
| 67 | + "Volume", "Change", "Var"]) |
| 68 | + # as of 2017-06-11, Price == LastClose, all others are NaN |
| 69 | + assert df.Price.at[self.day10] == 5950.983 |
| 70 | + |
| 71 | + @skip_on_exception(RemoteDataError) |
| 72 | + def test_db_nse_in(self): |
| 73 | + # TCS: Tata Consutancy Services |
| 74 | + df = web.DataReader('NSE/TCS', 'quandl', self.start10, self.end10) |
| 75 | + self.check_headers(df, ['Open', 'High', 'Low', 'Last', 'Close', |
| 76 | + 'TotalTradeQuantity', 'TurnoverLacs']) |
| 77 | + assert df.Close.at[self.day10] == 1259.05 |
| 78 | + |
| 79 | + @skip_on_exception(RemoteDataError) |
| 80 | + def test_db_tse_jp(self): |
| 81 | + # TSE/6758: Sony Corp. |
| 82 | + df = web.DataReader('TSE/6758', 'quandl', self.start10, self.end10) |
| 83 | + self.check_headers(df, ['Open', 'High', 'Low', 'Close', 'Volume']) |
| 84 | + assert df.Close.at[self.day10] == 5190.0 |
| 85 | + |
| 86 | + @skip_on_exception(RemoteDataError) |
| 87 | + def test_db_hkex_cn(self): |
| 88 | + # HKEX/00941: China Mobile |
| 89 | + df = web.DataReader('HKEX/00941', 'quandl', self.start2, self.end2) |
| 90 | + self.check_headers(df, |
| 91 | + ['NominalPrice', 'NetChange', 'Change', 'Bid', |
| 92 | + 'Ask', 'PEx', 'High', 'Low', 'PreviousClose', |
| 93 | + 'ShareVolume000', 'Turnover000', 'LotSize']) |
| 94 | + assert df.High.at[self.day2] == 91.9 |
0 commit comments