diff --git a/.gitignore b/.gitignore
index ab4a70189b6..3ccfd94a901 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,6 +19,9 @@ gamestonk_terminal/config_plot.py
gamestonk_terminal/config_terminal.py
gamestonk_terminal/feature_flags.py
gamestonk_terminal/jupyter/reports/stored/*
+gamestonk_terminal/jupyter/dashboards/.ipynb_checkpoints
+gamestonk_terminal/jupyter/reports/.ipynb_checkpoints
+gamestonk_terminal/jupyter/widgets/.ipynb_checkpoints
!gamestonk_terminal/jupyter/reports/stored/.gitkeep
!gamestonk_terminal/jupyter/dashboards/*.ipynb
!gamestonk_terminal/jupyter/reports/*.ipynb
diff --git a/bots/requirements.txt b/bots/requirements.txt
index dbb27a3f5d9..21cae8c51c0 100755
--- a/bots/requirements.txt
+++ b/bots/requirements.txt
@@ -1,44 +1,44 @@
aiohttp==3.8.1; python_version >= "3.6" and python_full_version >= "3.8.0"
-aiosignal==1.2.0; python_version >= "3.6"
+aiosignal==1.2.0; python_version >= "3.6" and python_full_version >= "3.8.0"
alabaster==0.7.12; python_version >= "3.7"
alpha-vantage==2.3.1
ansiwrap==0.8.4; python_version >= "3.6"
anyio==3.5.0; python_full_version >= "3.6.2" and python_version >= "3.7"
-appnope==0.1.2; platform_system == "Darwin" and python_version >= "3.8" and sys_platform == "darwin"
-argon2-cffi-bindings==21.2.0; python_version >= "3.6"
+appnope==0.1.2; platform_system == "Darwin" and python_version >= "3.8" and sys_platform == "darwin" and python_full_version >= "3.6.2"
+argon2-cffi-bindings==21.2.0; python_version >= "3.7"
argon2-cffi==21.3.0; python_version >= "3.7"
ascii-magic==1.6; python_version >= "3.5"
asgiref==3.5.0; python_version >= "3.7"
astor==0.8.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7"
astroid==2.9.3; python_full_version >= "3.6.2"
-asttokens==2.0.5; python_version >= "3.8"
+asttokens==2.0.5; python_full_version >= "3.6.2" and python_version >= "3.8"
async-generator==1.10; python_version >= "3.7" and python_version < "4.0"
-async-timeout==4.0.2; python_version >= "3.6"
+async-timeout==4.0.2; python_version >= "3.6" and python_full_version >= "3.8.0"
atomicwrites==1.4.0; python_version >= "3.7" and python_full_version < "3.0.0" and sys_platform == "win32" or sys_platform == "win32" and python_version >= "3.7" and python_full_version >= "3.4.0"
-attrs==21.4.0; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_full_version >= "3.5.0" and python_version >= "3.7" and python_version < "4.0"
+attrs==21.4.0; python_full_version >= "3.8.0" and python_version >= "3.7" and (python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.5.0") and (python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.5.0") and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7")
babel==2.9.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7"
-backcall==0.2.0; python_version >= "3.8"
+backcall==0.2.0; python_full_version >= "3.6.2" and python_version >= "3.8"
backports.zoneinfo==0.2.1; python_version < "3.9" and python_version >= "3.6" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6")
bandit==1.7.4; python_version >= "3.7"
beartype==0.7.1; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.6.0"
beautifulsoup4==4.10.0; python_full_version > "3.0.0" and python_version >= "3.7"
black==22.1.0; python_full_version >= "3.6.2"
bleach==4.1.0; python_version >= "3.7"
-boto3==1.21.22; python_version >= "3.6"
-botocore==1.24.22; python_version >= "3.6"
+boto3==1.21.25; python_version >= "3.6"
+botocore==1.24.25; python_version >= "3.6"
bs4==0.0.1
bt==0.2.9; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.6.0")
-certifi==2021.10.8; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4"
-cffi==1.15.0
+certifi==2021.10.8; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.8" and python_full_version < "4.0.0" and (python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0") and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7")
+cffi==1.15.0; python_version >= "3.7"
cfgv==3.3.1; python_full_version >= "3.6.1"
-charset-normalizer==2.0.12; python_full_version >= "3.6.0" and python_version >= "3.6"
+charset-normalizer==2.0.12; python_full_version >= "3.8.0" and python_version >= "3.8" and python_version < "4.0" and python_full_version < "4.0.0" and (python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0") and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7")
click==8.0.4; python_version >= "3.7" and python_full_version >= "3.6.2"
codespell==2.1.0; python_version >= "3.5"
-colorama==0.4.4; python_full_version >= "3.6.2" and python_full_version < "4.0.0" and (python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.5") and (python_version >= "3.6" and python_full_version < "3.0.0" and sys_platform == "win32" or sys_platform == "win32" and python_version >= "3.6" and python_full_version >= "3.5.0") and sys_platform == "win32" and (python_version >= "3.7" and python_full_version < "3.0.0" and sys_platform == "win32" or sys_platform == "win32" and python_version >= "3.7" and python_full_version >= "3.5.0") and (python_version >= "3.7" and python_full_version < "3.0.0" and platform_system == "Windows" or platform_system == "Windows" and python_version >= "3.7" and python_full_version >= "3.5.0") and (python_version >= "2.7" and python_full_version < "3.0.0" and platform_system == "Windows" or python_full_version >= "3.5.0" and platform_system == "Windows") and (python_version >= "3.6" and python_full_version < "3.0.0" and platform_system == "Windows" or platform_system == "Windows" and python_version >= "3.6" and python_full_version >= "3.5.0") and (python_version >= "3.8" and python_full_version < "3.0.0" and sys_platform == "win32" or sys_platform == "win32" and python_version >= "3.8" and python_full_version >= "3.5.0")
+colorama==0.4.4; python_full_version >= "3.6.2" and python_full_version < "4.0.0" and (python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.5") and (python_version >= "3.6" and python_full_version < "3.0.0" and sys_platform == "win32" or sys_platform == "win32" and python_version >= "3.6" and python_full_version >= "3.5.0") and sys_platform == "win32" and (python_version >= "3.7" and python_full_version < "3.0.0" and sys_platform == "win32" or sys_platform == "win32" and python_version >= "3.7" and python_full_version >= "3.5.0") and (python_version >= "3.7" and python_full_version < "3.0.0" and platform_system == "Windows" or platform_system == "Windows" and python_version >= "3.7" and python_full_version >= "3.5.0") and (python_version >= "3.6" and python_full_version < "3.0.0" and platform_system == "Windows" or python_full_version >= "3.5.0" and platform_system == "Windows" and python_version >= "3.6") and platform_system == "Windows" and python_version >= "3.8"
commonmark==0.9.1; python_full_version >= "3.6.2" and python_full_version < "4.0.0"
convertdate==2.4.0; python_version >= "3.7" and python_version < "4"
coverage==6.3.2; python_version >= "3.7"
-cryptography==36.0.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.6"
+cryptography==36.0.2; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.7"
cssselect==1.1.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0"
cvxpy==1.2.0; python_full_version >= "3.6.1" and python_full_version < "4.0.0" and python_version >= "3.7"
cycler==0.11.0; python_version >= "3.7"
@@ -46,7 +46,7 @@ cython==0.29.28; python_version >= "3.7" and python_full_version < "3.0.0" and s
dateparser==1.1.1; python_version >= "3.5"
datetime==4.4; python_version >= "3.5"
debugpy==1.5.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7"
-decorator==5.1.1; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8"
+decorator==5.1.1; python_full_version >= "3.6.2" and python_version >= "3.8" and (python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.5")
defusedxml==0.7.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7"
degiro-connector==2.0.18; python_full_version >= "3.7.1" and python_full_version < "4.0.0"
deprecation==2.1.0
@@ -56,10 +56,10 @@ distlib==0.3.4; python_full_version >= "3.6.1"
dnspython==2.2.1; python_version >= "3.6" and python_version < "4.0"
docutils==0.16; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7"
ecos==2.0.10; python_full_version >= "3.6.1" and python_full_version < "4.0.0" and python_version >= "3.7"
-entrypoints==0.4; python_full_version >= "3.6.1" and python_version >= "3.7"
+entrypoints==0.4; python_full_version >= "3.7.0" and python_version >= "3.7"
et-xmlfile==1.1.0; python_version >= "3.6"
exchange-calendars==3.6.1; python_version >= "3.7" and python_full_version >= "3.7.0"
-executing==0.8.3; python_version >= "3.8"
+executing==0.8.3; python_full_version >= "3.6.2" and python_version >= "3.8"
fastapi==0.73.0; python_full_version >= "3.6.1"
fear-greed-index==0.1.4; python_version >= "3.7"
ffn==0.3.6; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0"
@@ -69,26 +69,26 @@ finnhub-python==2.4.11
finviz==1.4.4
finvizfinance==0.12.2; python_version >= "3.5"
flake8==3.9.2; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0")
-fonttools==4.31.1; python_version >= "3.7"
+fonttools==4.31.2; python_version >= "3.7"
formulaic==0.3.2; python_version >= "3.7"
fred==3.1
fredapi==0.4.3
frozendict==2.3.0; python_version >= "3.6"
-frozenlist==1.3.0; python_version >= "3.7"
+frozenlist==1.3.0; python_version >= "3.7" and python_full_version >= "3.8.0"
fundamentalanalysis==0.2.12
future==0.18.2; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0"
gitdb==4.0.9; python_version >= "3.7"
gitpython==3.1.27; python_version >= "3.7"
-grpcio==1.44.0; python_full_version >= "3.7.1" and python_full_version < "4.0.0" and python_version >= "3.6"
+grpcio==1.45.0; python_full_version >= "3.7.1" and python_full_version < "4.0.0" and python_version >= "3.6"
h11==0.13.0; python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.7.0"
hijri-converter==2.2.3; python_version >= "3.6"
holidays==0.11.3.1; python_version >= "3.6"
identify==2.4.12; python_version >= "3.7" and python_full_version >= "3.6.1"
-idna==3.3; python_full_version >= "3.6.2" and python_version >= "3.7" and python_version < "4"
+idna==3.3; python_full_version >= "3.8.0" and python_version >= "3.8" and python_version < "4" and python_full_version < "4.0.0" and (python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0") and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7")
imagesize==1.3.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7"
inflection==0.5.1; python_version >= "3.6"
iniconfig==1.1.1; python_version >= "3.7"
-interface-meta==1.2.4; python_version >= "3.7"
+interface-meta==1.2.5; python_version >= "3.7"
investpy==1.0.8; python_version >= "3.7"
ipykernel==6.9.2; python_version >= "3.7"
ipympl==0.8.8
@@ -97,22 +97,22 @@ ipython==8.1.1; python_full_version >= "3.6.2" and python_version >= "3.8"
ipywidgets==7.7.0
iso8601==0.1.16
isort==5.10.1; python_full_version >= "3.6.2" and python_version < "4.0"
-jedi==0.18.1; python_version >= "3.8"
-jinja2==3.0.3; python_version >= "3.7"
+jedi==0.18.1; python_full_version >= "3.6.2" and python_version >= "3.8"
+jinja2==3.1.0; python_version >= "3.7"
jmespath==1.0.0; python_version >= "3.7"
-joblib==1.1.0; python_version >= "3.7"
+joblib==1.1.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7"
json5==0.9.6; python_version >= "3.7"
jsonschema==3.2.0
jupyter-client==7.1.2; python_full_version >= "3.7.0" and python_version >= "3.7"
jupyter-console==6.4.3; python_version >= "3.6"
-jupyter-core==4.9.2; python_full_version >= "3.6.1" and python_version >= "3.7"
+jupyter-core==4.9.2; python_full_version >= "3.7.0" and python_version >= "3.7"
jupyter-server==1.15.6; python_version >= "3.7"
jupyter==1.0.0
jupyterlab-pygments==0.1.2; python_version >= "3.7"
jupyterlab-server==2.11.2; python_version >= "3.7"
jupyterlab-widgets==1.1.0; python_version >= "3.6"
jupyterlab==3.3.2; python_version >= "3.7"
-kaleido==0.2.1; python_version >= "3.8" and python_version < "4.0"
+kaleido==0.2.1.post1
kiwisolver==1.4.0; python_version >= "3.7"
korean-lunar-calendar==0.2.1; python_version >= "3.7" and python_full_version >= "3.7.0"
lazy-object-proxy==1.7.1; python_version >= "3.6" and python_full_version >= "3.6.2"
@@ -121,7 +121,7 @@ lxml==4.8.0; python_version >= "3.7" and python_full_version < "3.0.0" or python
m2r2==0.2.8; python_version >= "3.7"
markdown-it-py==1.1.0; python_version >= "3.6" and python_version < "4.0"
markupsafe==2.1.1; python_version >= "3.7"
-matplotlib-inline==0.1.3; python_version >= "3.8"
+matplotlib-inline==0.1.3; python_full_version >= "3.6.2" and python_version >= "3.8"
matplotlib==3.5.1; python_version >= "3.7"
mccabe==0.6.1; python_full_version >= "3.6.2"
mdit-py-plugins==0.2.8; python_version >= "3.6" and python_version < "4.0"
@@ -129,11 +129,12 @@ mistune==0.8.4; python_version >= "3.7"
mock==4.0.3; python_version >= "3.6"
more-itertools==8.12.0; python_version >= "3.6"
mplfinance==0.12.8b9
-multidict==6.0.2; python_version >= "3.7"
+multidict==6.0.2; python_version >= "3.7" and python_full_version >= "3.8.0"
multitasking==0.0.10
mypy-extensions==0.4.3; python_version >= "3.7" and python_full_version >= "3.6.2"
mypy==0.930; python_version >= "3.6"
myst-parser==0.15.2; python_version >= "3.6"
+natsort==8.1.0; python_version >= "3.6"
nbclassic==0.3.7; python_version >= "3.7"
nbclient==0.5.13; python_full_version >= "3.7.0" and python_version >= "3.7"
nbconvert==6.4.4; python_version >= "3.7"
@@ -156,12 +157,12 @@ pandas-ta==0.3.14b
pandas==1.3.5; python_full_version >= "3.7.1"
pandocfilters==1.5.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7"
papermill==2.3.4; python_version >= "3.6"
-parso==0.8.3; python_version >= "3.8"
+parso==0.8.3; python_full_version >= "3.6.2" and python_version >= "3.8"
pathspec==0.9.0; python_full_version >= "3.6.2"
patsy==0.5.2; python_version >= "3.7"
pbr==5.8.1; python_version >= "3.7"
-pexpect==4.8.0; sys_platform != "win32" and python_version >= "3.8"
-pickleshare==0.7.5; python_version >= "3.8"
+pexpect==4.8.0; sys_platform != "win32" and python_version >= "3.8" and python_full_version >= "3.6.2"
+pickleshare==0.7.5; python_full_version >= "3.6.2" and python_version >= "3.8"
pillow==9.0.1; python_version >= "3.7" and python_version < "4"
platformdirs==2.5.1; python_version >= "3.7" and python_full_version >= "3.6.2"
plotly==5.6.0; python_version >= "3.6"
@@ -176,14 +177,14 @@ property-cached==1.6.4; python_version >= "3.7"
protobuf==3.19.4; python_full_version >= "3.7.1" and python_full_version < "4.0.0" and python_version >= "3.5"
psaw==0.0.12; python_version >= "3"
psutil==5.9.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7"
-ptyprocess==0.7.0; os_name != "nt" and python_version >= "3.8" and sys_platform != "win32"
-pure-eval==0.2.2; python_version >= "3.8"
-py==1.11.0; python_version >= "3.7" and python_full_version < "3.0.0" and implementation_name == "pypy" or python_full_version >= "3.5.0" and python_version >= "3.7" and implementation_name == "pypy"
+ptyprocess==0.7.0; os_name != "nt" and python_version >= "3.8" and sys_platform != "win32" and python_full_version >= "3.6.2"
+pure-eval==0.2.2; python_full_version >= "3.6.2" and python_version >= "3.8"
+py==1.11.0; python_full_version >= "3.7.0" and python_version >= "3.7" and implementation_name == "pypy"
pyally==1.1.2
pycodestyle==2.7.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0"
pycoingecko==2.2.0
-pycparser==2.21; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6"
-pydantic==1.9.0; python_full_version >= "3.6.1"
+pycparser==2.21; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" and os_name == "nt" and implementation_name != "pypy" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.7" and os_name == "nt" and implementation_name != "pypy"
+pydantic==1.8.2; python_full_version >= "3.6.1"
pyex==0.5.0
pyflakes==2.3.1; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0"
pygments==2.11.2; python_version >= "3.5"
@@ -196,13 +197,13 @@ pymongo==3.11.0; (python_version >= "2.7" and python_full_version < "3.0.0") or
pynacl==1.5.0; python_version >= "3.6"
pyobjc-core==8.4.1; python_version >= "3.6" and sys_platform == "darwin"
pyobjc-framework-cocoa==8.4.1; python_version >= "3.6" and sys_platform == "darwin"
-pyopenssl==22.0.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.6"
+pyopenssl==22.0.0; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.7"
pyotp==2.6.0; python_version >= "3"
pyparsing==3.0.7; python_version >= "3.7"
-pyportfolioopt==1.5.1; python_full_version >= "3.6.1" and python_full_version < "4.0.0"
+pyportfolioopt==1.5.2; python_full_version >= "3.6.1" and python_full_version < "4.0.0"
pyprind==2.11.3; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0"
pyrsistent==0.18.1; python_version >= "3.7"
-pysocks==1.7.1; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4"
+pysocks==1.7.1; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.7"
pytelegrambotapi==4.4.0
pytest-cov==3.0.0; python_version >= "3.6"
pytest-mock==3.7.0; python_version >= "3.7"
@@ -210,16 +211,16 @@ pytest-recording==0.12.0; python_version >= "3.5"
pytest==6.2.5; python_version >= "3.6"
python-binance==1.0.15
python-coinmarketcap==0.2
-python-dateutil==2.8.2; python_full_version >= "3.7.1" and python_version >= "3.7" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.7") and (python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.5") and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.6")
+python-dateutil==2.8.2; python_full_version >= "3.7.1" and python_version >= "3.7" and python_full_version < "4.0.0" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.7") and (python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.5") and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.6")
python-dotenv==0.19.2; python_version >= "3.5"
pytrends==4.8.0
pytz-deprecation-shim==0.1.0.post0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6"
-pytz==2022.1; python_full_version >= "3.7.1" and python_version >= "3.7" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7")
+pytz==2022.1; python_full_version >= "3.7.1" and python_version >= "3.7" and python_full_version < "4.0.0" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7")
pyupgrade==2.31.1; python_version >= "3.7"
-pywin32==303; sys_platform == "win32" and platform_python_implementation != "PyPy" and python_version >= "3.7"
+pywin32==303; sys_platform == "win32" and platform_python_implementation != "PyPy" and python_version >= "3.7" and python_full_version >= "3.7.0"
pywinpty==2.0.5; os_name == "nt" and python_version >= "3.7"
pyyaml==6.0; python_version >= "3.7" and python_full_version >= "3.6.1"
-pyzmq==22.3.0; python_full_version >= "3.6.1" and python_version >= "3.7"
+pyzmq==22.3.0; python_full_version >= "3.7.0" and python_version >= "3.7"
qdldl==0.1.5.post0; python_full_version >= "3.6.1" and python_full_version < "4.0.0" and python_version >= "3.7"
qtconsole==5.2.2; python_version >= "3.6"
qtpy==2.0.1; python_version >= "3.6"
@@ -233,7 +234,7 @@ rich==10.16.2; python_full_version >= "3.6.2" and python_full_version < "4.0.0"
robin-stocks==2.1.0; python_version >= "3"
s3transfer==0.5.2; python_version >= "3.6"
scikit-learn==1.0.2; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7"
-scipy==1.8.0; python_version >= "3.8" and python_version < "3.11" and python_full_version >= "3.6.1" and python_full_version < "4.0.0" and (python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0")
+scipy==1.8.0; python_version >= "3.8" and python_version < "3.11" and python_full_version >= "3.6.1" and python_full_version < "4.0.0" and (python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0") and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7")
screeninfo==0.6.7
scs==3.2.0; python_full_version >= "3.6.1" and python_full_version < "4.0.0" and python_version >= "3.7"
seaborn==0.11.2; python_version >= "3.6"
@@ -241,7 +242,7 @@ selenium==4.1.3; python_version >= "3.7" and python_version < "4.0"
send2trash==1.8.0; python_version >= "3.7"
sentiment-investor==2.1.0; python_version >= "3.8" and python_version < "4.0"
setuptools-scm==6.4.2; python_version >= "3.7"
-six==1.16.0; python_full_version >= "3.7.1" and python_version >= "3.7" and python_full_version < "4.0.0" and (python_version >= "3.8" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.3.0") and (python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.5") and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.7") and (python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.8")
+six==1.16.0; python_full_version >= "3.7.1" and python_version >= "3.8" and python_full_version < "4.0.0" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.7") and (python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0") and (python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.5")
slack-bolt==1.13.0; python_version >= "3.6"
slack-sdk==3.15.2; python_full_version >= "3.6.0" and python_version >= "3.6"
smmap==5.0.0; python_version >= "3.7"
@@ -260,24 +261,24 @@ sphinxcontrib-qthelp==1.0.3; python_version >= "3.7"
sphinxcontrib-serializinghtml==1.1.5; python_version >= "3.7"
squarify==0.4.3
sseclient==0.0.27
-stack-data==0.2.0; python_version >= "3.8"
+stack-data==0.2.0; python_full_version >= "3.6.2" and python_version >= "3.8"
starlette==0.17.1; python_version >= "3.6" and python_full_version >= "3.6.1"
statsmodels==0.13.2; python_version >= "3.7"
stevedore==3.5.0; python_version >= "3.7"
tabulate==0.8.9; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0"
temporal-cache==0.1.4
-tenacity==8.0.1; python_version >= "3.8" and python_version < "4.0"
+tenacity==8.0.1; python_version >= "3.6"
terminado==0.13.3; python_version >= "3.7"
testpath==0.6.0; python_version >= "3.7"
textwrap3==0.9.2; python_version >= "3.6"
thepassiveinvestor==1.0.10
-threadpoolctl==3.1.0; python_version >= "3.7"
+threadpoolctl==3.1.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7"
tokenize-rt==4.2.1; python_full_version >= "3.6.2" and python_version >= "3.7"
toml==0.10.2; python_full_version >= "3.6.2" and python_version >= "3.6" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.7")
tomli==2.0.1; python_version >= "3.7" and python_full_version >= "3.6.2"
toolz==0.11.2; python_version >= "3.7" and python_full_version >= "3.7.0"
-tornado==6.1; python_full_version >= "3.6.1" and python_version >= "3.7"
-tqdm==4.63.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6"
+tornado==6.1; python_full_version >= "3.7.0" and python_version >= "3.7"
+tqdm==4.63.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6"
tradingview-ta==3.2.10; python_version >= "3.6"
traitlets==5.1.1; python_full_version >= "3.7.0" and python_version >= "3.8"
trio-websocket==0.9.2; python_version >= "3.7" and python_version < "4.0"
@@ -295,21 +296,21 @@ ujson==5.1.0; python_version >= "3.7"
undetected-chromedriver==3.1.5.post4
unidecode==1.3.4; python_version >= "3.7"
update-checker==0.18.0; python_version >= "3.6" and python_version < "4.0"
-urllib3==1.26.9; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.7"
+urllib3==1.26.9; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.8" and python_full_version < "4.0.0" and (python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0") and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7") and (python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_full_version >= "3.5.0" and python_version < "4" and python_version >= "3.7") and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version < "4" and python_version >= "3.6")
user-agent==0.1.10
uvicorn==0.17.6; python_version >= "3.7"
vadersentiment==3.3.2
valinvest==0.0.2; python_version >= "3.6"
vcrpy==4.1.1; python_version >= "3.5"
virtualenv==20.13.4; python_full_version >= "3.6.1"
-voila==0.3.3; python_version >= "3.7"
-wcwidth==0.2.5; python_full_version >= "3.6.2" and python_version >= "3.6"
+voila==0.3.4; python_version >= "3.7"
+wcwidth==0.2.5; python_full_version >= "3.6.2" and python_version >= "3.8"
webencodings==0.5.1; python_version >= "3.7"
websocket-client==1.3.1; python_version >= "3.8" and python_version < "4.0"
websockets==9.1; python_full_version >= "3.6.1" and python_version >= "3.7"
widgetsnbextension==3.6.0
wrapt==1.13.3; python_full_version >= "3.7.1" and python_full_version < "4.0.0" and (python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.5") and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7")
wsproto==1.1.0; python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.7.0"
-yarl==1.7.2; python_version >= "3.6"
+yarl==1.7.2; python_version >= "3.6" and python_full_version >= "3.8.0"
yfinance==0.1.70
zope.interface==5.4.0; python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.5"
diff --git a/example.gst b/example.gst
deleted file mode 100644
index c4918f49f37..00000000000
--- a/example.gst
+++ /dev/null
@@ -1,9 +0,0 @@
-stocks
-load pltr
-dd
-pt
-rot
-../ins
-stats
-../ta
-fib
\ No newline at end of file
diff --git a/gamestonk_terminal/api.py b/gamestonk_terminal/api.py
index de8edb6cd7a..0f3b52d9ee4 100644
--- a/gamestonk_terminal/api.py
+++ b/gamestonk_terminal/api.py
@@ -10,5 +10,6 @@ from .etf import etf_api as etf
from .forex import forex_api as forex
from .mutual_funds import mutual_fund_api as funds
from .portfolio import portfolio_api as portfolio
+from .jupyter import widget_helpers as widgets
from .config_terminal import theme
diff --git a/gamestonk_terminal/cryptocurrency/crypto_api.py b/gamestonk_terminal/cryptocurrency/crypto_api.py
index bef76b3a1fc..8688547a929 100644
--- a/gamestonk_terminal/cryptocurrency/crypto_api.py
+++ b/gamestonk_terminal/cryptocurrency/crypto_api.py
@@ -1,4 +1,7 @@
"""Crypto context API."""
+import os
+from gamestonk_terminal.helper_classes import ModelsNamespace as _models
+
# flake8: noqa
# pylint: disable=unused-import
@@ -7,6 +10,7 @@ from .cryptocurrency_helpers import display_all_coins as coins
from .cryptocurrency_helpers import load
from .cryptocurrency_helpers import find
from .cryptocurrency_helpers import plot_chart as chart
+from .cryptocurrency_helpers import plot_candles as candle
# Context menus
from .defi import defi_api as defi
@@ -25,3 +29,6 @@ try:
except Exception:
# print("Prediction API is not available.")
pass
+
+# Models
+models = _models(os.path.abspath(os.path.dirname(__file__)))
diff --git a/gamestonk_terminal/cryptocurrency/cryptocurrency_helpers.py b/gamestonk_terminal/cryptocurrency/cryptocurrency_helpers.py
index 04cbbeb7c46..af6e9ad488a 100644
--- a/gamestonk_terminal/cryptocurrency/cryptocurrency_helpers.py
+++ b/gamestonk_terminal/cryptocurrency/cryptocurrency_helpers.py
@@ -1008,7 +1008,7 @@ def plot_candles(
}
# This plot has 2 axes
- if not external_axes:
+ if external_axes is None:
candle_chart_kwargs["returnfig"] = True
candle_chart_kwargs["figratio"] = (10, 7)
candle_chart_kwargs["figscale"] = 1.10
@@ -1036,7 +1036,7 @@ def plot_candles(
(ax, volume) = external_axes
candle_chart_kwargs["volume"] = volume
else:
- ax = external_axes
+ ax = external_axes[0]
candle_chart_kwargs["ax"] = ax
diff --git a/gamestonk_terminal/helper_funcs.py b/gamestonk_terminal/helper_funcs.py
index eab1be3e069..c35b5f234fc 100644
--- a/gamestonk_terminal/helper_funcs.py
+++ b/gamestonk_terminal/helper_funcs.py
@@ -1108,7 +1108,7 @@ def check_file_type_saved(valid_types: List[str] = None):
Parameters
----------
filenames: str
- filneames to be saved separated with comma
+ filenames to be saved separated with comma
Returns
-------
diff --git a/gamestonk_terminal/jupyter/dashboards/crypto.ipynb b/gamestonk_terminal/jupyter/dashboards/crypto.ipynb
new file mode 100644
index 00000000000..830e666a7db
--- /dev/null
+++ b/gamestonk_terminal/jupyter/dashboards/crypto.ipynb
@@ -0,0 +1,160 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "6e198e40-0c33-45b3-a79b-2d9ee9eff7b9",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "# Cryptocurrency exchange rates to USD ($)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "da655985-c9b7-492e-aefa-fbe3bc1865d5",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import json\n",
+ "import os\n",
+ "\n",
+ "import ipywidgets as ipw\n",
+ "from IPython.display import display\n",
+ "import pandas as pd\n",
+ "\n",
+ "from gamestonk_terminal import api as gst\n",
+ "\n",
+ "ipw.HTML(f\"\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "dcbbf867-af50-4d06-ae5c-7c09647aa55d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "COIN_LIST = (\n",
+ " \"BTC,ETH,USDT,BNB,USDC,XRP,LUNA,ADA,\"\n",
+ " + \"SOL,AVAX,DOT,BUSD,DOGE,UST,SHIB,WBTC,\"\n",
+ " + \"MATIC,CRO,DAI,LTC,ATOM,NEAR,LINK,BCH,\"\n",
+ " + \"UNI,TRX,FTT,ETC,LEO,ALGO,XLM,MANA,\"\n",
+ " + \"BTCB,HBAR,EGLD,ICP,SAND,XMR,WAVES,VET,\"\n",
+ " + \"APE,FIL,FTM,AXS,THETA,KLAY,XTZ,RUNE\"\n",
+ ").split(\",\")\n",
+ "exchange_rates = {}"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "deeeb80a-3675-44fb-9a1b-2325d8da4e7d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def get_exchange_rate(coin: str, days: int = 2):\n",
+ " \"\"\"Get exchange rate for a cryptocurrency agains USD.\"\"\"\n",
+ " (_, _, _, _, current_df, _,) = gst.crypto.load(\n",
+ " coin=coin,\n",
+ " source=\"cp\",\n",
+ " days=days,\n",
+ " vs=\"usd\",\n",
+ " interval=\"1day\",\n",
+ " should_load_ta_data=True,\n",
+ " )\n",
+ " price_color = \"neutral_color\"\n",
+ " if current_df[\"Close\"].iloc[-1] > current_df[\"Close\"].iloc[-2]:\n",
+ " price_color = \"up_color\"\n",
+ " elif current_df[\"Close\"].iloc[-1] < current_df[\"Close\"].iloc[-2]:\n",
+ " price_color = \"down_color\"\n",
+ " price = str(current_df[\"Close\"].iloc[-1])[:7]\n",
+ "\n",
+ " return price, price_color"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "18acf5cb-6cbf-484d-8042-107c030098de",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def show_rates(btn):\n",
+ " \"\"\"Show exchange rates in grid box widget.\"\"\"\n",
+ " grid.children = ()\n",
+ " for coin in COIN_LIST:\n",
+ " if coin not in exchange_rates.keys():\n",
+ " exchange_rates[coin] = {\"price\": None, \"color\": None}\n",
+ " try:\n",
+ " price, price_color = get_exchange_rate(coin=coin)\n",
+ " except:\n",
+ " price, price_color = \"-------\", \"neutral_color\"\n",
+ " widgets = list(grid.children)\n",
+ " widgets.append(\n",
+ " ipw.HTML(\n",
+ " gst.widgets.price_card(\n",
+ " ticker=coin,\n",
+ " price=price,\n",
+ " price_color=price_color,\n",
+ " )\n",
+ " )\n",
+ " )\n",
+ " grid.children = tuple(widgets)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "cf2021e9-de8a-466e-b341-fcd6abda64b5",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "update_rates = ipw.Button(description=\"Update rates\")\n",
+ "update_rates.on_click(show_rates)\n",
+ "header = ipw.HBox([update_rates])\n",
+ "\n",
+ "layout = ipw.Layout(grid_template_columns=\"1fr \" * 8)\n",
+ "grid = ipw.GridBox(\n",
+ " [],\n",
+ " layout=layout,\n",
+ ")\n",
+ "\n",
+ "display(header, grid)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "19dfcbfe-eaec-406e-bb3c-72d1b3538a6e",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.12"
+ },
+ "voila": {
+ "theme": "dark"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/gamestonk_terminal/jupyter/dashboards/dashboards_controller.py b/gamestonk_terminal/jupyter/dashboards/dashboards_controller.py
index 6451389b103..c19ce5af98d 100644
--- a/gamestonk_terminal/jupyter/dashboards/dashboards_controller.py
+++ b/gamestonk_terminal/jupyter/dashboards/dashboards_controller.py
@@ -25,7 +25,14 @@ logger = logging.getLogger(__name__)
class DashboardsController(BaseController):
"""Dashboards Controller class"""
- CHOICES_COMMANDS = ["stocks", "correlation", "vsurf", "chains", "shortdata"]
+ CHOICES_COMMANDS = [
+ "stocks",
+ "correlation",
+ "vsurf",
+ "chains",
+ "shortdata",
+ "crypto",
+ ]
PATH = "/jupyter/dashboards/"
def __init__(self, queue: List[str] = None):
@@ -43,7 +50,8 @@ class DashboardsController(BaseController):
correlation stock correlations
vsurf options volatility surface
chains options chain analysis
- shortdata finra shortdata analysis[/cmds]
+ shortdata finra shortdata analysis
+ crypto cryptocurrency exchange rates against USD[/cmds]
"""
console.print(text=help_text, menu="Jupyter - Dashboards")
@@ -64,14 +72,19 @@ class DashboardsController(BaseController):
@log_start_end(log=logger)
def call_chains(self, other_args: List[str]):
- """Process vsurf command"""
+ """Process chains command"""
create_call(other_args, "chains", "")
@log_start_end(log=logger)
def call_shortdata(self, other_args: List[str]):
- """Process vsurf command"""
+ """Process shortdata command"""
create_call(other_args, "shortdata", "")
+ @log_start_end(log=logger)
+ def call_crypto(self, other_args: List[str]):
+ """Process crypto command"""
+ create_call(other_args, "crypto", "")
+
def create_call(other_args: List[str], name: str, filename: str = None) -> None:
filename = filename if filename else name
diff --git a/gamestonk_terminal/jupyter/reports/due_diligence.ipynb b/gamestonk_terminal/jupyter/reports/due_diligence.ipynb
deleted file mode 100644
index b540e8b308f..00000000000
--- a/gamestonk_terminal/jupyter/reports/due_diligence.ipynb
+++ /dev/null
@@ -1,299 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "phantom-facility",
- "metadata": {},
- "outputs": [],
- "source": [
- "# Import most generic modules\n",
- "import importlib\n",
- "import pathlib\n",
- "import os\n",
- "import sys\n",
- "from datetime import datetime, timedelta\n",
- "import pandas as pd\n",
- "from IPython.display import display, Markdown\n",
- "import warnings\n",
- "\n",
- "warnings.filterwarnings(\"ignore\")\n",
- "module_path = os.path.abspath(os.path.join(\"../..\"))\n",
- "\n",
- "if module_path not in sys.path:\n",
- " sys.path.append(module_path)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "compact-count",
- "metadata": {
- "tags": [
- "parameters"
- ]
- },
- "outputs": [],
- "source": [
- "# Parameters that will be replaced when calling this notebook\n",
- "ticker = \"AAPL\"\n",
- "\n",
- "report_name = (\n",
- " f\"{datetime.now().strftime('%Y%m%d_%H%M%S')}_due_diligence_{ticker.upper()}\"\n",
- ")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "possible-constraint",
- "metadata": {},
- "outputs": [],
- "source": [
- "display(\n",
- " Markdown(\n",
- " f\"# {ticker.upper()} - Due Diligence - {datetime.now().strftime('%Y/%m/%d %H:%M:%S')}\"\n",
- " )\n",
- ")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "3a473d25",
- "metadata": {},
- "outputs": [],
- "source": [
- "base_path = os.path.abspath(os.path.join(\".\"))\n",
- "report_cache_dir = pathlib.Path(base_path, \"stored\")\n",
- "\n",
- "if not os.path.isdir(report_cache_dir):\n",
- " print(\"Reports data directory not found.\")\n",
- " print(f\"Creating {report_cache_dir}\")\n",
- " os.mkdir(report_cache_dir)\n",
- "else:\n",
- " print(f\"Found reports directory {report_cache_dir}\")"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "temporal-clerk",
- "metadata": {},
- "source": [
- "## Candle View"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "d783ed59-1fb2-44f2-b4b0-bfdfee9afcb6",
- "metadata": {},
- "outputs": [],
- "source": [
- "from gamestonk_terminal.stocks import stocks_helper\n",
- "\n",
- "df_stock_cache = pathlib.Path(report_cache_dir, f\"{ticker}_stock_data.pkl\")\n",
- "if os.path.isfile(df_stock_cache):\n",
- " print(f\"Found a cache file. Loading {df_stock_cache}\")\n",
- " df_stock = pd.read_pickle(df_stock_cache)\n",
- "else:\n",
- " print(\"Cache file not found. Getting data.\")\n",
- " df_stock = stocks_helper.load_ticker(\n",
- " ticker, (datetime.now() - timedelta(days=180)).strftime(\"%Y-%m-%d\")\n",
- " )\n",
- " df_stock = stocks_helper.find_trendline(df_stock, \"OC_High\", \"high\")\n",
- " df_stock = stocks_helper.find_trendline(df_stock, \"OC_Low\", \"low\")\n",
- " print(f\"Saving cache file {ticker}_stock_data.pkl\")\n",
- " df_stock.to_pickle(df_stock_cache)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "transsexual-trance",
- "metadata": {},
- "outputs": [],
- "source": [
- "import mplfinance as mpf\n",
- "\n",
- "mc = mpf.make_marketcolors(\n",
- " up=\"green\", down=\"red\", edge=\"black\", wick=\"black\", volume=\"in\", ohlc=\"i\"\n",
- ")\n",
- "s = mpf.make_mpf_style(marketcolors=mc, gridstyle=\":\", y_on_right=True)\n",
- "\n",
- "ap0 = []\n",
- "\n",
- "if \"OC_High_trend\" in df_stock.columns:\n",
- " ap0.append(\n",
- " mpf.make_addplot(df_stock[\"OC_High_trend\"], color=\"g\"),\n",
- " )\n",
- "\n",
- "if \"OC_Low_trend\" in df_stock.columns:\n",
- " ap0.append(\n",
- " mpf.make_addplot(df_stock[\"OC_Low_trend\"], color=\"b\"),\n",
- " )\n",
- "\n",
- "mpf.plot(\n",
- " df_stock,\n",
- " type=\"candle\",\n",
- " mav=(20, 50, 200),\n",
- " volume=True,\n",
- " addplot=ap0,\n",
- " xrotation=0,\n",
- " style=s,\n",
- " figratio=(10, 7),\n",
- " figscale=2.00,\n",
- " update_width_config=dict(\n",
- " candle_linewidth=1.0, candle_width=0.8, volume_linewidth=1.0\n",
- " ),\n",
- ")"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "political-intake",
- "metadata": {},
- "source": [
- "## Analyst Targets"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "numerous-begin",
- "metadata": {},
- "outputs": [],
- "source": [
- "from gamestonk_terminal.stocks.due_diligence import finviz_view\n",
- "\n",
- "try:\n",
- " finviz_view.analyst(ticker=ticker, export=\"\")\n",
- "except Exception as e:\n",
- " print(e)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "3cfd302c",
- "metadata": {},
- "source": [
- "## Fundamentals"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "written-lease",
- "metadata": {},
- "source": [
- "### Annual Income Statement"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "played-vancouver",
- "metadata": {},
- "outputs": [],
- "source": [
- "from gamestonk_terminal.stocks.fundamental_analysis import av_view\n",
- "\n",
- "av_view.display_income_statement(ticker, limit=1)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "smooth-forge",
- "metadata": {},
- "source": [
- "### Quarterly Income Statement"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "juvenile-throw",
- "metadata": {},
- "outputs": [],
- "source": [
- "from gamestonk_terminal.stocks.fundamental_analysis import av_view\n",
- "\n",
- "av_view.display_income_statement(ticker, limit=1, quarterly=True)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "passive-nerve",
- "metadata": {},
- "source": [
- "### Annual Balance Sheet"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "nominated-empire",
- "metadata": {},
- "outputs": [],
- "source": [
- "from gamestonk_terminal.stocks.fundamental_analysis import av_view\n",
- "\n",
- "av_view.display_balance_sheet(ticker, limit=1)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "special-bargain",
- "metadata": {},
- "source": [
- "### Annual Cash Flow"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "focused-thanks",
- "metadata": {},
- "outputs": [],
- "source": [
- "from gamestonk_terminal.stocks.fundamental_analysis import av_view\n",
- "\n",
- "av_view.display_cash_flow(ticker, limit=1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "sought-phase",
- "metadata": {},
- "outputs": [],
- "source": [
- "!jupyter nbconvert {report_name + \".ipynb\"} --to html --no-input"
- ]
- }
- ],
- "metadata": {
- "celltoolbar": "Tags",
- "interpreter": {
- "hash": "bdefb52be37b6ab26a82d292d220aaeebafdd00af58c431a8f759eb373ff9ec1"
- },
- "kernelspec": {
- "display_name": "Python 3.8.12 ('gst')",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.9.10"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/gamestonk_terminal/jupyter/reports/due_dilligence.ipynb b/gamestonk_terminal/jupyter/reports/due_dilligence.ipynb
new file mode 100644
index 00000000000..cf0e8ef4952
--- /dev/null
+++ b/gamestonk_terminal/jupyter/reports/due_dilligence.ipynb
@@ -0,0 +1,445 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "70ba2c8a",
+ "metadata": {},
+ "source": [
+ "## Notebook setup"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "driven-billion",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import io\n",
+ "import warnings\n",
+ "from datetime import datetime, timedelta\n",
+ "\n",
+ "import matplotlib.pyplot as plt\n",
+ "import matplotlib_inline.backend_inline\n",
+ "\n",
+ "from gamestonk_terminal import api as gst\n",
+ "from gamestonk_terminal.helper_classes import TerminalStyle\n",
+ "\n",
+ "%matplotlib inline\n",
+ "matplotlib_inline.backend_inline.set_matplotlib_formats(\"svg\")\n",
+ "warnings.filterwarnings(\"ignore\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c3fe7db5-ec6a-42cf-9e66-52dc1de22370",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "try:\n",
+ " theme = TerminalStyle(\"light\", \"light\", \"light\")\n",
+ "except:\n",
+ " pass\n",
+ "stylesheet = gst.widgets.html_report_stylesheet()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "807fda4e",
+ "metadata": {},
+ "source": [
+ "## Select Ticker"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "intended-sherman",
+ "metadata": {
+ "tags": [
+ "parameters"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "# Parameters that will be replaced when calling this notebook\n",
+ "ticker = \"AMC\"\n",
+ "report_name = \"\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "1be26dae-cafe-4a22-80aa-eff296fc1a9b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ticker_data = gst.stocks.load(ticker, start=datetime.now() - timedelta(days=365))\n",
+ "ticker_data = gst.stocks.process_candle(ticker_data)\n",
+ "\n",
+ "report_title = (f\"{ticker.upper()} Due Diligence report ({datetime.now().strftime('%Y-%m-%d %H:%M:%S')})\")\n",
+ "report_title"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e3b15d6f-dc9e-4f97-aa07-37d949a4e4bb",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "overview = gst.stocks.fa.models.yahoo_finance.get_info(ticker=ticker).transpose()[\n",
+ " \"Long business summary\"\n",
+ "][0]\n",
+ "overview"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f8a0d747",
+ "metadata": {},
+ "source": [
+ "## Data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "aca4b6ef",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "(\n",
+ " df_year_estimates,\n",
+ " df_quarter_earnings,\n",
+ " df_quarter_revenues,\n",
+ ") = gst.stocks.dd.models.business_insider.get_estimates(ticker)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b9c8feff",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "### 1. Yearly Estimates"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c0f0a1ca",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "display_year = sorted(df_year_estimates.columns.tolist())[:3]\n",
+ "df_year_estimates = df_year_estimates[display_year].head(5)\n",
+ "df_year_estimates"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "64d3d490",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "### 2. Quarterly Earnings"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "fde46353",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df_quarter_earnings"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d13a1e5e",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "### 3. Quarterly Revenues"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "51dfd9d2",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df_quarter_revenues"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6303e520",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "### 4. SEC Filings"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "3022130e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df_sec_filings = gst.stocks.dd.models.marketwatch.get_sec_filings(ticker)[\n",
+ " [\"Type\", \"Category\", \"Link\"]\n",
+ "].head(5)\n",
+ "df_sec_filings"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1e201003",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "### 5. Analyst Ratings"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "4662b1ac",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df_analyst = gst.stocks.dd.models.finviz.get_analyst_data(ticker)\n",
+ "df_analyst[\"target_to\"] = df_analyst[\"target_to\"].combine_first(df_analyst[\"target\"])\n",
+ "df_analyst = df_analyst[[\"category\", \"analyst\", \"rating\", \"target_to\"]].rename(\n",
+ " columns={\n",
+ " \"category\": \"Category\",\n",
+ " \"analyst\": \"Analyst\",\n",
+ " \"rating\": \"Rating\",\n",
+ " \"target_to\": \"Price Target\",\n",
+ " }\n",
+ ")\n",
+ "df_analyst"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ade589d6-d80f-4651-acb7-929943114ef0",
+ "metadata": {},
+ "source": [
+ "## Plots"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "621ed931-57e9-4ca6-afe8-8ef278122c77",
+ "metadata": {},
+ "source": [
+ "### 1. Price history"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "394668e1-1158-4a2b-8a38-04c72a6abdd6",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fig, (candles, volume) = plt.subplots(nrows=2, ncols=1, figsize=(5, 3), dpi=150)\n",
+ "gst.stocks.candle(\n",
+ " s_ticker=ticker,\n",
+ " df_stock=ticker_data,\n",
+ " use_matplotlib=True,\n",
+ " external_axes=[candles, volume],\n",
+ ")\n",
+ "candles.set_xticklabels(\"\")\n",
+ "fig.tight_layout()\n",
+ "\n",
+ "f = io.BytesIO()\n",
+ "fig.savefig(f, format=\"svg\")\n",
+ "price_chart = f.getvalue().decode(\"utf-8\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bf07a909",
+ "metadata": {},
+ "source": [
+ "### 2. Price Target"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "900686a3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fig, ax = plt.subplots(figsize=(8, 3), dpi=150)\n",
+ "gst.stocks.dd.pt(\n",
+ " ticker=ticker,\n",
+ " start=\"2021-10-25\",\n",
+ " interval=\"1440min\",\n",
+ " stock=ticker_data,\n",
+ " num=10,\n",
+ " raw=False,\n",
+ " external_axes=[ax],\n",
+ ")\n",
+ "fig.tight_layout()\n",
+ "f = io.BytesIO()\n",
+ "fig.savefig(f, format=\"svg\")\n",
+ "price_target_chart = f.getvalue().decode(\"utf-8\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "63c0538c",
+ "metadata": {},
+ "source": [
+ "### 3. Ratings over time"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f3733ff2",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fig, ax = plt.subplots(figsize=(8, 3), dpi=150)\n",
+ "gst.stocks.dd.rot(\n",
+ " ticker=ticker,\n",
+ " num=10,\n",
+ " raw=False,\n",
+ " export=\"\",\n",
+ " external_axes=[ax],\n",
+ ")\n",
+ "fig.tight_layout()\n",
+ "f = io.BytesIO()\n",
+ "fig.savefig(f, format=\"svg\")\n",
+ "ratings_over_time_chart = f.getvalue().decode(\"utf-8\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ac501a32-124d-4d21-aae1-a8d147bb1071",
+ "metadata": {},
+ "source": [
+ "## Render the report template to a file"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "mounted-phase",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "body = \"\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "abfe37e4-ea38-42c3-8fb5-7cceb233fb12",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Title\n",
+ "body += gst.widgets.h(1, report_title)\n",
+ "\n",
+ "body += gst.widgets.h(2, \"Overview\")\n",
+ "body += gst.widgets.row([gst.widgets.p(overview)])\n",
+ "\n",
+ "\n",
+ "# Analysts ratings\n",
+ "body += gst.widgets.h(2, \"Analyst assessments\")\n",
+ "body += gst.widgets.row([price_target_chart])\n",
+ "body += gst.widgets.row([df_analyst.to_html()])\n",
+ "body += gst.widgets.row([ratings_over_time_chart])\n",
+ "\n",
+ "# Price history and yearly estimates\n",
+ "body += gst.widgets.row(\n",
+ " [\n",
+ " gst.widgets.h(3, \"Price history\") + price_chart,\n",
+ " gst.widgets.h(3, \"Estimates\") + df_year_estimates.head().to_html(),\n",
+ " ]\n",
+ ")\n",
+ "\n",
+ "# Earnings and revenues\n",
+ "body += gst.widgets.h(2, \"Earnings and revenues\")\n",
+ "body += gst.widgets.row([df_quarter_earnings.head().to_html()])\n",
+ "body += gst.widgets.row([df_quarter_revenues.head().to_html()])\n",
+ "\n",
+ "# Sec filings and insider trading\n",
+ "body += gst.widgets.h(2, \"SEC filings\")\n",
+ "body += gst.widgets.row([df_sec_filings.to_html()])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "eb26492f-d13f-4302-b36d-ea8ee0020f82",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "report = gst.widgets.html_report(title=report_name, stylesheet=stylesheet, body=body)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "ee07c30c-9b38-4035-b128-20b7c9989951",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# to save the results\n",
+ "with open(report_name + \".html\", \"w\") as fh:\n",
+ " fh.write(report)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "34991096-bc3a-4134-b519-aa3a490abe98",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "celltoolbar": "Tags",
+ "interpreter": {
+ "hash": "31090e8428bc3cbe850895ffb75aca3a30f914a21038b56ab61f04d2ddd7301b"
+ },
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.12"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/gamestonk_terminal/jupyter/reports/reports_controller.py b/gamestonk_terminal/jupyter/reports/reports_controller.py
index 3c4edb365c4..f84e61f6e63 100644
--- a/gamestonk_terminal/jupyter/reports/reports_controller.py
+++ b/gamestonk_terminal/jupyter/reports/reports_controller.py
@@ -133,7 +133,7 @@ Select one of the following reports:[/info][cmds]
(known_args, other_args) = self.parser.parse_known_args(an_input.split())
- if not other_args and an_input in ("1", "3", "4"):
+ if not other_args and an_input in ("2", "3", "5"):
console.print("[red]Error: No ticker provided\n[/red]")
logger.error("Exception: No ticker provided")
return self.queue
diff --git a/gamestonk_terminal/jupyter/widget_helpers.py b/gamestonk_terminal/jupyter/widget_helpers.py
new file mode 100644
index 00000000000..090a5ce87ae
--- /dev/null
+++ b/gamestonk_terminal/jupyter/widget_helpers.py
@@ -0,0 +1,97 @@
+"""Widgets Helper Library.
+
+A library of `ipywidgets` wrappers for notebook based reports and voila dashboards.
+The library includes both python code and html/css/js elements that can be found in the
+`./widgets` folder.
+"""
+import os
+from typing import List
+from jinja2 import Template
+
+
+def price_card_stylesheet():
+ """Load a default CSS stylesheet from file."""
+ with open(
+ os.path.join(os.path.dirname(os.path.abspath(__file__)), "widgets", "style.css")
+ ) as f:
+ style = f.read()
+ return style
+
+
+def price_card(ticker: str, price: str, price_color: str = "neutral_color") -> str:
+ """Prepare a styled HTML element of a 128 by 128 price card.
+
+ Parameters
+ ----------
+ ticker : str
+ Instrument ticker for the price card
+ price : str
+ Instrument price as a string
+ price_color : str, optional
+ The color of the price. Accepts "up_color", "down_color" and default "neutral_color"
+
+ Returns
+ -------
+ str
+ HTML code as string
+ """
+ with open(
+ os.path.join(os.path.dirname(os.path.abspath(__file__)), "widgets", "card.j2")
+ ) as f:
+ template = Template(f.read())
+ card = template.render(ticker=ticker, price=price, price_color=price_color)
+ return card
+
+
+def html_report_stylesheet():
+ """Load a default CSS stylesheet from file."""
+ with open(
+ os.path.join(
+ os.path.dirname(os.path.abspath(__file__)), "widgets", "report.css"
+ )
+ ) as f:
+ style = f.read()
+ return style
+
+
+def html_report(title: str = "", stylesheet: str = "", body: str = "") -> str:
+ """Prepare a styled HTML page element.
+
+ Parameters
+ ----------
+ title : str, optional
+ Contents of the title tag, by default ""
+ stylesheet : str, optional
+ Contents of the stylesheet tag, by default ""
+ body : str, optional
+ Contents of the body tag, by default ""
+
+ Returns
+ -------
+ str
+ HTML code as string
+ """
+ with open(
+ os.path.join(os.path.dirname(os.path.abspath(__file__)), "widgets", "report.j2")
+ ) as f:
+ template = Template(f.read())
+ card = template.render(title=title, stylesheet=stylesheet, body=body)
+ return card
+
+
+def h(level: int, text: str) -> str:
+ """Wrap text into an HTML `h` tag."""
+ return f"
{text}
" + + +def row(elements: List) -> str: + with open( + os.path.join(os.path.dirname(os.path.abspath(__file__)), "widgets", "row.j2") + ) as f: + template = Template(f.read()) + return template.render(elements=elements) diff --git a/gamestonk_terminal/jupyter/widgets/card.j2 b/gamestonk_terminal/jupyter/widgets/card.j2 new file mode 100644 index 00000000000..09e630ad46b --- /dev/null +++ b/gamestonk_terminal/jupyter/widgets/card.j2 @@ -0,0 +1,8 @@ +