Пример #1
0
 def __init__(self, app_dir, main_menu, camera, theme_mgr, widget_properties, \
         config, player=None):
     Menu.__init__(self, widget_properties)
     self.main_menu = main_menu
     self.app_dir = app_dir
     self.camera = camera
     # self.theme_mgr = theme_mgr
     self.player = player
     # self.menu_list = {}
     # self.menu_list['singscreen'] = self
     self.config = config
Пример #2
0
    def __init__(self, widget_props, song_data=None, \
            player=None, keyboard_event=None, song=None, \
            song_event=None):
        Menu.__init__(self, widget_props)
        l_continue = _(u'continue singing')
        l_quit = _(u'quit song')

        self.song_data = song_data
        self.song = song
        self.player = player
        self.keyboard_event = keyboard_event
        self.song_event = song_event
Пример #3
0
    def __init__(self, widget_properties):
        Menu.__init__(self, widget_properties)
        l_next = _(u'next >>')
        l_prev = _(u'<< previous')

        self.prev_button = MenuButton(label=l_prev, \
            widget_properties=self.widget_properties)
        self.next_button = MenuButton(l_next, \
            widget_properties=self.widget_properties)
        self.add(self.prev_button, 'center')
        self.add(self.next_button, 'center')

        # self.bc_top = self.nc_top + 10 + self.nc_height
        # self.bc_left = 20
        # self.bc_width = self.screen_res_x - 40
        # self.bc_height = self.screen_res_y - self.bc_top - 25
        # self.bc_right = 20
        # self.bc_bottom = 30
        # self.box_cont = pudding.container.Container( \
        #         self, left=self.bc_left, top=self.bc_top, \
        #         width=self.bc_width, height=self.bc_height, \
        #         right=self.bc_right)

        # self.bg_box = pudding.control.Box(self.box_cont, \
        #         width=self.bc_width, \
        #         height=self.bc_height, \
        #         background_color=self.box_bg_color, \
        #         border_color=self.box_border_color, \
        #         z_index=-3)
        # self.bg_box.anchors = pudding.ANCHOR_ALL

        # self.directory_cont = pudding.container.HorizontalContainer( \
        #     self.box_cont, top=self.height * 0.02, \
        #     right=self.right, width=self.width, \
        #     height=self.height, left=0)

        pos_size = {}
        pos_size['top'] = 0
        pos_size['left'] = 0
#        pos_size['height'] = self.height * 0.05
#        pos_size['width'] = self.width * 0.3

        # self.directory_cont.anchors = pudding.ANCHOR_ALL
        # self.directory_cont.padding = 10

        # self.directory_up_button = MenuButton("<<", \
        #     widget_properties = self.widget_properties, pos_size=pos_size)
        # self.directory_cont.add_child(self.directory_up_button, \
        #         pudding.ALIGN_LEFT)

        pos_size = {}
        pos_size['top'] = 0
Пример #4
0
    def __init__(self, app_dir, widget_properties, theme_mgr, main_menu, player):

        Menu.__init__(self, widget_properties)
        self.l_help_hint_0 = _(u'Press [h] for help...')
        self.l_help_hint_1 = _(u'Press [ESC] to go back...')
        self.l_help_hint = self.l_help_hint_0
        self.l_bpm = _(u'BPM: ')
        self.l_line_no = _(u'Line: ')
        self.separator = u' - '
        self.h_help = _(u'Help')
        self.help_file_path = os.path.join(app_dir, 'misc', 'HELP.txt')
        self.widget_properties = widget_properties
        self.app_dir = app_dir
        #self.parent_widget = widget_properties['root_widget']
        self.theme_mgr = theme_mgr

        self.screen_res_x = int(widget_properties['config']['screen']['resolution'].split('x')[0])
        self.screen_res_y = int(widget_properties['config']['screen']['resolution'].split('x')[1])

        # self.font_p = widget_properties['font']['p']['obj']
        # self.color_p = widget_properties['font']['p']['color']

        # self.font_h = widget_properties['font']['h1']['obj']
        # self.color_h = widget_properties['font']['h1']['color']

        self.main_menu = main_menu
        # self.help_hint_cont = pudding.container.VerticalContainer( \
        #         self, left=self.screen_res_x / 2.5, top=5)
        # self.help_hint_cont.right = 10
        # self.help_hint_cont.anchors = pudding.ANCHOR_ALL
        # self.keyboard_event = KeyboardEvent(self.widget_properties, theme_mgr)

        self.txt_input = InputField(self.widget_properties, '')
