Skip to content

Commit 35189ec

Browse files
authored
Merge pull request #657 from bashtage/702
BUG: Remove pandas.compat dependencies
2 parents 68da604 + 4361bbf commit 35189ec

File tree

15 files changed

+72
-46
lines changed

15 files changed

+72
-46
lines changed

docs/source/whatsnew/v0.7.0.txt

+1
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ Backwards incompatible API changes
6464
Bug Fixes
6565
~~~~~~~~~
6666

67+
- Fixed import of pandas.compat (:issue:`657`)
6768
- Added support for passing the API KEY to QuandlReader either directly or by
6869
setting the environmental variable QUANDL_API_KEY (:issue:`485`).
6970
- Added support for optionally passing a custom base_url to the EnigmaReader (:issue:`499`).

pandas_datareader/bankofcanada.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from __future__ import unicode_literals
22

3-
import pandas.compat as compat
3+
from pandas_datareader.compat import string_types
44

55
from pandas_datareader.base import _BaseReader
66

@@ -17,7 +17,7 @@ class BankOfCanadaReader(_BaseReader):
1717
@property
1818
def url(self):
1919
"""API URL"""
20-
if not isinstance(self.symbols, compat.string_types):
20+
if not isinstance(self.symbols, string_types):
2121
raise ValueError('data name must be string')
2222

2323
return '{0}/{1}/csv'.format(self._URL, self.symbols)

pandas_datareader/base.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
import numpy as np
44

55
import requests
6+
from io import StringIO
67

7-
import pandas.compat as compat
88
from pandas import DataFrame
99
from pandas import read_csv, concat
1010
from pandas.io.common import urlencode
11-
from pandas.compat import StringIO, bytes_to_str
11+
from pandas_datareader.compat import bytes_to_str, string_types, binary_type
1212

1313
from pandas_datareader._utils import (RemoteDataError, SymbolWarning,
1414
_sanitize_dates, _init_session)
@@ -99,7 +99,7 @@ def _read_url_as_StringIO(self, url, params=None):
9999
service = self.__class__.__name__
100100
raise IOError("{} request returned no data; check URL for invalid "
101101
"inputs: {}".format(service, self.url))
102-
if isinstance(text, compat.binary_type):
102+
if isinstance(text, binary_type):
103103
out.write(bytes_to_str(text))
104104
else:
105105
out.write(text)
@@ -205,7 +205,7 @@ def _get_params(self, *args, **kwargs):
205205
def read(self):
206206
"""Read data"""
207207
# If a single symbol, (e.g., 'GOOG')
208-
if isinstance(self.symbols, (compat.string_types, int)):
208+
if isinstance(self.symbols, (string_types, int)):
209209
df = self._read_one_data(self.url,
210210
params=self._get_params(self.symbols))
211211
# Or multiple symbols, (e.g., ['GOOG', 'AAPL', 'MSFT'])

pandas_datareader/compat/__init__.py

+35-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
# flake8: noqa
2+
import pandas as pd
3+
import pandas.io.common as com
24
import sys
35
from distutils.version import LooseVersion
46
from io import BytesIO
57

6-
import pandas as pd
7-
import pandas.compat as compat
8-
import pandas.io.common as com
9-
108
PY3 = sys.version_info >= (3, 0)
119

