def select(
        self,
        cryptocurrency: str | list | None = None,
        currency: str | list | None = None,
    ) -> pd.DataFrame:
        """
        Obtain cryptocurrency data based on specified criteria.

        This method allows you to retrieve data for specific cryptocurrencies and currencies,
        with the option to customize the capitalization of cryptocurrency names. If no input
        criteria are provided, it returns data for all cryptocurrencies.

        Args:
            cryptocurrency (str | list, optional): Specific cryptocurrency to retrieve data for.
                If not provided, returns data for all cryptocurrencies.
            currency (str | list, optional): Specific currency to retrieve data for.
                If not provided, returns data for all currencies.

        Raises:
            ValueError: If the specified cryptocurrency or currency is not available in the database.
                Please check the available cryptocurrencies and currencies using the 'show_options' method.

        Returns:
            A DataFrame containing cryptocurrency data matching the specified input criteria.
        """
        cryptos = self.data.copy(deep=True)

        if cryptocurrency:
            cryptocurrencies = (
                [cryptocurrency] if isinstance(cryptocurrency, str) else cryptocurrency
            )
            cryptocurrencies_lower = [crypto.lower() for crypto in cryptocurrencies]
            options_lower = [
                option.lower()
                for option in self.show_options(selection="cryptocurrency")
            ]

            for cryptocurrency_lower, cryptocurrency_actual in zip(
                cryptocurrencies_lower, cryptocurrencies
            ):
                if cryptocurrency_lower not in options_lower:
                    raise ValueError(
                        f"The cryptocurrency '{cryptocurrency_actual}' is not available in the database. "
                        "Please check the available cryptocurrencies using the 'show_options' method."
                    )
            cryptos = cryptos[
                cryptos["cryptocurrency"].str.lower().isin(cryptocurrencies_lower)
            ]
        if currency:
            currencies = [currency] if isinstance(currency, str) else currency
            currencies_lower = [currency.lower() for currency in currencies]
            options_lower = [
                option.lower() for option in self.show_options(selection="currency")
            ]

            for currency_lower, currency_actual in zip(currencies_lower, currencies):
                if currency_lower not in options_lower:
                    raise ValueError(
                        f"The currency '{currency_actual}' is not available in the database. "
                        "Please check the available currencies using the 'show_options' method."
                    )
            cryptos = cryptos[cryptos["currency"].str.lower().isin(currencies_lower)]

        return FinanceFrame(cryptos)

        Obtain cryptocurrency data based on specified criteria.

        This method allows you to retrieve data for specific cryptocurrencies and currencies,
        with the option to customize the capitalization of cryptocurrency names. If no input
        criteria are provided, it returns data for all cryptocurrencies.

        Args:
            cryptocurrency (str | list, optional): Specific cryptocurrency to retrieve data for.
                If not provided, returns data for all cryptocurrencies.
            currency (str | list, optional): Specific currency to retrieve data for.
                If not provided, returns data for all currencies.

        Raises:
            ValueError: If the specified cryptocurrency or currency is not available in the database.
                Please check the available cryptocurrencies and currencies using the 'show_options' method.

        Returns:
            A DataFrame containing cryptocurrency data matching the specified input criteria.
        
financedatabase/Cryptos.py