summaryrefslogtreecommitdiffstats
path: root/openbb_terminal
diff options
context:
space:
mode:
authorJames Maslek <jmaslek11@gmail.com>2022-10-21 09:36:31 -0400
committerGitHub <noreply@github.com>2022-10-21 15:36:31 +0200
commit70d35ff598553069421e7e20a67671bdd47d030b (patch)
tree989a4383fb93978fe31ead1ab7da93b6d95344b8 /openbb_terminal
parent459e103a5a565217e99150ced13a0fc7899d9283 (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.py95
-rw-r--r--openbb_terminal/economy/nasdaq_model.py69
-rw-r--r--openbb_terminal/economy/nasdaq_view.py32
-rw-r--r--openbb_terminal/miscellaneous/data_sources_default.json4
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("&nbsp;", "-")
+ 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"],