#        self.txt_input.label.visible = 0

        self.player = player
        self.__connect_keys__()
        self.msg = dict()
Пример #5
0
class StateDialog(State):
    # Options
    OPTION_OK = 1
    OPTION_CANCEL = 1 << 1

    OPTION_OK_CANCEL = OPTION_OK | OPTION_CANCEL

    def __init__(self, context, layout, callback):
        super(StateDialog, self).__init__(context)

        # Settings
        self._size = (context.main_screen.get_maxsize()[0] - 1, 40)

        # Outside function to handle input data on confirm
        self._return_handler_func = callback

        # Menu
        self._menu = Menu()
        self._menu.set_position(2, 2)

        if layout['options'] & StateDialog.OPTION_OK:
            self._menu.add_entry('OK', self.on_option_selected,
                                 StateDialog.OPTION_OK)
        if layout['options'] & StateDialog.OPTION_CANCEL:
            self._menu.add_entry('Cancel', self.on_option_selected,
                                 StateDialog.OPTION_CANCEL)

        # Setup
        self._header = ['', '', '']
        self.__spawn_layout(layout)

    # Base
    def on_input(self, key_code):
        self._menu.on_input(key_code)

    def on_update(self, dt):
        pass

    def on_render(self, screen):
        # Frame
        screen.put_string(0, 0, self._header[0])
        screen.put_string(1, 0, self._header[1])
        screen.put_string(self._size[0] - 1, 0, self._header[2])

        for i in range(2, self._size[0] - 1):
            screen.put_string(i, 0, '│')
            screen.put_string(i, self._size[1] - 1, '│')

        # Menu
        self._menu.on_render(screen)

    # On event
    def on_option_selected(self, option):
        self.pop_this_state()
        self._return_handler_func(option)

    def __spawn_layout(self, layout):
        self._header[0] = '│ {} │'.format(layout['title'].ljust(self._size[1] -
                                                                4))
        self._header[1] = '├' + ('─' * (self._size[1] - 2)) + '┤'
        self._header[2] = '└' + ('─' * (self._size[1] - 2)) + '┘'
Пример #6
0
 def __init__(self, game):
     Menu.__init__(self, game)
     self.game = game
