-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy patheikon_data_import.py
205 lines (163 loc) · 6.29 KB
/
eikon_data_import.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
import eikon as ek
import configparser as cp
import datetime as dt
import pandas as pd
import os
from pathlib import Path
# Set global variables.
cfg = cp.ConfigParser()
cfg.read('eikon_cfg.cfg')
ek.set_app_key(cfg['eikon']['app_id'])
def get_time_series(rics: list, fields: list, start_date: str, end_date: str) -> pd.DataFrame:
"""
Retrieve time series data as Pandas DataFrame.
Validate date input format as string.
Not for stock data.
:param rics: List of RIC:s to get.
:param fields: List fields to get.
:param start_date: Start date of time series.
:param end_date: End date of time series.
:return: Pandas DataFrame.
"""
# Check date formats are YYYY-MM-DD.
try:
dt.datetime.strptime(start_date, '%Y-%m-%d')
except ValueError:
raise ValueError('"start_date" has incorrect format.')
try:
dt.datetime.strptime(end_date, '%Y-%m-%d')
except ValueError:
raise ValueError('"end_date" has incorrect format.')
data = ek.get_timeseries(rics, fields, start_date=start_date, end_date=end_date)
return data
def get_data(rics: list, fields: list):
"""
Eikon API call for data type file (not time series).
Print any errors.
:param rics: List of RIC:s to get.
:param fields: List fields to get.
:return: None.
"""
data, err = ek.get_data(rics, fields)
if err:
print(err)
return data
def make_data(rics: list, fields: list, name: str) -> None:
"""
Get data from Eikon API and save to .csv (not time series data).
:param rics: List of RIC:s to get.
:param fields: List fields to get.
:param name: File name to save (including ".csv" suffix).
:return: None.
"""
df = get_data(rics, fields)
df.index.name = 'ID'
to_csv(df, name)
def make_time_series(rics: list, fields: list, start_date: str, end_date: str, name: str) -> None:
"""
Get time series data from Eikon API and save to .csv file.
:param rics: List of RIC:s to get.
:param fields: List fields to get (Eikon offers "CLOSE" as only option).
:param start_date: Start date of time series (oldest date). Format "YYYY-MM-DD".
:param end_date: End date of time series (newest date). Format "YYYY-MM-DD".
:param name: New file name.
:return: None.
"""
df = get_time_series(rics, fields, start_date, end_date)
df.dropna(inplace=True)
to_csv(df, name, time_series=True)
def to_csv(df: pd.DataFrame, name: str, time_series=False) -> None:
"""
Save a Pandas DataFrame as a .csv file in the "eikon_data_files" directory.
:param df: Data to save as a .csv file.
:param name: File name (no suffix).
:param time_series: Is the file a time series type or not.
:return: None.
"""
abs_dir = os.path.dirname(__file__)
if time_series:
rel_dir = os.path.join(abs_dir, 'eikon_time_series_files')
else:
rel_dir = os.path.join(abs_dir, 'eikon_data_files')
path = ''.join([rel_dir, '/' + name])
df.to_csv(path, encoding='utf-8')
print(' ')
print('File "' + name + '" saved in directory "eikon_data_files".')
def read_data(name: str) -> pd.DataFrame:
"""
Read .csv file by name from directory "eikon_data_files".
:param name: File name (including suffix).
:return: Pandas DataFrame.
"""
import_dir = Path.cwd().joinpath('eikon_data_files')
path = Path.joinpath(import_dir, Path(name))
if path.exists():
return pd.read_csv(path, sep=',')
else:
print('File type "' + name + '.csv' + ' does not exist. Aborted.')
quit()
def read_time_series(name: str) -> pd.DataFrame:
"""
Read .csv file by name from directory "eikon_time_series_files".
:param name: File name (including suffix).
:return: Pandas DataFrame.
"""
import_dir = Path.cwd().joinpath('eikon_time_series_files')
path = Path.joinpath(import_dir, Path(name))
if path.exists():
return pd.read_csv(path, sep=',', index_col=0, parse_dates=True)
else:
print('File type "' + name + '.csv' + ' does not exist. Aborted.')
quit()
def create_data_file(rics_conf: str, fields_conf: str, file_name: str) -> None:
"""
Create .csv file with specified data from Eikon Python API and save in "/eikon_data_files".
:param rics_conf: Name of config file (including ".csv" suffix) with Eikon RICs.
:param fields_conf: Name of config file (including ".csv" suffix) with Eikon field names.
:param file_name: Name of file to save with data.
:return: None.
"""
rics, fields = read_config(rics_conf, fields_conf, time_series=False)
make_data(rics, fields, file_name)
def create_time_series_file(rics_conf: str, fields_conf: list, start_dt: str, end_dt: str, file_name: str) -> None:
"""
:param rics_conf: Name of config file (including ".csv" suffix) with Eikon RICs.
:param fields_conf: Name of config file (including ".csv" suffix) with Eikon field names.
:param start_dt: Earliest date.
:param end_dt: Newest date.
:param file_name: Name of file to save with data (including ".csv" suffix).
:return:
"""
rics = read_config(rics=rics_conf, fields=None, time_series=True)
make_time_series(rics, fields_conf, start_dt, end_dt, file_name)
def read_config(rics: str, fields, time_series=False):
"""
Read config files from directory "eikon_config_files".
:param rics: Name of .csv file with RICS to get.
:param fields: Name of .csv file with fields to get.
:param time_series: Time series type file or not.
:return: List(s).
"""
import_dir = Path.cwd().joinpath('eikon_config_files')
symb = []
path = Path.joinpath(import_dir, Path(rics))
if path.exists():
s = pd.read_csv(path, sep=',')
for column_name in s.columns:
symb = s[column_name].tolist()
else:
print('File type "' + rics + '.csv' + ' does not exist. Aborted.')
quit()
if not time_series:
flds = []
path = Path.joinpath(import_dir, Path(fields))
if path.exists():
f = pd.read_csv(path, sep=',')
for column_name in f.columns:
flds = f[column_name].tolist()
else:
print('File type "' + fields + '.csv' + ' does not exist. Aborted.')
quit()
return symb, flds
else:
return symb