From 43976e873af18198580617d48f1d636541e05a88 Mon Sep 17 00:00:00 2001 From: MisterBiggs Date: Fri, 2 Jul 2021 12:41:36 -0700 Subject: [PATCH] updated all docstrings --- IEX_Symbol.py | 66 ++++++----- Symbol.py | 4 + T_info.py | 4 +- bot.py | 57 ++++----- cg_Crypto.py | 41 ++++--- search_index.pickle | Bin 230449 -> 0 bytes searchindexer.ipynb | 276 -------------------------------------------- symbol_router.py | 25 ++-- 8 files changed, 114 insertions(+), 359 deletions(-) delete mode 100644 search_index.pickle delete mode 100644 searchindexer.ipynb diff --git a/IEX_Symbol.py b/IEX_Symbol.py index 7c00c01..2fdae3a 100644 --- a/IEX_Symbol.py +++ b/IEX_Symbol.py @@ -30,7 +30,7 @@ class IEX_Symbol: Parameters ---------- IEX_TOKEN : str - IEX Token + IEX API Token """ try: self.IEX_TOKEN = os.environ["IEX"] @@ -47,12 +47,28 @@ class IEX_Symbol: schedule.every().day.do(self.clear_charts) def clear_charts(self) -> None: - """Clears cache of chart data.""" + """ + Clears cache of chart data. + Charts are cached so that only 1 API call per 24 hours is needed since the + chart data is expensive and a large download. + """ self.charts = {} def get_symbol_list( self, return_df=False ) -> Optional[Tuple[pd.DataFrame, datetime]]: + """Gets list of all symbols supported by IEX + + Parameters + ---------- + return_df : bool, optional + return the dataframe of all stock symbols, by default False + + Returns + ------- + Optional[Tuple[pd.DataFrame, datetime]] + If `return_df` is set to `True` returns a dataframe, otherwise returns `None`. + """ reg_symbols = r.get( f"https://cloud.iexapis.com/stable/ref-data/symbols?token={self.IEX_TOKEN}", @@ -145,18 +161,16 @@ class IEX_Symbol: return symbol_list def price_reply(self, symbol: Stock) -> str: - """Returns current market price or after hours if its available for a given stock symbol. + """Returns price movement of Stock for the last market day, or after hours. Parameters ---------- - symbols : list - List of stock symbols. + symbol : Stock Returns ------- - Dict[str, str] - Each symbol passed in is a key with its value being a human readable - markdown formatted string of the symbols price and movement. + str + Formatted markdown """ IEXurl = f"https://cloud.iexapis.com/stable/stock/{symbol.id}/quote?token={self.IEX_TOKEN}" @@ -223,13 +237,12 @@ class IEX_Symbol: Parameters ---------- - symbols : list - List of stock symbols. + symbol : Stock Returns ------- - Dict[str, str] - Each symbol passed in is a key with its value being a human readable formatted string of the symbols div dates. + str + Formatted markdown """ if symbol.symbol.upper() in self.otc_list: return "OTC stocks do not currently support any commands." @@ -284,17 +297,16 @@ class IEX_Symbol: return f"${symbol.id.upper()} either doesn't exist or pays no dividend." def news_reply(self, symbol: Stock) -> str: - """Gets recent english news on stock symbols. + """Gets most recent, english, non-paywalled news Parameters ---------- - symbols : list - List of stock symbols. + symbol : Stock Returns ------- - Dict[str, str] - Each symbol passed in is a key with its value being a human readable markdown formatted string of the symbols news. + str + Formatted markdown """ if symbol.symbol.upper() in self.otc_list: return "OTC stocks do not currently support any commands." @@ -323,17 +335,16 @@ class IEX_Symbol: return f"News for **{symbol.id.upper()}**:\n" + "\n".join(line[:5]) def info_reply(self, symbol: Stock) -> str: - """Gets information on stock symbols. + """Gets description for Stock Parameters ---------- - symbols : List[str] - List of stock symbols. + symbol : Stock Returns ------- - Dict[str, str] - Each symbol passed in is a key with its value being a human readable formatted string of the symbols information. + str + Formatted text """ if symbol.symbol.upper() in self.otc_list: return "OTC stocks do not currently support any commands." @@ -354,17 +365,16 @@ class IEX_Symbol: return f"No information found for: {symbol}\nEither today is boring or the symbol does not exist." def stat_reply(self, symbol: Stock) -> str: - """Gets key statistics for each symbol in the list + """Key statistics on a Stock Parameters ---------- - symbols : List[str] - List of stock symbols + symbol : Stock Returns ------- - Dict[str, str] - Each symbol passed in is a key with its value being a human readable formatted string of the symbols statistics. + str + Formatted markdown """ if symbol.symbol.upper() in self.otc_list: return "OTC stocks do not currently support any commands." @@ -503,7 +513,7 @@ class IEX_Symbol: Returns ------- list[str] - list of $ID: NAME + list of $ID: NAME, CHANGE% """ stocks = r.get( diff --git a/Symbol.py b/Symbol.py index 3e204c6..8c702a1 100644 --- a/Symbol.py +++ b/Symbol.py @@ -25,6 +25,8 @@ class Symbol: class Stock(Symbol): + """Stock Market Object. Gets data from IEX Cloud""" + def __init__(self, symbol: str) -> None: self.symbol = symbol self.id = symbol @@ -36,6 +38,8 @@ coins = r.get("https://api.coingecko.com/api/v3/coins/list").json() class Coin(Symbol): + """Cryptocurrency Object. Gets data from CoinGecko.""" + @functools.cache def __init__(self, symbol: str) -> None: self.symbol = symbol diff --git a/T_info.py b/T_info.py index 66d07ef..f87446c 100644 --- a/T_info.py +++ b/T_info.py @@ -21,7 +21,7 @@ Keep up with the latest news for the bot in its Telegram Channel: https://t.me/s Full documentation on using and running your own stock bot can be found [on the bots website.](https://simple-stock-bots.gitlab.io/site) -The bot detects _"Symbols"_ using either one or two dollar signs before the symbol. One dollar sign is for a stock market ticker, while two is for a cryptocurrency coin. `/chart $$eth` would return a chart of the past month of data for Ethereum, while `/dividend $psec` returns dividend information for Prospect Capital stock. +The bot detects _"Symbols"_ using either one `$` or two `$$` dollar signs before the symbol. One dollar sign is for a stock market ticker, while two is for a cryptocurrency coin. `/chart $$eth` would return a chart of the past month of data for Ethereum, while `/dividend $psec` returns dividend information for Prospect Capital stock. Simply calling a symbol in any message that the bot can see will also return the price. So a message like: `I wonder if $$btc will go to the Moon now that $tsla accepts it as payment` would return the current price for both Bitcoin and Tesla. @@ -67,7 +67,7 @@ info - $[symbol] General information about the symbol. â„šī¸ news - $[symbol] News about the symbol. 📰 stat - $[symbol] Key statistics about the symbol. đŸ”ĸ dividend - $[symbol] Dividend info 📅 -intra - $[symbol] Plot since the last market open. 📈 trending - Trending Stocks and Cryptos. đŸ’Ŧ +intra - $[symbol] Plot since the last market open. 📈 chart - $[chart] Plot of the past month. 📊 """ # Not used by the bot but for updaing commands with BotFather diff --git a/bot.py b/bot.py index 8f2f934..4fe6e9b 100644 --- a/bot.py +++ b/bot.py @@ -53,7 +53,7 @@ info("Bot script started.") def start(update: Update, context: CallbackContext): - """Send a message when the command /start is issued.""" + """Send help text when the command /start is issued.""" info(f"Start command ran by {update.message.chat.username}") update.message.reply_text( text=t.help_text, @@ -63,7 +63,7 @@ def start(update: Update, context: CallbackContext): def help(update: Update, context: CallbackContext): - """Send link to docs when the command /help is issued.""" + """Send help text when the command /help is issued.""" info(f"Help command ran by {update.message.chat.username}") update.message.reply_text( text=t.help_text, @@ -73,7 +73,7 @@ def help(update: Update, context: CallbackContext): def license(update: Update, context: CallbackContext): - """Return bots license agreement""" + """Send bots license when the /license command is issued.""" info(f"License command ran by {update.message.chat.username}") update.message.reply_text( text=t.license, @@ -83,6 +83,7 @@ def license(update: Update, context: CallbackContext): def status(update: Update, context: CallbackContext): + """Gather status of bot and dependant services and return important status updates.""" warning(f"Status command ran by {update.message.chat.username}") bot_resp = datetime.datetime.now(update.message.date.tzinfo) - update.message.date @@ -96,6 +97,7 @@ def status(update: Update, context: CallbackContext): def donate(update: Update, context: CallbackContext): + """Sets up donation.""" info(f"Donate command ran by {update.message.chat.username}") chat_id = update.message.chat_id @@ -133,6 +135,7 @@ def donate(update: Update, context: CallbackContext): def precheckout_callback(update: Update, context: CallbackContext): + """Approves donation""" info(f"precheckout_callback queried") query = update.pre_checkout_query @@ -146,6 +149,7 @@ def precheckout_callback(update: Update, context: CallbackContext): def successful_payment_callback(update: Update, context: CallbackContext): + """Thanks user for donation""" info(f"Successful payment!") update.message.reply_text( "Thank you for your donation! It goes a long way to keeping the bot free!" @@ -177,9 +181,7 @@ def symbol_detect(update: Update, context: CallbackContext): def dividend(update: Update, context: CallbackContext): - """ - waits for /dividend or /div command and then finds dividend info on that symbol. - """ + """/dividend or /div command and then finds dividend info on that symbol.""" info(f"Dividend command ran by {update.message.chat.username}") message = update.message.text chat_id = update.message.chat_id @@ -203,9 +205,7 @@ def dividend(update: Update, context: CallbackContext): def news(update: Update, context: CallbackContext): - """ - waits for /news command and then finds news info on that symbol. - """ + """/news command then finds news info on that symbol.""" info(f"News command ran by {update.message.chat.username}") message = update.message.text chat_id = update.message.chat_id @@ -230,9 +230,7 @@ def news(update: Update, context: CallbackContext): def information(update: Update, context: CallbackContext): - """ - waits for /info command and then finds info on that symbol. - """ + """/info command then finds info on that symbol.""" info(f"Information command ran by {update.message.chat.username}") message = update.message.text chat_id = update.message.chat_id @@ -257,6 +255,10 @@ def information(update: Update, context: CallbackContext): def search(update: Update, context: CallbackContext): + """ + Uses fuzzy search on full list of stocks and crypto names + and descriptions then returns the top matches in order. + """ info(f"Search command ran by {update.message.chat.username}") message = update.message.text.replace("/search ", "") chat_id = update.message.chat_id @@ -281,8 +283,8 @@ def search(update: Update, context: CallbackContext): def intra(update: Update, context: CallbackContext): + """returns a chart of intraday data for a symbol""" info(f"Intra command ran by {update.message.chat.username}") - # TODO: Document usage of this command. https://iexcloud.io/docs/api/#historical-prices message = update.message.text chat_id = update.message.chat_id @@ -337,8 +339,8 @@ def intra(update: Update, context: CallbackContext): def chart(update: Update, context: CallbackContext): + """returns a chart of the past month of data for a symbol""" info(f"Chart command ran by {update.message.chat.username}") - # TODO: Document usage of this command. https://iexcloud.io/docs/api/#historical-prices message = update.message.text chat_id = update.message.chat_id @@ -390,9 +392,7 @@ def chart(update: Update, context: CallbackContext): def stat(update: Update, context: CallbackContext): - """ - https://iexcloud.io/docs/api/#key-stats - """ + """returns key statistics on symbol""" info(f"Stat command ran by {update.message.chat.username}") message = update.message.text chat_id = update.message.chat_id @@ -417,9 +417,7 @@ def stat(update: Update, context: CallbackContext): def cap(update: Update, context: CallbackContext): - """ - Market Cap Information - """ + """returns market cap for symbol""" info(f"Cap command ran by {update.message.chat.username}") message = update.message.text chat_id = update.message.chat_id @@ -444,9 +442,7 @@ def cap(update: Update, context: CallbackContext): def trending(update: Update, context: CallbackContext): - """ - Trending Symbols - """ + """returns currently trending symbols and how much they've moved in the past trading day.""" info(f"Trending command ran by {update.message.chat.username}") chat_id = update.message.chat_id @@ -462,8 +458,8 @@ def trending(update: Update, context: CallbackContext): def inline_query(update: Update, context: CallbackContext): """ - Handles inline query. - Does a fuzzy search on input and returns stocks that are close. + Handles inline query. Searches by looking if query is contained + in the symbol and returns matches in alphabetical order. """ info(f"Inline command ran by {update.message.chat.username}") info(f"Query: {update.inline_query.query}") @@ -496,6 +492,7 @@ def inline_query(update: Update, context: CallbackContext): def rand_pick(update: Update, context: CallbackContext): + """For the gamblers. Returns a random symbol to buy and a sell date""" info( f"Someone is gambling! Random_pick command ran by {update.message.chat.username}" ) @@ -558,13 +555,17 @@ def main(): dp.add_handler(CommandHandler("cap", cap)) dp.add_handler(CommandHandler("trending", trending)) dp.add_handler(CommandHandler("search", search)) - dp.add_handler(CommandHandler("intraday", intra)) - dp.add_handler(CommandHandler("intra", intra, run_async=True)) - dp.add_handler(CommandHandler("chart", chart, run_async=True)) dp.add_handler(CommandHandler("random", rand_pick)) dp.add_handler(CommandHandler("donate", donate)) dp.add_handler(CommandHandler("status", status)) + # Charting can be slow so they run async. + dp.add_handler(CommandHandler("intra", intra, run_async=True)) + dp.add_handler(CommandHandler("intraday", intra, run_async=True)) + dp.add_handler(CommandHandler("day", intra, run_async=True)) + dp.add_handler(CommandHandler("chart", chart, run_async=True)) + dp.add_handler(CommandHandler("month", chart, run_async=True)) + # on noncommand i.e message - echo the message on Telegram dp.add_handler(MessageHandler(Filters.text, symbol_detect)) diff --git a/cg_Crypto.py b/cg_Crypto.py index 0d59104..c71962e 100644 --- a/cg_Crypto.py +++ b/cg_Crypto.py @@ -220,18 +220,18 @@ class cg_Crypto: return pd.DataFrame() def stat_reply(self, symbol: Coin) -> str: - """Gets key statistics for each symbol in the list + """Gathers key statistics on coin. Mostly just CoinGecko scores. Parameters ---------- - symbols : List[str] - List of coin symbols + symbol : Coin Returns ------- - Dict[str, str] - Each symbol passed in is a key with its value being a human readable formatted string of the symbols statistics. + str + Preformatted markdown. """ + response = r.get( f"https://api.coingecko.com/api/v3/coins/{symbol.id}?localization=false", timeout=5, @@ -253,17 +253,16 @@ class cg_Crypto: return f"{symbol.symbol} returned an error." def cap_reply(self, coin: Coin) -> str: - """Gets market Cap for each symbol in the list + """Gets market cap for Coin Parameters ---------- - symbols : List[str] - List of coin symbols + coin : Coin Returns ------- - Dict[str, str] - Each symbol passed in is a key with its value being a human readable formatted string of the symbols markey cap. + str + Preformatted markdown. """ response = r.get( f"https://api.coingecko.com/api/v3/simple/price?ids={coin.id}&vs_currencies={self.vs_currency}&include_market_cap=true", @@ -290,17 +289,16 @@ class cg_Crypto: return message def info_reply(self, symbol: Coin) -> str: - """Gets information on stock symbols. + """Gets coin description Parameters ---------- - symbols : List[str] - List of stock symbols. + symbol : Coin Returns ------- - Dict[str, str] - Each symbol passed in is a key with its value being a human readable formatted string of the symbols information. + str + Preformatted markdown. """ response = r.get( @@ -322,7 +320,7 @@ class cg_Crypto: Returns ------- list[str] - list of $$ID: NAME + list of $$ID: NAME, CHANGE% """ coins = r.get( @@ -352,6 +350,17 @@ class cg_Crypto: return trending def batch_price(self, coins: list[Coin]) -> list[str]: + """Gets price of a list of coins all in one API call + + Parameters + ---------- + coins : list[Coin] + + Returns + ------- + list[str] + returns preformatted list of strings detailing price movement of each coin passed in. + """ query = ",".join([c.id for c in coins]) prices = r.get( diff --git a/search_index.pickle b/search_index.pickle deleted file mode 100644 index 26e0883c021f243dd0a1cde6a6abb8ea2a9da275..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230449 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