Пример #7
0
async def est_command(ctx, ticker: str = ""):
    """Displays earning estimates [Business Insider]"""

    try:

        # Debug
        if cfg.DEBUG:
            logger.debug("!stocks.dd.est %s", ticker)

        # Check for argument
        if ticker == "":
            raise Exception("Stock ticker is required")

        (
            df_year_estimates,
            df_quarter_earnings,
            df_quarter_revenues,
        ) = business_insider_model.get_estimates(ticker)

        if (df_quarter_revenues.empty and df_year_estimates.empty
                and df_quarter_earnings.empty):
            raise Exception("Enter a valid ticker")

        # Debug user output
        if cfg.DEBUG:
            logger.debug(df_year_estimates.to_string())
            logger.debug(df_quarter_earnings.to_string())
            logger.debug(df_quarter_revenues.to_string())

        dindex = len(df_year_estimates.index)
        fig = df2img.plot_dataframe(
            df_year_estimates,
            fig_size=(1200, (40 + (60 * dindex))),
            col_width=[12, 4, 4, 4, 4],
            tbl_cells=dict(height=35, ),
            font=dict(
                family="Consolas",
                size=20,
            ),
            template="plotly_dark",
            paper_bgcolor="rgba(0, 0, 0, 0)",
        )
        imagefile = "estimates.png"

        df2img.save_dataframe(fig=fig, filename=imagefile)
        image = Image.open(imagefile)
        image = autocrop_image(image, 0)
        image.save(imagefile, "PNG", quality=100)
        uploaded_image = gst_imgur.upload_image(imagefile, title="something")
        link_estimates = uploaded_image.link

        os.remove(imagefile)

        fig = df2img.plot_dataframe(
            df_quarter_earnings,
            fig_size=(1200, (40 + (40 * 20))),
            col_width=[5, 5, 4, 4, 5, 4],
            tbl_cells=dict(height=35, ),
            font=dict(
                family="Consolas",
                size=20,
            ),
            template="plotly_dark",
            paper_bgcolor="rgba(0, 0, 0, 0)",
        )
        imagefile = "earnings.png"

        df2img.save_dataframe(fig=fig, filename=imagefile)
        image = Image.open(imagefile)
        image = autocrop_image(image, 0)
        image.save(imagefile, "PNG", quality=100)
        uploaded_image = gst_imgur.upload_image(imagefile, title="something")
        link_earnings = uploaded_image.link
        os.remove(imagefile)

        fig = df2img.plot_dataframe(
            df_quarter_revenues,
            fig_size=(1200, (40 + (40 * 20))),
            col_width=[5, 5, 4, 4, 5, 4],
            tbl_cells=dict(height=35, ),
            font=dict(
                family="Consolas",
                size=20,
            ),
            template="plotly_dark",
            paper_bgcolor="rgba(0, 0, 0, 0)",
        )
        imagefile = "revenues.png"

        df2img.save_dataframe(fig=fig, filename=imagefile)
        image = Image.open(imagefile)
        image = autocrop_image(image, 0)
        image.save(imagefile, "PNG", quality=100)
        uploaded_image = gst_imgur.upload_image(imagefile, title="something")
        link_revenues = uploaded_image.link
        os.remove(imagefile)

        embeds = [
            disnake.Embed(
                title=f"**{ticker.upper()} Year Estimates**",
                color=cfg.COLOR,
            ),
            disnake.Embed(
                title=f"**{ticker.upper()} Quarter Earnings**",
                colour=cfg.COLOR,
            ),
            disnake.Embed(
                title=f"**{ticker.upper()} Quarter Revenues**",
                colour=cfg.COLOR,
            ),
        ]
        embeds[0].set_image(url=link_estimates)
        embeds[1].set_image(url=link_earnings)
        embeds[2].set_image(url=link_revenues)
        # Output data
        choices = [
            disnake.SelectOption(label=f"{ticker.upper()} Year Estimates",
                                 value="0",
                                 emoji="🟢"),
            disnake.SelectOption(label=f"{ticker.upper()} Quarter Earnings",
                                 value="1",
                                 emoji="🟢"),
            disnake.SelectOption(label=f"{ticker.upper()} Quarter Revenues",
                                 value="2",
                                 emoji="🟢"),
        ]

        await ctx.send(embed=embeds[0], view=Menu(embeds, choices))
    except Exception as e:
        embed = disnake.Embed(
            title="ERROR Stocks: [Business Insider] Earning Estimates",
            colour=cfg.COLOR,
            description=e,
        )
        embed.set_author(
            name=cfg.AUTHOR_NAME,
            icon_url=cfg.AUTHOR_ICON_URL,
        )

        await ctx.send(embed=embed, delete_after=30.0)
Пример #8
0
async def hsi_command(ctx, num: int = 10):
    """Show top high short interest stocks of over 20% ratio [shortinterest.com]"""

    try:
        # Debug user input
        if cfg.DEBUG:
            logger.debug("!stocks.dps.hsi %s", num)

        # Check for argument
        if num < 0:
            raise Exception("Number has to be above 0")

        # Retrieve data
        df = shortinterest_model.get_high_short_interest()
        df = df.iloc[1:].head(n=num)

        # Debug user output
        if cfg.DEBUG:
            logger.debug(df.to_string())

        # Output data
        future_column_name = df["Ticker"]
        df = df.transpose()
        df.columns = future_column_name
        df.drop("Ticker")
        columns = []
        choices = [
            disnake.SelectOption(label="Overview", value="0", emoji="🟢"),
        ]
        initial_str = "Overview"
        i = 1
        for col_name in df.columns.values:
            menu = f"\nPage {i}: {col_name}"
            initial_str += f"\nPage {i}: {col_name}"
            choices.append(
                disnake.SelectOption(label=menu, value=f"{i}", emoji="🟢"), )
            i += 1
        columns.append(
            disnake.Embed(
                title="Stocks: [highshortinterest.com] Top High Short Interest",
                description=initial_str,
                colour=cfg.COLOR,
            ).set_author(
                name=cfg.AUTHOR_NAME,
                icon_url=cfg.AUTHOR_ICON_URL,
            ))
        for column in df.columns.values:
            columns.append(
                disnake.Embed(
                    title=
                    "Stocks: [highshortinterest.com] Top High Short Interest",
                    description="```" + df[column].fillna("").to_string() +
                    "```",
                    colour=cfg.COLOR,
                ).set_author(
                    name=cfg.AUTHOR_NAME,
                    icon_url=cfg.AUTHOR_ICON_URL,
                ))

        await ctx.send(embed=columns[0], view=Menu(columns, choices))

    except Exception as e:
        embed = disnake.Embed(
            title=
            "ERROR Stocks: [highshortinterest.com] Top High Short Interest",
            colour=cfg.COLOR,
            description=e,
        )
        embed.set_author(
            name=cfg.AUTHOR_NAME,
            icon_url=cfg.AUTHOR_ICON_URL,
        )

        await ctx.send(embed=embed, delete_after=30.0)
