Spaces:
Runtime error
Runtime error
| import os | |
| from datetime import datetime | |
| from typing import List | |
| import pandas as pd | |
| import pandas_market_calendars as mcal | |
| import pytz | |
| import requests | |
| from meta.data_processors._base import _Base | |
| # from _base import _Base | |
| class Iexcloud(_Base): | |
| def _get_base_url(self, mode: str) -> str: | |
| as1 = "mode must be sandbox or production." | |
| assert mode in {"sandbox", "production"}, as1 | |
| if mode == "sandbox": | |
| return "https://sandbox.iexapis.com" | |
| return "https://cloud.iexapis.com" | |
| def __init__( | |
| self, | |
| data_source: str, | |
| start_date: str, | |
| end_date: str, | |
| time_interval: str, | |
| **kwargs, | |
| ): | |
| super().__init__(data_source, start_date, end_date, time_interval, **kwargs) | |
| self.base_url = self._get_base_url(mode=kwargs["mode"]) | |
| self.token = kwargs["token"] or os.environ.get("IEX_TOKEN") | |
| def download_data( | |
| self, ticker_list: List[str], save_path: str = "./data/dataset.csv" | |
| ): | |
| """Returns end of day historical data for up to 15 years. | |
| Args: | |
| ticker_list (List[str]): List of the tickers to retrieve information. | |
| start_date (str): Oldest date of the range. | |
| end_date (str): Latest date of the range. | |
| Returns: | |
| pd.DataFrame: A pandas dataframe with end of day historical data | |
| for the specified tickers with the following columns: | |
| date, tic, open, high, low, close, adjusted_close, volume. | |
| Examples: | |
| kwargs['mode'] = 'sandbox' | |
| kwargs['token'] = 'Tsk_d633e2ff10d463...' | |
| >>> iex_dloader = Iexcloud(data_source='iexcloud', **kwargs) | |
| >>> iex_dloader.download_data(ticker_list=["AAPL", "NVDA"], | |
| start_date='2014-01-01', | |
| end_date='2021-12-12', | |
| time_interval = '1D') | |
| """ | |
| assert self.time_interval == "1D" # one day | |
| price_data = pd.DataFrame() | |
| query_params = { | |
| "token": self.token, | |
| } | |
| if self.start_date and self.end_date: | |
| query_params["from"] = self.start_date | |
| query_params["to"] = self.end_date | |
| for stock in ticker_list: | |
| end_point = f"{self.base_url}/stable/time-series/HISTORICAL_PRICES/{stock}" | |
| response = requests.get( | |
| url=end_point, | |
| params=query_params, | |
| ) | |
| if response.status_code != 200: | |
| raise requests.exceptions.RequestException(response.text) | |
| temp = pd.DataFrame.from_dict(data=response.json()) | |
| temp["ticker"] = stock | |
| price_data = price_data.append(temp) | |
| price_data = price_data[ | |
| [ | |
| "date", | |
| "ticker", | |
| "open", | |
| "high", | |
| "low", | |
| "close", | |
| "fclose", | |
| "volume", | |
| ] | |
| ] | |
| price_data = price_data.rename( | |
| columns={ | |
| "ticker": "tic", | |
| "date": "time", | |
| "fclose": "adjusted_close", | |
| } | |
| ) | |
| price_data.date = price_data.date.map( | |
| lambda x: datetime.fromtimestamp(x / 1000, pytz.UTC).strftime("%Y-%m-%d") | |
| ) | |
| self.dataframe = price_data | |
| self.save_data(save_path) | |
| print( | |
| f"Download complete! Dataset saved to {save_path}. \nShape of DataFrame: {self.dataframe.shape}" | |
| ) | |
| def get_trading_days(self, start: str, end: str) -> List[str]: | |
| """Retrieves every trading day between two dates. | |
| Args: | |
| start (str): Oldest date of the range. | |
| end (str): Latest date of the range. | |
| Returns: | |
| List[str]: List of all trading days in YYYY-dd-mm format. | |
| Examples: | |
| >>> iex_dloader = Iexcloud(data_source='iexcloud', | |
| mode='sandbox', | |
| token='Tsk_d633e2ff10d463...') | |
| >>> iex_dloader.get_trading_days(start='2014-01-01', | |
| end='2021-12-12') | |
| ['2021-12-15', '2021-12-16', '2021-12-17'] | |
| """ | |
| nyse = mcal.get_calendar("NYSE") | |
| df = nyse.schedule( | |
| start_date=pd.Timestamp(start, tz=pytz.UTC), | |
| end_date=pd.Timestamp(end, tz=pytz.UTC), | |
| ) | |
| return df.applymap(lambda x: x.strftime("%Y-%m-%d")).market_open.to_list() | |