diff --git a/ROADMAP.md b/ROADMAP.md
index ac1999baf06..1e76964f59f 100644
--- a/ROADMAP.md
+++ b/ROADMAP.md
@@ -32,9 +32,10 @@
## Discovery
* [x] Top Losers (@didier) - [PR #171](https://github.com/DidierRLopes/GamestonkTerminal/pull/171)
* [x] ARK orders (@aia) - [PR #140](https://github.com/DidierRLopes/GamestonkTerminal/pull/140)
+* [x] Analyse sectors/industry performance, overview and valuation from Finviz (@didier) - [PR #315](https://github.com/DidierRLopes/GamestonkTerminal/pull/315)
**NEXT**
-* [ ] Analyse sectors/industry performance, overview and valuation from Finviz (@didier)
+
---
diff --git a/gamestonk_terminal/discovery/README.md b/gamestonk_terminal/discovery/README.md
index 203a8a51e80..517d142d334 100644
--- a/gamestonk_terminal/discovery/README.md
+++ b/gamestonk_terminal/discovery/README.md
@@ -4,8 +4,8 @@ This menu aims to discover new stocks, and the usage of the following commands a
* [map](#map)
* S&P500 index stocks map [Finviz]
-* [sectors](#sectors)
- * show sectors performance [Alpha Vantage]
+* [rtp_sectors](#rtp_sectors)
+ * real-time performance sectors [Alpha Vantage]
* [gainers](#gainers)
* show latest top gainers [Yahoo Finance]
* [losers](#losers)
@@ -26,6 +26,13 @@ This menu aims to discover new stocks, and the usage of the following commands a
* great website for SPACs research [SpacHero]
* [uwhales](#uwhales)
* good website for SPACs research [UnusualWhales]
+* [valuation](#valuation)
+ * valuation of sectors, industry, country [Finviz]
+* [performance](#performance)
+ * performance of sectors, industry, country [Finviz]
+* [spectrum](#spectrum)
+ * spectrum of sectors, industry, country [Finviz]
+
## map
@@ -40,10 +47,10 @@ Performance index stocks map categorized by sectors and industries. Size represe

-## sectors
+## rtp_sectors
```shell
-usage: sectors
+usage: rtp_sectors
```
Real-time and historical sector performances calculated from S&P500 incumbents. Pops plot in terminal. [Source: Alpha Vantage]
@@ -167,3 +174,47 @@ usage: uwhales
Good website for SPACs research. [Source: www.unusualwhales.com]
+
+## valuation
+
+```shell
+usage: valuation [-g Sector,Industry,Industry (Basic Materials),Industry (Communication Services),
+Industry (Consumer Cyclical),Industry (Consumer Defensive),Industry (Energy),Industry (Financial),
+Industry (Healthcare),Industry (Industrials),Industry (Real Estate),Industry (Technology),
+Industry (Utilities),Country (U.S. listed stocks only),Capitalization]
+```
+
+valuation of sectors, industry, country. [Source: Finviz]
+* -g : Data group (sector, industry or country). Default: Sector.
+
+
+
+
+## performance
+
+```shell
+usage: performance [-g Sector,Industry,Industry (Basic Materials),Industry (Communication Services),
+Industry (Consumer Cyclical),Industry (Consumer Defensive),Industry (Energy),Industry (Financial),
+Industry (Healthcare),Industry (Industrials),Industry (Real Estate),Industry (Technology),
+Industry (Utilities),Country (U.S. listed stocks only),Capitalization]
+```
+
+performance of sectors, industry, country. [Source: Finviz]
+* -g : Data group (sector, industry or country). Default: Sector.
+
+
+
+
+## spectrum
+
+```
+usage: spectrum [-g Sector,Industry,Industry (Basic Materials),Industry (Communication Services),
+Industry (Consumer Cyclical),Industry (Consumer Defensive),Industry (Energy),Industry (Financial),
+Industry (Healthcare),Industry (Industrials),Industry (Real Estate),Industry (Technology),
+Industry (Utilities),Country (U.S. listed stocks only),Capitalization]
+```
+
+Spectrum of sectors, industry, country. [Source: Finviz]
+* -g : Data group (sector, industry or country). Default: Sector.
+
+
diff --git a/gamestonk_terminal/discovery/disc_controller.py b/gamestonk_terminal/discovery/disc_controller.py
index a8c44d739e0..a39f67e9d1f 100644
--- a/gamestonk_terminal/discovery/disc_controller.py
+++ b/gamestonk_terminal/discovery/disc_controller.py
@@ -2,9 +2,9 @@
__docformat__ = "numpy"
import argparse
+import os
from typing import List
from prompt_toolkit.completion import NestedCompleter
-
from gamestonk_terminal import feature_flags as gtff
from gamestonk_terminal.helper_funcs import get_flair
from gamestonk_terminal.menu import session
@@ -31,7 +31,7 @@ class DiscoveryController:
"q",
"quit",
"map",
- "sectors",
+ "rtp_sectors",
"gainers",
"losers",
"orders",
@@ -42,10 +42,14 @@ class DiscoveryController:
"simply_wallst",
"spachero",
"uwhales",
+ "valuation",
+ "performance",
+ "spectrum",
]
def __init__(self):
"""Constructor"""
+ self.spectrum_img_to_delete = ""
self.disc_parser = argparse.ArgumentParser(add_help=False, prog="disc")
self.disc_parser.add_argument(
"cmd",
@@ -57,26 +61,31 @@ class DiscoveryController:
""" Print help """
print("\nDiscovery Mode:")
- print(" help show this discovery menu again")
- print(" q quit this menu, and shows back to main menu")
- print(" quit quit to abandon program")
+ print(" help show this discovery menu again")
+ print(" q quit this menu, and shows back to main menu")
+ print(" quit quit to abandon program")
print("")
- print(" map S&P500 index stocks map [Finviz]")
- print(" sectors show sectors performance [Alpha Vantage]")
- print(" gainers show latest top gainers [Yahoo Finance]")
- print(" losers show latest top losers [Yahoo Finance]")
- print(" orders orders by Fidelity Customers [Fidelity]")
- print(" ark_orders orders by ARK Investment Management LLC")
- print(" up_earnings upcoming earnings release dates [Seeking Alpha]")
+ print(" map S&P500 index stocks map [Finviz]")
+ print(" rtp_sectors real-time performance sectors [Alpha Vantage]")
+ print(" gainers show latest top gainers [Yahoo Finance]")
+ print(" losers show latest top losers [Yahoo Finance]")
+ print(" orders orders by Fidelity Customers [Fidelity]")
print(
- " high_short show top high short interest stocks of over 20% ratio [www.highshortinterest.com]"
+ " ark_orders orders by ARK Investment Management LLC [www.cathiesark.com]"
+ )
+ print(" up_earnings upcoming earnings release dates [Seeking Alpha]")
+ print(
+ " high_short show top high short interest stocks of over 20% ratio [www.highshortinterest.com]"
)
print(
- " low_float show low float stocks under 10M shares float [www.lowfloat.com]"
+ " low_float show low float stocks under 10M shares float [www.lowfloat.com]"
)
- print(" simply_wallst Simply Wall St. research data [Simply Wall St.]")
- print(" spachero great website for SPACs research [SpacHero]")
- print(" uwhales good website for SPACs research [UnusualWhales]")
+ print(" simply_wallst Simply Wall St. research data [Simply Wall St.]")
+ print(" spachero great website for SPACs research [SpacHero]")
+ print(" uwhales good website for SPACs research [UnusualWhales]")
+ print(" valuation valuation of sectors, industry, country [Finviz]")
+ print(" performance performance of sectors, industry, country [Finviz]")
+ print(" spectrum spectrum of sectors, industry, country [Finviz]")
print("")
def switch(self, an_input: str):
@@ -91,6 +100,12 @@ class DiscoveryController:
"""
(known_args, other_args) = self.disc_parser.parse_known_args(an_input.split())
+ # Due to Finviz implementation of Spectrum, we delete the generated spectrum figure
+ # after saving it and displaying it to the user
+ if self.spectrum_img_to_delete:
+ os.remove(self.spectrum_img_to_delete + ".jpg")
+ self.spectrum_img_to_delete = ""
+
return getattr(
self, "call_" + known_args.cmd, lambda: "Command not recognized!"
)(other_args)
@@ -111,8 +126,8 @@ class DiscoveryController:
"""Process map command"""
finviz_view.map_sp500_view(other_args)
- def call_sectors(self, other_args: List[str]):
- """Process sectors command"""
+ def call_rtp_sectors(self, other_args: List[str]):
+ """Process rtp_sectors command"""
alpha_vantage_view.sectors_view(other_args)
def call_gainers(self, other_args: List[str]):
@@ -155,6 +170,20 @@ class DiscoveryController:
"""Process uwhales command"""
unusual_whales_view.unusual_whales_view(other_args)
+ def call_valuation(self, other_args: List[str]):
+ """Process valuation command"""
+ finviz_view.view_group_data(other_args, "valuation")
+
+ def call_performance(self, other_args: List[str]):
+ """Process performance command"""
+ finviz_view.view_group_data(other_args, "performance")
+
+ def call_spectrum(self, other_args: List[str]):
+ """Process spectrum command"""
+ self.spectrum_img_to_delete = finviz_view.view_group_data(
+ other_args, "spectrum"
+ )
+
def menu():
"""Discovery Menu"""
diff --git a/gamestonk_terminal/discovery/finviz_view.py b/gamestonk_terminal/discovery/finviz_view.py
index 46715342ea2..3bd3e06e8f6 100644
--- a/gamestonk_terminal/discovery/finviz_view.py
+++ b/gamestonk_terminal/discovery/finviz_view.py
@@ -5,6 +5,26 @@ import argparse
from typing import List
import webbrowser
from gamestonk_terminal.helper_funcs import parse_known_args_and_warn
+from finvizfinance.group import valuation, performance, spectrum
+from PIL import Image
+
+l_GROUPS = [
+ "Sector",
+ "Industry",
+ "Industry (Basic Materials)",
+ "Industry (Communication Services)",
+ "Industry (Consumer Cyclical)",
+ "Industry (Consumer Defensive)",
+ "Industry (Energy)",
+ "Industry (Financial)",
+ "Industry (Healthcare)",
+ "Industry (Industrials)",
+ "Industry (Real Estate)",
+ "Industry (Technology)",
+ "Industry (Utilities)",
+ "Country (U.S. listed stocks only)",
+ "Capitalization",
+]
def map_sp500_view(other_args: List[str]):
@@ -58,3 +78,109 @@ def map_sp500_view(other_args: List[str]):
f"https://finviz.com/map.ashx?t={d_type[ns_parser.s_type]}&st={d_period[ns_parser.s_period]}"
)
print("")
+
+
+def get_valuation_performance_data(group: str, data_type: str):
+ """Get group (sectors, industry or country) valuation/performance data
+
+ Parameters
+ ----------
+ other_args : List[str]
+ argparse other args
+ group : str
+ select group to see data between sectors, industry or country
+ data_type : str
+ select data type to see data between valuation or performance
+
+ Returns
+ ----------
+ pd.DataFrame
+ dataframe with valuation/performance data
+ """
+ if data_type == "valuation":
+ df_group = valuation.Valuation().ScreenerView(group=group)
+ elif data_type == "performance":
+ df_group = performance.Performance().ScreenerView(group=group)
+
+ return df_group
+
+
+def get_spectrum_data(group: str):
+ """Get group (sectors, industry or country) valuation/performance data
+
+ Parameters
+ ----------
+ other_args : List[str]
+ argparse other args
+ group : str
+ select group to see data between sectors, industry or country
+ data_type : str
+ select data type to see data between valuation or performance
+ """
+ spectrum.Spectrum().ScreenerView(group=group)
+
+
+def view_group_data(other_args: List[str], data_type: str):
+ """View group (sectors, industry or country) valuation/performance/spectrum data
+
+ Parameters
+ ----------
+ other_args : List[str]
+ argparse other args
+ data_type : str
+ select data type to see data between valuation, performance and spectrum
+ """
+ parser = argparse.ArgumentParser(
+ add_help=False,
+ prog="group_data",
+ description="""
+ View group (sectors, industry or country) valuation/performance/spectrum data. [Source: Finviz]
+ """,
+ )
+ parser.add_argument(
+ "-g",
+ "--group",
+ nargs="+",
+ type=str,
+ default="Sector",
+ dest="group",
+ help="Data group (sector, industry or country)",
+ choices=l_GROUPS,
+ )
+
+ try:
+ if other_args:
+ if "-" not in other_args[0]:
+ other_args.insert(0, "-g")
+ other_args = [other_args[0], " ".join(other_args[1:])]
+
+ ns_parser = parse_known_args_and_warn(parser, other_args)
+ if not ns_parser:
+ return
+
+ if isinstance(ns_parser.group, List):
+ ns_parser.group = ns_parser.group[0]
+
+ if data_type == "valuation" or data_type == "performance":
+ df_group = get_valuation_performance_data(ns_parser.group, data_type)
+ print(df_group.to_string())
+
+ elif data_type == "spectrum":
+ get_spectrum_data(ns_parser.group)
+
+ img = Image.open(ns_parser.group + ".jpg")
+ img.show()
+
+ print("")
+ return ns_parser.group
+
+ else:
+ print(
+ "Invalid data type. Choose between valuation, performance and spectrum."
+ )
+
+ print("")
+ return ""
+
+ except SystemExit:
+ print("")
diff --git a/poetry.lock b/poetry.lock
index 14b1fc7fb7c..b20746d369b 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1631,7 +1631,7 @@ python-versions = "*"
[[package]]
name = "pillow"
-version = "8.1.2"
+version = "8.2.0"
description = "Python Imaging Library (Fork)"
category = "main"
optional = false
@@ -2837,7 +2837,7 @@ prediction = ["fbprophet", "tensorflow", "pmdarima", "transformers", "flair", "t
[metadata]
lock-version = "1.1"
python-versions = "^3.6.8"
-content-hash = "d07d8303b9772ad67003224f0a4372bf91bf1685c7e0393eb4cc58757065324f"
+content-hash = "144771641ef753b1e937c0db16496c409905f6f692ef81a03d9ba716d9207bb0"
[metadata.files]
absl-py = [
@@ -3874,39 +3874,39 @@ pickleshare = [
{file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"},
]
pillow = [
- {file = "Pillow-8.1.2-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:5cf03b9534aca63b192856aa601c68d0764810857786ea5da652581f3a44c2b0"},
- {file = "Pillow-8.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:f91b50ad88048d795c0ad004abbe1390aa1882073b1dca10bfd55d0b8cf18ec5"},
- {file = "Pillow-8.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5762ebb4436f46b566fc6351d67a9b5386b5e5de4e58fdaa18a1c83e0e20f1a8"},
- {file = "Pillow-8.1.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e2cd8ac157c1e5ae88b6dd790648ee5d2777e76f1e5c7d184eaddb2938594f34"},
- {file = "Pillow-8.1.2-cp36-cp36m-win32.whl", hash = "sha256:72027ebf682abc9bafd93b43edc44279f641e8996fb2945104471419113cfc71"},
- {file = "Pillow-8.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:d1d6bca39bb6dd94fba23cdb3eeaea5e30c7717c5343004d900e2a63b132c341"},
- {file = "Pillow-8.1.2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:90882c6f084ef68b71bba190209a734bf90abb82ab5e8f64444c71d5974008c6"},
- {file = "Pillow-8.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:89e4c757a91b8c55d97c91fa09c69b3677c227b942fa749e9a66eef602f59c28"},
- {file = "Pillow-8.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:8c4e32218c764bc27fe49b7328195579581aa419920edcc321c4cb877c65258d"},
- {file = "Pillow-8.1.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:a01da2c266d9868c4f91a9c6faf47a251f23b9a862dce81d2ff583135206f5be"},
- {file = "Pillow-8.1.2-cp37-cp37m-win32.whl", hash = "sha256:30d33a1a6400132e6f521640dd3f64578ac9bfb79a619416d7e8802b4ce1dd55"},
- {file = "Pillow-8.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:71b01ee69e7df527439d7752a2ce8fb89e19a32df484a308eca3e81f673d3a03"},
- {file = "Pillow-8.1.2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:5a2d957eb4aba9d48170b8fe6538ec1fbc2119ffe6373782c03d8acad3323f2e"},
- {file = "Pillow-8.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:87f42c976f91ca2fc21a3293e25bd3cd895918597db1b95b93cbd949f7d019ce"},
- {file = "Pillow-8.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:15306d71a1e96d7e271fd2a0737038b5a92ca2978d2e38b6ced7966583e3d5af"},
- {file = "Pillow-8.1.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:71f31ee4df3d5e0b366dd362007740106d3210fb6a56ec4b581a5324ba254f06"},
- {file = "Pillow-8.1.2-cp38-cp38-win32.whl", hash = "sha256:98afcac3205d31ab6a10c5006b0cf040d0026a68ec051edd3517b776c1d78b09"},
- {file = "Pillow-8.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:328240f7dddf77783e72d5ed79899a6b48bc6681f8d1f6001f55933cb4905060"},
- {file = "Pillow-8.1.2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:bead24c0ae3f1f6afcb915a057943ccf65fc755d11a1410a909c1fefb6c06ad1"},
- {file = "Pillow-8.1.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81b3716cc9744ffdf76b39afb6247eae754186838cedad0b0ac63b2571253fe6"},
- {file = "Pillow-8.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:63cd413ac52ee3f67057223d363f4f82ce966e64906aea046daf46695e3c8238"},
- {file = "Pillow-8.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:8565355a29655b28fdc2c666fd9a3890fe5edc6639d128814fafecfae2d70910"},
- {file = "Pillow-8.1.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:1940fc4d361f9cc7e558d6f56ff38d7351b53052fd7911f4b60cd7bc091ea3b1"},
- {file = "Pillow-8.1.2-cp39-cp39-win32.whl", hash = "sha256:46c2bcf8e1e75d154e78417b3e3c64e96def738c2a25435e74909e127a8cba5e"},
- {file = "Pillow-8.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:aeab4cd016e11e7aa5cfc49dcff8e51561fa64818a0be86efa82c7038e9369d0"},
- {file = "Pillow-8.1.2-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:74cd9aa648ed6dd25e572453eb09b08817a1e3d9f8d1bd4d8403d99e42ea790b"},
- {file = "Pillow-8.1.2-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:e5739ae63636a52b706a0facec77b2b58e485637e1638202556156e424a02dc2"},
- {file = "Pillow-8.1.2-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:903293320efe2466c1ab3509a33d6b866dc850cfd0c5d9cc92632014cec185fb"},
- {file = "Pillow-8.1.2-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:5daba2b40782c1c5157a788ec4454067c6616f5a0c1b70e26ac326a880c2d328"},
- {file = "Pillow-8.1.2-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:1f93f2fe211f1ef75e6f589327f4d4f8545d5c8e826231b042b483d8383e8a7c"},
- {file = "Pillow-8.1.2-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:6efac40344d8f668b6c4533ae02a48d52fd852ef0654cc6f19f6ac146399c733"},
- {file = "Pillow-8.1.2-pp37-pypy37_pp73-win32.whl", hash = "sha256:f36c3ff63d6fc509ce599a2f5b0d0732189eed653420e7294c039d342c6e204a"},
- {file = "Pillow-8.1.2.tar.gz", hash = "sha256:b07c660e014852d98a00a91adfbe25033898a9d90a8f39beb2437d22a203fc44"},
+ {file = "Pillow-8.2.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:dc38f57d8f20f06dd7c3161c59ca2c86893632623f33a42d592f097b00f720a9"},
+ {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a013cbe25d20c2e0c4e85a9daf438f85121a4d0344ddc76e33fd7e3965d9af4b"},
+ {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8bb1e155a74e1bfbacd84555ea62fa21c58e0b4e7e6b20e4447b8d07990ac78b"},
+ {file = "Pillow-8.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c5236606e8570542ed424849f7852a0ff0bce2c4c8d0ba05cc202a5a9c97dee9"},
+ {file = "Pillow-8.2.0-cp36-cp36m-win32.whl", hash = "sha256:12e5e7471f9b637762453da74e390e56cc43e486a88289995c1f4c1dc0bfe727"},
+ {file = "Pillow-8.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5afe6b237a0b81bd54b53f835a153770802f164c5570bab5e005aad693dab87f"},
+ {file = "Pillow-8.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:cb7a09e173903541fa888ba010c345893cd9fc1b5891aaf060f6ca77b6a3722d"},
+ {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0d19d70ee7c2ba97631bae1e7d4725cdb2ecf238178096e8c82ee481e189168a"},
+ {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:083781abd261bdabf090ad07bb69f8f5599943ddb539d64497ed021b2a67e5a9"},
+ {file = "Pillow-8.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c6b39294464b03457f9064e98c124e09008b35a62e3189d3513e5148611c9388"},
+ {file = "Pillow-8.2.0-cp37-cp37m-win32.whl", hash = "sha256:01425106e4e8cee195a411f729cff2a7d61813b0b11737c12bd5991f5f14bcd5"},
+ {file = "Pillow-8.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3b570f84a6161cf8865c4e08adf629441f56e32f180f7aa4ccbd2e0a5a02cba2"},
+ {file = "Pillow-8.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:031a6c88c77d08aab84fecc05c3cde8414cd6f8406f4d2b16fed1e97634cc8a4"},
+ {file = "Pillow-8.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:66cc56579fd91f517290ab02c51e3a80f581aba45fd924fcdee01fa06e635812"},
+ {file = "Pillow-8.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c32cc3145928c4305d142ebec682419a6c0a8ce9e33db900027ddca1ec39178"},
+ {file = "Pillow-8.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:624b977355cde8b065f6d51b98497d6cd5fbdd4f36405f7a8790e3376125e2bb"},
+ {file = "Pillow-8.2.0-cp38-cp38-win32.whl", hash = "sha256:5cbf3e3b1014dddc45496e8cf38b9f099c95a326275885199f427825c6522232"},
+ {file = "Pillow-8.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:463822e2f0d81459e113372a168f2ff59723e78528f91f0bd25680ac185cf797"},
+ {file = "Pillow-8.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:95d5ef984eff897850f3a83883363da64aae1000e79cb3c321915468e8c6add5"},
+ {file = "Pillow-8.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b91c36492a4bbb1ee855b7d16fe51379e5f96b85692dc8210831fbb24c43e484"},
+ {file = "Pillow-8.2.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d68cb92c408261f806b15923834203f024110a2e2872ecb0bd2a110f89d3c602"},
+ {file = "Pillow-8.2.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f217c3954ce5fd88303fc0c317af55d5e0204106d86dea17eb8205700d47dec2"},
+ {file = "Pillow-8.2.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5b70110acb39f3aff6b74cf09bb4169b167e2660dabc304c1e25b6555fa781ef"},
+ {file = "Pillow-8.2.0-cp39-cp39-win32.whl", hash = "sha256:a7d5e9fad90eff8f6f6106d3b98b553a88b6f976e51fce287192a5d2d5363713"},
+ {file = "Pillow-8.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:238c197fc275b475e87c1453b05b467d2d02c2915fdfdd4af126145ff2e4610c"},
+ {file = "Pillow-8.2.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0e04d61f0064b545b989126197930807c86bcbd4534d39168f4aa5fda39bb8f9"},
+ {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:63728564c1410d99e6d1ae8e3b810fe012bc440952168af0a2877e8ff5ab96b9"},
+ {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:c03c07ed32c5324939b19e36ae5f75c660c81461e312a41aea30acdd46f93a7c"},
+ {file = "Pillow-8.2.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:4d98abdd6b1e3bf1a1cbb14c3895226816e666749ac040c4e2554231068c639b"},
+ {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:aac00e4bc94d1b7813fe882c28990c1bc2f9d0e1aa765a5f2b516e8a6a16a9e4"},
+ {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:22fd0f42ad15dfdde6c581347eaa4adb9a6fc4b865f90b23378aa7914895e120"},
+ {file = "Pillow-8.2.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:e98eca29a05913e82177b3ba3d198b1728e164869c613d76d0de4bde6768a50e"},
+ {file = "Pillow-8.2.0.tar.gz", hash = "sha256:a787ab10d7bb5494e5f76536ac460741788f1fbce851068d73a87ca7c35fc3e1"},
]
plotly = [
{file = "plotly-4.14.3-py2.py3-none-any.whl", hash = "sha256:d68fc15fcb49f88db27ab3e0c87110943e65fee02a47f33a8590f541b3042461"},
diff --git a/pyproject.toml b/pyproject.toml
index ba84a278c34..5895d2c9dd0 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -53,6 +53,7 @@ pycoingecko = "^1.4.0"
detecta = "^0.0.5"
tradingview-ta = "^3.2.3"
finvizfinance = "^0.9.3"
+Pillow = "^8.2.0"
[tool.poetry.dev-dependencies]
pytest = "^6.2.2"