Пример #9
0
async def lins_command(ctx, ticker: str = "", num: int = 10):
    """Display insider activity for a given stock ticker. [Source: Finviz]

    Parameters
    ----------
    ticker : Stock Ticker
    num : Number of latest insider activity to display
    """
    try:
        # Debug
        if cfg.DEBUG:
            logger.debug("disc-lins %s", num)

        d_finviz_insider = finviz_model.get_last_insider_activity(ticker)

        df = pd.DataFrame.from_dict(d_finviz_insider)
        df.set_index("Date", inplace=True)

        df = df[
            [
                "Relationship",
                "Transaction",
                "#Shares",
                "Cost",
                "Value ($)",
                "#Shares Total",
                "Insider Trading",
                "SEC Form 4",
            ]
        ]

        df = df.head(num)
        df = df.replace(to_replace="Option Exercise", value="Opt Ex.", regex=True)

        title = f"Insider Trading for {ticker.upper()}"

        embeds: list = []

        i, i2, end = 0, 0, 20
        df_pg = []
        embeds_img = []
        dindex = len(df.index)
        while i < dindex:
            df_pg = df.iloc[i:end]
            df_pg.append(df_pg)
            fig = df2img.plot_dataframe(
                df_pg,
                fig_size=(1600, (40 + (40 * 20))),
                col_width=[5, 14, 4, 4, 3, 4, 5, 8, 7],
                tbl_cells=dict(
                    height=35,
                ),
                font=dict(
                    family="Consolas",
                    size=20,
                ),
                template="plotly_dark",
                paper_bgcolor="rgba(0, 0, 0, 0)",
            )
            imagefile = f"disc-insider{i}.png"

            df2img.save_dataframe(fig=fig, filename=imagefile)
            image = Image.open(imagefile)
            image = autocrop_image(image, 0)
            image.save(imagefile, "PNG", quality=100)
            uploaded_image = gst_imgur.upload_image(imagefile, title="something")
            image_link = uploaded_image.link
            embeds_img.append(
                f"{image_link}",
            )
            embeds.append(
                disnake.Embed(
                    title=title,
                    colour=cfg.COLOR,
                ),
            )
            i2 += 1
            i += 20
            end += 20
            os.remove(imagefile)

        # Author/Footer
        for i in range(0, i2):
            embeds[i].set_author(
                name=cfg.AUTHOR_NAME,
                url=cfg.AUTHOR_URL,
                icon_url=cfg.AUTHOR_ICON_URL,
            )
            embeds[i].set_footer(
                text=cfg.AUTHOR_NAME,
                icon_url=cfg.AUTHOR_ICON_URL,
            )

        i = 0
        for i in range(0, i2):
            embeds[i].set_image(url=embeds_img[i])

            i += 1
        embeds[0].set_footer(text=f"Page 1 of {len(embeds)}")
        options = [
            disnake.SelectOption(label="Home", value="0", emoji="🟢"),
        ]

        await ctx.send(embed=embeds[0], view=Menu(embeds, options))

    except Exception as e:
        embed = disnake.Embed(
            title="ERROR Insider Activity [Source: Finviz]",
            colour=cfg.COLOR,
            description=e,
        )
        embed.set_author(
            name=cfg.AUTHOR_NAME,
            icon_url=cfg.AUTHOR_ICON_URL,
        )

        await ctx.send(embed=embed, delete_after=30.0)
