mirror of
https://github.com/shawnkim1997/All-in-one-Financial-Analysis.git
synced 2026-07-27 18:47:44 +00:00
d337c63976
Architecture (3,909-line monolith → 28 focused modules, all < 300 lines):
- config/: constants.py (company lists, row maps, Damodaran baselines), theme.py (CSS/HTML)
- utils/: prefs, formatting, ticker, dcf, charts, ui_helpers
- data/: sec_parser, sec_fetcher, sec_downloader, financials, fundamentals,
valuation, ratios, scores, scores_ai, market
- ai/: gemini_core, gemini_sec, gemini_insights
- views/: sidebar, tab1_quant, tab1_ai, tab1_filings, tab2_dcf,
tab3_comps, tab4_news, tab5_markets, tab6_crypto, tab7_technical
- app.py: thin orchestrator (~118 lines)
- Strict unidirectional dependency graph (no circular imports)
- All @st.cache_data TTLs and st.session_state keys preserved identically
SEC filing viewer fix:
- Rebuilt EDGAR fetch chain: company_tickers.json → CIK → submissions API
→ filings.recent.primaryDocument[] (replaces deprecated directory.item)
- Filing type selectbox (10-K, 10-Q, 8-K, 20-F, 6-K) connected to backend
- Native HTML rendered via streamlit.components.v1.html() with CSS reset
- Errors surfaced explicitly with st.error()
- DART direct links restored for Korean-listed companies
.gitignore: data/ → data/*.json + data/*.html (preserve Python modules)
README: full rewrite for master's portfolio — 7-tab layout, architecture
diagram, modular structure tree, technical challenges, design rationale
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
44 lines
1.9 KiB
Python
44 lines
1.9 KiB
Python
import pandas as pd
|
|
import streamlit as st
|
|
try:
|
|
import yfinance as yf
|
|
except ImportError:
|
|
yf = None
|
|
|
|
|
|
def render_tab6():
|
|
st.subheader("Cryptocurrency Prices")
|
|
crypto_list = [
|
|
("Bitcoin", "BTC-USD"), ("Ethereum", "ETH-USD"), ("BNB", "BNB-USD"),
|
|
("Solana", "SOL-USD"), ("XRP", "XRP-USD"), ("Cardano", "ADA-USD"),
|
|
("Avalanche", "AVAX-USD"), ("Dogecoin", "DOGE-USD"), ("Polkadot", "DOT-USD"),
|
|
("Chainlink", "LINK-USD"), ("Polygon", "MATIC-USD"), ("Litecoin", "LTC-USD"),
|
|
]
|
|
crypto_rows = []
|
|
for name, sym in crypto_list:
|
|
try:
|
|
t = yf.Ticker(sym)
|
|
info = t.info or {}
|
|
price = info.get("regularMarketPrice") or info.get("previousClose") or 0
|
|
prev = info.get("regularMarketPreviousClose") or price
|
|
chg = ((price - prev) / prev * 100) if prev else 0
|
|
mcap = info.get("marketCap") or 0
|
|
crypto_rows.append({
|
|
"Coin": name,
|
|
"Symbol": sym.replace("-USD", ""),
|
|
"Price (USD)": f"${price:,.2f}",
|
|
"24h Change": f"{chg:+.2f}%",
|
|
"Market Cap": f"${mcap/1e9:.1f}B" if mcap >= 1e9 else (f"${mcap/1e6:.0f}M" if mcap else "N/A"),
|
|
"_change": chg,
|
|
})
|
|
except Exception:
|
|
crypto_rows.append({"Coin": name, "Symbol": sym.replace("-USD", ""), "Price (USD)": "N/A", "24h Change": "N/A", "Market Cap": "N/A", "_change": 0})
|
|
if crypto_rows:
|
|
df_crypto = pd.DataFrame(crypto_rows)
|
|
def style_crypto(row):
|
|
chg = row.get("_change", 0)
|
|
color = "#34D399" if chg >= 0 else "#F87171"
|
|
return [f"color: {color}" if col == "24h Change" else "" for col in row.index]
|
|
display_df = df_crypto.drop(columns=["_change"])
|
|
st.dataframe(display_df.style.apply(style_crypto, axis=1), use_container_width=True, hide_index=True)
|