1210
PANDAS_VERSION = LooseVersion(pd.__version__)
@@ -45,8 +43,39 @@ def get_filepath_or_buffer(filepath_or_buffer, encoding=None,
4543
else:
4644
from pandas.core.common import is_list_like
4745

48-
49-
if compat.PY3:
46+
if PY3:
5047
from urllib.error import HTTPError
48+
from functools import reduce
49+
50+
string_types = str,
51+
binary_type = bytes
52+
53+
54+
def str_to_bytes(s, encoding=None):
55+
return s.encode(encoding or 'ascii')
56+
57+
58+
def bytes_to_str(b, encoding=None):
59+
return b.decode(encoding or 'utf-8')
5160
else:
5261
from urllib2 import HTTPError
62+
63+
reduce = reduce
64+
binary_type = str
65+
string_types = basestring,
66+
67+
68+
def bytes_to_str(b, encoding=None):
69+
return b
70+
71+
72+
def str_to_bytes(s, encoding=None):
73+
return s
74+
75+
76+
def lmap(*args, **kwargs):
77+
return list(map(*args, **kwargs))
78+
79+
80+
def lrange(*args, **kwargs):
81+
return list(range(*args, **kwargs))

pandas_datareader/enigma.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@
22
import time
33

44
from io import StringIO
5-
import pandas.compat as compat
65
import pandas as pd
76

8-
from pandas_datareader.base import _BaseReader
7+
from pandas_datareader.base import _BaseReader, string_types
98

109

1110
class EnigmaReader(_BaseReader):
@@ -65,7 +64,7 @@ def __init__(self,
6564
self._api_key = api_key
6665

6766
self._dataset_id = dataset_id
68-
if not isinstance(self._dataset_id, compat.string_types):
67+
if not isinstance(self._dataset_id, string_types):
6968
raise ValueError(
7069
"The Enigma dataset_id must be a string (ex: "
7170
"'bedaf052-5fcd-4758-8d27-048ce8746c6a')")

pandas_datareader/eurostat.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
from __future__ import unicode_literals
22

33
import pandas as pd
4-
import pandas.compat as compat
54

65
from pandas_datareader.io.sdmx import read_sdmx, _read_sdmx_dsd
6+
from pandas_datareader.compat import string_types
77
from pandas_datareader.base import _BaseReader
88

99

@@ -15,7 +15,7 @@ class EurostatReader(_BaseReader):
1515
@property
1616
def url(self):
1717
"""API URL"""
18-
if not isinstance(self.symbols, compat.string_types):
18+
if not isinstance(self.symbols, string_types):
1919
raise ValueError('data name must be string')
2020

2121
q = '{0}/data/{1}/?startperiod={2}&endperiod={3}'
@@ -25,7 +25,7 @@ def url(self):
2525
@property
2626
def dsd_url(self):
2727
"""API DSD URL"""
28-
if not isinstance(self.symbols, compat.string_types):
28+
if not isinstance(self.symbols, string_types):
2929
raise ValueError('data name must be string')
3030

3131
return '{0}/datastructure/ESTAT/DSD_{1}'.format(

pandas_datareader/famafrench.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from zipfile import ZipFile
66

77
from pandas import read_csv, to_datetime
8-
from pandas.compat import lmap
8+
from pandas_datareader.compat import lmap
99

1010
from pandas_datareader.base import _BaseReader
1111

@@ -107,7 +107,7 @@ def _read_one_data(self, url, params):
107107

108108
datasets, table_desc = {}, []
109109
for i, src in enumerate(tables):
110-
match = re.search('^\s*,', src, re.M) # the table starts there
110+
match = re.search(r'^\s*,', src, re.M) # the table starts there
111111
start = 0 if not match else match.start()
112112

113113
df = read_csv(StringIO('Date' + src[start:]), **params)

pandas_datareader/google/quotes.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
import json
2+
import numpy as np
13
import pandas as pd
4+
import re
25
from dateutil.parser import parse
3-
import numpy as np
46

57
from pandas_datareader.base import _BaseReader
6-
import json
7-
import re
8+
from pandas_datareader.compat import string_types
89

910

1011
class GoogleQuotesReader(_BaseReader):
@@ -20,7 +21,7 @@ def url(self):
2021
@property
2122
def params(self):
2223
"""Parameters to use in API calls"""
23-
if isinstance(self.symbols, pd.compat.string_types):
24+
if isinstance(self.symbols, string_types):
2425
sym_list = self.symbols
2526
else:
2627
sym_list = ','.join(self.symbols)

pandas_datareader/io/jsdmx.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
# pylint: disable-msg=E1101,W0613,W0603
22

33
from __future__ import unicode_literals
4+
from collections import OrderedDict
45

56
import itertools
67
import sys
78

89
import numpy as np
910
import pandas as pd
10-
import pandas.compat as compat
1111

1212
from pandas_datareader.io.util import _read_content
1313

@@ -38,7 +38,7 @@ def read_jsdmx(path_or_buf):
3838
if isinstance(jdata, dict):
3939
data = jdata
4040
else:
41-
data = json.loads(jdata, object_pairs_hook=compat.OrderedDict)
41+
data = json.loads(jdata, object_pairs_hook=OrderedDict)
4242

4343
structure = data['structure']
4444
index = _parse_dimensions(structure['dimensions']['observation'])
@@ -56,9 +56,9 @@ def read_jsdmx(path_or_buf):
5656

5757
def _get_indexer(index):
5858
if index.nlevels == 1:
59-
return [str(i) for i in compat.range(len(index))]
59+
return [str(i) for i in range(len(index))]
6060
else:
61-
it = itertools.product(*[compat.range(
61+
it = itertools.product(*[range(
6262
len(level)) for level in index.levels])
6363
return [':'.join(map(str, i)) for i in it]
6464

@@ -68,7 +68,7 @@ def _parse_values(dataset, index, columns):
6868
series = dataset['series']
6969

7070
values = []
71-
# for s_key, s_value in compat.iteritems(series):
71+
# for s_key, s_value in iteritems(series):
7272
for s_key in _get_indexer(columns):
7373
try:
7474
observations = series[s_key]['observations']

pandas_datareader/io/sdmx.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
import collections
44
import time
55
import zipfile
6+
from io import BytesIO
67

78
import pandas as pd
8-
import pandas.compat as compat
99

1010
from pandas_datareader.io.util import _read_content
11-
from pandas_datareader.compat import HTTPError
11+
from pandas_datareader.compat import HTTPError, str_to_bytes
1212

1313

1414
_STRUCTURE = '{http://www.sdmx.org/resources/sdmxml/schemas/v2_1/structure}'
@@ -235,8 +235,8 @@ def _read_zipped_sdmx(path_or_buf):
235235
""" Unzipp data contains SDMX-XML """
236236
data = _read_content(path_or_buf)
237237

238-
zp = compat.BytesIO()
239-
zp.write(compat.str_to_bytes(data))
238+
zp = BytesIO()
239+
zp.write(str_to_bytes(data))
240240
f = zipfile.ZipFile(zp)
241241
files = f.namelist()
242242
assert len(files) == 1

pandas_datareader/io/util.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
import os
44

5-
import pandas.compat as compat
6-
from pandas_datareader.compat import get_filepath_or_buffer
5+
from pandas_datareader.compat import get_filepath_or_buffer, string_types
76

87

98
def _read_content(path_or_buf):
@@ -13,7 +12,7 @@ def _read_content(path_or_buf):
1312

1413
filepath_or_buffer = get_filepath_or_buffer(path_or_buf)[0]
1514

16-
if isinstance(filepath_or_buffer, compat.string_types):
15+
if isinstance(filepath_or_buffer, string_types):
1716
try:
1817
exists = os.path.exists(filepath_or_buffer)
1918
except (TypeError, ValueError):

pandas_datareader/oecd.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import pandas as pd
2-
import pandas.compat as compat
32

43
from pandas_datareader.io import read_jsdmx
54
from pandas_datareader.base import _BaseReader
5+
from pandas_datareader.compat import string_types
66

77

88
class OECDReader(_BaseReader):
@@ -15,7 +15,7 @@ def url(self):
1515
"""API URL"""
1616
url = 'http://stats.oecd.org/SDMX-JSON/data'
1717

18-
if not isinstance(self.symbols, compat.string_types):
18+
if not isinstance(self.symbols, string_types):
1919
raise ValueError('data name must be string')
2020

2121
# API: https://data.oecd.org/api/sdmx-json-documentation/

pandas_datareader/wb.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import warnings
44

5-
from pandas.compat import reduce, lrange, string_types
5+
from pandas_datareader.compat import reduce, lrange, string_types
66
import pandas as pd
77
import numpy as np
88

pandas_datareader/yahoo/fx.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import warnings
44
from pandas import (DataFrame, Series, to_datetime, concat)
55
from pandas_datareader.yahoo.daily import YahooDailyReader
6-
import pandas.compat as compat
76
from pandas_datareader._utils import (RemoteDataError, SymbolWarning)
7+
from pandas_datareader.compat import string_types
88

99

1010
class YahooFXReader(YahooDailyReader):
@@ -55,7 +55,7 @@ def read(self):
5555
"""Read data"""
5656
try:
5757
# If a single symbol, (e.g., 'GOOG')
58-
if isinstance(self.symbols, (compat.string_types, int)):
58+
if isinstance(self.symbols, (string_types, int)):
5959
df = self._read_one_data(self.symbols)
6060

6161
# Or multiple symbols, (e.g., ['GOOG', 'AAPL', 'MSFT'])

pandas_datareader/yahoo/quotes.py

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
import json
22
from collections import OrderedDict
3-
4-
import pandas.compat as compat
53
from pandas import DataFrame
64

7-
85
from pandas_datareader.base import _BaseReader
9-
6+
from pandas_datareader.compat import string_types
107

118
_DEFAULT_PARAMS = {
129
'lang': 'en-US',
@@ -24,7 +21,7 @@ def url(self):
2421
return 'https://query1.finance.yahoo.com/v7/finance/quote'
2522

2623
def read(self):
27-
if isinstance(self.symbols, compat.string_types):
24+
if isinstance(self.symbols, string_types):
2825
return self._read_one_data(self.url, self.params(self.symbols))
2926
else:
3027
data = OrderedDict()

0 commit comments

Comments
 (0)