Пример #10
0
async def sidtc_command(ctx, sort="float", num: int = 10):
    """Short interest and days to cover [Stockgrid]"""

    try:
        # Debug
        if cfg.DEBUG:
            logger.debug("!stocks.dps.sidtc %s %s", sort, num)

        # Check for argument
        possible_sorts = ("float", "dtc", "si")

        if sort not in possible_sorts:
            raise Exception(f"The possible sorts are: {', '.join(possible_sorts)}")

        if num < 0:
            raise Exception("Number has to be above 0")

        # Retrieve data
        df = stockgrid_model.get_short_interest_days_to_cover(sort)
        df = df.iloc[:num]

        # Debug user output
        if cfg.DEBUG:
            logger.debug(df.to_string())

        # Output data
        dp_date = df["Date"].values[0]
        df = df.drop(columns=["Date"])
        df["Short Interest"] = df["Short Interest"] / 1_000_000
        df.head()
        df.columns = [
            "Ticker",
            "Float Short %",
            "Days to Cover",
            "Short Interest (1M)",
        ]
        future_column_name = df["Ticker"]
        df = df.transpose()
        df.columns = future_column_name
        df.drop("Ticker")
        columns = []
        choices = [
            disnake.SelectOption(label="Overview", value="0", emoji="🟢"),
        ]
        initial_str = "Overview"
        i = 1
        for col_name in df.columns.values:
            menu = f"\nPage {i}: {col_name}"
            initial_str += f"\nPage {i}: {col_name}"
            if i < 19:
                choices.append(
                    disnake.SelectOption(label=menu, value=f"{i}", emoji="🟢"),
                )
            if i == 20:
                choices.append(
                    disnake.SelectOption(label="Max Reached", value=f"{i}", emoji="🟢"),
                )
            i += 1
        columns.append(
            disnake.Embed(
                title="Dark Pool Shorts", description=initial_str, colour=cfg.COLOR
            ).set_author(
                name=cfg.AUTHOR_NAME,
                icon_url=cfg.AUTHOR_ICON_URL,
            )
        )
        for column in df.columns.values:
            columns.append(
                disnake.Embed(
                    title="Stocks: [Stockgrid] Short Interest and Days to Cover",
                    description="```The following data corresponds to the date: "
                    + dp_date
                    + "\n\n"
                    + df[column].fillna("").to_string()
                    + "```",
                    colour=cfg.COLOR,
                ).set_author(
                    name=cfg.AUTHOR_NAME,
                    icon_url=cfg.AUTHOR_ICON_URL,
                )
            )

        await ctx.send(embed=columns[0], view=Menu(columns, choices))

    except Exception as e:
        embed = disnake.Embed(
            title="ERROR Stocks: [Stockgrid] Short Interest and Days to Cover",
            colour=cfg.COLOR,
            description=e,
        )
        embed.set_author(
            name=cfg.AUTHOR_NAME,
            icon_url=cfg.AUTHOR_ICON_URL,
        )

        await ctx.send(embed=embed, delete_after=30.0)
Пример #11
0
async def lastcontracts_command(ctx,
                                past_transactions_days: int = 2,
                                num: int = 20):
    """Displays last government contracts [quiverquant.com]"""
    try:
        # Debug user input
        if cfg.DEBUG:
            logger.debug("!stocks.gov.lastcontracts %s %s",
                         past_transactions_days, num)

        df_contracts = quiverquant_model.get_government_trading("contracts")

        if df_contracts.empty:
            logger.debug("No government contracts found")
            return

        df_contracts.sort_values("Date", ascending=False)

        df_contracts["Date"] = pd.to_datetime(df_contracts["Date"])
        df_contracts["Date"] = df_contracts["Date"].dt.date

        df_contracts.drop_duplicates(inplace=True)
        df_contracts = df_contracts[df_contracts["Date"].isin(
            df_contracts["Date"].unique()[:past_transactions_days])]

        df_contracts = df_contracts[["Date", "Ticker", "Amount",
                                     "Agency"]][:num]
        choices = [
            disnake.SelectOption(label="Overview", value="0", emoji="🟢"),
        ]
        initial_str = "Overview"
        i = 1
        for col_name in df_contracts["Ticker"].values:
            menu = f"\nPage {i}: {col_name}"
            initial_str += f"\nPage {i}: {col_name}"
            choices.append(
                disnake.SelectOption(label=menu, value=f"{i}", emoji="🟢"), )
            i += 1

        columns = []
        df_contracts = df_contracts.T
        columns.append(
            disnake.Embed(
                title="Stocks: [quiverquant.com] Top buy government trading",
                description=initial_str,
                colour=cfg.COLOR,
            ).set_author(
                name=cfg.AUTHOR_NAME,
                icon_url=cfg.AUTHOR_ICON_URL,
            ))
        for column in df_contracts.columns.values:
            columns.append(
                disnake.Embed(
                    description="```" +
                    df_contracts[column].fillna("").to_string() + "```",
                    colour=cfg.COLOR,
                ).set_author(
                    name=cfg.AUTHOR_NAME,
                    icon_url=cfg.AUTHOR_ICON_URL,
                ))

        await ctx.send(embed=columns[0], view=Menu(columns, choices))

    except Exception as e:
        embed = disnake.Embed(
            title="ERROR Stocks: [quiverquant.com] Top buy government trading",
            colour=cfg.COLOR,
            description=e,
        )
        embed.set_author(
            name=cfg.AUTHOR_NAME,
            icon_url=cfg.AUTHOR_ICON_URL,
        )

        await ctx.send(embed=embed, delete_after=30.0)
