diff options
author | James Maslek <jmaslek11@gmail.com> | 2022-10-21 09:36:31 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-21 15:36:31 +0200 |
commit | 70d35ff598553069421e7e20a67671bdd47d030b (patch) | |
tree | 989a4383fb93978fe31ead1ab7da93b6d95344b8 /openbb_terminal | |
parent | 459e103a5a565217e99150ced13a0fc7899d9283 (diff) |
Economic calendar (#2936)
* First push
* Second commit
* Comment out 'spread'
* list to List
Diffstat (limited to 'openbb_terminal')
-rw-r--r-- | openbb_terminal/economy/economy_controller.py | 95 | ||||
-rw-r--r-- | openbb_terminal/economy/nasdaq_model.py | 69 | ||||
-rw-r--r-- | openbb_terminal/economy/nasdaq_view.py | 32 | ||||
-rw-r--r-- | openbb_terminal/miscellaneous/data_sources_default.json | 4 |
4 files changed, 165 insertions, 35 deletions
diff --git a/openbb_terminal/economy/economy_controller.py b/openbb_terminal/economy/economy_controller.py index 2a6bb319542..db409b83d76 100644 --- a/openbb_terminal/economy/economy_controller.py +++ b/openbb_terminal/economy/economy_controller.py @@ -6,7 +6,7 @@ import argparse import logging import os import itertools -from datetime import date +from datetime import date, datetime as dt from typing import List, Dict, Any import pandas as pd @@ -69,7 +69,7 @@ class EconomyController(BaseController): "rtps", "bigmac", "ycrv", - "spread", + # "spread", "events", "edebt", ] @@ -388,7 +388,8 @@ class EconomyController(BaseController): mt.add_cmd("map") mt.add_cmd("bigmac") mt.add_cmd("ycrv") - mt.add_cmd("spread") + # Comment out spread while investpy is donw :() + # mt.add_cmd("spread") mt.add_cmd("events") mt.add_cmd("edebt") mt.add_raw("\n") @@ -1269,33 +1270,17 @@ class EconomyController(BaseController): "--country", action="store", dest="country", - nargs="+", - default="all", + type=str, + default="", help="Display calendar for specific country.", ) parser.add_argument( - "-i", - "--importance", - action="store", - dest="importance", - choices=investingcom_model.IMPORTANCES, - help="Event importance classified as high, medium, low or all.", - ) - parser.add_argument( - "--categories", - action="store", - dest="category", - choices=investingcom_model.CATEGORIES, - default=None, - help="Event category.", - ) - parser.add_argument( "-s", "--start", dest="start_date", type=valid_date, help="The start date of the data (format: YEAR-MONTH-DAY, i.e. 2010-12-31)", - default=None, + default=dt.now().strftime("%Y-%m-%d"), ) parser.add_argument( "-e", @@ -1303,8 +1288,32 @@ class EconomyController(BaseController): dest="end_date", type=valid_date, help="The start date of the data (format: YEAR-MONTH-DAY, i.e. 2010-12-31)", + default=dt.now().strftime("%Y-%m-%d"), + ) + parser.add_argument( + "-d", + "--date", + dest="spec_date", + type=valid_date, + help="Get a specific date for events. Overrides start and end dates.", default=None, ) + parser.add_argument( + "-i", + "--importance", + action="store", + dest="importance", + choices=investingcom_model.IMPORTANCES, + help="Event importance classified as high, medium, low or all.", + ) + parser.add_argument( + "--categories", + action="store", + dest="category", + choices=investingcom_model.CATEGORIES, + default=None, + help="[INVESTING source only] Event category.", + ) ns_parser = self.parse_known_args_and_warn( parser, other_args, @@ -1315,7 +1324,8 @@ class EconomyController(BaseController): if ns_parser: if isinstance(ns_parser.country, list): - ns_parser.country = " ".join(ns_parser.country) + if ns_parser.source == "Investing": + ns_parser.country = " ".join(ns_parser.country) if ns_parser.start_date: start_date = ns_parser.start_date.strftime("%Y-%m-%d") @@ -1327,15 +1337,36 @@ class EconomyController(BaseController): else: end_date = None - investingcom_view.display_economic_calendar( - country=ns_parser.country, - importance=ns_parser.importance, - category=ns_parser.category, - start_date=start_date, - end_date=end_date, - limit=ns_parser.limit, - export=ns_parser.export, - ) + if ns_parser.source == "Investing": + investingcom_view.display_economic_calendar( + country=ns_parser.country, + importance=ns_parser.importance, + category=ns_parser.category, + start_date=start_date, + end_date=end_date, + limit=ns_parser.limit, + export=ns_parser.export, + ) + elif ns_parser.source == "Nasdaq": + countries = ( + ns_parser.country.replace("_", " ").title().split(",") + if ns_parser.country + else [] + ) + + if ns_parser.spec_date: + start_date = ns_parser.spec_date.strftime("%Y-%m-%d") + end_date = ns_parser.spec_date.strftime("%Y-%m-%d") + + else: + start_date, end_date = sorted([start_date, end_date]) + nasdaq_view.display_economic_calendar( + country=countries, + start_date=start_date, + end_date=end_date, + limit=ns_parser.limit, + export=ns_parser.export, + ) @log_start_end(log=logger) def call_plot(self, other_args: List[str]): diff --git a/openbb_terminal/economy/nasdaq_model.py b/openbb_terminal/economy/nasdaq_model.py index 00e7943b159..d0c1b5b22de 100644 --- a/openbb_terminal/economy/nasdaq_model.py +++ b/openbb_terminal/economy/nasdaq_model.py @@ -4,8 +4,9 @@ __docformat__ = "numpy" import argparse import logging import os -from typing import List +from typing import List, Union +from datetime import datetime as dt import pandas as pd import requests @@ -17,6 +18,72 @@ logger = logging.getLogger(__name__) @log_start_end(log=logger) +def get_economic_calendar( + countries: Union[List[str], str] = "", + start_date: str = dt.now().strftime("%Y-%m-%d"), + end_date: str = dt.now().strftime("%Y-%m-%d"), +) -> pd.DataFrame: + """Get economic calendar for countries between specified dates + + Parameters + ---------- + countries : [List[str],str] + List of countries to include in calendar. Empty returns all + start_date : str + Start date for calendar + end_date : str + End date for calendar + + Returns + ------- + pd.DataFrame + Economic calendar + """ + if isinstance(countries, str): + countries = [countries] + if start_date == end_date: + dates = [start_date] + else: + dates = ( + pd.date_range(start=start_date, end=end_date).strftime("%Y-%m-%d").tolist() + ) + calendar = pd.DataFrame() + for date in dates: + try: + df = pd.DataFrame( + requests.get( + f"https://api.nasdaq.com/api/calendar/economicevents?date={date}", + headers={ + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) " + "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36" + }, + ).json()["data"]["rows"] + ).replace(" ", "-") + df.loc[:, "Date"] = date + calendar = pd.concat([calendar, df], axis=0) + except TypeError: + continue + + if calendar.empty: + console.print("[red]No data found for date range.[/red]") + return pd.DataFrame() + + calendar = calendar.rename( + columns={"gmt": "Time (GMT)", "country": "Country", "eventName": "Event"} + ) + + calendar = calendar.drop(columns=["description"]) + if not countries: + return calendar + + calendar = calendar[calendar["Country"].isin(countries)].reset_index(drop=True) + if calendar.empty: + console.print(f"[red]No data found for {','.join(countries)}[/red]") + return pd.DataFrame() + return calendar + + +@log_start_end(log=logger) def check_country_code_type(list_of_codes: str) -> List[str]: """Check that codes are valid for NASDAQ API""" nasdaq_codes = list( diff --git a/openbb_terminal/economy/nasdaq_view.py b/openbb_terminal/economy/nasdaq_view.py index 6cb05b6cb40..62e47428fe8 100644 --- a/openbb_terminal/economy/nasdaq_view.py +++ b/openbb_terminal/economy/nasdaq_view.py @@ -24,6 +24,38 @@ logger = logging.getLogger(__name__) @log_start_end(log=logger) +def display_economic_calendar( + country: str, start_date: str, end_date: str, limit: int = 10, export: str = "" +) -> None: + """Display economic calendar for specified country between start and end dates + + Parameters + ---------- + country : str + Country to display calendar for + start_date : str + Start date for calendar + end_date : str + End date for calendar + limit : int + Limit number of rows to display + export : str + Export data to csv or excel file + """ + df = nasdaq_model.get_economic_calendar(country, start_date, end_date) + if df.empty: + return + print_rich_table( + df.head(limit), + title="Economic Calendar", + show_index=False, + headers=df.columns, + ) + console.print() + export_data(export, os.path.dirname(os.path.abspath(__file__)), "events", df) + + +@log_start_end(log=logger) @check_api_key(["API_KEY_QUANDL"]) def display_big_mac_index( country_codes: List[str] = None, diff --git a/openbb_terminal/miscellaneous/data_sources_default.json b/openbb_terminal/miscellaneous/data_sources_default.json index 69abfc2ca25..c5866995949 100644 --- a/openbb_terminal/miscellaneous/data_sources_default.json +++ b/openbb_terminal/miscellaneous/data_sources_default.json @@ -471,8 +471,8 @@ "futures": ["WallStreetJournal", "Finviz"], "map": ["Finviz"], "bigmac": ["Nasdaq"], - "ycrv": ["Investing", "FRED"], - "events": ["Investing"], + "ycrv": ["FRED","Investing"], + "events": ["Nasdaq","Investing"], "edebt": ["Wikipedia"], "rtps": ["AlphaVantage"], "valuation": ["Finviz"], |