MTkyd(wimb9C=|s!_r!5Uc9b9^_G6KLb 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 diff --git a/searchindexer.ipynb b/searchindexer.ipynb deleted file mode 100644 index 66d422e..0000000 --- a/searchindexer.ipynb +++ /dev/null @@ -1,276 +0,0 @@ -{ - "metadata": { - "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.0-final" - }, - "orig_nbformat": 2, - "kernelspec": { - "name": "python3", - "display_name": "Python 3.9.0 64-bit", - "metadata": { - "interpreter": { - "hash": "36cf16204b8548560b1c020c4e8fb5b57f0e4c58016f52f2d4be01e192833930" - } - } - } - }, - "nbformat": 4, - "nbformat_minor": 2, - "cells": [ - { - "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Requirement already satisfied: tqdm in /home/anson/.local/lib/python3.8/site-packages (4.59.0)\n" - ] - } - ], - "source": [ - "!pip install tqdm" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [], - "source": [ - "import requests as r\n", - "import pandas as pd\n", - "from fuzzywuzzy import fuzz\n", - "from functools import cache\n", - "from tqdm import tqdm" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [], - "source": [ - " def stocks():\n", - "\n", - " raw_symbols = r.get(\n", - " f\"https://cloud.iexapis.com/stable/ref-data/symbols?token=WOOOPS\"\n", - " ).json()\n", - " symbols = pd.DataFrame(data=raw_symbols)\n", - "\n", - " symbols[\"description\"] = \"$\" + symbols[\"symbol\"] + \": \" + symbols[\"name\"]\n", - " symbols[\"id\"] = symbols[\"symbol\"]\n", - "\n", - " symbols = symbols[[\"id\", \"symbol\", \"name\", \"description\"]]\n", - "\n", - " return symbols\n", - "\n", - "\n", - "\n", - " def coins():\n", - "\n", - " raw_symbols = r.get(\"https://api.coingecko.com/api/v3/coins/list\").json()\n", - " symbols = pd.DataFrame(data=raw_symbols)\n", - "\n", - " symbols[\"description\"] = \"$$\" + symbols[\"symbol\"] + \": \" + symbols[\"name\"]\n", - " symbols = symbols[[\"id\", \"symbol\", \"name\", \"description\"]]\n", - "\n", - " return symbols" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " id symbol \\\n", - "0 A A \n", - "1 AA AA \n", - "2 AAA AAA \n", - "3 AAAU AAAU \n", - "4 AAC AAC \n", - "... ... ... \n", - "6565 zyro zyro \n", - "6566 zytara-dollar zusd \n", - "6567 zyx zyx \n", - "6568 zzz-finance zzz \n", - "6569 zzz-finance-v2 zzzv2 \n", - "\n", - " name \\\n", - "0 Agilent Technologies Inc. \n", - "1 Alcoa Corp \n", - "2 Listed Funds Trust - AAF First Priority CLO Bo... \n", - "3 Goldman Sachs Physical Gold ETF Shares - Goldm... \n", - "4 Ares Acquisition Corporation - Class A \n", - "... ... \n", - "6565 Zyro \n", - "6566 Zytara Dollar \n", - "6567 ZYX \n", - "6568 zzz.finance \n", - "6569 zzz.finance v2 \n", - "\n", - " description \n", - "0 $A: Agilent Technologies Inc. \n", - "1 $AA: Alcoa Corp \n", - "2 $AAA: Listed Funds Trust - AAF First Priority ... \n", - "3 $AAAU: Goldman Sachs Physical Gold ETF Shares ... \n", - "4 $AAC: Ares Acquisition Corporation - Class A \n", - "... ... \n", - "6565 $$zyro: Zyro \n", - "6566 $$zusd: Zytara Dollar \n", - "6567 $$zyx: ZYX \n", - "6568 $$zzz: zzz.finance \n", - "6569 $$zzzv2: zzz.finance v2 \n", - "\n", - "[16946 rows x 4 columns]" - ], - "text/html": "

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
idsymbolnamedescription
0AAAgilent Technologies Inc.$A: Agilent Technologies Inc.
1AAAAAlcoa Corp$AA: Alcoa Corp
2AAAAAAListed Funds Trust - AAF First Priority CLO Bo...$AAA: Listed Funds Trust - AAF First Priority ...
3AAAUAAAUGoldman Sachs Physical Gold ETF Shares - Goldm...$AAAU: Goldman Sachs Physical Gold ETF Shares ...
4AACAACAres Acquisition Corporation - Class A$AAC: Ares Acquisition Corporation - Class A
...............
6565zyrozyroZyro$$zyro: Zyro
6566zytara-dollarzusdZytara Dollar$$zusd: Zytara Dollar
6567zyxzyxZYX$$zyx: ZYX
6568zzz-financezzzzzz.finance$$zzz: zzz.finance
6569zzz-finance-v2zzzv2zzz.finance v2$$zzzv2: zzz.finance v2
\n

16946 rows × 4 columns

\n
" - }, - "metadata": {}, - "execution_count": 51 - } - ], - "source": [ - "df = pd.concat([stocks(), coins()])\n", - "df" - ] - }, - { - "cell_type": "code", - "execution_count": 79, - "metadata": {}, - "outputs": [], - "source": [ - " def search_symbols(search: str):\n", - " \"\"\"Performs a fuzzy search to find stock symbols closest to a search term.\n", - "\n", - " Parameters\n", - " ----------\n", - " search : str\n", - " String used to search, could be a company name or something close to the companies stock ticker.\n", - "\n", - " Returns\n", - " -------\n", - " List[tuple[str, str]]\n", - " A list tuples of every stock sorted in order of how well they match. Each tuple contains: (Symbol, Issue Name).\n", - " \"\"\"\n", - "\n", - " try:\n", - " if search_index[search]: return search_index[search]\n", - " except KeyError:\n", - " pass\n", - "\n", - "\n", - "\n", - " search = search.lower()\n", - "\n", - " df[\"Match\"] = df.apply(\n", - " lambda x: fuzz.ratio(search, f\"{x['symbol']}\".lower()),\n", - " axis=1,\n", - " )\n", - "\n", - " df.sort_values(by=\"Match\", ascending=False, inplace=True)\n", - " if df[\"Match\"].head().sum() < 300:\n", - " df[\"Match\"] = df.apply(\n", - " lambda x: fuzz.partial_ratio(search, x[\"name\"].lower()),\n", - " axis=1,\n", - " )\n", - "\n", - " df.sort_values(by=\"Match\", ascending=False, inplace=True)\n", - "\n", - " symbols = df.head(20)\n", - " symbol_list = list(zip(list(symbols[\"symbol\"]), list(symbols[\"description\"])))\n", - " \n", - " return symbol_list" - ] - }, - { - "cell_type": "code", - "execution_count": 91, - "metadata": {}, - "outputs": [], - "source": [ - "search_list = df['id'].to_list() + df['description'].to_list()\n", - "search_index = {}" - ] - }, - { - "cell_type": "code", - "execution_count": 92, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - " 5%|▍ | 1545/33892 [06:51<2:23:40, 3.75it/s]\n" - ] - }, - { - "output_type": "error", - "ename": "KeyboardInterrupt", - "evalue": "", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtqdm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msearch_list\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0msearch_index\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msearch_symbols\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36msearch_symbols\u001b[0;34m(search)\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0msearch\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msearch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlower\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 24\u001b[0;31m df[\"Match\"] = df.apply(\n\u001b[0m\u001b[1;32m 25\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfuzz\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mratio\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msearch\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34mf\"{x['symbol']}\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlower\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 26\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.9/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36mapply\u001b[0;34m(self, func, axis, raw, result_type, args, **kwds)\u001b[0m\n\u001b[1;32m 7763\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7764\u001b[0m )\n\u001b[0;32m-> 7765\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mop\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_result\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7766\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7767\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mapplymap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mna_action\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mOptional\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mDataFrame\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.9/site-packages/pandas/core/apply.py\u001b[0m in \u001b[0;36mget_result\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 183\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply_raw\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 184\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 185\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply_standard\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 186\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 187\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mapply_empty_result\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.9/site-packages/pandas/core/apply.py\u001b[0m in \u001b[0;36mapply_standard\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 274\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 275\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mapply_standard\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 276\u001b[0;31m \u001b[0mresults\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mres_index\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply_series_generator\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 277\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 278\u001b[0m \u001b[0;31m# wrap results\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.9/site-packages/pandas/core/apply.py\u001b[0m in \u001b[0;36mapply_series_generator\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 286\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 287\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0moption_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"mode.chained_assignment\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 288\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mseries_gen\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 289\u001b[0m \u001b[0;31m# ignore SettingWithCopy here in case the user mutates\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 290\u001b[0m \u001b[0mresults\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.9/site-packages/pandas/core/apply.py\u001b[0m in \u001b[0;36mseries_generator\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 408\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0marr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 409\u001b[0m \u001b[0;31m# GH#35462 re-pin mgr in case setitem changed it\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 410\u001b[0;31m \u001b[0mser\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_mgr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmgr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 411\u001b[0m \u001b[0mblk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0marr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 412\u001b[0m \u001b[0mser\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.9/site-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36m__setattr__\u001b[0;34m(self, name, value)\u001b[0m\n\u001b[1;32m 5473\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5474\u001b[0m \u001b[0mobject\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__getattribute__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 5475\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mobject\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__setattr__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5476\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mAttributeError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5477\u001b[0m \u001b[0;32mpass\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] - } - ], - "source": [ - "\n", - "for i in tqdm(search_list):\n", - " search_index[i] = search_symbols(i)" - ] - }, - { - "cell_type": "code", - "execution_count": 89, - "metadata": {}, - "outputs": [], - "source": [ - "import pickle\n", - "\n", - "\n", - "\n", - "with open('search_index.pickle', 'wb') as handle:\n", - " pickle.dump(search_index, handle, protocol=pickle.HIGHEST_PROTOCOL)\n", - "\n", - "# with open('filename.pickle', 'rb') as handle:\n", - "# b = pickle.load(handle)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ] -} diff --git a/symbol_router.py b/symbol_router.py index 87d6667..5144e72 100644 --- a/symbol_router.py +++ b/symbol_router.py @@ -27,7 +27,6 @@ class Router: def find_symbols(self, text: str) -> list[Symbol]: """Finds stock tickers starting with a dollar sign, and cryptocurrencies with two dollar signs in a blob of text and returns them in a list. - Only returns each match once. Example: Whats the price of $tsla? Parameters ---------- @@ -91,7 +90,8 @@ class Router: Returns ------- list[tuple[str, str]] - A list tuples of every stock sorted in order of how well they match. Each tuple contains: (Symbol, Issue Name). + A list tuples of every stock sorted in order of how well they match. + Each tuple contains: (Symbol, Issue Name). """ df = pd.concat([self.stock.symbol_list, self.crypto.symbol_list]) @@ -183,7 +183,8 @@ class Router: Returns ------- Dict[str, str] - Each symbol passed in is a key with its value being a human readable formatted string of the symbols div dates. + Each symbol passed in is a key with its value being a human readable + formatted string of the symbols div dates. """ replies = [] for symbol in symbols: @@ -207,7 +208,8 @@ class Router: Returns ------- Dict[str, str] - Each symbol passed in is a key with its value being a human readable markdown formatted string of the symbols news. + Each symbol passed in is a key with its value being a human + readable markdown formatted string of the symbols news. """ replies = [] @@ -235,7 +237,8 @@ class Router: Returns ------- Dict[str, str] - Each symbol passed in is a key with its value being a human readable formatted string of the symbols information. + Each symbol passed in is a key with its value being a human readable formatted + string of the symbols information. """ replies = [] @@ -260,7 +263,8 @@ class Router: Returns ------- pd.DataFrame - Returns a timeseries dataframe with high, low, and volume data if its available. Otherwise returns empty pd.DataFrame. + Returns a timeseries dataframe with high, low, and volume data if its available. + Otherwise returns empty pd.DataFrame. """ if isinstance(symbol, Stock): @@ -283,7 +287,8 @@ class Router: Returns ------- pd.DataFrame - Returns a timeseries dataframe with high, low, and volume data if its available. Otherwise returns empty pd.DataFrame. + Returns a timeseries dataframe with high, low, and volume data if its available. + Otherwise returns empty pd.DataFrame. """ if isinstance(symbol, Stock): return self.stock.chart_reply(symbol) @@ -304,7 +309,8 @@ class Router: Returns ------- Dict[str, str] - Each symbol passed in is a key with its value being a human readable formatted string of the symbols statistics. + Each symbol passed in is a key with its value being a human readable + formatted string of the symbols statistics. """ replies = [] @@ -329,7 +335,8 @@ class Router: Returns ------- Dict[str, str] - Each symbol passed in is a key with its value being a human readable formatted string of the symbols market cap. + Each symbol passed in is a key with its value being a human readable + formatted string of the symbols market cap. """ replies = []