Пример #12
0
 def __init__(self, game):
     Menu.__init__(self, game)
Пример #13
0
async def valuation_command(
    ctx, preset: str = "template", sort: str = "", limit: int = 5, ascend: bool = False
):
    """Displays results from chosen preset focusing on valuation metrics [Finviz]"""
    try:
        # Check for argument
        if preset == "template" or preset not in so.all_presets:
            raise Exception("Invalid preset selected!")

        # Debug
        if cfg.DEBUG:
            logger.debug(
                "!stocks.scr.valuation %s %s %s %s", preset, sort, limit, ascend
            )

        # Check for argument
        if limit < 0:
            raise Exception("Number has to be above 0")

        # Output Data
        df_screen = get_screener_data(
            preset,
            "valuation",
            limit,
            ascend,
        )

        description = ""

        if isinstance(df_screen, pd.DataFrame):
            if df_screen.empty:
                return []

            df_screen = df_screen.dropna(axis="columns", how="all")

            if sort:
                if " ".join(sort) in so.d_cols_to_sort["valuation"]:
                    df_screen = df_screen.sort_values(
                        by=[" ".join(sort)],
                        ascending=ascend,
                        na_position="last",
                    )
                else:
                    similar_cmd = difflib.get_close_matches(
                        " ".join(sort),
                        so.d_cols_to_sort["valuation"],
                        n=1,
                        cutoff=0.7,
                    )
                    if similar_cmd:
                        description = f"Replacing '{' '.join(sort)}' by '{similar_cmd[0]}' so table can be sorted.\n\n"
                        df_screen = df_screen.sort_values(
                            by=[similar_cmd[0]],
                            ascending=ascend,
                            na_position="last",
                        )
                    else:
                        raise ValueError(
                            f"Wrong sort column provided! Select from: {', '.join(so.d_cols_to_sort['valuation'])}"
                        )

            df_screen = df_screen.fillna("")
            future_column_name = df_screen["Ticker"]
            df_screen = df_screen.head(n=limit).transpose()
            df_screen.columns = future_column_name
            df_screen.drop("Ticker")

            columns = []
            choices = [
                disnake.SelectOption(label="Overview", value="0", emoji="🟢"),
            ]
            initial_str = description + "Overview"
            i = 1
            for column in df_screen.columns.values:
                menu = f"\nPage {i}: {column}"
                initial_str += f"\nPage {i}: {column}"
                if i < 19:
                    choices.append(
                        disnake.SelectOption(label=menu, value=f"{i}", emoji="🟢"),
                    )
                if i == 20:
                    choices.append(
                        disnake.SelectOption(
                            label="Max Reached", value=f"{i}", emoji="🟢"
                        ),
                    )
                i += 1
            columns.append(
                disnake.Embed(
                    title="Stocks: [Finviz] Valuation Screener",
                    description=initial_str,
                    colour=cfg.COLOR,
                ).set_author(
                    name=cfg.AUTHOR_NAME,
                    icon_url=cfg.AUTHOR_ICON_URL,
                )
            )
            for column in df_screen.columns.values:
                columns.append(
                    disnake.Embed(
                        title="Stocks: [Finviz] Valuation Screener",
                        description="```"
                        + df_screen[column].fillna("").to_string()
                        + "```",
                        colour=cfg.COLOR,
                    ).set_author(
                        name=cfg.AUTHOR_NAME,
                        icon_url=cfg.AUTHOR_ICON_URL,
                    )
                )

            await ctx.send(embed=columns[0], view=Menu(columns, choices))

    except Exception as e:
        embed = disnake.Embed(
            title="ERROR Stocks: [Finviz] Valuation Screener",
            colour=cfg.COLOR,
            description=e,
        )
        embed.set_author(
            name=cfg.AUTHOR_NAME,
            icon_url=cfg.AUTHOR_ICON_URL,
        )

        await ctx.send(embed=embed, delete_after=30.0)