1
+ import os
2
+
3
+ import pytest
4
+
1
5
import pandas_datareader .data as web
2
- from pandas_datareader ._utils import RemoteDataError
3
- from pandas_datareader ._testing import skip_on_exception
6
+ from pandas_datareader .compat import assert_frame_equal
7
+
8
+ TEST_API_KEY = os .getenv ('QUANDL_API_KEY' )
9
+ # Ensure blank TEST_API_KEY not used in pull request
10
+ TEST_API_KEY = None if not TEST_API_KEY else TEST_API_KEY
4
11
5
12
6
13
class TestQuandl (object ):
@@ -17,76 +24,88 @@ def check_headers(self, df, expected_cols):
17
24
act_cols = frozenset (df .columns .tolist ())
18
25
assert expected_cols == act_cols , "unexpected cols: " + str (act_cols )
19
26
20
- @skip_on_exception ( RemoteDataError )
27
+ @pytest . mark . skipif ( TEST_API_KEY is None , reason = "QUANDL_API_KEY not set" )
21
28
def test_db_wiki_us (self ):
22
- df = web .DataReader ('F' , 'quandl' , self .start10 , self .end10 )
29
+ df = web .DataReader ('F' , 'quandl' , self .start10 , self .end10 ,
30
+ access_key = TEST_API_KEY )
23
31
self .check_headers (df , ['Open' , 'High' , 'Low' , 'Close' , 'Volume' ,
24
32
'ExDividend' , 'SplitRatio' , 'AdjOpen' ,
25
33
'AdjHigh' , 'AdjLow' , 'AdjClose' , 'AdjVolume' ])
26
34
assert df .Close .at [self .day10 ] == 7.70
27
35
28
- @skip_on_exception ( RemoteDataError )
36
+ @pytest . mark . skipif ( TEST_API_KEY is None , reason = "QUANDL_API_KEY not set" )
29
37
def test_db_fse_frankfurt (self ):
30
38
# ALV_X: Allianz SE
31
- df = web .DataReader ('FSE/ALV_X' , 'quandl' , self .start10 , self .end10 )
39
+ df = web .DataReader ('FSE/ALV_X' , 'quandl' , self .start10 , self .end10 ,
40
+ access_key = TEST_API_KEY )
32
41
self .check_headers (df , ['Open' , 'High' , 'Low' , 'Close' , 'Change' ,
33
42
'TradedVolume' , 'Turnover' ,
34
43
'LastPriceoftheDay' , 'DailyTradedUnits' ,
35
44
'DailyTurnover' ])
36
45
assert df .Close .at [self .day10 ] == 159.45
37
46
38
- @skip_on_exception ( RemoteDataError )
47
+ @pytest . mark . skipif ( TEST_API_KEY is None , reason = "QUANDL_API_KEY not set" )
39
48
def test_db_sse_de_stuttgart (self ):
40
49
# ALV: Allianz SE
41
- df = web .DataReader ('SSE/ALV' , 'quandl' , self .start2 , self .end2 )
50
+ df = web .DataReader ('SSE/ALV' , 'quandl' , self .start2 , self .end2 ,
51
+ access_key = TEST_API_KEY )
42
52
self .check_headers (df , [
43
- "High" , "Low" , "Last" , "PreviousDayPrice" , "Volume" ])
53
+ "High" , "Low" , "Last" , "PreviousDayPrice" , "Volume" ])
44
54
# as of 2017-06-11: PreviousDayPrice can be outside Low/High range;
45
55
# Volume can be NaN
46
56
assert df .Last .at [self .day2 ] == 136.47
47
57
df2 = web .DataReader ('ALV.DE' , 'quandl' , self .start2 , self .end2 )
48
58
assert (df .Last == df2 .Last ).all ()
49
59
50
- @skip_on_exception ( RemoteDataError )
60
+ @pytest . mark . skipif ( TEST_API_KEY is None , reason = "QUANDL_API_KEY not set" )
51
61
def test_db_euronext_be_fr_nl_pt (self ):
52
62
# FP: Total SA
53
63
# as of 2017-06-11, some datasets end a few months after their start,
54
64
# e.g. ALVD, BASD
55
- df = web .DataReader ('EURONEXT/FP' , 'quandl' , self .start2 , self .end2 )
65
+ df = web .DataReader ('EURONEXT/FP' , 'quandl' , self .start2 , self .end2 ,
66
+ access_key = TEST_API_KEY )
56
67
self .check_headers (df , [
57
- "Open" , "High" , "Low" , "Last" , "Turnover" , "Volume" ])
68
+ "Open" , "High" , "Low" , "Last" , "Turnover" , "Volume" ])
58
69
assert df .Last .at [self .day2 ] == 42.525
59
70
df2 = web .DataReader ('FP.FR' , 'quandl' , self .start2 , self .end2 )
60
71
assert (df .Last == df2 .Last ).all ()
61
72
62
- @skip_on_exception ( RemoteDataError )
73
+ @pytest . mark . skipif ( TEST_API_KEY is None , reason = "QUANDL_API_KEY not set" )
63
74
def test_db_lse_uk (self ):
64
75
# RBS: Royal Bank of Scotland
65
- df = web .DataReader ('LSE/RBS' , 'quandl' , self .start10 , self .end10 )
76
+ df = web .DataReader ('LSE/RBS' , 'quandl' , self .start10 , self .end10 ,
77
+ access_key = TEST_API_KEY )
66
78
self .check_headers (df , ["High" , "Low" , "LastClose" , "Price" ,
67
79
"Volume" , "Change" , "Var" ])
68
80
# as of 2017-06-11, Price == LastClose, all others are NaN
69
81
assert df .Price .at [self .day10 ] == 5950.983
70
82
71
- @skip_on_exception ( RemoteDataError )
83
+ @pytest . mark . skipif ( TEST_API_KEY is None , reason = "QUANDL_API_KEY not set" )
72
84
def test_db_nse_in (self ):
73
85
# TCS: Tata Consutancy Services
74
- df = web .DataReader ('NSE/TCS' , 'quandl' , self .start10 , self .end10 )
86
+ df = web .DataReader ('NSE/TCS' , 'quandl' , self .start10 , self .end10 ,
87
+ access_key = TEST_API_KEY )
75
88
self .check_headers (df , ['Open' , 'High' , 'Low' , 'Last' , 'Close' ,
76
89
'TotalTradeQuantity' , 'TurnoverLacs' ])
77
90
assert df .Close .at [self .day10 ] == 1259.05
78
91
79
- @skip_on_exception ( RemoteDataError )
92
+ @pytest . mark . skipif ( TEST_API_KEY is None , reason = "QUANDL_API_KEY not set" )
80
93
def test_db_tse_jp (self ):
81
94
# TSE/6758: Sony Corp.
82
- df = web .DataReader ('TSE/6758' , 'quandl' , self .start10 , self .end10 )
95
+ df = web .DataReader ('TSE/6758' , 'quandl' , self .start10 , self .end10 ,
96
+ access_key = TEST_API_KEY )
83
97
self .check_headers (df , ['Open' , 'High' , 'Low' , 'Close' , 'Volume' ])
84
98
assert df .Close .at [self .day10 ] == 5190.0
85
99
86
- @skip_on_exception (RemoteDataError )
100
+ df2 = web .get_data_quandl ('TSE/6758' , self .start10 , self .end10 ,
101
+ api_key = TEST_API_KEY )
102
+ assert_frame_equal (df , df2 )
103
+
104
+ @pytest .mark .skipif (TEST_API_KEY is None , reason = "QUANDL_API_KEY not set" )
87
105
def test_db_hkex_cn (self ):
88
106
# HKEX/00941: China Mobile
89
- df = web .DataReader ('HKEX/00941' , 'quandl' , self .start2 , self .end2 )
107
+ df = web .DataReader ('HKEX/00941' , 'quandl' , self .start2 , self .end2 ,
108
+ access_key = TEST_API_KEY )
90
109
self .check_headers (df ,
91
110
['NominalPrice' , 'NetChange' , 'Change' , 'Bid' ,
92
111
'Ask' , 'PEx' , 'High' , 'Low' , 'PreviousClose' ,
0 commit comments