Big improvements on image view.
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
# rstat_tool/dashboard.py
|
# rstat_tool/dashboard.py
|
||||||
|
|
||||||
from flask import Flask, render_template
|
from flask import Flask, render_template, request
|
||||||
from datetime import datetime, timedelta, timezone
|
from datetime import datetime, timedelta, timezone
|
||||||
from .logger_setup import get_logger
|
from .logger_setup import get_logger
|
||||||
from .database import (
|
from .database import (
|
||||||
@@ -69,13 +69,30 @@ def daily_image_view(name):
|
|||||||
|
|
||||||
@app.route("/image/weekly/<name>")
|
@app.route("/image/weekly/<name>")
|
||||||
def weekly_image_view(name):
|
def weekly_image_view(name):
|
||||||
"""The handler for the WEEKLY image-style dashboard."""
|
"""
|
||||||
tickers = get_weekly_summary_for_subreddit(name)
|
The handler for the WEEKLY image-style dashboard.
|
||||||
|
Accepts an optional 'date' query parameter in YYYY-MM-DD format.
|
||||||
# Create the date range string for the title
|
"""
|
||||||
end_date = datetime.now(timezone.utc)
|
# Get the date from the URL query string, e.g., ?date=2025-07-21
|
||||||
start_date = end_date - timedelta(days=7)
|
date_str = request.args.get('date')
|
||||||
date_range_str = f"{start_date.strftime('%b %d')} - {end_date.strftime('%b %d, %Y')}"
|
target_date = None
|
||||||
|
|
||||||
|
if date_str:
|
||||||
|
try:
|
||||||
|
# Convert the string to a datetime object
|
||||||
|
target_date = datetime.strptime(date_str, "%Y-%m-%d").replace(tzinfo=timezone.utc)
|
||||||
|
except ValueError:
|
||||||
|
return "Invalid date format. Please use YYYY-MM-DD.", 400
|
||||||
|
else:
|
||||||
|
# If no date is provided, default to showing LAST week
|
||||||
|
today = datetime.now(timezone.utc)
|
||||||
|
target_date = today - timedelta(days=7)
|
||||||
|
|
||||||
|
# The query now returns the results and the date objects used
|
||||||
|
tickers, start_of_week, end_of_week = get_weekly_summary_for_subreddit(name, target_date)
|
||||||
|
|
||||||
|
# Format the date range for the title
|
||||||
|
date_range_str = f"{start_of_week.strftime('%b %d')} - {end_of_week.strftime('%b %d, %Y')}"
|
||||||
|
|
||||||
return render_template(
|
return render_template(
|
||||||
"weekly_image_view.html",
|
"weekly_image_view.html",
|
||||||
|
@@ -235,6 +235,22 @@ def get_ticker_info(conn, ticker_id):
|
|||||||
cursor.execute("SELECT * FROM tickers WHERE id = ?", (ticker_id,))
|
cursor.execute("SELECT * FROM tickers WHERE id = ?", (ticker_id,))
|
||||||
return cursor.fetchone()
|
return cursor.fetchone()
|
||||||
|
|
||||||
|
def get_week_start_end(for_date):
|
||||||
|
"""
|
||||||
|
Calculates the start (Monday, 00:00:00) and end (Sunday, 23:59:59)
|
||||||
|
of the week that a given date falls into.
|
||||||
|
Returns two datetime objects.
|
||||||
|
"""
|
||||||
|
# Monday is 0, Sunday is 6
|
||||||
|
start_of_week = for_date - timedelta(days=for_date.weekday())
|
||||||
|
end_of_week = start_of_week + timedelta(days=6)
|
||||||
|
|
||||||
|
# Set time to the very beginning and very end of the day for an inclusive range
|
||||||
|
start_of_week = start_of_week.replace(hour=0, minute=0, second=0, microsecond=0)
|
||||||
|
end_of_week = end_of_week.replace(hour=23, minute=59, second=59, microsecond=999999)
|
||||||
|
|
||||||
|
return start_of_week, end_of_week
|
||||||
|
|
||||||
def generate_summary_report(limit=20):
|
def generate_summary_report(limit=20):
|
||||||
"""Queries the DB to generate a summary for the command-line tool."""
|
"""Queries the DB to generate a summary for the command-line tool."""
|
||||||
log.info(f"\n--- Top {limit} Tickers by Mention Count ---")
|
log.info(f"\n--- Top {limit} Tickers by Mention Count ---")
|
||||||
@@ -334,49 +350,53 @@ def get_daily_summary_for_subreddit(subreddit_name):
|
|||||||
one_day_ago = datetime.now(timezone.utc) - timedelta(days=1)
|
one_day_ago = datetime.now(timezone.utc) - timedelta(days=1)
|
||||||
one_day_ago_timestamp = int(one_day_ago.timestamp())
|
one_day_ago_timestamp = int(one_day_ago.timestamp())
|
||||||
query = """
|
query = """
|
||||||
SELECT t.symbol,
|
SELECT
|
||||||
COUNT(CASE WHEN m.mention_type = 'post' THEN 1 END) as post_mentions,
|
t.symbol, t.market_cap, t.closing_price,
|
||||||
COUNT(CASE WHEN m.mention_type = 'comment' THEN 1 END) as comment_mentions,
|
COUNT(m.id) as total_mentions,
|
||||||
COUNT(CASE WHEN m.mention_sentiment > 0.1 THEN 1 END) as bullish_mentions,
|
COUNT(CASE WHEN m.mention_sentiment > 0.1 THEN 1 END) as bullish_mentions,
|
||||||
COUNT(CASE WHEN m.mention_sentiment < -0.1 THEN 1 END) as bearish_mentions
|
COUNT(CASE WHEN m.mention_sentiment < -0.1 THEN 1 END) as bearish_mentions
|
||||||
FROM mentions m JOIN tickers t ON m.ticker_id = t.id JOIN subreddits s ON m.subreddit_id = s.id
|
FROM mentions m JOIN tickers t ON m.ticker_id = t.id JOIN subreddits s ON m.subreddit_id = s.id
|
||||||
WHERE LOWER(s.name) = LOWER(?) AND m.mention_timestamp >= ?
|
WHERE LOWER(s.name) = LOWER(?) AND m.mention_timestamp >= ?
|
||||||
GROUP BY t.symbol ORDER BY (post_mentions + comment_mentions) DESC LIMIT 10;
|
GROUP BY t.symbol, t.market_cap, t.closing_price
|
||||||
|
ORDER BY total_mentions DESC LIMIT 10;
|
||||||
"""
|
"""
|
||||||
results = conn.execute(query, (subreddit_name, one_day_ago_timestamp)).fetchall()
|
results = conn.execute(query, (subreddit_name, one_day_ago_timestamp)).fetchall()
|
||||||
conn.close()
|
conn.close()
|
||||||
return results
|
return results
|
||||||
|
|
||||||
def get_weekly_summary_for_subreddit(subreddit_name):
|
def get_weekly_summary_for_subreddit(subreddit_name, for_date):
|
||||||
""" Gets a summary for the WEEKLY image view (last 7 days). """
|
""" Gets a summary for the WEEKLY image view (full week). """
|
||||||
conn = get_db_connection()
|
conn = get_db_connection()
|
||||||
seven_days_ago = datetime.now(timezone.utc) - timedelta(days=7)
|
start_of_week, end_of_week = get_week_start_end(for_date)
|
||||||
seven_days_ago_timestamp = int(seven_days_ago.timestamp())
|
start_timestamp = int(start_of_week.timestamp())
|
||||||
|
end_timestamp = int(end_of_week.timestamp())
|
||||||
query = """
|
query = """
|
||||||
SELECT t.symbol,
|
SELECT
|
||||||
COUNT(CASE WHEN m.mention_type = 'post' THEN 1 END) as post_mentions,
|
t.symbol, t.market_cap, t.closing_price,
|
||||||
COUNT(CASE WHEN m.mention_type = 'comment' THEN 1 END) as comment_mentions,
|
COUNT(m.id) as total_mentions,
|
||||||
COUNT(CASE WHEN m.mention_sentiment > 0.1 THEN 1 END) as bullish_mentions,
|
COUNT(CASE WHEN m.mention_sentiment > 0.1 THEN 1 END) as bullish_mentions,
|
||||||
COUNT(CASE WHEN m.mention_sentiment < -0.1 THEN 1 END) as bearish_mentions
|
COUNT(CASE WHEN m.mention_sentiment < -0.1 THEN 1 END) as bearish_mentions
|
||||||
FROM mentions m JOIN tickers t ON m.ticker_id = t.id JOIN subreddits s ON m.subreddit_id = s.id
|
FROM mentions m JOIN tickers t ON m.ticker_id = t.id JOIN subreddits s ON m.subreddit_id = s.id
|
||||||
WHERE LOWER(s.name) = LOWER(?) AND m.mention_timestamp >= ?
|
WHERE LOWER(s.name) = LOWER(?) AND m.mention_timestamp BETWEEN ? AND ?
|
||||||
GROUP BY t.symbol ORDER BY (post_mentions + comment_mentions) DESC LIMIT 10;
|
GROUP BY t.symbol, t.market_cap, t.closing_price
|
||||||
|
ORDER BY total_mentions DESC LIMIT 10;
|
||||||
"""
|
"""
|
||||||
results = conn.execute(query, (subreddit_name, seven_days_ago_timestamp)).fetchall()
|
results = conn.execute(query, (subreddit_name, start_timestamp, end_timestamp)).fetchall()
|
||||||
conn.close()
|
conn.close()
|
||||||
return results
|
return results, start_of_week, end_of_week
|
||||||
|
|
||||||
def get_overall_image_view_summary():
|
def get_overall_image_view_summary():
|
||||||
""" Gets a summary of top tickers across ALL subreddits for the image view. """
|
""" Gets a summary of top tickers across ALL subreddits for the image view. """
|
||||||
conn = get_db_connection()
|
conn = get_db_connection()
|
||||||
query = """
|
query = """
|
||||||
SELECT t.symbol,
|
SELECT
|
||||||
COUNT(CASE WHEN m.mention_type = 'post' THEN 1 END) as post_mentions,
|
t.symbol, t.market_cap, t.closing_price,
|
||||||
COUNT(CASE WHEN m.mention_type = 'comment' THEN 1 END) as comment_mentions,
|
COUNT(m.id) as total_mentions,
|
||||||
COUNT(CASE WHEN m.mention_sentiment > 0.1 THEN 1 END) as bullish_mentions,
|
COUNT(CASE WHEN m.mention_sentiment > 0.1 THEN 1 END) as bullish_mentions,
|
||||||
COUNT(CASE WHEN m.mention_sentiment < -0.1 THEN 1 END) as bearish_mentions
|
COUNT(CASE WHEN m.mention_sentiment < -0.1 THEN 1 END) as bearish_mentions
|
||||||
FROM mentions m JOIN tickers t ON m.ticker_id = t.id
|
FROM mentions m JOIN tickers t ON m.ticker_id = t.id
|
||||||
GROUP BY t.symbol ORDER BY (post_mentions + comment_mentions) DESC LIMIT 10;
|
GROUP BY t.symbol, t.market_cap, t.closing_price
|
||||||
|
ORDER BY total_mentions DESC LIMIT 10;
|
||||||
"""
|
"""
|
||||||
results = conn.execute(query).fetchall()
|
results = conn.execute(query).fetchall()
|
||||||
conn.close()
|
conn.close()
|
||||||
|
@@ -18,81 +18,82 @@ COMMON_WORDS_BLACKLIST = {
|
|||||||
"CNY", "COCK", "COGS", "COIL", "COKE", "COME", "COST", "COULD", "COVID", "CPAP",
|
"CNY", "COCK", "COGS", "COIL", "COKE", "COME", "COST", "COULD", "COVID", "CPAP",
|
||||||
"CPI", "CRA", "CRE", "CRO", "CRV", "CSE", "CSS", "CST", "CTB", "CTEP",
|
"CPI", "CRA", "CRE", "CRO", "CRV", "CSE", "CSS", "CST", "CTB", "CTEP",
|
||||||
"CTO", "CUCKS", "CULT", "CUV", "CYCLE", "CZK", "DA", "DAILY", "DAO", "DATE",
|
"CTO", "CUCKS", "CULT", "CUV", "CYCLE", "CZK", "DA", "DAILY", "DAO", "DATE",
|
||||||
"DAX", "DAY", "DAYS", "DCA", "DCF", "DD", "DEBT", "DEEZ", "DEMO", "DEX",
|
"DAX", "DAY", "DAYS", "DCA", "DCF", "DD", "DEBT", "DEEZ", "DEMO", "DET",
|
||||||
"DIA", "DID", "DIDNT", "DIP", "DITM", "DIV", "DIY", "DJIA", "DKK", "DL",
|
"DEX", "DIA", "DID", "DIDNT", "DIP", "DITM", "DIV", "DIY", "DJIA", "DKK",
|
||||||
"DM", "DMV", "DNI", "DO", "DOE", "DOES", "DOGE", "DOJ", "DOM", "DONT",
|
"DL", "DM", "DMV", "DNI", "DO", "DOE", "DOES", "DOGE", "DOJ", "DOM",
|
||||||
"DOOR", "DOWN", "DPI", "DR", "DUDE", "DUMP", "DUTY", "DYI", "DYNK", "DYODD",
|
"DONT", "DOOR", "DOWN", "DPI", "DR", "DUDE", "DUMP", "DUTY", "DXYXBT", "DYI",
|
||||||
"DYOR", "EACH", "EARLY", "EARN", "EAST", "EASY", "ECB", "EDGAR", "EDIT", "EDT",
|
"DYNK", "DYODD", "DYOR", "EACH", "EARLY", "EARN", "EAST", "EASY", "ECB", "EDGAR",
|
||||||
"EJ", "EMA", "EMJ", "END", "ENRON", "ENSI", "ENV", "EO", "EOD", "EOW",
|
"EDIT", "EDT", "EJ", "EMA", "EMJ", "END", "ENRON", "ENSI", "ENV", "EO",
|
||||||
"EOY", "EPA", "EPK", "EPS", "ER", "ESG", "ESPP", "EST", "ETA", "ETF",
|
"EOD", "EOW", "EOY", "EPA", "EPK", "EPS", "ER", "ESG", "ESPP", "EST",
|
||||||
"ETFS", "ETH", "EU", "EUR", "EV", "EVEN", "EVERY", "EVTOL", "EXTRA", "EYES",
|
"ETA", "ETF", "ETFS", "ETH", "EU", "EUR", "EV", "EVEN", "EVERY", "EVTOL",
|
||||||
"EZ", "FAANG", "FAFO", "FAQ", "FAR", "FAST", "FBI", "FCFF", "FD", "FDA",
|
"EXTRA", "EYES", "EZ", "FAANG", "FAFO", "FAQ", "FAR", "FAST", "FBI", "FCFF",
|
||||||
"FEE", "FFH", "FFS", "FGMA", "FIG", "FIGMA", "FIHTX", "FING", "FINRA", "FINT",
|
"FD", "FDA", "FEE", "FFH", "FFS", "FGMA", "FIG", "FIGMA", "FIHTX", "FING",
|
||||||
"FINTX", "FINTY", "FIRST", "FKIN", "FLT", "FLY", "FML", "FOLO", "FOMC", "FOMO",
|
"FINRA", "FINT", "FINTX", "FINTY", "FIRST", "FKIN", "FLT", "FLY", "FML", "FOLO",
|
||||||
"FOR", "FOREX", "FRAUD", "FRG", "FROM", "FSBO", "FSD", "FSELK", "FSPSX", "FTD",
|
"FOMC", "FOMO", "FOR", "FOREX", "FRAUD", "FRG", "FROM", "FRP", "FSBO", "FSD",
|
||||||
"FTSE", "FUCK", "FUCKS", "FUD", "FULL", "FUND", "FUNNY", "FVG", "FWIW", "FX",
|
"FSELK", "FSPSX", "FTD", "FTSE", "FUCK", "FUCKS", "FUD", "FULL", "FUND", "FUNNY",
|
||||||
"FXAIX", "FXIAX", "FXROX", "FY", "FYI", "FZROX", "GAAP", "GAIN", "GAVE", "GBP",
|
"FVG", "FWIW", "FX", "FXAIX", "FXIAX", "FXROX", "FY", "FYI", "FZROX", "GAAP",
|
||||||
"GC", "GDP", "GET", "GG", "GJ", "GL", "GLHF", "GMAT", "GMI", "GMT",
|
"GAIN", "GAVE", "GBP", "GC", "GDP", "GET", "GG", "GJ", "GL", "GLHF",
|
||||||
"GO", "GOAL", "GOAT", "GOD", "GOING", "GOLD", "GONE", "GONNA", "GPT", "GPU",
|
"GMAT", "GMI", "GMT", "GO", "GOAL", "GOAT", "GOD", "GOING", "GOLD", "GONE",
|
||||||
"GRAB", "GREAT", "GREEN", "GST", "GTA", "GTFO", "GTG", "GUH", "GUY", "GUYS",
|
"GONNA", "GPT", "GPU", "GRAB", "GREAT", "GREEN", "GST", "GTA", "GTFO", "GTG",
|
||||||
"HAD", "HAHA", "HALF", "HANDS", "HAS", "HATE", "HAVE", "HBAR", "HCOL", "HEAR",
|
"GUH", "GUY", "GUYS", "HAD", "HAHA", "HALF", "HANDS", "HAS", "HATE", "HAVE",
|
||||||
"HEDGE", "HEGE", "HELD", "HELP", "HEY", "HFCS", "HFT", "HGTV", "HIGH", "HIGHS",
|
"HBAR", "HCOL", "HEAR", "HEDGE", "HEGE", "HELD", "HELP", "HEY", "HFCS", "HFT",
|
||||||
"HINT", "HIS", "HITID", "HKD", "HODL", "HODOR", "HOF", "HOLD", "HOLY", "HOME",
|
"HGTV", "HIGH", "HIGHS", "HINT", "HIS", "HITID", "HKD", "HODL", "HODOR", "HOF",
|
||||||
"HOUR", "HOW", "HS", "HSA", "HT", "HTF", "HTML", "HUF", "HUGE", "HYPE",
|
"HOLD", "HOLY", "HOME", "HOUR", "HOW", "HS", "HSA", "HT", "HTF", "HTML",
|
||||||
"IANAL", "IB", "IBS", "ICT", "ID", "IDF", "IDK", "IF", "II", "IKKE",
|
"HUF", "HUGE", "HYPE", "IANAL", "IB", "IBS", "ICT", "ID", "IDF", "IDK",
|
||||||
"IKZ", "IM", "IMHO", "IMI", "IMO", "IN", "INR", "INTO", "IP", "IPO",
|
"IF", "II", "IKKE", "IKZ", "IM", "IMHO", "IMI", "IMO", "IN", "INR",
|
||||||
"IRA", "IRAS", "IRC", "IRISH", "IRS", "IS", "ISA", "ISIN", "ISM", "ISN",
|
"INTO", "IP", "IPO", "IRA", "IRAS", "IRC", "IRISH", "IRS", "IS", "ISA",
|
||||||
"IST", "IT", "ITC", "ITM", "ITS", "ITWN", "IUIT", "IV", "IVV", "IWM",
|
"ISIN", "ISM", "ISN", "IST", "IT", "ITC", "ITM", "ITS", "ITWN", "IUIT",
|
||||||
"IXL", "JAVA", "JD", "JFC", "JK", "JLR", "JMO", "JOIN", "JOKE", "JP",
|
"IV", "IVV", "IWM", "IXL", "JAVA", "JD", "JFC", "JK", "JLR", "JMO",
|
||||||
"JPOW", "JPY", "JS", "JST", "JUN", "JUST", "KARMA", "KEEP", "KILL", "KING",
|
"JOIN", "JOKE", "JP", "JPOW", "JPY", "JS", "JST", "JUN", "JUST", "KARMA",
|
||||||
"KNEW", "KNOW", "KO", "KOHLS", "KPMG", "KRW", "LANGT", "LARGE", "LAST", "LATE",
|
"KEEP", "KILL", "KING", "KNEW", "KNOW", "KO", "KOHLS", "KPMG", "KRW", "LANGT",
|
||||||
"LATER", "LBO", "LCS", "LDL", "LEADS", "LEAP", "LEAPS", "LEARN", "LEI", "LET",
|
"LARGE", "LAST", "LATE", "LATER", "LBO", "LCS", "LDL", "LEADS", "LEAP", "LEAPS",
|
||||||
"LETS", "LFG", "LFP", "LIFE", "LIG", "LIGMA", "LIKE", "LIMIT", "LIST", "LLC",
|
"LEARN", "LEI", "LET", "LETS", "LFG", "LFP", "LIFE", "LIG", "LIGMA", "LIKE",
|
||||||
"LLM", "LMAO", "LMM", "LMN", "LOKO", "LOL", "LOLOL", "LONG", "LOOK", "LOSE",
|
"LIMIT", "LIST", "LLC", "LLM", "LMAO", "LMM", "LMN", "LOKO", "LOL", "LOLOL",
|
||||||
"LOSS", "LOST", "LOVE", "LOW", "LOWER", "LOWS", "LP", "LTCG", "LUPD", "LYING",
|
"LONG", "LOOK", "LOSE", "LOSS", "LOST", "LOVE", "LOW", "LOWER", "LOWS", "LP",
|
||||||
"M&A", "MA", "MACD", "MAKE", "MAKES", "MANY", "MAX", "MBA", "MC", "MCAP",
|
"LTCG", "LUPD", "LYING", "M&A", "MA", "MACD", "MAKE", "MAKES", "MANGE", "MANY",
|
||||||
"MCP", "ME", "MEME", "MERGE", "MERK", "MES", "MEXC", "MF", "MFER", "MID",
|
"MAX", "MBA", "MC", "MCAP", "MCP", "ME", "MEME", "MERGE", "MERK", "MES",
|
||||||
"MIGHT", "MIN", "MIND", "ML", "MLB", "MLS", "MM", "MNQ", "MOASS", "MOM",
|
"MEXC", "MF", "MFER", "MID", "MIGHT", "MIN", "MIND", "ML", "MLB", "MLS",
|
||||||
"MONEY", "MONTH", "MONY", "MOON", "MORE", "MOU", "MSK", "MTVGA", "MUCH", "MUSIC",
|
"MM", "MNQ", "MOASS", "MOM", "MONEY", "MONTH", "MONY", "MOON", "MORE", "MOU",
|
||||||
"MUST", "MXN", "MY", "MYMD", "NASA", "NASDA", "NATO", "NAV", "NBA", "NCAN",
|
"MSK", "MTVGA", "MUCH", "MUSIC", "MUST", "MVA", "MXN", "MY", "MYMD", "NASA",
|
||||||
"NCR", "NEAR", "NEAT", "NEED", "NEVER", "NEW", "NEWS", "NEXT", "NFA", "NFC",
|
"NASDA", "NATO", "NAV", "NBA", "NCAN", "NCR", "NEAR", "NEAT", "NEED", "NEVER",
|
||||||
"NFL", "NFT", "NGMI", "NIGHT", "NIQ", "NK", "NO", "NOK", "NONE", "NOPE",
|
"NEW", "NEWS", "NEXT", "NFA", "NFC", "NFL", "NFT", "NGMI", "NIGHT", "NIQ",
|
||||||
"NORTH", "NOT", "NOVA", "NOW", "NQ", "NSA", "NTVS", "NULL", "NUT", "NUTS",
|
"NK", "NO", "NOK", "NONE", "NOPE", "NORTH", "NOT", "NOVA", "NOW", "NQ",
|
||||||
"NUTZ", "NVM", "NW", "NY", "NYSE", "NZ", "NZD", "OBBB", "OBI", "OBS",
|
"NSA", "NTVS", "NULL", "NUT", "NUTS", "NUTZ", "NVM", "NW", "NY", "NYSE",
|
||||||
"OBV", "OCF", "OCO", "ODAT", "OEM", "OF", "OFA", "OFF", "OG", "OH",
|
"NZ", "NZD", "OBBB", "OBI", "OBS", "OBV", "OCF", "OCO", "ODAT", "OEM",
|
||||||
"OK", "OKAY", "OLD", "OMFG", "OMG", "ON", "ONE", "ONLY", "OP", "OPEC",
|
"OF", "OFA", "OFF", "OG", "OH", "OK", "OKAY", "OL", "OLD", "OMFG",
|
||||||
"OPENQ", "OPEX", "OPRN", "OR", "ORB", "OS", "OSCE", "OT", "OTC", "OTM",
|
"OMG", "ON", "ONE", "ONLY", "OP", "OPEC", "OPENQ", "OPEX", "OPRN", "OR",
|
||||||
"OUCH", "OUGHT", "OUT", "OVER", "OWN", "PA", "PANIC", "PC", "PDT", "PE",
|
"ORB", "OS", "OSCE", "OT", "OTC", "OTM", "OUCH", "OUGHT", "OUT", "OVER",
|
||||||
"PEAK", "PEG", "PETA", "PEW", "PFC", "PGHL", "PIMCO", "PITA", "PLAN", "PLAYS",
|
"OWN", "PA", "PANIC", "PC", "PDT", "PE", "PEAK", "PEG", "PETA", "PEW",
|
||||||
"PLN", "PM", "PMI", "PNL", "POC", "POMO", "POP", "POS", "POSCO", "POTUS",
|
"PFC", "PGHL", "PIMCO", "PITA", "PLAN", "PLAYS", "PLN", "PM", "PMI", "PNL",
|
||||||
"POV", "POW", "PPI", "PR", "PRICE", "PROFIT", "PROXY", "PS", "PSA", "PST",
|
"POC", "POMO", "POP", "POS", "POSCO", "POTUS", "POV", "POW", "PPI", "PR",
|
||||||
"PT", "PTD", "PUSSY", "PUT", "PWC", "Q1", "Q2", "Q3", "Q4", "QE",
|
"PRICE", "PROFIT", "PROXY", "PS", "PSA", "PST", "PT", "PTD", "PUSSY", "PUT",
|
||||||
"QED", "QIMC", "QQQ", "QR", "RAM", "RATM", "RBA", "RBNZ", "RE", "REACH",
|
"PWC", "Q1", "Q2", "Q3", "Q4", "QE", "QED", "QIMC", "QQQ", "QR",
|
||||||
"READY", "REAL", "RED", "REIT", "REITS", "REKT", "RFK", "RH", "RICO", "RIDE",
|
"RAM", "RATM", "RBA", "RBNZ", "RE", "REACH", "READY", "REAL", "RED", "REIT",
|
||||||
"RIGHT", "RIP", "RISK", "RISKY", "ROCE", "ROCK", "ROE", "ROFL", "ROI", "ROIC",
|
"REITS", "REKT", "RFK", "RH", "RICO", "RIDE", "RIGHT", "RIP", "RISK", "RISKY",
|
||||||
"ROTH", "RRSP", "RSD", "RSI", "RT", "RTD", "RUB", "RUG", "RULE", "RUST",
|
"ROCE", "ROCK", "ROE", "ROFL", "ROI", "ROIC", "ROTH", "RRSP", "RSD", "RSI",
|
||||||
"RVOL", "SAGA", "SALES", "SAME", "SAVE", "SAYS", "SBF", "SBLOC", "SC", "SCALP",
|
"RT", "RTD", "RUB", "RUG", "RULE", "RUST", "RVOL", "SAGA", "SALES", "SAME",
|
||||||
"SCAM", "SCHB", "SCIF", "SEC", "SEE", "SEK", "SELL", "SELLL", "SEP", "SESG",
|
"SAVE", "SAYS", "SBF", "SBLOC", "SC", "SCALP", "SCAM", "SCHB", "SCIF", "SEC",
|
||||||
"SET", "SGD", "SHALL", "SHARE", "SHELL", "SHIT", "SHORT", "SHOW", "SHTF", "SI",
|
"SEE", "SEK", "SELL", "SELLL", "SEP", "SESG", "SET", "SGD", "SHALL", "SHARE",
|
||||||
"SIGN", "SL", "SLIM", "SLOW", "SMA", "SMALL", "SO", "SOLIS", "SOME", "SOON",
|
"SHELL", "SHIT", "SHORT", "SHOW", "SHTF", "SI", "SIGN", "SL", "SLIM", "SLOW",
|
||||||
"SOUTH", "SP", "SPAC", "SPDR", "SPEND", "SPLG", "SPX", "SPY", "SS", "START",
|
"SMA", "SMALL", "SO", "SOLIS", "SOME", "SOON", "SOUTH", "SP", "SPAC", "SPDR",
|
||||||
"STAY", "STEEL", "STFU", "STILL", "STOCK", "STOOQ", "STOP", "STOR", "STQQQ", "STUCK",
|
"SPEND", "SPLG", "SPX", "SPY", "SS", "START", "STAY", "STEEL", "STFU", "STILL",
|
||||||
"STUDY", "SUS", "SUV", "SWIFT", "SWING", "TA", "TAG", "TAKE", "TAM", "TBTH",
|
"STOCK", "STOOQ", "STOP", "STOR", "STQQQ", "STUCK", "STUDY", "SUS", "SUV", "SWIFT",
|
||||||
"TEAMS", "TED", "TERM", "TEXT", "TF", "TFNA", "TFSA", "THANK", "THAT", "THATS",
|
"SWING", "TA", "TAG", "TAKE", "TAM", "TBTH", "TEAMS", "TED", "TERM", "TEXT",
|
||||||
"THE", "THEIR", "THEM", "THEN", "THERE", "THESE", "THEY", "THING", "THINK", "THIS",
|
"TF", "TFNA", "TFSA", "THANK", "THAT", "THATS", "THE", "THEIR", "THEM", "THEN",
|
||||||
"TIA", "TIKR", "TIME", "TINA", "TITS", "TJR", "TL", "TL;DR", "TLDR", "TO",
|
"THERE", "THESE", "THEY", "THING", "THINK", "THIS", "TIA", "TIKR", "TIME", "TINA",
|
||||||
"TODAY", "TOLD", "TOO", "TOS", "TOT", "TOTAL", "TP", "TRADE", "TREND", "TRUE",
|
"TITS", "TJR", "TL", "TL;DR", "TLDR", "TO", "TODAY", "TOLD", "TOO", "TOS",
|
||||||
"TRUMP", "TRUST", "TRY", "TSA", "TSP", "TSX", "TSXV", "TTM", "TTYL", "TWO",
|
"TOT", "TOTAL", "TP", "TRADE", "TREND", "TRUE", "TRUMP", "TRUST", "TRY", "TSA",
|
||||||
"UAW", "UCITS", "UGH", "UI", "UK", "UNDER", "UNTIL", "UP", "US", "USA",
|
"TSP", "TSX", "TSXV", "TTM", "TTYL", "TWO", "UAW", "UCITS", "UGH", "UI",
|
||||||
"USD", "USSA", "USSR", "UTC", "VALID", "VALUE", "VAMOS", "VERY", "VFMXX", "VFV",
|
"UK", "UNDER", "UNTIL", "UP", "US", "USA", "USD", "USSA", "USSR", "UTC",
|
||||||
"VI", "VIX", "VLI", "VOO", "VP", "VR", "VRVP", "VSUS", "VTI", "VUAG",
|
"VALID", "VALUE", "VAMOS", "VERY", "VFMXX", "VFV", "VI", "VIX", "VLI", "VOO",
|
||||||
"VW", "VWAP", "VWCE", "VXN", "VXUX", "WAGMI", "WAIT", "WALL", "WANT", "WATCH",
|
"VP", "VR", "VRVP", "VSUS", "VTI", "VUAG", "VW", "VWAP", "VWCE", "VXN",
|
||||||
"WAY", "WE", "WEB3", "WEEK", "WENT", "WEST", "WHALE", "WHAT", "WHEN", "WHERE",
|
"VXUX", "WAGMI", "WAIT", "WALL", "WANT", "WATCH", "WAY", "WE", "WEB3", "WEEK",
|
||||||
"WHICH", "WHO", "WHOS", "WHY", "WIDE", "WILL", "WIRE", "WIRED", "WITH", "WL",
|
"WENT", "WEST", "WHALE", "WHAT", "WHEN", "WHERE", "WHICH", "WHO", "WHOS", "WHY",
|
||||||
"WON", "WOOPS", "WORDS", "WORTH", "WOULD", "WP", "WRONG", "WSB", "WSJ", "WTF",
|
"WIDE", "WILL", "WIRE", "WIRED", "WITH", "WL", "WON", "WOOPS", "WORDS", "WORTH",
|
||||||
"WV", "WWII", "WWIII", "X", "XCUSE", "XD", "XEQT", "XMR", "XO", "XRP",
|
"WOULD", "WP", "WRONG", "WSB", "WSJ", "WTF", "WV", "WWII", "WWIII", "X",
|
||||||
"XX", "YEAH", "YEET", "YES", "YET", "YIELD", "YM", "YMMV", "YOLO", "YOU",
|
"XCUSE", "XD", "XEQT", "XMR", "XO", "XRP", "XX", "YEAH", "YEET", "YES",
|
||||||
"YOUR", "YOY", "YT", "YTD", "YUGE", "ZAR", "ZEN", "ZERO", "ZEVDXY"
|
"YET", "YIELD", "YM", "YMMV", "YOLO", "YOU", "YOUR", "YOY", "YT", "YTD",
|
||||||
|
"YUGE", "ZAR", "ZEN", "ZERO", "ZEV"
|
||||||
}
|
}
|
||||||
|
|
||||||
def format_and_print_list(word_set, words_per_line=10):
|
def format_and_print_list(word_set, words_per_line=10):
|
||||||
|
@@ -22,81 +22,82 @@ COMMON_WORDS_BLACKLIST = {
|
|||||||
"CNY", "COCK", "COGS", "COIL", "COKE", "COME", "COST", "COULD", "COVID", "CPAP",
|
"CNY", "COCK", "COGS", "COIL", "COKE", "COME", "COST", "COULD", "COVID", "CPAP",
|
||||||
"CPI", "CRA", "CRE", "CRO", "CRV", "CSE", "CSS", "CST", "CTB", "CTEP",
|
"CPI", "CRA", "CRE", "CRO", "CRV", "CSE", "CSS", "CST", "CTB", "CTEP",
|
||||||
"CTO", "CUCKS", "CULT", "CUV", "CYCLE", "CZK", "DA", "DAILY", "DAO", "DATE",
|
"CTO", "CUCKS", "CULT", "CUV", "CYCLE", "CZK", "DA", "DAILY", "DAO", "DATE",
|
||||||
"DAX", "DAY", "DAYS", "DCA", "DCF", "DD", "DEBT", "DEEZ", "DEMO", "DEX",
|
"DAX", "DAY", "DAYS", "DCA", "DCF", "DD", "DEBT", "DEEZ", "DEMO", "DET",
|
||||||
"DIA", "DID", "DIDNT", "DIP", "DITM", "DIV", "DIY", "DJIA", "DKK", "DL",
|
"DEX", "DIA", "DID", "DIDNT", "DIP", "DITM", "DIV", "DIY", "DJIA", "DKK",
|
||||||
"DM", "DMV", "DNI", "DO", "DOE", "DOES", "DOGE", "DOJ", "DOM", "DONT",
|
"DL", "DM", "DMV", "DNI", "DO", "DOE", "DOES", "DOGE", "DOJ", "DOM",
|
||||||
"DOOR", "DOWN", "DPI", "DR", "DUDE", "DUMP", "DUTY", "DYI", "DYNK", "DYODD",
|
"DONT", "DOOR", "DOWN", "DPI", "DR", "DUDE", "DUMP", "DUTY", "DXYXBT", "DYI",
|
||||||
"DYOR", "EACH", "EARLY", "EARN", "EAST", "EASY", "ECB", "EDGAR", "EDIT", "EDT",
|
"DYNK", "DYODD", "DYOR", "EACH", "EARLY", "EARN", "EAST", "EASY", "ECB", "EDGAR",
|
||||||
"EJ", "EMA", "EMJ", "END", "ENRON", "ENSI", "ENV", "EO", "EOD", "EOW",
|
"EDIT", "EDT", "EJ", "EMA", "EMJ", "END", "ENRON", "ENSI", "ENV", "EO",
|
||||||
"EOY", "EPA", "EPK", "EPS", "ER", "ESG", "ESPP", "EST", "ETA", "ETF",
|
"EOD", "EOW", "EOY", "EPA", "EPK", "EPS", "ER", "ESG", "ESPP", "EST",
|
||||||
"ETFS", "ETH", "EU", "EUR", "EV", "EVEN", "EVERY", "EVTOL", "EXTRA", "EYES",
|
"ETA", "ETF", "ETFS", "ETH", "EU", "EUR", "EV", "EVEN", "EVERY", "EVTOL",
|
||||||
"EZ", "FAANG", "FAFO", "FAQ", "FAR", "FAST", "FBI", "FCFF", "FD", "FDA",
|
"EXTRA", "EYES", "EZ", "FAANG", "FAFO", "FAQ", "FAR", "FAST", "FBI", "FCFF",
|
||||||
"FEE", "FFH", "FFS", "FGMA", "FIG", "FIGMA", "FIHTX", "FING", "FINRA", "FINT",
|
"FD", "FDA", "FEE", "FFH", "FFS", "FGMA", "FIG", "FIGMA", "FIHTX", "FING",
|
||||||
"FINTX", "FINTY", "FIRST", "FKIN", "FLT", "FLY", "FML", "FOLO", "FOMC", "FOMO",
|
"FINRA", "FINT", "FINTX", "FINTY", "FIRST", "FKIN", "FLT", "FLY", "FML", "FOLO",
|
||||||
"FOR", "FOREX", "FRAUD", "FRG", "FROM", "FSBO", "FSD", "FSELK", "FSPSX", "FTD",
|
"FOMC", "FOMO", "FOR", "FOREX", "FRAUD", "FRG", "FROM", "FRP", "FSBO", "FSD",
|
||||||
"FTSE", "FUCK", "FUCKS", "FUD", "FULL", "FUND", "FUNNY", "FVG", "FWIW", "FX",
|
"FSELK", "FSPSX", "FTD", "FTSE", "FUCK", "FUCKS", "FUD", "FULL", "FUND", "FUNNY",
|
||||||
"FXAIX", "FXIAX", "FXROX", "FY", "FYI", "FZROX", "GAAP", "GAIN", "GAVE", "GBP",
|
"FVG", "FWIW", "FX", "FXAIX", "FXIAX", "FXROX", "FY", "FYI", "FZROX", "GAAP",
|
||||||
"GC", "GDP", "GET", "GG", "GJ", "GL", "GLHF", "GMAT", "GMI", "GMT",
|
"GAIN", "GAVE", "GBP", "GC", "GDP", "GET", "GG", "GJ", "GL", "GLHF",
|
||||||
"GO", "GOAL", "GOAT", "GOD", "GOING", "GOLD", "GONE", "GONNA", "GPT", "GPU",
|
"GMAT", "GMI", "GMT", "GO", "GOAL", "GOAT", "GOD", "GOING", "GOLD", "GONE",
|
||||||
"GRAB", "GREAT", "GREEN", "GST", "GTA", "GTFO", "GTG", "GUH", "GUY", "GUYS",
|
"GONNA", "GPT", "GPU", "GRAB", "GREAT", "GREEN", "GST", "GTA", "GTFO", "GTG",
|
||||||
"HAD", "HAHA", "HALF", "HANDS", "HAS", "HATE", "HAVE", "HBAR", "HCOL", "HEAR",
|
"GUH", "GUY", "GUYS", "HAD", "HAHA", "HALF", "HANDS", "HAS", "HATE", "HAVE",
|
||||||
"HEDGE", "HEGE", "HELD", "HELP", "HEY", "HFCS", "HFT", "HGTV", "HIGH", "HIGHS",
|
"HBAR", "HCOL", "HEAR", "HEDGE", "HEGE", "HELD", "HELP", "HEY", "HFCS", "HFT",
|
||||||
"HINT", "HIS", "HITID", "HKD", "HODL", "HODOR", "HOF", "HOLD", "HOLY", "HOME",
|
"HGTV", "HIGH", "HIGHS", "HINT", "HIS", "HITID", "HKD", "HODL", "HODOR", "HOF",
|
||||||
"HOUR", "HOW", "HS", "HSA", "HT", "HTF", "HTML", "HUF", "HUGE", "HYPE",
|
"HOLD", "HOLY", "HOME", "HOUR", "HOW", "HS", "HSA", "HT", "HTF", "HTML",
|
||||||
"IANAL", "IB", "IBS", "ICT", "ID", "IDF", "IDK", "IF", "II", "IKKE",
|
"HUF", "HUGE", "HYPE", "IANAL", "IB", "IBS", "ICT", "ID", "IDF", "IDK",
|
||||||
"IKZ", "IM", "IMHO", "IMI", "IMO", "IN", "INR", "INTO", "IP", "IPO",
|
"IF", "II", "IKKE", "IKZ", "IM", "IMHO", "IMI", "IMO", "IN", "INR",
|
||||||
"IRA", "IRAS", "IRC", "IRISH", "IRS", "IS", "ISA", "ISIN", "ISM", "ISN",
|
"INTO", "IP", "IPO", "IRA", "IRAS", "IRC", "IRISH", "IRS", "IS", "ISA",
|
||||||
"IST", "IT", "ITC", "ITM", "ITS", "ITWN", "IUIT", "IV", "IVV", "IWM",
|
"ISIN", "ISM", "ISN", "IST", "IT", "ITC", "ITM", "ITS", "ITWN", "IUIT",
|
||||||
"IXL", "JAVA", "JD", "JFC", "JK", "JLR", "JMO", "JOIN", "JOKE", "JP",
|
"IV", "IVV", "IWM", "IXL", "JAVA", "JD", "JFC", "JK", "JLR", "JMO",
|
||||||
"JPOW", "JPY", "JS", "JST", "JUN", "JUST", "KARMA", "KEEP", "KILL", "KING",
|
"JOIN", "JOKE", "JP", "JPOW", "JPY", "JS", "JST", "JUN", "JUST", "KARMA",
|
||||||
"KNEW", "KNOW", "KO", "KOHLS", "KPMG", "KRW", "LANGT", "LARGE", "LAST", "LATE",
|
"KEEP", "KILL", "KING", "KNEW", "KNOW", "KO", "KOHLS", "KPMG", "KRW", "LANGT",
|
||||||
"LATER", "LBO", "LCS", "LDL", "LEADS", "LEAP", "LEAPS", "LEARN", "LEI", "LET",
|
"LARGE", "LAST", "LATE", "LATER", "LBO", "LCS", "LDL", "LEADS", "LEAP", "LEAPS",
|
||||||
"LETS", "LFG", "LFP", "LIFE", "LIG", "LIGMA", "LIKE", "LIMIT", "LIST", "LLC",
|
"LEARN", "LEI", "LET", "LETS", "LFG", "LFP", "LIFE", "LIG", "LIGMA", "LIKE",
|
||||||
"LLM", "LMAO", "LMM", "LMN", "LOKO", "LOL", "LOLOL", "LONG", "LOOK", "LOSE",
|
"LIMIT", "LIST", "LLC", "LLM", "LMAO", "LMM", "LMN", "LOKO", "LOL", "LOLOL",
|
||||||
"LOSS", "LOST", "LOVE", "LOW", "LOWER", "LOWS", "LP", "LTCG", "LUPD", "LYING",
|
"LONG", "LOOK", "LOSE", "LOSS", "LOST", "LOVE", "LOW", "LOWER", "LOWS", "LP",
|
||||||
"M&A", "MA", "MACD", "MAKE", "MAKES", "MANY", "MAX", "MBA", "MC", "MCAP",
|
"LTCG", "LUPD", "LYING", "M&A", "MA", "MACD", "MAKE", "MAKES", "MANGE", "MANY",
|
||||||
"MCP", "ME", "MEME", "MERGE", "MERK", "MES", "MEXC", "MF", "MFER", "MID",
|
"MAX", "MBA", "MC", "MCAP", "MCP", "ME", "MEME", "MERGE", "MERK", "MES",
|
||||||
"MIGHT", "MIN", "MIND", "ML", "MLB", "MLS", "MM", "MNQ", "MOASS", "MOM",
|
"MEXC", "MF", "MFER", "MID", "MIGHT", "MIN", "MIND", "ML", "MLB", "MLS",
|
||||||
"MONEY", "MONTH", "MONY", "MOON", "MORE", "MOU", "MSK", "MTVGA", "MUCH", "MUSIC",
|
"MM", "MNQ", "MOASS", "MOM", "MONEY", "MONTH", "MONY", "MOON", "MORE", "MOU",
|
||||||
"MUST", "MXN", "MY", "MYMD", "NASA", "NASDA", "NATO", "NAV", "NBA", "NCAN",
|
"MSK", "MTVGA", "MUCH", "MUSIC", "MUST", "MVA", "MXN", "MY", "MYMD", "NASA",
|
||||||
"NCR", "NEAR", "NEAT", "NEED", "NEVER", "NEW", "NEWS", "NEXT", "NFA", "NFC",
|
"NASDA", "NATO", "NAV", "NBA", "NCAN", "NCR", "NEAR", "NEAT", "NEED", "NEVER",
|
||||||
"NFL", "NFT", "NGMI", "NIGHT", "NIQ", "NK", "NO", "NOK", "NONE", "NOPE",
|
"NEW", "NEWS", "NEXT", "NFA", "NFC", "NFL", "NFT", "NGMI", "NIGHT", "NIQ",
|
||||||
"NORTH", "NOT", "NOVA", "NOW", "NQ", "NSA", "NTVS", "NULL", "NUT", "NUTS",
|
"NK", "NO", "NOK", "NONE", "NOPE", "NORTH", "NOT", "NOVA", "NOW", "NQ",
|
||||||
"NUTZ", "NVM", "NW", "NY", "NYSE", "NZ", "NZD", "OBBB", "OBI", "OBS",
|
"NSA", "NTVS", "NULL", "NUT", "NUTS", "NUTZ", "NVM", "NW", "NY", "NYSE",
|
||||||
"OBV", "OCF", "OCO", "ODAT", "OEM", "OF", "OFA", "OFF", "OG", "OH",
|
"NZ", "NZD", "OBBB", "OBI", "OBS", "OBV", "OCF", "OCO", "ODAT", "OEM",
|
||||||
"OK", "OKAY", "OLD", "OMFG", "OMG", "ON", "ONE", "ONLY", "OP", "OPEC",
|
"OF", "OFA", "OFF", "OG", "OH", "OK", "OKAY", "OL", "OLD", "OMFG",
|
||||||
"OPENQ", "OPEX", "OPRN", "OR", "ORB", "OS", "OSCE", "OT", "OTC", "OTM",
|
"OMG", "ON", "ONE", "ONLY", "OP", "OPEC", "OPENQ", "OPEX", "OPRN", "OR",
|
||||||
"OUCH", "OUGHT", "OUT", "OVER", "OWN", "PA", "PANIC", "PC", "PDT", "PE",
|
"ORB", "OS", "OSCE", "OT", "OTC", "OTM", "OUCH", "OUGHT", "OUT", "OVER",
|
||||||
"PEAK", "PEG", "PETA", "PEW", "PFC", "PGHL", "PIMCO", "PITA", "PLAN", "PLAYS",
|
"OWN", "PA", "PANIC", "PC", "PDT", "PE", "PEAK", "PEG", "PETA", "PEW",
|
||||||
"PLN", "PM", "PMI", "PNL", "POC", "POMO", "POP", "POS", "POSCO", "POTUS",
|
"PFC", "PGHL", "PIMCO", "PITA", "PLAN", "PLAYS", "PLN", "PM", "PMI", "PNL",
|
||||||
"POV", "POW", "PPI", "PR", "PRICE", "PROFIT", "PROXY", "PS", "PSA", "PST",
|
"POC", "POMO", "POP", "POS", "POSCO", "POTUS", "POV", "POW", "PPI", "PR",
|
||||||
"PT", "PTD", "PUSSY", "PUT", "PWC", "Q1", "Q2", "Q3", "Q4", "QE",
|
"PRICE", "PROFIT", "PROXY", "PS", "PSA", "PST", "PT", "PTD", "PUSSY", "PUT",
|
||||||
"QED", "QIMC", "QQQ", "QR", "RAM", "RATM", "RBA", "RBNZ", "RE", "REACH",
|
"PWC", "Q1", "Q2", "Q3", "Q4", "QE", "QED", "QIMC", "QQQ", "QR",
|
||||||
"READY", "REAL", "RED", "REIT", "REITS", "REKT", "RFK", "RH", "RICO", "RIDE",
|
"RAM", "RATM", "RBA", "RBNZ", "RE", "REACH", "READY", "REAL", "RED", "REIT",
|
||||||
"RIGHT", "RIP", "RISK", "RISKY", "ROCE", "ROCK", "ROE", "ROFL", "ROI", "ROIC",
|
"REITS", "REKT", "RFK", "RH", "RICO", "RIDE", "RIGHT", "RIP", "RISK", "RISKY",
|
||||||
"ROTH", "RRSP", "RSD", "RSI", "RT", "RTD", "RUB", "RUG", "RULE", "RUST",
|
"ROCE", "ROCK", "ROE", "ROFL", "ROI", "ROIC", "ROTH", "RRSP", "RSD", "RSI",
|
||||||
"RVOL", "SAGA", "SALES", "SAME", "SAVE", "SAYS", "SBF", "SBLOC", "SC", "SCALP",
|
"RT", "RTD", "RUB", "RUG", "RULE", "RUST", "RVOL", "SAGA", "SALES", "SAME",
|
||||||
"SCAM", "SCHB", "SCIF", "SEC", "SEE", "SEK", "SELL", "SELLL", "SEP", "SESG",
|
"SAVE", "SAYS", "SBF", "SBLOC", "SC", "SCALP", "SCAM", "SCHB", "SCIF", "SEC",
|
||||||
"SET", "SGD", "SHALL", "SHARE", "SHELL", "SHIT", "SHORT", "SHOW", "SHTF", "SI",
|
"SEE", "SEK", "SELL", "SELLL", "SEP", "SESG", "SET", "SGD", "SHALL", "SHARE",
|
||||||
"SIGN", "SL", "SLIM", "SLOW", "SMA", "SMALL", "SO", "SOLIS", "SOME", "SOON",
|
"SHELL", "SHIT", "SHORT", "SHOW", "SHTF", "SI", "SIGN", "SL", "SLIM", "SLOW",
|
||||||
"SOUTH", "SP", "SPAC", "SPDR", "SPEND", "SPLG", "SPX", "SPY", "SS", "START",
|
"SMA", "SMALL", "SO", "SOLIS", "SOME", "SOON", "SOUTH", "SP", "SPAC", "SPDR",
|
||||||
"STAY", "STEEL", "STFU", "STILL", "STOCK", "STOOQ", "STOP", "STOR", "STQQQ", "STUCK",
|
"SPEND", "SPLG", "SPX", "SPY", "SS", "START", "STAY", "STEEL", "STFU", "STILL",
|
||||||
"STUDY", "SUS", "SUV", "SWIFT", "SWING", "TA", "TAG", "TAKE", "TAM", "TBTH",
|
"STOCK", "STOOQ", "STOP", "STOR", "STQQQ", "STUCK", "STUDY", "SUS", "SUV", "SWIFT",
|
||||||
"TEAMS", "TED", "TERM", "TEXT", "TF", "TFNA", "TFSA", "THANK", "THAT", "THATS",
|
"SWING", "TA", "TAG", "TAKE", "TAM", "TBTH", "TEAMS", "TED", "TERM", "TEXT",
|
||||||
"THE", "THEIR", "THEM", "THEN", "THERE", "THESE", "THEY", "THING", "THINK", "THIS",
|
"TF", "TFNA", "TFSA", "THANK", "THAT", "THATS", "THE", "THEIR", "THEM", "THEN",
|
||||||
"TIA", "TIKR", "TIME", "TINA", "TITS", "TJR", "TL", "TL;DR", "TLDR", "TO",
|
"THERE", "THESE", "THEY", "THING", "THINK", "THIS", "TIA", "TIKR", "TIME", "TINA",
|
||||||
"TODAY", "TOLD", "TOO", "TOS", "TOT", "TOTAL", "TP", "TRADE", "TREND", "TRUE",
|
"TITS", "TJR", "TL", "TL;DR", "TLDR", "TO", "TODAY", "TOLD", "TOO", "TOS",
|
||||||
"TRUMP", "TRUST", "TRY", "TSA", "TSP", "TSX", "TSXV", "TTM", "TTYL", "TWO",
|
"TOT", "TOTAL", "TP", "TRADE", "TREND", "TRUE", "TRUMP", "TRUST", "TRY", "TSA",
|
||||||
"UAW", "UCITS", "UGH", "UI", "UK", "UNDER", "UNTIL", "UP", "US", "USA",
|
"TSP", "TSX", "TSXV", "TTM", "TTYL", "TWO", "UAW", "UCITS", "UGH", "UI",
|
||||||
"USD", "USSA", "USSR", "UTC", "VALID", "VALUE", "VAMOS", "VERY", "VFMXX", "VFV",
|
"UK", "UNDER", "UNTIL", "UP", "US", "USA", "USD", "USSA", "USSR", "UTC",
|
||||||
"VI", "VIX", "VLI", "VOO", "VP", "VR", "VRVP", "VSUS", "VTI", "VUAG",
|
"VALID", "VALUE", "VAMOS", "VERY", "VFMXX", "VFV", "VI", "VIX", "VLI", "VOO",
|
||||||
"VW", "VWAP", "VWCE", "VXN", "VXUX", "WAGMI", "WAIT", "WALL", "WANT", "WATCH",
|
"VP", "VR", "VRVP", "VSUS", "VTI", "VUAG", "VW", "VWAP", "VWCE", "VXN",
|
||||||
"WAY", "WE", "WEB3", "WEEK", "WENT", "WEST", "WHALE", "WHAT", "WHEN", "WHERE",
|
"VXUX", "WAGMI", "WAIT", "WALL", "WANT", "WATCH", "WAY", "WE", "WEB3", "WEEK",
|
||||||
"WHICH", "WHO", "WHOS", "WHY", "WIDE", "WILL", "WIRE", "WIRED", "WITH", "WL",
|
"WENT", "WEST", "WHALE", "WHAT", "WHEN", "WHERE", "WHICH", "WHO", "WHOS", "WHY",
|
||||||
"WON", "WOOPS", "WORDS", "WORTH", "WOULD", "WP", "WRONG", "WSB", "WSJ", "WTF",
|
"WIDE", "WILL", "WIRE", "WIRED", "WITH", "WL", "WON", "WOOPS", "WORDS", "WORTH",
|
||||||
"WV", "WWII", "WWIII", "X", "XCUSE", "XD", "XEQT", "XMR", "XO", "XRP",
|
"WOULD", "WP", "WRONG", "WSB", "WSJ", "WTF", "WV", "WWII", "WWIII", "X",
|
||||||
"XX", "YEAH", "YEET", "YES", "YET", "YIELD", "YM", "YMMV", "YOLO", "YOU",
|
"XCUSE", "XD", "XEQT", "XMR", "XO", "XRP", "XX", "YEAH", "YEET", "YES",
|
||||||
"YOUR", "YOY", "YT", "YTD", "YUGE", "ZAR", "ZEN", "ZERO", "ZEVDXY"
|
"YET", "YIELD", "YM", "YMMV", "YOLO", "YOU", "YOUR", "YOY", "YT", "YTD",
|
||||||
|
"YUGE", "ZAR", "ZEN", "ZERO", "ZEV"
|
||||||
}
|
}
|
||||||
|
|
||||||
def extract_tickers(text):
|
def extract_tickers(text):
|
||||||
|
@@ -3,85 +3,59 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>r/{{ subreddit_name }} Mentions</title>
|
<title>r/{{ subreddit_name }} Ticker Mentions</title>
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&display=swap" rel="stylesheet">
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&display=swap" rel="stylesheet">
|
||||||
<style>
|
<style>
|
||||||
body {
|
body { margin: 0; padding: 2rem; font-family: 'Inter', sans-serif; background: #1a1a1a; display: flex; justify-content: center; align-items: center; min-height: 100vh; }
|
||||||
margin: 0;
|
.image-container { width: 750px; background: linear-gradient(145deg, #2d3748, #1a202c); color: #ffffff; border-radius: 16px; padding: 2.5rem; box-shadow: 0 10px 30px rgba(0,0,0,0.5); text-align: center; }
|
||||||
padding: 2rem;
|
header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 2rem; }
|
||||||
font-family: 'Inter', sans-serif;
|
|
||||||
background: #1a1a1a;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
min-height: 100vh;
|
|
||||||
}
|
|
||||||
.image-container {
|
|
||||||
width: 650px; /* Increased width to accommodate new column */
|
|
||||||
background: linear-gradient(145deg, #4d302d, #1f2128);
|
|
||||||
color: #ffffff;
|
|
||||||
border-radius: 16px;
|
|
||||||
padding: 2.5rem;
|
|
||||||
box-shadow: 0 10px B30px rgba(0,0,0,0.5);
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
header {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: flex-start;
|
|
||||||
margin-bottom: 2rem;
|
|
||||||
}
|
|
||||||
.title-block { text-align: left; }
|
.title-block { text-align: left; }
|
||||||
.title-block h1 { font-size: 2.5rem; font-weight: 800; margin: 0; line-height: 1; }
|
.title-block h1 { font-size: 2.5rem; font-weight: 800; margin: 0; line-height: 1; }
|
||||||
.title-block h2 { font-size: 1.25rem; font-weight: 600; margin: 0.5rem 0 0; color: #b0b0b0; }
|
.title-block h2 { font-size: 1.25rem; font-weight: 600; margin: 0.5rem 0 0; color: #a0aec0; }
|
||||||
.date { font-size: 1.1rem; font-weight: 600; color: #c0c0c0; letter-spacing: 0.02em; }
|
.date { font-size: 1.1rem; font-weight: 600; color: #a0aec0; letter-spacing: 0.02em; }
|
||||||
table { width: 100%; border-collapse: collapse; text-align: left; }
|
table { width: 100%; border-collapse: collapse; text-align: left; }
|
||||||
th, td { padding: 1rem 0.5rem; border-bottom: 1px solid rgba(255, 255, 255, 0.1); }
|
th, td { padding: 1rem 0.5rem; border-bottom: 1px solid rgba(255, 255, 255, 0.1); }
|
||||||
th { font-weight: 700; text-transform: uppercase; font-size: 0.8rem; color: #a0a0a0; }
|
th { font-weight: 700; text-transform: uppercase; font-size: 0.75rem; color: #718096; letter-spacing: 0.05em; }
|
||||||
td { font-size: 1.1rem; font-weight: 600; }
|
td { font-size: 1.1rem; font-weight: 600; }
|
||||||
tr:last-child td { border-bottom: none; }
|
tr:last-child td { border-bottom: none; }
|
||||||
td.rank { font-weight: 700; color: #d0d0d0; width: 8%; }
|
td.rank { font-weight: 700; color: #cbd5e0; width: 5%; }
|
||||||
td.ticker { width: 30%; }
|
td.ticker { width: 15%; }
|
||||||
td.mentions { text-align: center; width: 18%; }
|
td.financials { text-align: right; width: 20%; }
|
||||||
td.sentiment { text-align: center; width: 26%; } /* New width */
|
td.mentions { text-align: center; width: 15%; }
|
||||||
|
td.sentiment { text-align: center; width: 20%; }
|
||||||
/* Sentiment Colors */
|
th.mentions, th.sentiment {
|
||||||
.sentiment-bullish { color: #28a745; font-weight: 700; }
|
text-align: center;
|
||||||
.sentiment-bearish { color: #dc3545; font-weight: 700; }
|
}
|
||||||
.sentiment-neutral { color: #9e9e9e; font-weight: 600; }
|
th.financials {
|
||||||
|
text-align: right;
|
||||||
/* Row colors */
|
}
|
||||||
tr:nth-child(1) td.ticker { color: #d8b4fe; } tr:nth-child(6) td.ticker { color: #fca5a5; }
|
.sentiment-bullish { color: #48bb78; font-weight: 700; }
|
||||||
tr:nth-child(2) td.ticker { color: #a3e635; } tr:nth-child(7) td.ticker { color: #fdba74; }
|
.sentiment-bearish { color: #f56565; font-weight: 700; }
|
||||||
tr:nth-child(3) td.ticker { color: #67e8f9; } tr:nth-child(8) td.ticker { color: #6ee7b7; }
|
.sentiment-neutral { color: #a0aec0; font-weight: 600; }
|
||||||
tr:nth-child(4) td.ticker { color: #fde047; } tr:nth-child(9) td.ticker { color: #93c5fd; }
|
|
||||||
tr:nth-child(5) td.ticker { color: #fcd34d; } tr:nth-child(10) td.ticker { color: #d1d5db; }
|
|
||||||
|
|
||||||
footer { margin-top: 2.5rem; }
|
footer { margin-top: 2.5rem; }
|
||||||
.brand-name { font-size: 1.75rem; font-weight: 800; letter-spacing: -1px; }
|
.brand-name { font-size: 1.75rem; font-weight: 800; letter-spacing: -1px; }
|
||||||
.brand-subtitle { font-size: 1rem; color: #b0b0b0; }
|
.brand-subtitle { font-size: 1rem; color: #a0aec0; }
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="image-container">
|
<div class="image-container">
|
||||||
<header>
|
<header>
|
||||||
<div class="title-block">
|
<div class="title-block">
|
||||||
<h1>Reddit Mentions</h1>
|
<h1>Ticker Mentions Daily</h1>
|
||||||
<h2>r/{{ subreddit_name }}</h2>
|
<h2>r/{{ subreddit_name }}</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="date">{{ current_date }}</div>
|
<div class="date">{{ current_date }}</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th class="rank">Rank</th>
|
<th class="rank">Rank</th>
|
||||||
<th class="ticker">Ticker</th>
|
<th class="ticker">Ticker</th>
|
||||||
<th class="mentions">Posts</th>
|
<th class="mentions">Mentions</th>
|
||||||
<th class="mentions">Comments</th>
|
<th class="financials">Mkt Cap</th>
|
||||||
<!-- UPDATED: Added Sentiment column header -->
|
<th class="financials">Close Price</th>
|
||||||
<th class="sentiment">Sentiment</th>
|
<th class="sentiment">Sentiment</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
@@ -90,9 +64,15 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td class="rank">{{ loop.index }}</td>
|
<td class="rank">{{ loop.index }}</td>
|
||||||
<td class="ticker">{{ ticker.symbol }}</td>
|
<td class="ticker">{{ ticker.symbol }}</td>
|
||||||
<td class="mentions">{{ ticker.post_mentions }}</td>
|
<td class="mentions">{{ ticker.total_mentions }}</td>
|
||||||
<td class="mentions">{{ ticker.comment_mentions }}</td>
|
<td class="financials">{{ ticker.market_cap | format_mc }}</td>
|
||||||
<!-- UPDATED: Added Sentiment data cell -->
|
<td class="financials">
|
||||||
|
{% if ticker.closing_price %}
|
||||||
|
${{ "%.2f"|format(ticker.closing_price) }}
|
||||||
|
{% else %}
|
||||||
|
N/A
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
<td class="sentiment">
|
<td class="sentiment">
|
||||||
{% if ticker.bullish_mentions > ticker.bearish_mentions %}
|
{% if ticker.bullish_mentions > ticker.bearish_mentions %}
|
||||||
<span class="sentiment-bullish">Bullish</span>
|
<span class="sentiment-bullish">Bullish</span>
|
||||||
@@ -106,7 +86,6 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
<div class="brand-name">r/rstat</div>
|
<div class="brand-name">r/rstat</div>
|
||||||
<div class="brand-subtitle">visit us for more</div>
|
<div class="brand-subtitle">visit us for more</div>
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
<h1>
|
<h1>
|
||||||
Top 10 Tickers (All Subreddits)
|
Top 10 Tickers (All Subreddits)
|
||||||
<!-- ADD THIS LINK -->
|
<!-- ADD THIS LINK -->
|
||||||
<a href="/image/overall" target="_blank" style="font-size: 0.8rem; margin-left: 1rem; font-weight: normal;">(View as Image)</a>
|
<a href="/image/overall" target="_blank" style="font-size: 0.8rem; margin-left: 1rem; font-weight: normal;">image</a>
|
||||||
</h1>
|
</h1>
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
|
@@ -3,85 +3,59 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Reddit Mentions</title>
|
<title>r/{{ subreddit_name }} Ticker Mentions</title>
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&display=swap" rel="stylesheet">
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&display=swap" rel="stylesheet">
|
||||||
<style>
|
<style>
|
||||||
body {
|
body { margin: 0; padding: 2rem; font-family: 'Inter', sans-serif; background: #1a1a1a; display: flex; justify-content: center; align-items: center; min-height: 100vh; }
|
||||||
margin: 0;
|
.image-container { width: 750px; background: linear-gradient(145deg, #2d3748, #1a202c); color: #ffffff; border-radius: 16px; padding: 2.5rem; box-shadow: 0 10px 30px rgba(0,0,0,0.5); text-align: center; }
|
||||||
padding: 2rem;
|
header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 2rem; }
|
||||||
font-family: 'Inter', sans-serif;
|
|
||||||
background: #1a1a1a;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
min-height: 100vh;
|
|
||||||
}
|
|
||||||
.image-container {
|
|
||||||
width: 650px; /* Increased width to accommodate new column */
|
|
||||||
background: linear-gradient(145deg, #4d302d, #1f2128);
|
|
||||||
color: #ffffff;
|
|
||||||
border-radius: 16px;
|
|
||||||
padding: 2.5rem;
|
|
||||||
box-shadow: 0 10px B30px rgba(0,0,0,0.5);
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
header {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: flex-start;
|
|
||||||
margin-bottom: 2rem;
|
|
||||||
}
|
|
||||||
.title-block { text-align: left; }
|
.title-block { text-align: left; }
|
||||||
.title-block h1 { font-size: 2.5rem; font-weight: 800; margin: 0; line-height: 1; }
|
.title-block h1 { font-size: 2.5rem; font-weight: 800; margin: 0; line-height: 1; }
|
||||||
.title-block h2 { font-size: 1.25rem; font-weight: 600; margin: 0.5rem 0 0; color: #b0b0b0; }
|
.title-block h2 { font-size: 1.25rem; font-weight: 600; margin: 0.5rem 0 0; color: #a0aec0; }
|
||||||
.date { font-size: 1.1rem; font-weight: 600; color: #c0c0c0; letter-spacing: 0.02em; }
|
.date { font-size: 1.1rem; font-weight: 600; color: #a0aec0; letter-spacing: 0.02em; }
|
||||||
table { width: 100%; border-collapse: collapse; text-align: left; }
|
table { width: 100%; border-collapse: collapse; text-align: left; }
|
||||||
th, td { padding: 1rem 0.5rem; border-bottom: 1px solid rgba(255, 255, 255, 0.1); }
|
th, td { padding: 1rem 0.5rem; border-bottom: 1px solid rgba(255, 255, 255, 0.1); }
|
||||||
th { font-weight: 700; text-transform: uppercase; font-size: 0.8rem; color: #a0a0a0; }
|
th { font-weight: 700; text-transform: uppercase; font-size: 0.75rem; color: #718096; letter-spacing: 0.05em; }
|
||||||
td { font-size: 1.1rem; font-weight: 600; }
|
td { font-size: 1.1rem; font-weight: 600; }
|
||||||
tr:last-child td { border-bottom: none; }
|
tr:last-child td { border-bottom: none; }
|
||||||
td.rank { font-weight: 700; color: #d0d0d0; width: 8%; }
|
td.rank { font-weight: 700; color: #cbd5e0; width: 5%; }
|
||||||
td.ticker { width: 30%; }
|
td.ticker { width: 15%; }
|
||||||
td.mentions { text-align: center; width: 18%; }
|
td.financials { text-align: right; width: 20%; }
|
||||||
td.sentiment { text-align: center; width: 26%; } /* New width */
|
td.mentions { text-align: center; width: 15%; }
|
||||||
|
td.sentiment { text-align: center; width: 20%; }
|
||||||
/* Sentiment Colors */
|
th.mentions, th.sentiment {
|
||||||
.sentiment-bullish { color: #28a745; font-weight: 700; }
|
text-align: center;
|
||||||
.sentiment-bearish { color: #dc3545; font-weight: 700; }
|
}
|
||||||
.sentiment-neutral { color: #9e9e9e; font-weight: 600; }
|
th.financials {
|
||||||
|
text-align: right;
|
||||||
/* Row colors */
|
}
|
||||||
tr:nth-child(1) td.ticker { color: #d8b4fe; } tr:nth-child(6) td.ticker { color: #fca5a5; }
|
.sentiment-bullish { color: #48bb78; font-weight: 700; }
|
||||||
tr:nth-child(2) td.ticker { color: #a3e635; } tr:nth-child(7) td.ticker { color: #fdba74; }
|
.sentiment-bearish { color: #f56565; font-weight: 700; }
|
||||||
tr:nth-child(3) td.ticker { color: #67e8f9; } tr:nth-child(8) td.ticker { color: #6ee7b7; }
|
.sentiment-neutral { color: #a0aec0; font-weight: 600; }
|
||||||
tr:nth-child(4) td.ticker { color: #fde047; } tr:nth-child(9) td.ticker { color: #93c5fd; }
|
|
||||||
tr:nth-child(5) td.ticker { color: #fcd34d; } tr:nth-child(10) td.ticker { color: #d1d5db; }
|
|
||||||
|
|
||||||
footer { margin-top: 2.5rem; }
|
footer { margin-top: 2.5rem; }
|
||||||
.brand-name { font-size: 1.75rem; font-weight: 800; letter-spacing: -1px; }
|
.brand-name { font-size: 1.75rem; font-weight: 800; letter-spacing: -1px; }
|
||||||
.brand-subtitle { font-size: 1rem; color: #b0b0b0; }
|
.brand-subtitle { font-size: 1rem; color: #a0aec0; }
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="image-container">
|
<div class="image-container">
|
||||||
<header>
|
<header>
|
||||||
<div class="title-block">
|
<div class="title-block">
|
||||||
<h1>Reddit Mentions</h1>
|
<h1>Ticker Mentions Daily</h1>
|
||||||
<h2>All Subreddits - Top 10</h2>
|
<h2>All Subreddits</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="date">{{ current_date }}</div>
|
<div class="date">{{ current_date }}</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th class="rank">Rank</th>
|
<th class="rank">Rank</th>
|
||||||
<th class="ticker">Ticker</th>
|
<th class="ticker">Ticker</th>
|
||||||
<th class="mentions">Posts</th>
|
<th class="mentions">Mentions</th>
|
||||||
<th class="mentions">Comments</th>
|
<th class="financials">Mkt Cap</th>
|
||||||
<!-- UPDATED: Added Sentiment column header -->
|
<th class="financials">Close Price</th>
|
||||||
<th class="sentiment">Sentiment</th>
|
<th class="sentiment">Sentiment</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
@@ -90,9 +64,15 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td class="rank">{{ loop.index }}</td>
|
<td class="rank">{{ loop.index }}</td>
|
||||||
<td class="ticker">{{ ticker.symbol }}</td>
|
<td class="ticker">{{ ticker.symbol }}</td>
|
||||||
<td class="mentions">{{ ticker.post_mentions }}</td>
|
<td class="mentions">{{ ticker.total_mentions }}</td>
|
||||||
<td class="mentions">{{ ticker.comment_mentions }}</td>
|
<td class="financials">{{ ticker.market_cap | format_mc }}</td>
|
||||||
<!-- UPDATED: Added Sentiment data cell -->
|
<td class="financials">
|
||||||
|
{% if ticker.closing_price %}
|
||||||
|
${{ "%.2f"|format(ticker.closing_price) }}
|
||||||
|
{% else %}
|
||||||
|
N/A
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
<td class="sentiment">
|
<td class="sentiment">
|
||||||
{% if ticker.bullish_mentions > ticker.bearish_mentions %}
|
{% if ticker.bullish_mentions > ticker.bearish_mentions %}
|
||||||
<span class="sentiment-bullish">Bullish</span>
|
<span class="sentiment-bullish">Bullish</span>
|
||||||
@@ -106,7 +86,6 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
<div class="brand-name">r/rstat</div>
|
<div class="brand-name">r/rstat</div>
|
||||||
<div class="brand-subtitle">visit us for more</div>
|
<div class="brand-subtitle">visit us for more</div>
|
||||||
|
@@ -5,9 +5,8 @@
|
|||||||
{% block content %}
|
{% block content %}
|
||||||
<h1>
|
<h1>
|
||||||
Top 10 Tickers in r/{{ subreddit_name }}
|
Top 10 Tickers in r/{{ subreddit_name }}
|
||||||
<a href="/image/daily/{{ subreddit_name }}" target="_blank" style="font-size: 0.8rem; margin-left: 1rem; font-weight: normal;">(View Daily Image)</a>
|
<a href="/image/daily/{{ subreddit_name }}" target="_blank" style="font-size: 0.8rem; margin-left: 1rem; font-weight: normal;">daily image</a>
|
||||||
<!-- ADD THIS NEW LINK -->
|
<a href="/image/weekly/{{ subreddit_name }}" target="_blank" style="font-size: 0.8rem; margin-left: 1rem; font-weight: normal;">weekly image</a>
|
||||||
<a href="/image/weekly/{{ subreddit_name }}" target="_blank" style="font-size: 0.8rem; margin-left: 1rem; font-weight: normal;">(View Weekly Image)</a>
|
|
||||||
</h1>
|
</h1>
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
|
@@ -3,63 +3,59 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Weekly Sentiment: r/{{ subreddit_name }}</title>
|
<title>r/{{ subreddit_name }} Ticker Mentions</title>
|
||||||
<!-- All the <style> and <link> tags from image_view.html go here -->
|
|
||||||
<!-- You can just copy the entire <head> section from image_view.html -->
|
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&display=swap" rel="stylesheet">
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&display=swap" rel="stylesheet">
|
||||||
<style>
|
<style>
|
||||||
/* This entire style block is IDENTICAL to image_view.html */
|
|
||||||
body { margin: 0; padding: 2rem; font-family: 'Inter', sans-serif; background: #1a1a1a; display: flex; justify-content: center; align-items: center; min-height: 100vh; }
|
body { margin: 0; padding: 2rem; font-family: 'Inter', sans-serif; background: #1a1a1a; display: flex; justify-content: center; align-items: center; min-height: 100vh; }
|
||||||
.image-container { width: 650px; background: linear-gradient(145deg, #4d302d, #1f2128); color: #ffffff; border-radius: 16px; padding: 2.5rem; box-shadow: 0 10px 30px rgba(0,0,0,0.5); text-align: center; }
|
.image-container { width: 750px; background: linear-gradient(145deg, #2d3748, #1a202c); color: #ffffff; border-radius: 16px; padding: 2.5rem; box-shadow: 0 10px 30px rgba(0,0,0,0.5); text-align: center; }
|
||||||
header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 2rem; }
|
header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 2rem; }
|
||||||
.title-block { text-align: left; }
|
.title-block { text-align: left; }
|
||||||
.title-block h1 { font-size: 2.5rem; font-weight: 800; margin: 0; line-height: 1; }
|
.title-block h1 { font-size: 2.5rem; font-weight: 800; margin: 0; line-height: 1; }
|
||||||
.title-block h2 { font-size: 1.25rem; font-weight: 600; margin: 0.5rem 0 0; color: #b0b0b0; }
|
.title-block h2 { font-size: 1.25rem; font-weight: 600; margin: 0.5rem 0 0; color: #a0aec0; }
|
||||||
.date { font-size: 1rem; font-weight: 600; color: #c0c0c0; letter-spacing: 0.02em; }
|
.date { font-size: 1.1rem; font-weight: 600; color: #a0aec0; letter-spacing: 0.02em; }
|
||||||
table { width: 100%; border-collapse: collapse; text-align: left; }
|
table { width: 100%; border-collapse: collapse; text-align: left; }
|
||||||
th, td { padding: 1rem 0.5rem; border-bottom: 1px solid rgba(255, 255, 255, 0.1); }
|
th, td { padding: 1rem 0.5rem; border-bottom: 1px solid rgba(255, 255, 255, 0.1); }
|
||||||
th { font-weight: 700; text-transform: uppercase; font-size: 0.8rem; color: #a0a0a0; }
|
th { font-weight: 700; text-transform: uppercase; font-size: 0.75rem; color: #718096; letter-spacing: 0.05em; }
|
||||||
td { font-size: 1.1rem; font-weight: 600; }
|
td { font-size: 1.1rem; font-weight: 600; }
|
||||||
tr:last-child td { border-bottom: none; }
|
tr:last-child td { border-bottom: none; }
|
||||||
td.rank { font-weight: 700; color: #d0d0d0; width: 8%; }
|
td.rank { font-weight: 700; color: #cbd5e0; width: 5%; }
|
||||||
td.ticker { width: 30%; }
|
td.ticker { width: 15%; }
|
||||||
td.mentions { text-align: center; width: 18%; }
|
td.financials { text-align: right; width: 20%; }
|
||||||
td.sentiment { text-align: center; width: 26%; }
|
td.mentions { text-align: center; width: 15%; }
|
||||||
.sentiment-bullish { color: #28a745; font-weight: 700; }
|
td.sentiment { text-align: center; width: 20%; }
|
||||||
.sentiment-bearish { color: #dc3545; font-weight: 700; }
|
th.mentions, th.sentiment {
|
||||||
.sentiment-neutral { color: #9e9e9e; font-weight: 600; }
|
text-align: center;
|
||||||
tr:nth-child(1) td.ticker { color: #d8b4fe; } tr:nth-child(6) td.ticker { color: #fca5a5; }
|
}
|
||||||
tr:nth-child(2) td.ticker { color: #a3e635; } tr:nth-child(7) td.ticker { color: #fdba74; }
|
th.financials {
|
||||||
tr:nth-child(3) td.ticker { color: #67e8f9; } tr:nth-child(8) td.ticker { color: #6ee7b7; }
|
text-align: right;
|
||||||
tr:nth-child(4) td.ticker { color: #fde047; } tr:nth-child(9) td.ticker { color: #93c5fd; }
|
}
|
||||||
tr:nth-child(5) td.ticker { color: #fcd34d; } tr:nth-child(10) td.ticker { color: #d1d5db; }
|
.sentiment-bullish { color: #48bb78; font-weight: 700; }
|
||||||
|
.sentiment-bearish { color: #f56565; font-weight: 700; }
|
||||||
|
.sentiment-neutral { color: #a0aec0; font-weight: 600; }
|
||||||
footer { margin-top: 2.5rem; }
|
footer { margin-top: 2.5rem; }
|
||||||
.brand-name { font-size: 1.75rem; font-weight: 800; letter-spacing: -1px; }
|
.brand-name { font-size: 1.75rem; font-weight: 800; letter-spacing: -1px; }
|
||||||
.brand-subtitle { font-size: 1rem; color: #b0b0b0; }
|
.brand-subtitle { font-size: 1rem; color: #a0aec0; }
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="image-container">
|
<div class="image-container">
|
||||||
<header>
|
<header>
|
||||||
<div class="title-block">
|
<div class="title-block">
|
||||||
<!-- UPDATED: Title shows it's a weekly report -->
|
<h1>Ticker Mentions Weekly</h1>
|
||||||
<h1>Weekly Sentiment</h1>
|
<h2>r/{{ subreddit_name }}</h2>
|
||||||
<h2>r/{{ subreddit_name }} - Top 10</h2>
|
|
||||||
</div>
|
</div>
|
||||||
<!-- UPDATED: Date now shows the range -->
|
|
||||||
<div class="date">{{ date_range }}</div>
|
<div class="date">{{ date_range }}</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<!-- The entire table structure is IDENTICAL to image_view.html -->
|
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th class="rank">Rank</th>
|
<th class="rank">Rank</th>
|
||||||
<th class="ticker">Ticker</th>
|
<th class="ticker">Ticker</th>
|
||||||
<th class="mentions">Posts</th>
|
<th class="mentions">Mentions</th>
|
||||||
<th class="mentions">Comments</th>
|
<th class="financials">Mkt Cap</th>
|
||||||
|
<th class="financials">Close Price</th>
|
||||||
<th class="sentiment">Sentiment</th>
|
<th class="sentiment">Sentiment</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
@@ -68,8 +64,15 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td class="rank">{{ loop.index }}</td>
|
<td class="rank">{{ loop.index }}</td>
|
||||||
<td class="ticker">{{ ticker.symbol }}</td>
|
<td class="ticker">{{ ticker.symbol }}</td>
|
||||||
<td class="mentions">{{ ticker.post_mentions }}</td>
|
<td class="mentions">{{ ticker.total_mentions }}</td>
|
||||||
<td class="mentions">{{ ticker.comment_mentions }}</td>
|
<td class="financials">{{ ticker.market_cap | format_mc }}</td>
|
||||||
|
<td class="financials">
|
||||||
|
{% if ticker.closing_price %}
|
||||||
|
${{ "%.2f"|format(ticker.closing_price) }}
|
||||||
|
{% else %}
|
||||||
|
N/A
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
<td class="sentiment">
|
<td class="sentiment">
|
||||||
{% if ticker.bullish_mentions > ticker.bearish_mentions %}
|
{% if ticker.bullish_mentions > ticker.bearish_mentions %}
|
||||||
<span class="sentiment-bullish">Bullish</span>
|
<span class="sentiment-bullish">Bullish</span>
|
||||||
@@ -83,7 +86,6 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
<div class="brand-name">r/rstat</div>
|
<div class="brand-name">r/rstat</div>
|
||||||
<div class="brand-subtitle">visit us for more</div>
|
<div class="brand-subtitle">visit us for more</div>
|
||||||
|
Reference in New Issue
Block a user