1
+ # flake8: noqa
2
+
1
3
from pandas_datareader .base import _DailyBaseReader
2
4
from pandas import read_csv , compat
3
- from pandas .compat import StringIO , bytes_to_str
5
+ from pandas .compat import StringIO
4
6
import datetime as dt
5
7
8
+
6
9
class MoexReader (_DailyBaseReader ):
7
10
8
11
"""
@@ -40,14 +43,15 @@ def __init__(self, *args, **kwargs):
40
43
raise ValueError ("Support for multiple symbols is not yet implemented." )
41
44
42
45
__url_metadata = "https://iss.moex.com/iss/securities/{symbol}.csv"
43
- __url_data = "https://iss.moex.com/iss/history/engines/{engine}/markets/{market}/securities/{symbol}.csv"
46
+ __url_data = "https://iss.moex.com/iss/history/engines/{engine}/" \
47
+ "markets/{market}/securities/{symbol}.csv"
44
48
45
49
@property
46
50
def url (self ):
47
51
return self .__url_data .format (
48
- engine = self .__engine ,
49
- market = self .__market ,
50
- symbol = self .symbols
52
+ engine = self .__engine ,
53
+ market = self .__market ,
54
+ symbol = self .symbols
51
55
)
52
56
53
57
def _get_params (self , start ):
@@ -70,7 +74,9 @@ def _get_params(self, start):
70
74
71
75
def _get_metadata (self ):
72
76
""" get a market and an engine for a given symbol """
73
- response = self ._get_response (self .__url_metadata .format (symbol = self .symbols ))
77
+ response = self ._get_response (
78
+ self .__url_metadata .format (symbol = self .symbols )
79
+ )
74
80
text = self ._sanitize_response (response )
75
81
if len (text ) == 0 :
76
82
service = self .__class__ .__name__
@@ -80,34 +86,39 @@ def _get_metadata(self):
80
86
text = text .decode ('windows-1251' )
81
87
else :
82
88
text = text
83
-
89
+
84
90
header_str = 'secid;boardid;'
85
91
get_data = False
86
92
for s in text .splitlines ():
87
93
if s .startswith (header_str ):
88
94
get_data = True
89
95
continue
90
- if get_data and s != '' :
96
+ if get_data and s != '' :
91
97
fields = s .split (';' )
92
98
return fields [5 ], fields [7 ]
93
99
service = self .__class__ .__name__
94
- raise IOError ("{} request returned no metadata"
95
- ": {}\n Typo in security symbol `{}`?" .format (service , self .__url_metadata .format (symbol = self .symbols ), self .symbols ))
100
+ raise IOError ("{} request returned no metadata: {}\n "
101
+ "Typo in security symbol `{}`?" .format (
102
+ service ,
103
+ self .__url_metadata .format (symbol = self .symbols ),
104
+ self .symbols
105
+ )
106
+ )
96
107
97
108
def read (self ):
98
109
""" read data """
99
110
try :
100
111
self .__market , self .__engine = self ._get_metadata ()
101
112
102
- end = self .end .strftime ('%Y-%m-%d' )
103
113
out_list = []
104
114
date_column = None
105
- while True : # read in loop with small date intervals
106
- if len (out_list )> 0 :
115
+ while True : # read in loop with small date intervals
116
+ if len (out_list ) > 0 :
107
117
if date_column is None :
108
118
date_column = out_list [0 ].split (';' ).index ('TRADEDATE' )
109
119
110
- start_str = out_list [- 1 ].split (';' , 4 )[date_column ] # get the last downloaded date
120
+ # get the last downloaded date
121
+ start_str = out_list [- 1 ].split (';' , 4 )[date_column ]
111
122
start = dt .datetime .strptime (start_str , '%Y-%m-%d' ).date ()
112
123
else :
113
124
start_str = self .start .strftime ('%Y-%m-%d' )
@@ -117,15 +128,16 @@ def read(self):
117
128
break
118
129
119
130
params = self ._get_params (start_str )
120
- strings_out = self ._read_url_as_String (self .url , params ).splitlines ()[2 :]
131
+ strings_out = self ._read_url_as_String (self .url , params ) \
132
+ .splitlines ()[2 :]
121
133
strings_out = list (filter (lambda x : x .strip (), strings_out ))
122
134
123
135
if len (out_list ) == 0 :
124
136
out_list = strings_out
125
137
if len (strings_out ) < 101 :
126
138
break
127
139
else :
128
- out_list += strings_out [1 :] # remove CSV head line
140
+ out_list += strings_out [1 :] # remove CSV head line
129
141
if len (strings_out ) < 100 :
130
142
break
131
143
str_io = StringIO ('\r \n ' .join (out_list ))
0 commit comments