From 4e5af9527215846684b4fe8273ccb96fb8fd4a42 Mon Sep 17 00:00:00 2001 From: Wong Ding Feng Date: Sat, 25 Apr 2026 17:56:10 +0800 Subject: [PATCH] feat: add defeatbeta-api integration with comprehensive comparison tools - Add defeatbeta-api as primary financial data source (replaces yfinance for analysis) - Add comprehensive Jupyter notebook tutorial (defeatbeta_tutorial.ipynb) - Add API comparison script (compare_apis.py) - Add data exploration script (explore_data.py) - Add basic test script (test_defeatbeta.py) - Add notebook runner script (run_notebook.sh) - Add org-mode mapping documentation (docs/defeatbeta_mapping.org) - Update pyproject.toml with defeatbeta-api dependency - Add defeatbeta-api as git submodule for reference DefeatBeta Advantages: - No rate limits (HuggingFace hosted) - Historical financial ratios (ROE, ROIC, WACC time series) - Earnings call transcripts access - Revenue segmentation by product/geography - Automated DCF valuation with Excel output - DuckDB-powered fast queries Note: .envrc, .jupyter_checkpoints/, __marimo__/, AAPL.xlsx, tearsheet.html and other generated files intentionally excluded --- .gitmodules | 3 + README_NOTEBOOK.md | 107 ++ compare_apis.py | 359 ++++ defeatbeta_tutorial.ipynb | 3448 +++++++++++++++++++++++++++++++++++ docs/defeatbeta_mapping.org | 291 +++ explore_data.py | 147 ++ pyproject.toml | 1 + references/defeatbeta-api | 1 + run_notebook.sh | 45 + test_defeatbeta.py | 203 +++ uv.lock | 653 ++++++- 11 files changed, 5235 insertions(+), 23 deletions(-) create mode 100644 .gitmodules create mode 100644 README_NOTEBOOK.md create mode 100644 compare_apis.py create mode 100644 defeatbeta_tutorial.ipynb create mode 100644 docs/defeatbeta_mapping.org create mode 100644 explore_data.py create mode 160000 references/defeatbeta-api create mode 100755 run_notebook.sh create mode 100644 test_defeatbeta.py diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..9e54b08 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "references/defeatbeta-api"] + path = references/defeatbeta-api + url = git@github.com:defeat-beta/defeatbeta-api.git diff --git a/README_NOTEBOOK.md b/README_NOTEBOOK.md new file mode 100644 index 0000000..05ba027 --- /dev/null +++ b/README_NOTEBOOK.md @@ -0,0 +1,107 @@ +# DefeatBeta-API Tutorial Notebook + +An interactive Jupyter notebook comparing **DefeatBeta-API** vs **Yahoo Finance** for financial data analysis. + +## ๐Ÿ“š What's Included + +### `defeatbeta_tutorial.ipynb` +A comprehensive 12-section interactive notebook covering: + +1. **Quick Performance Test** - Compare query speeds +2. **Price Data Comparison** - OHLCV data structures +3. **Valuation Metrics** - TTM EPS, P/E ratios, Market Cap (historical!) +4. **Financial Statements** - Income statements, balance sheets, cash flows +5. **Financial Ratios** - ROE, ROIC, WACC with full time-series +6. **Growth & Margin Metrics** - YoY growth and margin analysis +7. **Earnings Transcripts** - Unique feature! Full transcript access +8. **Revenue Breakdown** - Unique feature! By segment and geography +9. **DCF Valuation** - Unique feature! Automated Excel output +10. **Interactive Stock Analysis** - Explore any stock symbol +11. **Stock Comparison** - Compare multiple stocks side-by-side +12. **Complete Method Reference** - All available API methods + +## ๐Ÿš€ How to Use + +### Option 1: Run the notebook directly +```bash +./run_notebook.sh +``` + +### Option 2: Run with uv +```bash +uv run jupyter notebook defeatbeta_tutorial.ipynb +``` + +### Option 3: Convert to Python script +```bash +uv run jupyter nbconvert --to script defeatbeta_tutorial.ipynb +uv run python defeatbeta_tutorial.py +``` + +## ๐Ÿ“ฆ Requirements + +```bash +uv add defeatbeta-api jupyter +``` + +## ๐ŸŽฏ Key Features Demonstrated + +### DefeatBeta-API Unique Features: +- โœ… **Earnings Call Transcripts** - Access full transcripts by quarter +- โœ… **Revenue Segmentation** - Breakdown by product/segment/geography +- โœ… **Automated DCF** - Professional Excel valuation models +- โœ… **Historical Financial Ratios** - Time-series for ROE, ROIC, WACC +- โœ… **AI-Powered Analysis** - LLM analysis of transcripts +- โœ… **No Rate Limits** - Hugging Face hosted data + +### Comparison with Yahoo Finance: +- DefeatBeta: Historical analysis, financial modeling, no rate limits +- Yahoo Finance: Real-time data, analyst consensus, larger ecosystem + +## ๐Ÿ“Š Example Output + +```python +# Stock Comparison +Symbol Price P/E Market Cap ROE Rev Growth +AAPL $270.23 31.2 $4.1T 10.2% 16.7% +MSFT $420.00 35.1 $3.1T 31.1% 20.2% +GOOGL $341.68 31.6 $4.1T 8.6% 22.3% +NVDA $201.68 41.2 $4.9T 31.1% 73.2% +``` + +## ๐Ÿงช Exercises + +Try these challenges in the notebook: + +1. **Find Undervalued Stocks** - P/E < 20 but ROE > 15% +2. **Growth Analysis** - Compare NVDA vs AMD +3. **DCF Valuation** - Compare fair value estimates +4. **Revenue Mix** - Track Apple's services growth +5. **Transcript Mining** - Extract sentiment from earnings calls + +## ๐Ÿ“– Documentation + +- [DefeatBeta-API GitHub](https://github.com/defeat-beta/defeatbeta-api) +- [DuckDB Documentation](https://duckdb.org/docs) +- [Financial Analysis Examples](doc/api/Value_Examples.md) + +## โš ๏ธ Notes + +- Data is updated daily (batch on HuggingFace) +- Real-time data requires Yahoo Finance +- AI features need `OPENAI_API_KEY` set +- Some features require Windows WSL/Docker (DuckDB dependency) + +## ๐ŸŽ“ Learning Path + +1. Start with **Section 1-2** to understand data structures +2. Move to **Section 3-5** for valuation and ratios +3. Explore **Section 7-9** for unique features +4. Complete **Section 10-11** for practical analysis +5. Reference **Section 12** for complete API + +--- + +**Created:** 2026-04-25 +**Version:** 0.0.45 +**Author:** Interactive Tutorial \ No newline at end of file diff --git a/compare_apis.py b/compare_apis.py new file mode 100644 index 0000000..f279a7b --- /dev/null +++ b/compare_apis.py @@ -0,0 +1,359 @@ +#!/usr/bin/env python3 +""" +Comprehensive comparison of defeatbeta-api vs yfinance +""" + +import pandas as pd +import time +from defeatbeta_api.data.ticker import Ticker + +# Check if yfinance is available +try: + import yfinance as yf + YFINANCE_AVAILABLE = True +except ImportError: + YFINANCE_AVAILABLE = False + print("yfinance not installed - will show defeatbeta only") + print("Install with: uv add yfinance\n") + +def compare_data_structures(): + """Compare data structures returned by both APIs""" + + print("="*80) + print("DEFEATBETA-API vs YFINANCE: DATA STRUCTURE COMPARISON") + print("="*80) + + # Test with Apple (AAPL) + symbol = 'AAPL' + + print(f"\n{'='*80}") + print(f"1. BASIC PRICE DATA - {symbol}") + print("="*80) + + # DefeatBeta + print("\n[DEFEATBETA-API]") + print("-" * 40) + db_ticker = Ticker(symbol) + start = time.time() + db_price = db_ticker.price() + db_time = time.time() - start + + print(f"Method: ticker.price()") + print(f"Type: {type(db_price).__name__}") + print(f"Shape: {db_price.shape}") + print(f"Columns: {list(db_price.columns)}") + print(f"Sample data (latest 3 rows):") + print(db_price.tail(3).to_string(index=False)) + print(f"Time taken: {db_time:.3f}s") + + # Yahoo Finance + if YFINANCE_AVAILABLE: + print("\n[YFINANCE]") + print("-" * 40) + start = time.time() + yf_ticker = yf.Ticker(symbol) + yf_price = yf_ticker.history(period="max") + yf_time = time.time() - start + + print(f"Method: ticker.history(period='max')") + print(f"Type: {type(yf_price).__name__}") + print(f"Shape: {yf_price.shape}") + print(f"Columns: {list(yf_price.columns)}") + print(f"Sample data (latest 3 rows):") + print(yf_price.tail(3).to_string(index=False)) + print(f"Time taken: {yf_time:.3f}s") + +def compare_financial_data(): + """Compare financial data structures""" + + print(f"\n{'='*80}") + print("2. FINANCIAL STATEMENTS") + print("="*80) + + symbol = 'MSFT' + db_ticker = Ticker(symbol) + + print("\n[DEFEATBETA-API - Quarterly Income Statement]") + print("-" * 40) + income_stmt = db_ticker.quarterly_income_statement() + df = income_stmt.df() + + print(f"Type: {type(income_stmt).__name__}") + print(f"DataFrame shape: {df.shape}") + print(f"Columns: {list(df.columns)}") + print(f"\nBreakdown items available:") + print(df['Breakdown'].head(15).tolist()) + print(f"\nKey metrics sample:") + for metric in ['Total Revenue', 'Gross Profit', 'Net Income Common Stockholders']: + if metric in df['Breakdown'].values: + row = df[df['Breakdown'] == metric].iloc[0] + print(f" {metric}: TTM={row['TTM']}, Latest Q={row.iloc[-1]}") + + if YFINANCE_AVAILABLE: + print("\n[YFINANCE - Quarterly Financials]") + print("-" * 40) + yf_ticker = yf.Ticker(symbol) + yf_financials = yf_ticker.quarterly_financials + + print(f"Type: {type(yf_financials).__name__}") + print(f"Shape: {yf_financials.shape}") + print(f"Index (dates): {list(yf_financials.index[:3])}") + print(f"Columns (sample): {list(yf_financials.columns[:5])}") + +def compare_valuation_metrics(): + """Compare valuation metrics""" + + print(f"\n{'='*80}") + print("3. VALUATION METRICS") + print("="*80) + + symbol = 'NVDA' + db_ticker = Ticker(symbol) + + print("\n[DEFEATBETA-API - TTM EPS]") + print("-" * 40) + ttm_eps = db_ticker.ttm_eps() + print(f"Type: {type(ttm_eps).__name__}") + print(f"Shape: {ttm_eps.shape}") + print(f"Columns: {list(ttm_eps.columns)}") + print(f"\nLatest values:") + print(ttm_eps.tail(3).to_string(index=False)) + + print("\n[DEFEATBETA-API - TTM P/E]") + print("-" * 40) + ttm_pe = db_ticker.ttm_pe() + print(f"Type: {type(ttm_pe).__name__}") + print(f"Shape: {ttm_pe.shape}") + print(f"Columns: {list(ttm_pe.columns)}") + print(f"\nLatest values:") + print(ttm_pe.tail(3).to_string(index=False)) + + print("\n[DEFEATBETA-API - Market Cap]") + print("-" * 40) + market_cap = db_ticker.market_capitalization() + print(f"Type: {type(market_cap).__name__}") + print(f"Shape: {market_cap.shape}") + print(f"Columns: {list(market_cap.columns)}") + print(f"\nLatest values:") + print(market_cap.tail(3).to_string(index=False)) + +def compare_financial_ratios(): + """Compare financial ratios""" + + print(f"\n{'='*80}") + print("4. FINANCIAL RATIOS") + print("="*80) + + symbol = 'TSLA' + db_ticker = Ticker(symbol) + + print("\n[DEFEATBETA-API - ROE]") + print("-" * 40) + roe = db_ticker.roe() + print(f"Type: {type(roe).__name__}") + print(f"Shape: {roe.shape}") + print(f"Columns: {list(roe.columns)}") + print(f"\nData:") + print(roe.to_string(index=False)) + + print("\n[DEFEATBETA-API - ROIC]") + print("-" * 40) + roic = db_ticker.roic() + print(f"Type: {type(roic).__name__}") + print(f"Shape: {roic.shape}") + print(f"Columns: {list(roic.columns)}") + print(f"\nData:") + print(roic.to_string(index=False)) + + print("\n[DEFEATBETA-API - WACC]") + print("-" * 40) + wacc = db_ticker.wacc() + print(f"Type: {type(wacc).__name__}") + print(f"Shape: {wacc.shape}") + print(f"Columns: {list(wacc.columns)}") + print(f"\nLatest values:") + print(wacc.tail(3).to_string(index=False)) + +def compare_special_features(): + """Compare special features""" + + print(f"\n{'='*80}") + print("5. SPECIAL FEATURES - EARNINGS TRANSCRIPTS") + print("="*80) + + symbol = 'AAPL' + db_ticker = Ticker(symbol) + + print("\n[DEFEATBETA-API - Earnings Call Transcripts]") + print("-" * 40) + transcripts = db_ticker.earning_call_transcripts() + transcript_list = transcripts.get_transcripts_list() + + print(f"Transcripts object type: {type(transcripts).__name__}") + print(f"get_transcripts_list() type: {type(transcript_list).__name__}") + print(f"Shape: {transcript_list.shape}") + print(f"Columns: {list(transcript_list.columns)}") + print(f"\nMost recent transcript:") + recent = transcript_list.iloc[-1] + print(f" FY {recent['fiscal_year']} Q{recent['fiscal_quarter']} ({recent['report_date']})") + print(f" Transcript ID: {recent['transcripts_id']}") + print(f" Paragraphs in transcript: {len(recent['transcripts'])}") + + # Get specific transcript + print("\n Sample from Q4 2025 transcript:") + q4_2025 = transcripts.get_transcript(2025, 4) + if q4_2025 is not None and len(q4_2025) > 0: + print(f" Type: {type(q4_2025).__name__}") + print(f" Shape: {q4_2025.shape}") + print(f" Columns: {list(q4_2025.columns)}") + print(f" First 2 paragraphs:") + for _, row in q4_2025.head(2).iterrows(): + speaker = row['speaker'] + content = row['content'][:100] + "..." if len(row['content']) > 100 else row['content'] + print(f" {speaker}: {content}") + + print("\n[DEFEATBETA-API - Revenue by Segment]") + print("-" * 40) + revenue_seg = db_ticker.revenue_by_segment() + print(f"Type: {type(revenue_seg).__name__}") + print(f"Shape: {revenue_seg.shape}") + print(f"Columns: {list(revenue_seg.columns)}") + print(f"\nLatest data:") + print(revenue_seg.tail(3).to_string(index=False)) + + print("\n[DEFEATBETA-API - Revenue by Geography]") + print("-" * 40) + revenue_geo = db_ticker.revenue_by_geography() + print(f"Type: {type(revenue_geo).__name__}") + if hasattr(revenue_geo, 'shape'): + print(f"Shape: {revenue_geo.shape}") + print(f"Columns: {list(revenue_geo.columns)}") + print(f"\nLatest data:") + print(revenue_geo.tail(3).to_string(index=False)) + else: + print(f"Data: {revenue_geo}") + +def show_all_available_methods(): + """Show all available methods in Ticker class""" + + print(f"\n{'='*80}") + print("6. COMPLETE API METHOD REFERENCE") + print("="*80) + + db_ticker = Ticker('AAPL') + + print("\n[DEFEATBETA-API - All Ticker Methods]") + print("-" * 40) + + all_methods = [m for m in dir(db_ticker) if not m.startswith('_')] + + categories = { + 'Price & Volume': ['price'], + 'Valuation': ['ttm_eps', 'ttm_pe', 'market_capitalization', 'ps_ratio', 'pb_ratio', 'peg_ratio'], + 'Financial Ratios': ['roe', 'roic', 'roa', 'wacc', 'beta', 'equity_multiplier', 'asset_turnover'], + 'Income Statement': ['quarterly_income_statement', 'annual_income_statement'], + 'Balance Sheet': ['quarterly_balance_sheet', 'annual_balance_sheet'], + 'Cash Flow': ['quarterly_cash_flow', 'annual_cash_flow'], + 'Growth Metrics': [m for m in all_methods if 'yoy_growth' in m.lower()], + 'Margin Metrics': [m for m in all_methods if 'margin' in m.lower()], + 'Special Data': ['earning_call_transcripts', 'news', 'sec_filing', 'dividends', 'splits'], + 'Revenue Breakdown': ['revenue_by_segment', 'revenue_by_product', 'revenue_by_geography'], + 'Industry Metrics': [m for m in all_methods if 'industry' in m.lower()], + 'Info & Calendar': ['info', 'calendar', 'currency', 'shares', 'officers'] + } + + for category, methods in categories.items(): + matching = [m for m in methods if m in all_methods] + if matching: + print(f"\n {category}:") + for method in sorted(matching): + print(f" โ€ข ticker.{method}()") + +def compare_data_reliability(): + """Compare data reliability and availability""" + + print(f"\n{'='*80}") + print("7. DATA RELIABILITY COMPARISON") + print("="*80) + + print("\n[DEFEATBETA-API Advantages]") + print("-" * 40) + print("โœ“ Data hosted on Hugging Face - no rate limits") + print("โœ“ DuckDB engine for fast queries") + print("โœ“ Sub-second query performance") + print("โœ“ Consistent data format across all endpoints") + print("โœ“ Historical data from 1990s for most stocks") + print("โœ“ SEC filings, earnings transcripts available") + print("โœ“ Revenue segmentation (by product/geography)") + print("โœ“ Automated DCF valuation with Excel output") + print("โœ“ LLM-powered analysis capabilities") + + print("\n[YFINANCE Advantages]") + print("-" * 40) + print("โœ“ Real-time data (delayed by 15min)") + print("โœ“ Larger ecosystem and community support") + print("โœ“ More extensive options/derivatives data") + print("โœ“ Institutional ownership data") + print("โœ“ Analyst recommendations and price targets") + print("โœ“ Splits and dividends detailed history") + +def demonstrate_unique_features(): + """Demonstrate features unique to defeatbeta-api""" + + print(f"\n{'='*80}") + print("8. UNIQUE DEFEATBETA-API FEATURES") + print("="*80) + + print("\n[DCF Valuation]") + print("-" * 40) + db_ticker = Ticker('AAPL') + try: + dcf_result = db_ticker.dcf() + print(f"DCF method returns: {type(dcf_result).__name__}") + if isinstance(dcf_result, dict): + print(f"Keys: {list(dcf_result.keys())}") + print("(Note: DCF generates professional Excel output with WACC, cash flow projections, fair price)") + except Exception as e: + print(f"DCF error: {type(e).__name__}") + + print("\n[AI-Powered Analysis on Earnings Transcripts]") + print("-" * 40) + transcripts = db_ticker.earning_call_transcripts() + ai_methods = [m for m in dir(transcripts) if 'ai' in m.lower() or 'analyze' in m.lower()] + print(f"Available AI methods:") + for method in ai_methods: + print(f" โ€ข transcripts.{method}()") + +def main(): + """Main function""" + print("DEFEATBETA-API vs YFINANCE - COMPREHENSIVE COMPARISON") + print("="*80) + + compare_data_structures() + compare_financial_data() + compare_valuation_metrics() + compare_financial_ratios() + compare_special_features() + show_all_available_methods() + compare_data_reliability() + demonstrate_unique_features() + + print(f"\n{'='*80}") + print("SUMMARY") + print("="*80) + print(""" +DEFEATBETA-API: + โ€ข Best for: Historical analysis, financial modeling, backtesting + โ€ข Strengths: No rate limits, comprehensive fundamentals, fast queries + โ€ข Data: Time-series heavy, quarterly/annual financial statements + โ€ข Unique: Revenue segmentation, WACC calculations, DCF automation + +YFINANCE: + โ€ข Best for: Real-time data, market scanning, quick lookups + โ€ข Strengths: Real-time prices, analyst data, institutional ownership + โ€ข Data: Mixed frequency, real-time + historical + โ€ข Unique: Analyst recommendations, options data, recommendations + """) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/defeatbeta_tutorial.ipynb b/defeatbeta_tutorial.ipynb new file mode 100644 index 0000000..0415d39 --- /dev/null +++ b/defeatbeta_tutorial.ipynb @@ -0,0 +1,3448 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# ๐Ÿ“ˆ DefeatBeta-API vs Yahoo Finance: Interactive Comparison\n", + "\n", + "Welcome to this interactive notebook where we'll explore the **DefeatBeta-API** - an open-source alternative to Yahoo Finance's market data APIs with higher reliability.\n", + "\n", + "## ๐ŸŽฏ What You'll Learn\n", + "\n", + "- How to use DefeatBeta-API for financial data analysis\n", + "- Compare data structures and methods with Yahoo Finance\n", + "- Explore unique features like earnings transcripts and DCF valuation\n", + "- Test practical trading analysis scenarios\n", + "\n", + "## ๐Ÿ“ฆ Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[nltk_data] Error loading punkt_tab: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[38;5;10m______ __ _ ______ _ \n", + "| _ \\ / _| | | | ___ \\ | | \n", + "| | | |___| |_ ___ __ _| |_ | |_/ / ___| |_ __ _ \n", + "| | | / _ \\ _/ _ \\/ _` | __| | ___ \\/ _ \\ __/ _` |\n", + "| |/ / __/ || __/ (_| | |_ | |_/ / __/ || (_| |\n", + "|___/ \\___|_| \\___|\\__,_|\\__| \\____/ \\___|\\__\\__,_|\u001b[0m\n", + "\u001b[1;38;5;10m๐Ÿ“ˆ:: Data Update Time ::\u001b[0m\t2026-04-17 \u001b[1;38;5;10m::\u001b[0m\n", + "\u001b[1;38;5;10m๐Ÿ“ˆ:: Software Version ::\u001b[0m\t0.0.45 \u001b[1;38;5;10m::\u001b[0m\n", + "โœ… yfinance is installed\n", + "โœ… DefeatBeta-API imported successfully\n", + "Python version: 3.12.12\n" + ] + } + ], + "source": [ + "# Import required libraries\n", + "import pandas as pd\n", + "import numpy as np\n", + "import time\n", + "import sys\n", + "\n", + "# DefeatBeta-API\n", + "from defeatbeta_api.data.ticker import Ticker\n", + "\n", + "# Yahoo Finance (for comparison)\n", + "try:\n", + " import yfinance as yf\n", + " YFINANCE_AVAILABLE = True\n", + " print(\"โœ… yfinance is installed\")\n", + "except ImportError:\n", + " YFINANCE_AVAILABLE = False\n", + " print(\"โš ๏ธ yfinance not installed - install with: uv add yfinance\")\n", + "\n", + "print(\"โœ… DefeatBeta-API imported successfully\")\n", + "print(f\"Python version: {sys.version.split()[0]}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## ๐Ÿƒโ€โ™€๏ธ 1. QUICK PERFORMANCE TEST" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "============================================================\n", + "PERFORMANCE COMPARISON: Fetching Price Data\n", + "============================================================\n", + "2026-04-25 17:43:11 INFO DuckDBClient MainThread - Cache is up-to-date. Update time: 2026-04-17\n", + "\n", + "โœ… DefeatBeta: 0.617s\n", + " Data shape: (7897, 7)\n", + "\n", + "โœ… Yahoo Finance: 0.493s\n", + " Data shape: (11433, 7)\n" + ] + } + ], + "source": [ + "# Test query speed for both APIs\n", + "symbol = 'AAPL'\n", + "\n", + "print(\"=\" * 60)\n", + "print(\"PERFORMANCE COMPARISON: Fetching Price Data\")\n", + "print(\"=\" * 60)\n", + "\n", + "# DefeatBeta\n", + "start = time.time()\n", + "db_ticker = Ticker(symbol)\n", + "db_price = db_ticker.price()\n", + "db_time = time.time() - start\n", + "print(f\"\\nโœ… DefeatBeta: {db_time:.3f}s\")\n", + "print(f\" Data shape: {db_price.shape}\")\n", + "\n", + "# Yahoo Finance\n", + "if YFINANCE_AVAILABLE:\n", + " start = time.time()\n", + " yf_ticker = yf.Ticker(symbol)\n", + " yf_price = yf_ticker.history(period='max')\n", + " yf_time = time.time() - start\n", + " print(f\"\\nโœ… Yahoo Finance: {yf_time:.3f}s\")\n", + " print(f\" Data shape: {yf_price.shape}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## ๐Ÿ“Š 2. PRICE DATA COMPARISON" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "============================================================\n", + "PRICE DATA STRUCTURE COMPARISON\n", + "============================================================\n", + "\n", + "๐Ÿ“Œ DEFEATBETA API:\n", + " Type: DataFrame\n", + " Columns: ['symbol', 'report_date', 'open', 'close', 'high', 'low', 'volume']\n", + "\n", + " Latest 3 rows:\n" + ] + }, + { + "data": { + "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", + " \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", + "
symbolreport_dateopenclosehighlowvolume
7887AAPL2026-04-06256.51258.86262.16256.4629329900
7888AAPL2026-04-07256.16253.50256.20245.7062148000
7889AAPL2026-04-08258.45258.90259.75256.5341032800
7890AAPL2026-04-09259.00260.49261.12256.0728121600
7891AAPL2026-04-10259.98260.48262.19259.0231291500
7892AAPL2026-04-13259.73259.20260.18256.6636234700
7893AAPL2026-04-14259.25258.83261.93257.1948370700
7894AAPL2026-04-15258.16266.43266.56257.8149913500
7895AAPL2026-04-16266.80263.40267.16261.2743323100
7896AAPL2026-04-17266.96270.23272.30266.7261314800
\n", + "
" + ], + "text/plain": [ + " symbol report_date open close high low volume\n", + "7887 AAPL 2026-04-06 256.51 258.86 262.16 256.46 29329900\n", + "7888 AAPL 2026-04-07 256.16 253.50 256.20 245.70 62148000\n", + "7889 AAPL 2026-04-08 258.45 258.90 259.75 256.53 41032800\n", + "7890 AAPL 2026-04-09 259.00 260.49 261.12 256.07 28121600\n", + "7891 AAPL 2026-04-10 259.98 260.48 262.19 259.02 31291500\n", + "7892 AAPL 2026-04-13 259.73 259.20 260.18 256.66 36234700\n", + "7893 AAPL 2026-04-14 259.25 258.83 261.93 257.19 48370700\n", + "7894 AAPL 2026-04-15 258.16 266.43 266.56 257.81 49913500\n", + "7895 AAPL 2026-04-16 266.80 263.40 267.16 261.27 43323100\n", + "7896 AAPL 2026-04-17 266.96 270.23 272.30 266.72 61314800" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "๐Ÿ“Œ YAHOO FINANCE:\n", + " Type: DataFrame\n", + " Columns: ['Open', 'High', 'Low', 'Close', 'Volume', 'Dividends', 'Stock Splits']\n", + "\n", + " Latest 3 rows:\n" + ] + }, + { + "data": { + "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", + " \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", + "
OpenHighLowCloseVolumeDividendsStock Splits
Date
2026-04-13 00:00:00-04:00259.730011260.179993256.660004259.200012362347000.00.0
2026-04-14 00:00:00-04:00259.250000261.929993257.190002258.829987483707000.00.0
2026-04-15 00:00:00-04:00258.160004266.559998257.809998266.429993499135000.00.0
2026-04-16 00:00:00-04:00266.799988267.160004261.269989263.399994433231000.00.0
2026-04-17 00:00:00-04:00266.959991272.299988266.720001270.230011614362000.00.0
2026-04-20 00:00:00-04:00270.329987274.279999270.290009273.049988365902000.00.0
2026-04-21 00:00:00-04:00271.500000272.799988265.399994266.170013502098000.00.0
2026-04-22 00:00:00-04:00267.820007273.739990266.869995273.170013432492000.00.0
2026-04-23 00:00:00-04:00275.049988275.769989271.649994273.429993333996000.00.0
2026-04-24 00:00:00-04:00272.760010273.059998269.649994271.059998381245000.00.0
\n", + "
" + ], + "text/plain": [ + " Open High Low Close \\\n", + "Date \n", + "2026-04-13 00:00:00-04:00 259.730011 260.179993 256.660004 259.200012 \n", + "2026-04-14 00:00:00-04:00 259.250000 261.929993 257.190002 258.829987 \n", + "2026-04-15 00:00:00-04:00 258.160004 266.559998 257.809998 266.429993 \n", + "2026-04-16 00:00:00-04:00 266.799988 267.160004 261.269989 263.399994 \n", + "2026-04-17 00:00:00-04:00 266.959991 272.299988 266.720001 270.230011 \n", + "2026-04-20 00:00:00-04:00 270.329987 274.279999 270.290009 273.049988 \n", + "2026-04-21 00:00:00-04:00 271.500000 272.799988 265.399994 266.170013 \n", + "2026-04-22 00:00:00-04:00 267.820007 273.739990 266.869995 273.170013 \n", + "2026-04-23 00:00:00-04:00 275.049988 275.769989 271.649994 273.429993 \n", + "2026-04-24 00:00:00-04:00 272.760010 273.059998 269.649994 271.059998 \n", + "\n", + " Volume Dividends Stock Splits \n", + "Date \n", + "2026-04-13 00:00:00-04:00 36234700 0.0 0.0 \n", + "2026-04-14 00:00:00-04:00 48370700 0.0 0.0 \n", + "2026-04-15 00:00:00-04:00 49913500 0.0 0.0 \n", + "2026-04-16 00:00:00-04:00 43323100 0.0 0.0 \n", + "2026-04-17 00:00:00-04:00 61436200 0.0 0.0 \n", + "2026-04-20 00:00:00-04:00 36590200 0.0 0.0 \n", + "2026-04-21 00:00:00-04:00 50209800 0.0 0.0 \n", + "2026-04-22 00:00:00-04:00 43249200 0.0 0.0 \n", + "2026-04-23 00:00:00-04:00 33399600 0.0 0.0 \n", + "2026-04-24 00:00:00-04:00 38124500 0.0 0.0 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Compare price data structures\n", + "print(\"=\" * 60)\n", + "print(\"PRICE DATA STRUCTURE COMPARISON\")\n", + "print(\"=\" * 60)\n", + "\n", + "print(\"\\n๐Ÿ“Œ DEFEATBETA API:\")\n", + "print(f\" Type: {type(db_price).__name__}\")\n", + "print(f\" Columns: {list(db_price.columns)}\")\n", + "print(f\"\\n Latest 3 rows:\")\n", + "display(db_price.tail(10))\n", + "\n", + "if YFINANCE_AVAILABLE:\n", + " print(\"\\n๐Ÿ“Œ YAHOO FINANCE:\")\n", + " print(f\" Type: {type(yf_price).__name__}\")\n", + " print(f\" Columns: {list(yf_price.columns)}\")\n", + " print(f\"\\n Latest 3 rows:\")\n", + " display(yf_price.tail(10))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## ๐Ÿ’ฐ 3. VALUATION METRICS" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "============================================================\n", + "VALUATION METRICS (with historical data!)\n", + "============================================================\n", + "\n", + "๐Ÿ“Œ TTM EPS History:\n" + ] + }, + { + "data": { + "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", + "
symbolreport_datetailing_epsepsupdate_time
104NVDA2025-01-312.940.892026-04-18
105NVDA2025-04-303.100.762026-04-18
106NVDA2025-07-313.511.082026-04-18
107NVDA2025-10-314.041.302026-04-18
108NVDA2026-01-314.901.762026-04-18
\n", + "
" + ], + "text/plain": [ + " symbol report_date tailing_eps eps update_time\n", + "104 NVDA 2025-01-31 2.94 0.89 2026-04-18\n", + "105 NVDA 2025-04-30 3.10 0.76 2026-04-18\n", + "106 NVDA 2025-07-31 3.51 1.08 2026-04-18\n", + "107 NVDA 2025-10-31 4.04 1.30 2026-04-18\n", + "108 NVDA 2026-01-31 4.90 1.76 2026-04-18" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "๐Ÿ“Œ TTM P/E Ratio History:\n" + ] + }, + { + "data": { + "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", + "
symbolreport_dateeps_report_dateclose_pricettm_epsttm_pe
6846NVDA2026-04-132026-01-31189.314.938.63
6847NVDA2026-04-142026-01-31196.514.940.10
6848NVDA2026-04-152026-01-31198.874.940.59
6849NVDA2026-04-162026-01-31198.354.940.48
6850NVDA2026-04-172026-01-31201.684.941.16
\n", + "
" + ], + "text/plain": [ + " symbol report_date eps_report_date close_price ttm_eps ttm_pe\n", + "6846 NVDA 2026-04-13 2026-01-31 189.31 4.9 38.63\n", + "6847 NVDA 2026-04-14 2026-01-31 196.51 4.9 40.10\n", + "6848 NVDA 2026-04-15 2026-01-31 198.87 4.9 40.59\n", + "6849 NVDA 2026-04-16 2026-01-31 198.35 4.9 40.48\n", + "6850 NVDA 2026-04-17 2026-01-31 201.68 4.9 41.16" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "๐Ÿ“Œ Market Capitalization History:\n" + ] + }, + { + "data": { + "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", + "
report_dateclose_priceshares_outstandingmarket_capitalization
68462026-04-13189.312.430000e+104.600233e+12
68472026-04-14196.512.430000e+104.775193e+12
68482026-04-15198.872.430000e+104.832541e+12
68492026-04-16198.352.430000e+104.819905e+12
68502026-04-17201.682.430000e+104.900824e+12
\n", + "
" + ], + "text/plain": [ + " report_date close_price shares_outstanding market_capitalization\n", + "6846 2026-04-13 189.31 2.430000e+10 4.600233e+12\n", + "6847 2026-04-14 196.51 2.430000e+10 4.775193e+12\n", + "6848 2026-04-15 198.87 2.430000e+10 4.832541e+12\n", + "6849 2026-04-16 198.35 2.430000e+10 4.819905e+12\n", + "6850 2026-04-17 201.68 2.430000e+10 4.900824e+12" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Explore valuation metrics - DefeatBeta provides HISTORICAL data\n", + "symbol = 'NVDA' # NVIDIA for interesting metrics\n", + "db_ticker = Ticker(symbol)\n", + "\n", + "print(\"=\" * 60)\n", + "print(\"VALUATION METRICS (with historical data!)\")\n", + "print(\"=\" * 60)\n", + "\n", + "print(\"\\n๐Ÿ“Œ TTM EPS History:\")\n", + "ttm_eps = db_ticker.ttm_eps()\n", + "display(ttm_eps.tail(5))\n", + "\n", + "print(\"\\n๐Ÿ“Œ TTM P/E Ratio History:\")\n", + "ttm_pe = db_ticker.ttm_pe()\n", + "display(ttm_pe.tail(5))\n", + "\n", + "print(\"\\n๐Ÿ“Œ Market Capitalization History:\")\n", + "market_cap = db_ticker.market_capitalization()\n", + "display(market_cap[['report_date', 'close_price', 'shares_outstanding', 'market_capitalization']].tail(5))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "============================================================\n", + "YAHOO FINANCE: Current Valuation (from .info)\n", + "============================================================\n", + " trailingPE: 42.591003\n", + " forwardPE: 18.530712\n", + " marketCap: 5062002737152\n", + " trailingEps: 4.89\n", + " forwardEps: 11.23918\n" + ] + } + ], + "source": [ + "# Compare with Yahoo Finance current values\n", + "if YFINANCE_AVAILABLE:\n", + " print(\"\\n\" + \"=\" * 60)\n", + " print(\"YAHOO FINANCE: Current Valuation (from .info)\")\n", + " print(\"=\" * 60)\n", + " \n", + " yf_ticker = yf.Ticker(symbol)\n", + " info = yf_ticker.info\n", + " \n", + " valuation_keys = ['trailingPE', 'forwardPE', 'marketCap', 'trailingEps', 'forwardEps']\n", + " for key in valuation_keys:\n", + " if key in info:\n", + " print(f\" {key}: {info[key]}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## ๐Ÿ“‰ 4. FINANCIAL STATEMENTS" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "============================================================\n", + "QUARTERLY INCOME STATEMENT\n", + "============================================================\n", + "\n", + "๐Ÿ“Œ Type: Statement\n", + " Methods: .df(), .data(), .print_pretty_table()\n", + "\n", + "๐Ÿ“Œ DataFrame Shape: (47, 17)\n", + " Columns: TTM + 16 quarters\n", + "\n", + "๐Ÿ“Œ KEY METRICS (TTM values):\n", + " Total Revenue: $281.72B\n", + " Gross Profit: $193.89B\n", + " Operating Income: $128.53B\n", + " Net Income Common Stockholders: $101.83B\n", + " Diluted EPS: $10.32\n" + ] + } + ], + "source": [ + "# Explore quarterly income statement\n", + "symbol = 'MSFT'\n", + "db_ticker = Ticker(symbol)\n", + "\n", + "print(\"=\" * 60)\n", + "print(\"QUARTERLY INCOME STATEMENT\")\n", + "print(\"=\" * 60)\n", + "\n", + "# Get the Statement object\n", + "income_stmt = db_ticker.quarterly_income_statement()\n", + "print(f\"\\n๐Ÿ“Œ Type: {type(income_stmt).__name__}\")\n", + "print(f\" Methods: .df(), .data(), .print_pretty_table()\")\n", + "\n", + "# Get as DataFrame\n", + "stmt_df = income_stmt.df()\n", + "print(f\"\\n๐Ÿ“Œ DataFrame Shape: {stmt_df.shape}\")\n", + "print(f\" Columns: TTM + 16 quarters\")\n", + "\n", + "# Show key metrics\n", + "key_metrics = [\n", + " 'Total Revenue',\n", + " 'Gross Profit',\n", + " 'Operating Income',\n", + " 'Net Income Common Stockholders',\n", + " 'Diluted EPS'\n", + "]\n", + "\n", + "print(\"\\n๐Ÿ“Œ KEY METRICS (TTM values):\")\n", + "for metric in key_metrics:\n", + " if metric in stmt_df['Breakdown'].values:\n", + " row = stmt_df[stmt_df['Breakdown'] == metric].iloc[0]\n", + " value = float(row['TTM']) # Convert Decimal to float\n", + " if abs(value) >= 1e9:\n", + " print(f\" {metric}: ${value/1e9:.2f}B\")\n", + " elif abs(value) >= 1e6:\n", + " print(f\" {metric}: ${value/1e6:.2f}M\")\n", + " else:\n", + " print(f\" {metric}: ${value:.2f}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "๐Ÿ“Œ FORMATTED TABLE (first 10 line items):\n", + "------------------------------------------------------------\n" + ] + }, + { + "data": { + "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", + "
MetricTTM Value
0Total Revenue281724000000.0
1Operating Revenue281724000000.0
2Cost of Revenue87831000000.0
3Gross Profit193893000000.0
4Operating Expense65365000000.0
5Selling General and Administrative32877000000.0
6General & Administrative Expense7223000000.0
7Other G and A7223000000.0
8Selling & Marketing Expense25654000000.0
9Research & Development32488000000.0
\n", + "
" + ], + "text/plain": [ + " Metric TTM Value\n", + "0 Total Revenue 281724000000.0\n", + "1 Operating Revenue 281724000000.0\n", + "2 Cost of Revenue 87831000000.0\n", + "3 Gross Profit 193893000000.0\n", + "4 Operating Expense 65365000000.0\n", + "5 Selling General and Administrative 32877000000.0\n", + "6 General & Administrative Expense 7223000000.0\n", + "7 Other G and A 7223000000.0\n", + "8 Selling & Marketing Expense 25654000000.0\n", + "9 Research & Development 32488000000.0" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Try the pretty print version\n", + "print(\"\\n๐Ÿ“Œ FORMATTED TABLE (first 10 line items):\")\n", + "print(\"-\" * 60)\n", + "# Note: print_pretty_table() might be very wide, so let's show a subset\n", + "subset = stmt_df.head(10)[['Breakdown', 'TTM']]\n", + "subset.columns = ['Metric', 'TTM Value']\n", + "display(subset)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## ๐Ÿ“ˆ 5. FINANCIAL RATIOS" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "============================================================\n", + "FINANCIAL RATIOS (Historical Time Series)\n", + "============================================================\n", + "\n", + "๐Ÿ“Œ RETURN ON EQUITY (ROE):\n" + ] + }, + { + "data": { + "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", + " \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", + "
symbolreport_datenet_income_common_stockholdersbeginning_stockholders_equityending_stockholders_equityavg_equityroe
0TSLA2023-09-301.851000e+095.113000e+105.346600e+105.229800e+100.0354
1TSLA2023-12-317.927000e+095.346600e+106.263400e+105.805000e+100.1366
2TSLA2024-03-311.432000e+096.263400e+106.437800e+106.350600e+100.0225
3TSLA2024-06-301.400000e+096.437800e+106.646800e+106.542300e+100.0214
4TSLA2024-09-302.173000e+096.646800e+106.993100e+106.819950e+100.0319
5TSLA2024-12-312.314000e+096.993100e+107.291300e+107.142200e+100.0324
6TSLA2025-03-314.090000e+087.291300e+107.465300e+107.378300e+100.0055
7TSLA2025-06-301.172000e+097.465300e+107.731400e+107.598350e+100.0154
8TSLA2025-09-301.373000e+097.731400e+107.997000e+107.864200e+100.0175
9TSLA2025-12-318.400000e+087.997000e+108.213700e+108.105350e+100.0104
\n", + "
" + ], + "text/plain": [ + " symbol report_date net_income_common_stockholders \\\n", + "0 TSLA 2023-09-30 1.851000e+09 \n", + "1 TSLA 2023-12-31 7.927000e+09 \n", + "2 TSLA 2024-03-31 1.432000e+09 \n", + "3 TSLA 2024-06-30 1.400000e+09 \n", + "4 TSLA 2024-09-30 2.173000e+09 \n", + "5 TSLA 2024-12-31 2.314000e+09 \n", + "6 TSLA 2025-03-31 4.090000e+08 \n", + "7 TSLA 2025-06-30 1.172000e+09 \n", + "8 TSLA 2025-09-30 1.373000e+09 \n", + "9 TSLA 2025-12-31 8.400000e+08 \n", + "\n", + " beginning_stockholders_equity ending_stockholders_equity avg_equity \\\n", + "0 5.113000e+10 5.346600e+10 5.229800e+10 \n", + "1 5.346600e+10 6.263400e+10 5.805000e+10 \n", + "2 6.263400e+10 6.437800e+10 6.350600e+10 \n", + "3 6.437800e+10 6.646800e+10 6.542300e+10 \n", + "4 6.646800e+10 6.993100e+10 6.819950e+10 \n", + "5 6.993100e+10 7.291300e+10 7.142200e+10 \n", + "6 7.291300e+10 7.465300e+10 7.378300e+10 \n", + "7 7.465300e+10 7.731400e+10 7.598350e+10 \n", + "8 7.731400e+10 7.997000e+10 7.864200e+10 \n", + "9 7.997000e+10 8.213700e+10 8.105350e+10 \n", + "\n", + " roe \n", + "0 0.0354 \n", + "1 0.1366 \n", + "2 0.0225 \n", + "3 0.0214 \n", + "4 0.0319 \n", + "5 0.0324 \n", + "6 0.0055 \n", + "7 0.0154 \n", + "8 0.0175 \n", + "9 0.0104 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "๐Ÿ“Œ RETURN ON INVESTED CAPITAL (ROIC):\n" + ] + }, + { + "data": { + "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", + " \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", + "
symbolreport_dateebittax_rate_for_calcsnopatbeginning_invested_capitalending_invested_capitalavg_invested_capitalroic
0TSLA2022-09-30NaNNaNNaN3.952800e+10NaNNaNNaN
1TSLA2023-09-302.083000e+090.081.916360e+095.264900e+105.717000e+105.490950e+100.0349
2TSLA2023-12-312.252000e+090.211.779080e+095.717000e+106.729100e+106.223050e+100.0286
3TSLA2024-03-311.964000e+090.261.453360e+096.729100e+106.925200e+106.827150e+100.0213
4TSLA2024-06-301.873000e+090.211.479670e+096.925200e+107.383000e+107.154100e+100.0207
5TSLA2024-09-302.883000e+090.222.248740e+097.383000e+107.732100e+107.557550e+100.0298
6TSLA2024-12-312.862000e+090.162.404080e+097.732100e+108.079100e+107.905600e+100.0304
7TSLA2025-03-316.800000e+080.294.828000e+088.079100e+108.189700e+108.134400e+100.0059
8TSLA2025-06-301.635000e+090.231.258950e+098.189700e+108.427000e+108.308350e+100.0152
9TSLA2025-09-302.035000e+090.291.444850e+098.427000e+108.743100e+108.585050e+100.0168
10TSLA2025-12-311.266000e+090.289.115200e+088.743100e+109.029000e+108.886050e+100.0103
\n", + "
" + ], + "text/plain": [ + " symbol report_date ebit tax_rate_for_calcs nopat \\\n", + "0 TSLA 2022-09-30 NaN NaN NaN \n", + "1 TSLA 2023-09-30 2.083000e+09 0.08 1.916360e+09 \n", + "2 TSLA 2023-12-31 2.252000e+09 0.21 1.779080e+09 \n", + "3 TSLA 2024-03-31 1.964000e+09 0.26 1.453360e+09 \n", + "4 TSLA 2024-06-30 1.873000e+09 0.21 1.479670e+09 \n", + "5 TSLA 2024-09-30 2.883000e+09 0.22 2.248740e+09 \n", + "6 TSLA 2024-12-31 2.862000e+09 0.16 2.404080e+09 \n", + "7 TSLA 2025-03-31 6.800000e+08 0.29 4.828000e+08 \n", + "8 TSLA 2025-06-30 1.635000e+09 0.23 1.258950e+09 \n", + "9 TSLA 2025-09-30 2.035000e+09 0.29 1.444850e+09 \n", + "10 TSLA 2025-12-31 1.266000e+09 0.28 9.115200e+08 \n", + "\n", + " beginning_invested_capital ending_invested_capital avg_invested_capital \\\n", + "0 3.952800e+10 NaN NaN \n", + "1 5.264900e+10 5.717000e+10 5.490950e+10 \n", + "2 5.717000e+10 6.729100e+10 6.223050e+10 \n", + "3 6.729100e+10 6.925200e+10 6.827150e+10 \n", + "4 6.925200e+10 7.383000e+10 7.154100e+10 \n", + "5 7.383000e+10 7.732100e+10 7.557550e+10 \n", + "6 7.732100e+10 8.079100e+10 7.905600e+10 \n", + "7 8.079100e+10 8.189700e+10 8.134400e+10 \n", + "8 8.189700e+10 8.427000e+10 8.308350e+10 \n", + "9 8.427000e+10 8.743100e+10 8.585050e+10 \n", + "10 8.743100e+10 9.029000e+10 8.886050e+10 \n", + "\n", + " roic \n", + "0 NaN \n", + "1 0.0349 \n", + "2 0.0286 \n", + "3 0.0213 \n", + "4 0.0207 \n", + "5 0.0298 \n", + "6 0.0304 \n", + "7 0.0059 \n", + "8 0.0152 \n", + "9 0.0168 \n", + "10 0.0103 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Explore financial ratios with historical data\n", + "symbol = 'TSLA' # Tesla for interesting ratios\n", + "db_ticker = Ticker(symbol)\n", + "\n", + "print(\"=\" * 60)\n", + "print(\"FINANCIAL RATIOS (Historical Time Series)\")\n", + "print(\"=\" * 60)\n", + "\n", + "print(\"\\n๐Ÿ“Œ RETURN ON EQUITY (ROE):\")\n", + "roe = db_ticker.roe()\n", + "display(roe)\n", + "\n", + "print(\"\\n๐Ÿ“Œ RETURN ON INVESTED CAPITAL (ROIC):\")\n", + "roic = db_ticker.roic()\n", + "display(roic)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "๐Ÿ“Œ WEIGHTED AVERAGE COST OF CAPITAL (WACC):\n", + " Columns: ['symbol', 'report_date', 'market_capitalization', 'exchange_rate', 'total_debt', 'total_debt_usd', 'interest_expense', 'interest_expense_usd', 'pretax_income', 'pretax_income_usd', 'tax_provision', 'tax_provision_usd', 'tax_rate_for_calcs', 'sp500_cagr_end', 'sp500_10y_cagr', 'treasure_10y_yield', 'beta_5y', 'weight_of_debt', 'weight_of_equity', 'cost_of_debt', 'cost_of_equity', 'wacc']\n", + "\n", + " Latest calculation components:\n", + " Market Cap: $3967.28B\n", + " Beta (5Y): 1.0636\n", + " S&P 500 10Y CAGR: 12.87%\n", + " Treasury 10Y Yield: 4.26%\n", + " Weight of Debt: 0.0272\n", + " Weight of Equity: 0.9728\n", + " Cost of Debt: 0.0090\n", + " Cost of Equity: 0.1342\n", + "\n", + " โญ WACC: 0.1308 (13.08%\n" + ] + } + ], + "source": [ + "# WACC - Weighted Average Cost of Capital\n", + "print(\"\\n๐Ÿ“Œ WEIGHTED AVERAGE COST OF CAPITAL (WACC):\")\n", + "wacc = db_ticker.wacc()\n", + "print(f\" Columns: {list(wacc.columns)}\")\n", + "print(f\"\\n Latest calculation components:\")\n", + "latest_wacc = wacc.iloc[-1]\n", + "print(f\" Market Cap: ${float(latest_wacc['market_capitalization'])/1e9:.2f}B\")\n", + "print(f\" Beta (5Y): {float(latest_wacc['beta_5y']):.4f}\")\n", + "print(f\" S&P 500 10Y CAGR: {float(latest_wacc['sp500_10y_cagr']):.2%}\")\n", + "print(f\" Treasury 10Y Yield: {float(latest_wacc['treasure_10y_yield']):.2%}\")\n", + "print(f\" Weight of Debt: {float(latest_wacc['weight_of_debt']):.4f}\")\n", + "print(f\" Weight of Equity: {float(latest_wacc['weight_of_equity']):.4f}\")\n", + "print(f\" Cost of Debt: {float(latest_wacc['cost_of_debt']):.4f}\")\n", + "print(f\" Cost of Equity: {float(latest_wacc['cost_of_equity']):.4f}\")\n", + "print(f\"\\n โญ WACC: {float(latest_wacc['wacc']):.4f} ({float(latest_wacc['wacc']):.2%}\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## ๐Ÿ“Š 6. GROWTH & MARGIN METRICS" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "============================================================\n", + "GROWTH & MARGIN METRICS\n", + "============================================================\n", + "\n", + "๐Ÿ“Œ QUARTERLY REVENUE YoY GROWTH:\n" + ] + }, + { + "data": { + "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", + "
symbolreport_daterevenueprev_year_revenueyoy_growth
5NVDA2024-04-302.604400e+10NaNNaN
6NVDA2024-07-313.004000e+101.350700e+101.2240
7NVDA2024-10-313.508200e+101.812000e+100.9361
8NVDA2025-01-313.933100e+102.210300e+100.7794
9NVDA2025-04-304.406200e+102.604400e+100.6918
10NVDA2025-07-314.674300e+103.004000e+100.5560
11NVDA2025-10-315.700600e+103.508200e+100.6249
12NVDA2026-01-316.812700e+103.933100e+100.7321
\n", + "
" + ], + "text/plain": [ + " symbol report_date revenue prev_year_revenue yoy_growth\n", + "5 NVDA 2024-04-30 2.604400e+10 NaN NaN\n", + "6 NVDA 2024-07-31 3.004000e+10 1.350700e+10 1.2240\n", + "7 NVDA 2024-10-31 3.508200e+10 1.812000e+10 0.9361\n", + "8 NVDA 2025-01-31 3.933100e+10 2.210300e+10 0.7794\n", + "9 NVDA 2025-04-30 4.406200e+10 2.604400e+10 0.6918\n", + "10 NVDA 2025-07-31 4.674300e+10 3.004000e+10 0.5560\n", + "11 NVDA 2025-10-31 5.700600e+10 3.508200e+10 0.6249\n", + "12 NVDA 2026-01-31 6.812700e+10 3.933100e+10 0.7321" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "๐Ÿ“Œ QUARTERLY EPS YoY GROWTH:\n" + ] + }, + { + "data": { + "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", + "
symbolreport_dateepsprev_year_epsyoy_growth
101NVDA2024-04-300.600.086.5000
102NVDA2024-07-310.670.251.6800
103NVDA2024-10-310.780.371.1081
104NVDA2025-01-310.890.490.8163
105NVDA2025-04-300.760.600.2667
106NVDA2025-07-311.080.670.6119
107NVDA2025-10-311.300.780.6667
108NVDA2026-01-311.760.890.9775
\n", + "
" + ], + "text/plain": [ + " symbol report_date eps prev_year_eps yoy_growth\n", + "101 NVDA 2024-04-30 0.60 0.08 6.5000\n", + "102 NVDA 2024-07-31 0.67 0.25 1.6800\n", + "103 NVDA 2024-10-31 0.78 0.37 1.1081\n", + "104 NVDA 2025-01-31 0.89 0.49 0.8163\n", + "105 NVDA 2025-04-30 0.76 0.60 0.2667\n", + "106 NVDA 2025-07-31 1.08 0.67 0.6119\n", + "107 NVDA 2025-10-31 1.30 0.78 0.6667\n", + "108 NVDA 2026-01-31 1.76 0.89 0.9775" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Explore growth metrics\n", + "symbol = 'NVDA'\n", + "db_ticker = Ticker(symbol)\n", + "\n", + "print(\"=\" * 60)\n", + "print(\"GROWTH & MARGIN METRICS\")\n", + "print(\"=\" * 60)\n", + "\n", + "print(\"\\n๐Ÿ“Œ QUARTERLY REVENUE YoY GROWTH:\")\n", + "rev_growth = db_ticker.quarterly_revenue_yoy_growth()\n", + "display(rev_growth.tail(8))\n", + "\n", + "print(\"\\n๐Ÿ“Œ QUARTERLY EPS YoY GROWTH:\")\n", + "eps_growth = db_ticker.quarterly_eps_yoy_growth()\n", + "display(eps_growth.tail(8))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "๐Ÿ“Œ QUARTERLY GROSS MARGIN:\n" + ] + }, + { + "data": { + "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", + "
symbolreport_dategross_profittotal_revenuegross_margin
11NVDA2025-01-312.872300e+103.933100e+100.7303
12NVDA2025-04-302.666800e+104.406200e+100.6052
13NVDA2025-07-313.385300e+104.674300e+100.7242
14NVDA2025-10-314.184900e+105.700600e+100.7341
15NVDA2026-01-315.109300e+106.812700e+100.7500
\n", + "
" + ], + "text/plain": [ + " symbol report_date gross_profit total_revenue gross_margin\n", + "11 NVDA 2025-01-31 2.872300e+10 3.933100e+10 0.7303\n", + "12 NVDA 2025-04-30 2.666800e+10 4.406200e+10 0.6052\n", + "13 NVDA 2025-07-31 3.385300e+10 4.674300e+10 0.7242\n", + "14 NVDA 2025-10-31 4.184900e+10 5.700600e+10 0.7341\n", + "15 NVDA 2026-01-31 5.109300e+10 6.812700e+10 0.7500" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "๐Ÿ“Œ QUARTERLY NET MARGIN:\n" + ] + }, + { + "data": { + "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", + "
symbolreport_datenet_income_common_stockholderstotal_revenuenet_margin
11NVDA2025-01-312.209100e+103.933100e+100.5617
12NVDA2025-04-301.877500e+104.406200e+100.4261
13NVDA2025-07-312.642200e+104.674300e+100.5653
14NVDA2025-10-313.191000e+105.700600e+100.5598
15NVDA2026-01-314.296000e+106.812700e+100.6306
\n", + "
" + ], + "text/plain": [ + " symbol report_date net_income_common_stockholders total_revenue \\\n", + "11 NVDA 2025-01-31 2.209100e+10 3.933100e+10 \n", + "12 NVDA 2025-04-30 1.877500e+10 4.406200e+10 \n", + "13 NVDA 2025-07-31 2.642200e+10 4.674300e+10 \n", + "14 NVDA 2025-10-31 3.191000e+10 5.700600e+10 \n", + "15 NVDA 2026-01-31 4.296000e+10 6.812700e+10 \n", + "\n", + " net_margin \n", + "11 0.5617 \n", + "12 0.4261 \n", + "13 0.5653 \n", + "14 0.5598 \n", + "15 0.6306 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Margin metrics\n", + "print(\"\\n๐Ÿ“Œ QUARTERLY GROSS MARGIN:\")\n", + "gross_margin = db_ticker.quarterly_gross_margin()\n", + "display(gross_margin.tail(5))\n", + "\n", + "print(\"\\n๐Ÿ“Œ QUARTERLY NET MARGIN:\")\n", + "net_margin = db_ticker.quarterly_net_margin()\n", + "display(net_margin.tail(5))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## ๐ŸŽฏ 7. UNIQUE FEATURES: EARNINGS TRANSCRIPTS" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "============================================================\n", + "EARNINGS CALL TRANSCRIPTS (Unique to DefeatBeta!)\n", + "============================================================\n", + "\n", + "๐Ÿ“Œ Available transcripts: 82 quarters\n", + " From FY2005 Q4 to FY2026 Q1\n", + "\n", + "๐Ÿ“Œ MOST RECENT TRANSCRIPTS:\n" + ] + }, + { + "data": { + "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", + "
fiscal_yearfiscal_quarterreport_date
77202512025-01-30
78202522025-05-01
79202532025-07-31
80202542025-10-30
81202612026-01-29
\n", + "
" + ], + "text/plain": [ + " fiscal_year fiscal_quarter report_date\n", + "77 2025 1 2025-01-30\n", + "78 2025 2 2025-05-01\n", + "79 2025 3 2025-07-31\n", + "80 2025 4 2025-10-30\n", + "81 2026 1 2026-01-29" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Access earnings call transcripts\n", + "symbol = 'AAPL'\n", + "db_ticker = Ticker(symbol)\n", + "\n", + "print(\"=\" * 60)\n", + "print(\"EARNINGS CALL TRANSCRIPTS (Unique to DefeatBeta!)\")\n", + "print(\"=\" * 60)\n", + "\n", + "transcripts = db_ticker.earning_call_transcripts()\n", + "transcript_list = transcripts.get_transcripts_list()\n", + "\n", + "print(f\"\\n๐Ÿ“Œ Available transcripts: {len(transcript_list)} quarters\")\n", + "print(f\" From FY{transcript_list.iloc[0]['fiscal_year']} Q{transcript_list.iloc[0]['fiscal_quarter']} to FY{transcript_list.iloc[-1]['fiscal_year']} Q{transcript_list.iloc[-1]['fiscal_quarter']}\")\n", + "\n", + "print(\"\\n๐Ÿ“Œ MOST RECENT TRANSCRIPTS:\")\n", + "display(transcript_list[['fiscal_year', 'fiscal_quarter', 'report_date']].tail(5))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "๐Ÿ“Œ SAMPLE: Q4 2025 EARNINGS CALL\n", + " Type: DataFrame\n", + " Total paragraphs: 77\n", + " Speakers: 15\n", + "\n", + " ๐Ÿ“ FIRST 3 PARAGRAPHS:\n", + "\n", + " [Suhasini Chandramouli]:\n", + " Good afternoon, and welcome to the Apple Q4 Fiscal Year 2025 Earnings Conference Call. My name is Suhasini Chandramouli, Director of Investor Relation...\n", + "\n", + " [Timothy Cook]:\n", + " Thank you, Suhasini. Good afternoon, everyone, and thanks for joining the call. Today, Apple is proud to report $102.5 billion in revenue, up 8% from ...\n", + "\n", + " [Kevan Parekh]:\n", + " Thanks, Tim, and good afternoon, everyone. Our revenue of $102.5 billion was up 8% year-over-year and is a new September quarter record. We set some t...\n" + ] + } + ], + "source": [ + "# Get a specific transcript\n", + "print(\"\\n๐Ÿ“Œ SAMPLE: Q4 2025 EARNINGS CALL\")\n", + "q4_2025 = transcripts.get_transcript(2025, 4)\n", + "\n", + "if q4_2025 is not None and len(q4_2025) > 0:\n", + " print(f\" Type: {type(q4_2025).__name__}\")\n", + " print(f\" Total paragraphs: {len(q4_2025)}\")\n", + " print(f\" Speakers: {q4_2025['speaker'].nunique()}\")\n", + " \n", + " print(\"\\n ๐Ÿ“ FIRST 3 PARAGRAPHS:\")\n", + " for idx, row in q4_2025.head(3).iterrows():\n", + " speaker = row['speaker']\n", + " content = row['content'][:150] + \"...\" if len(row['content']) > 150 else row['content']\n", + " print(f\"\\n [{speaker}]:\")\n", + " print(f\" {content}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "๐Ÿ“Œ AVAILABLE AI METHODS:\n", + " โ€ข transcripts.analyze_financial_metrics_change_for_this_quarter_with_ai()\n", + " โ€ข transcripts.analyze_financial_metrics_forecast_for_future_with_ai()\n", + " โ€ข transcripts.summarize_key_financial_data_with_ai()\n", + "\n", + "โš ๏ธ NOTE: AI methods require OPENAI_API_KEY to be set in environment\n", + " Set with: export OPENAI_API_KEY=your_key_here\n" + ] + } + ], + "source": [ + "# AI-powered analysis (requires OpenAI API key)\n", + "print(\"\\n๐Ÿ“Œ AVAILABLE AI METHODS:\")\n", + "ai_methods = [m for m in dir(transcripts) if 'ai' in m.lower() or 'analyze' in m.lower()]\n", + "for method in ai_methods:\n", + " print(f\" โ€ข transcripts.{method}()\")\n", + "\n", + "print(\"\\nโš ๏ธ NOTE: AI methods require OPENAI_API_KEY to be set in environment\")\n", + "print(\" Set with: export OPENAI_API_KEY=your_key_here\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## ๐ŸŒ 8. REVENUE BREAKDOWN (Unique Feature!)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "============================================================\n", + "REVENUE BREAKDOWN BY SEGMENT\n", + "============================================================\n", + "\n", + "๐Ÿ“Œ Columns: ['symbol', 'report_date', 'Mac', 'Services', 'Wearables, Home and Accessories', 'iPad', 'iPhone']\n", + "\n", + "๐Ÿ“Œ Latest Quarter (2025-12-31):\n", + " Mac: $8.39B\n", + " Services: $30.01B\n", + " Wearables, Home and Accessories: $11.49B\n", + " iPad: $8.60B\n", + " iPhone: $85.27B\n", + "\n", + " TOTAL: $143.76B\n" + ] + } + ], + "source": [ + "# Revenue by segment - unique to DefeatBeta!\n", + "symbol = 'AAPL'\n", + "db_ticker = Ticker(symbol)\n", + "\n", + "print(\"=\" * 60)\n", + "print(\"REVENUE BREAKDOWN BY SEGMENT\")\n", + "print(\"=\" * 60)\n", + "\n", + "revenue_segment = db_ticker.revenue_by_segment()\n", + "print(f\"\\n๐Ÿ“Œ Columns: {list(revenue_segment.columns)}\")\n", + "print(f\"\\n๐Ÿ“Œ Latest Quarter ({revenue_segment.iloc[-1]['report_date']}):\")\n", + "\n", + "latest = revenue_segment.iloc[-1]\n", + "total = 0\n", + "for col in revenue_segment.columns[2:]: # Skip symbol and report_date\n", + " value = latest[col]\n", + " if pd.notna(value):\n", + " value = float(value) # Convert Decimal to float\n", + " print(f\" {col}: ${value/1e9:.2f}B\")\n", + " total += value\n", + "print(f\"\\n TOTAL: ${total/1e9:.2f}B\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "๐Ÿ“Œ REVENUE BY GEOGRAPHY:\n" + ] + }, + { + "data": { + "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", + "
symbolreport_dateAmericasEuropeGreater ChinaJapanRest of Asia Pacific
20AAPL2025-06-304.119800e+102.401400e+101.536900e+105.782000e+097.673000e+09
21AAPL2025-09-304.419200e+102.870300e+101.449300e+106.636000e+098.442000e+09
22AAPL2025-12-315.852900e+103.814600e+102.552600e+109.413000e+091.214200e+10
\n", + "
" + ], + "text/plain": [ + " symbol report_date Americas Europe Greater China \\\n", + "20 AAPL 2025-06-30 4.119800e+10 2.401400e+10 1.536900e+10 \n", + "21 AAPL 2025-09-30 4.419200e+10 2.870300e+10 1.449300e+10 \n", + "22 AAPL 2025-12-31 5.852900e+10 3.814600e+10 2.552600e+10 \n", + "\n", + " Japan Rest of Asia Pacific \n", + "20 5.782000e+09 7.673000e+09 \n", + "21 6.636000e+09 8.442000e+09 \n", + "22 9.413000e+09 1.214200e+10 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Revenue by geography\n", + "print(\"\\n๐Ÿ“Œ REVENUE BY GEOGRAPHY:\")\n", + "revenue_geo = db_ticker.revenue_by_geography()\n", + "display(revenue_geo.tail(3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## ๐Ÿ“‹ 9. DCF VALUATION (Automated!)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "============================================================\n", + "AUTOMATED DCF VALUATION\n", + "============================================================\n", + "\n", + "๐Ÿ“Œ Running DCF analysis...\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + "
\n", + " \n", + " โฌ‡๏ธ Download AAPL DCF.xlsx\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " Return type: dict\n", + " Keys: ['file_path', 'description']\n", + " Description: DCF Valuation Analysis for AAPL\n", + " Excel file: AAPL.xlsx\n", + "\n", + "โš ๏ธ NOTE: DCF generates a professional Excel spreadsheet with:\n", + " โ€ข WACC calculations\n", + " โ€ข 10-year cash flow projections\n", + " โ€ข Enterprise value and fair price\n", + " โ€ข Buy/Sell recommendations\n" + ] + } + ], + "source": [ + "# Automated DCF Valuation\n", + "symbol = 'AAPL'\n", + "db_ticker = Ticker(symbol)\n", + "\n", + "print(\"=\" * 60)\n", + "print(\"AUTOMATED DCF VALUATION\")\n", + "print(\"=\" * 60)\n", + "\n", + "print(\"\\n๐Ÿ“Œ Running DCF analysis...\")\n", + "dcf_result = db_ticker.dcf()\n", + "\n", + "print(f\"\\n Return type: {type(dcf_result).__name__}\")\n", + "if isinstance(dcf_result, dict):\n", + " print(f\" Keys: {list(dcf_result.keys())}\")\n", + " print(f\" Description: {dcf_result.get('description', 'N/A')}\")\n", + " if 'file_path' in dcf_result:\n", + " print(f\" Excel file: {dcf_result['file_path']}\")\n", + "\n", + "print(\"\\nโš ๏ธ NOTE: DCF generates a professional Excel spreadsheet with:\")\n", + "print(\" โ€ข WACC calculations\")\n", + "print(\" โ€ข 10-year cash flow projections\")\n", + "print(\" โ€ข Enterprise value and fair price\")\n", + "print(\" โ€ข Buy/Sell recommendations\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## ๐Ÿ” 10. EXPLORE YOUR OWN STOCK" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "============================================================\n", + "EXPLORING: GOOGL\n", + "============================================================\n", + "\n", + "๐Ÿ“Œ CURRENT PRICE DATA:\n", + " Latest Close: $341.68\n", + " Date: 2026-04-17\n", + " Volume: 25,519,000\n", + "\n", + "๐Ÿ“Œ VALUATION:\n", + " TTM P/E: 31.61\n", + " Market Cap: $4133.30B\n", + "\n", + "๐Ÿ“Œ PROFITABILITY:\n", + " ROE: 8.59%\n", + " WACC: 13.93%\n", + "\n", + "๐Ÿ“Œ GROWTH:\n", + " Revenue YoY Growth: 18.00%\n" + ] + } + ], + "source": [ + "# Interactive stock analysis - change the symbol!\n", + "SYMBOL = 'GOOGL' # โฌ…๏ธ CHANGE THIS TO ANY STOCK SYMBOL\n", + "\n", + "print(\"=\" * 60)\n", + "print(f\"EXPLORING: {SYMBOL}\")\n", + "print(\"=\" * 60)\n", + "\n", + "ticker = Ticker(SYMBOL)\n", + "\n", + "# Basic stats\n", + "price_data = ticker.price()\n", + "latest = price_data.iloc[-1]\n", + "\n", + "print(f\"\\n๐Ÿ“Œ CURRENT PRICE DATA:\")\n", + "print(f\" Latest Close: ${float(latest['close']):.2f}\")\n", + "print(f\" Date: {latest['report_date']}\")\n", + "print(f\" Volume: {int(latest['volume']):,}\")\n", + "\n", + "# Valuation\n", + "ttm_pe = ticker.ttm_pe()\n", + "if not ttm_pe.empty:\n", + " print(f\"\\n๐Ÿ“Œ VALUATION:\")\n", + " print(f\" TTM P/E: {float(ttm_pe.iloc[-1]['ttm_pe']):.2f}\")\n", + "\n", + "market_cap = ticker.market_capitalization()\n", + "if not market_cap.empty:\n", + " mcap = float(market_cap.iloc[-1]['market_capitalization'])\n", + " print(f\" Market Cap: ${mcap/1e9:.2f}B\")\n", + "\n", + "# Ratios\n", + "roe = ticker.roe()\n", + "if not roe.empty:\n", + " print(f\"\\n๐Ÿ“Œ PROFITABILITY:\")\n", + " print(f\" ROE: {float(roe.iloc[-1]['roe']):.2%}\")\n", + "\n", + "wacc = ticker.wacc()\n", + "if not wacc.empty:\n", + " print(f\" WACC: {float(wacc.iloc[-1]['wacc']):.2%}\")\n", + "\n", + "# Growth\n", + "growth = ticker.quarterly_revenue_yoy_growth()\n", + "if not growth.empty:\n", + " print(f\"\\n๐Ÿ“Œ GROWTH:\")\n", + " print(f\" Revenue YoY Growth: {float(growth.iloc[-1]['yoy_growth']):.2%}\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## ๐Ÿงช 11. STOCK COMPARISON" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "============================================================\n", + "STOCK COMPARISON\n", + "============================================================\n", + "\n", + "๐Ÿ“Œ COMPARISON TABLE:\n" + ] + }, + { + "data": { + "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", + "
PriceP/EMarket CapROERev GrowthGross Margin
Symbol
AAPL270.2334.21$3967.3B52.0%15.7%48.2%
MSFT422.7926.46$3139.5B10.2%16.7%68.0%
GOOGL341.6831.61$4133.3B8.6%18.0%59.8%
NVDA201.6841.16$4900.8B31.1%73.2%75.0%
\n", + "
" + ], + "text/plain": [ + " Price P/E Market Cap ROE Rev Growth Gross Margin\n", + "Symbol \n", + "AAPL 270.23 34.21 $3967.3B 52.0% 15.7% 48.2%\n", + "MSFT 422.79 26.46 $3139.5B 10.2% 16.7% 68.0%\n", + "GOOGL 341.68 31.61 $4133.3B 8.6% 18.0% 59.8%\n", + "NVDA 201.68 41.16 $4900.8B 31.1% 73.2% 75.0%" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Compare multiple stocks\n", + "stocks = ['AAPL', 'MSFT', 'GOOGL', 'NVDA'] # โฌ…๏ธ CHANGE THESE\n", + "\n", + "print(\"=\" * 60)\n", + "print(\"STOCK COMPARISON\")\n", + "print(\"=\" * 60)\n", + "\n", + "comparison_data = []\n", + "\n", + "for symbol in stocks:\n", + " try:\n", + " ticker = Ticker(symbol)\n", + " \n", + " metrics = {'Symbol': symbol}\n", + " \n", + " # Price\n", + " price = ticker.price()\n", + " if not price.empty:\n", + " metrics['Price'] = float(price.iloc[-1]['close'])\n", + " \n", + " # Valuation\n", + " ttm_pe = ticker.ttm_pe()\n", + " if not ttm_pe.empty:\n", + " metrics['P/E'] = float(ttm_pe.iloc[-1]['ttm_pe'])\n", + " \n", + " market_cap = ticker.market_capitalization()\n", + " if not market_cap.empty:\n", + " metrics['Market Cap'] = float(market_cap.iloc[-1]['market_capitalization'])\n", + " \n", + " # Profitability\n", + " roe = ticker.roe()\n", + " if not roe.empty:\n", + " metrics['ROE'] = float(roe.iloc[-1]['roe'])\n", + " \n", + " # Growth\n", + " growth = ticker.quarterly_revenue_yoy_growth()\n", + " if not growth.empty:\n", + " metrics['Rev Growth'] = float(growth.iloc[-1]['yoy_growth'])\n", + " \n", + " # Margins\n", + " gross_margin = ticker.quarterly_gross_margin()\n", + " if not gross_margin.empty:\n", + " metrics['Gross Margin'] = float(gross_margin.iloc[-1]['gross_margin'])\n", + " \n", + " comparison_data.append(metrics)\n", + " \n", + " except Exception as e:\n", + " print(f\"โš ๏ธ Error loading {symbol}: {e}\")\n", + "\n", + "df = pd.DataFrame(comparison_data)\n", + "df.set_index('Symbol', inplace=True)\n", + "\n", + "# Format Market Cap in billions\n", + "df['Market Cap'] = df['Market Cap'].apply(lambda x: f\"${x/1e9:.1f}B\" if pd.notna(x) else 'N/A')\n", + "df['Rev Growth'] = df['Rev Growth'].apply(lambda x: f\"{x:.1%}\" if pd.notna(x) else 'N/A')\n", + "df['Gross Margin'] = df['Gross Margin'].apply(lambda x: f\"{x:.1%}\" if pd.notna(x) else 'N/A')\n", + "df['ROE'] = df['ROE'].apply(lambda x: f\"{x:.1%}\" if pd.notna(x) else 'N/A')\n", + "\n", + "print(\"\\n๐Ÿ“Œ COMPARISON TABLE:\")\n", + "display(df)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## ๐Ÿ“š 12. COMPLETE METHOD REFERENCE" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "============================================================\n", + "COMPLETE API METHOD REFERENCE\n", + "============================================================\n", + "\n", + "๐Ÿ’น Price & Volume:\n", + " โ€ข ticker.price()\n", + "\n", + "๐Ÿ“Š Valuation:\n", + " โ€ข ticker.market_capitalization()\n", + " โ€ข ticker.pb_ratio()\n", + " โ€ข ticker.peg_ratio()\n", + " โ€ข ticker.ps_ratio()\n", + " โ€ข ticker.ttm_eps()\n", + " โ€ข ticker.ttm_pe()\n", + "\n", + "๐Ÿ“ˆ Financial Ratios:\n", + " โ€ข ticker.asset_turnover()\n", + " โ€ข ticker.beta()\n", + " โ€ข ticker.equity_multiplier()\n", + " โ€ข ticker.roa()\n", + " โ€ข ticker.roe()\n", + " โ€ข ticker.roic()\n", + " โ€ข ticker.wacc()\n", + "\n", + "๐Ÿ“‹ Income Statement:\n", + " โ€ข ticker.annual_income_statement()\n", + " โ€ข ticker.quarterly_income_statement()\n", + "\n", + "โš–๏ธ Balance Sheet:\n", + " โ€ข ticker.annual_balance_sheet()\n", + " โ€ข ticker.quarterly_balance_sheet()\n", + "\n", + "๐Ÿ’ต Cash Flow:\n", + " โ€ข ticker.annual_cash_flow()\n", + " โ€ข ticker.quarterly_cash_flow()\n", + "\n", + "๐Ÿ“‰ Growth Metrics:\n", + " โ€ข ticker.annual_ebitda_yoy_growth()\n", + " โ€ข ticker.annual_fcf_yoy_growth()\n", + " โ€ข ticker.annual_net_income_yoy_growth()\n", + " โ€ข ticker.annual_operating_income_yoy_growth()\n", + " โ€ข ticker.annual_revenue_yoy_growth()\n", + " โ€ข ticker.quarterly_ebitda_yoy_growth()\n", + " โ€ข ticker.quarterly_eps_yoy_growth()\n", + " โ€ข ticker.quarterly_fcf_yoy_growth()\n", + " โ€ข ticker.quarterly_net_income_yoy_growth()\n", + " โ€ข ticker.quarterly_operating_income_yoy_growth()\n", + " โ€ข ticker.quarterly_revenue_yoy_growth()\n", + " โ€ข ticker.quarterly_ttm_eps_yoy_growth()\n", + "\n", + "๐Ÿ“Š Margin Metrics:\n", + " โ€ข ticker.annual_ebitda_margin()\n", + " โ€ข ticker.annual_fcf_margin()\n", + " โ€ข ticker.annual_gross_margin()\n", + " โ€ข ticker.annual_net_margin()\n", + " โ€ข ticker.annual_operating_margin()\n", + " โ€ข ticker.quarterly_ebitda_margin()\n", + " โ€ข ticker.quarterly_fcf_margin()\n", + " โ€ข ticker.quarterly_gross_margin()\n", + " โ€ข ticker.quarterly_net_margin()\n", + " โ€ข ticker.quarterly_operating_margin()\n", + "\n", + "๐ŸŽ™๏ธ Special Data:\n", + " โ€ข ticker.dividends()\n", + " โ€ข ticker.earning_call_transcripts()\n", + " โ€ข ticker.news()\n", + " โ€ข ticker.sec_filing()\n", + " โ€ข ticker.splits()\n", + "\n", + "๐ŸŒ Revenue Breakdown:\n", + " โ€ข ticker.revenue_by_geography()\n", + " โ€ข ticker.revenue_by_product()\n", + " โ€ข ticker.revenue_by_segment()\n", + "\n", + "๐Ÿญ Industry Metrics:\n", + " โ€ข ticker.industry_asset_turnover()\n", + " โ€ข ticker.industry_equity_multiplier()\n", + " โ€ข ticker.industry_pb_ratio()\n", + " โ€ข ticker.industry_ps_ratio()\n", + " โ€ข ticker.industry_quarterly_ebitda_margin()\n", + " โ€ข ticker.industry_quarterly_gross_margin()\n", + " โ€ข ticker.industry_quarterly_net_margin()\n", + " โ€ข ticker.industry_roa()\n", + " โ€ข ticker.industry_roe()\n", + " โ€ข ticker.industry_ttm_pe()\n", + "\n", + "โ„น๏ธ Info & Calendar:\n", + " โ€ข ticker.calendar()\n", + " โ€ข ticker.currency()\n", + " โ€ข ticker.info()\n", + " โ€ข ticker.officers()\n", + " โ€ข ticker.shares()\n" + ] + } + ], + "source": [ + "# List all available methods\n", + "symbol = 'AAPL'\n", + "ticker = Ticker(symbol)\n", + "\n", + "print(\"=\" * 60)\n", + "print(\"COMPLETE API METHOD REFERENCE\")\n", + "print(\"=\" * 60)\n", + "\n", + "all_methods = [m for m in dir(ticker) if not m.startswith('_')]\n", + "\n", + "categories = {\n", + " '๐Ÿ’น Price & Volume': ['price'],\n", + " '๐Ÿ“Š Valuation': ['ttm_eps', 'ttm_pe', 'market_capitalization', 'ps_ratio', 'pb_ratio', 'peg_ratio'],\n", + " '๐Ÿ“ˆ Financial Ratios': ['roe', 'roic', 'roa', 'wacc', 'beta', 'equity_multiplier', 'asset_turnover'],\n", + " '๐Ÿ“‹ Income Statement': ['quarterly_income_statement', 'annual_income_statement'],\n", + " 'โš–๏ธ Balance Sheet': ['quarterly_balance_sheet', 'annual_balance_sheet'],\n", + " '๐Ÿ’ต Cash Flow': ['quarterly_cash_flow', 'annual_cash_flow'],\n", + " '๐Ÿ“‰ Growth Metrics': [m for m in all_methods if 'yoy_growth' in m.lower()],\n", + " '๐Ÿ“Š Margin Metrics': [m for m in all_methods if 'margin' in m.lower() and 'industry' not in m.lower()],\n", + " '๐ŸŽ™๏ธ Special Data': ['earning_call_transcripts', 'news', 'sec_filing', 'dividends', 'splits'],\n", + " '๐ŸŒ Revenue Breakdown': ['revenue_by_segment', 'revenue_by_product', 'revenue_by_geography'],\n", + " '๐Ÿญ Industry Metrics': [m for m in all_methods if 'industry' in m.lower()],\n", + " 'โ„น๏ธ Info & Calendar': ['info', 'calendar', 'currency', 'shares', 'officers']\n", + "}\n", + "\n", + "for category, methods in categories.items():\n", + " matching = [m for m in methods if m in all_methods]\n", + " if matching:\n", + " print(f\"\\n{category}:\")\n", + " for method in sorted(matching):\n", + " print(f\" โ€ข ticker.{method}()\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## ๐ŸŽ“ EXERCISES TO TRY" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Exercise 1: Find Undervalued Stocks\n", + "Screen for stocks with P/E < 20 but ROE > 15%\n", + "\n", + "### Exercise 2: Growth Stock Analysis\n", + "Compare NVDA vs AMD on revenue growth, margins, and profitability\n", + "\n", + "### Exercise 3: DCF Valuation\n", + "Run DCF on 3 different stocks and compare their fair value estimates\n", + "\n", + "### Exercise 4: Revenue Mix Analysis\n", + "Analyze how Apple's revenue mix has shifted from hardware to services\n", + "\n", + "### Exercise 5: Earnings Transcript Mining\n", + "Extract key topics and sentiment from recent earnings calls" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## ๐Ÿ“– SUMMARY" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### DefeatBeta-API vs Yahoo Finance\n", + "\n", + "| Feature | DefeatBeta | Yahoo Finance |\n", + "|---------|------------|---------------|\n", + "| **Rate Limits** | โœ… None | โŒ Yes |\n", + "| **Historical Data** | โœ… Full | โœ… Full |\n", + "| **Financial Ratios** | โœ… Time series | โš ๏ธ Current only |\n", + "| **Earnings Transcripts** | โœ… Yes | โŒ No |\n", + "| **Revenue Segmentation** | โœ… Yes | โŒ No |\n", + "| **DCF Valuation** | โœ… Automated | โŒ No |\n", + "| **Real-time Data** | โŒ Daily batch | โœ… 15min delayed |\n", + "| **Query Speed** | โšก Fast (DuckDB) | ๐Ÿข Variable |\n", + "\n", + "### When to Use Each\n", + "- **DefeatBeta**: Historical analysis, financial modeling, backtesting, DCF\n", + "- **Yahoo Finance**: Real-time data, analyst consensus, quick lookups" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "sym = \"AAPL\"\n", + "dbt = Ticker(sym)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['__class__',\n", + " '__delattr__',\n", + " '__dict__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__getstate__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__init_subclass__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__module__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__',\n", + " '__weakref__',\n", + " '_add_dcf_template_section',\n", + " '_add_dcf_value_section',\n", + " '_add_discount_rate_section',\n", + " '_add_growth_estimates_section',\n", + " '_add_key_metrics_display',\n", + " '_calculate_yoy_growth',\n", + " '_dataframe_to_stock_statements',\n", + " '_generate_margin',\n", + " '_get_finance_values_map',\n", + " '_quarterly_book_value_of_equity',\n", + " '_quarterly_eps_yoy_growth',\n", + " '_query_data',\n", + " '_query_data2',\n", + " '_revenue_by_breakdown',\n", + " '_statement',\n", + " 'annual_balance_sheet',\n", + " 'annual_cash_flow',\n", + " 'annual_ebitda_margin',\n", + " 'annual_ebitda_yoy_growth',\n", + " 'annual_fcf_margin',\n", + " 'annual_fcf_yoy_growth',\n", + " 'annual_gross_margin',\n", + " 'annual_income_statement',\n", + " 'annual_net_income_yoy_growth',\n", + " 'annual_net_margin',\n", + " 'annual_operating_income_yoy_growth',\n", + " 'annual_operating_margin',\n", + " 'annual_revenue_yoy_growth',\n", + " 'asset_turnover',\n", + " 'beta',\n", + " 'calendar',\n", + " 'company_meta',\n", + " 'config',\n", + " 'currency',\n", + " 'dcf',\n", + " 'dividends',\n", + " 'download_data_performance',\n", + " 'duckdb_client',\n", + " 'earning_call_transcripts',\n", + " 'equity_multiplier',\n", + " 'http_proxy',\n", + " 'huggingface_client',\n", + " 'industry_asset_turnover',\n", + " 'industry_equity_multiplier',\n", + " 'industry_pb_ratio',\n", + " 'industry_ps_ratio',\n", + " 'industry_quarterly_ebitda_margin',\n", + " 'industry_quarterly_gross_margin',\n", + " 'industry_quarterly_net_margin',\n", + " 'industry_roa',\n", + " 'industry_roe',\n", + " 'industry_ttm_pe',\n", + " 'info',\n", + " 'log_level',\n", + " 'market_capitalization',\n", + " 'news',\n", + " 'officers',\n", + " 'pb_ratio',\n", + " 'peg_ratio',\n", + " 'price',\n", + " 'ps_ratio',\n", + " 'quarterly_balance_sheet',\n", + " 'quarterly_cash_flow',\n", + " 'quarterly_ebitda_margin',\n", + " 'quarterly_ebitda_yoy_growth',\n", + " 'quarterly_eps_yoy_growth',\n", + " 'quarterly_fcf_margin',\n", + " 'quarterly_fcf_yoy_growth',\n", + " 'quarterly_gross_margin',\n", + " 'quarterly_income_statement',\n", + " 'quarterly_net_income_yoy_growth',\n", + " 'quarterly_net_margin',\n", + " 'quarterly_operating_income_yoy_growth',\n", + " 'quarterly_operating_margin',\n", + " 'quarterly_revenue_yoy_growth',\n", + " 'quarterly_ttm_eps_yoy_growth',\n", + " 'revenue_by_geography',\n", + " 'revenue_by_product',\n", + " 'revenue_by_segment',\n", + " 'roa',\n", + " 'roe',\n", + " 'roic',\n", + " 'sec_filing',\n", + " 'shares',\n", + " 'splits',\n", + " 'ticker',\n", + " 'treasure',\n", + " 'ttm_eps',\n", + " 'ttm_fcf',\n", + " 'ttm_net_income_common_stockholders',\n", + " 'ttm_pe',\n", + " 'ttm_revenue',\n", + " 'wacc']" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(dbt)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "
symboladdresscitycountryphonezipindustrysectorlong_business_summaryfull_time_employeesweb_sitereport_date
0AAPLOne Apple Park WayCupertinoUnited States(408) 996-101095014Consumer ElectronicsTechnologyApple Inc. designs, manufactures, and markets ...150000https://www.apple.com2026-04-18
\n", + "
" + ], + "text/plain": [ + " symbol address city country phone zip \\\n", + "0 AAPL One Apple Park Way Cupertino United States (408) 996-1010 95014 \n", + "\n", + " industry sector \\\n", + "0 Consumer Electronics Technology \n", + "\n", + " long_business_summary full_time_employees \\\n", + "0 Apple Inc. designs, manufactures, and markets ... 150000 \n", + "\n", + " web_site report_date \n", + "0 https://www.apple.com 2026-04-18 " + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dbt.info()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dbt" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "yft = yf.ticker.Ticker(sym)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['__class__',\n", + " '__delattr__',\n", + " '__dict__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__getstate__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__init_subclass__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__module__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__str__',\n", + " '__subclasshook__',\n", + " '__weakref__',\n", + " '_analysis',\n", + " '_data',\n", + " '_download_options',\n", + " '_earnings',\n", + " '_earnings_dates',\n", + " '_expirations',\n", + " '_fast_info',\n", + " '_fetch_ticker_tz',\n", + " '_financials',\n", + " '_fundamentals',\n", + " '_funds_data',\n", + " '_get_earnings_dates_using_scrape',\n", + " '_get_earnings_dates_using_screener',\n", + " '_get_ticker_tz',\n", + " '_holders',\n", + " '_isin',\n", + " '_lazy_load_price_history',\n", + " '_message_handler',\n", + " '_news',\n", + " '_options2df',\n", + " '_price_history',\n", + " '_quote',\n", + " '_shares',\n", + " '_tz',\n", + " '_underlying',\n", + " 'actions',\n", + " 'analyst_price_targets',\n", + " 'balance_sheet',\n", + " 'balancesheet',\n", + " 'calendar',\n", + " 'capital_gains',\n", + " 'cash_flow',\n", + " 'cashflow',\n", + " 'dividends',\n", + " 'earnings',\n", + " 'earnings_dates',\n", + " 'earnings_estimate',\n", + " 'earnings_history',\n", + " 'eps_revisions',\n", + " 'eps_trend',\n", + " 'fast_info',\n", + " 'financials',\n", + " 'funds_data',\n", + " 'get_actions',\n", + " 'get_analyst_price_targets',\n", + " 'get_balance_sheet',\n", + " 'get_balancesheet',\n", + " 'get_calendar',\n", + " 'get_capital_gains',\n", + " 'get_cash_flow',\n", + " 'get_cashflow',\n", + " 'get_dividends',\n", + " 'get_earnings',\n", + " 'get_earnings_dates',\n", + " 'get_earnings_estimate',\n", + " 'get_earnings_history',\n", + " 'get_eps_revisions',\n", + " 'get_eps_trend',\n", + " 'get_fast_info',\n", + " 'get_financials',\n", + " 'get_funds_data',\n", + " 'get_growth_estimates',\n", + " 'get_history_metadata',\n", + " 'get_income_stmt',\n", + " 'get_incomestmt',\n", + " 'get_info',\n", + " 'get_insider_purchases',\n", + " 'get_insider_roster_holders',\n", + " 'get_insider_transactions',\n", + " 'get_institutional_holders',\n", + " 'get_isin',\n", + " 'get_major_holders',\n", + " 'get_mutualfund_holders',\n", + " 'get_news',\n", + " 'get_recommendations',\n", + " 'get_recommendations_summary',\n", + " 'get_revenue_estimate',\n", + " 'get_sec_filings',\n", + " 'get_shares',\n", + " 'get_shares_full',\n", + " 'get_splits',\n", + " 'get_sustainability',\n", + " 'get_upgrades_downgrades',\n", + " 'get_valuation_measures',\n", + " 'growth_estimates',\n", + " 'history',\n", + " 'history_metadata',\n", + " 'income_stmt',\n", + " 'incomestmt',\n", + " 'info',\n", + " 'insider_purchases',\n", + " 'insider_roster_holders',\n", + " 'insider_transactions',\n", + " 'institutional_holders',\n", + " 'isin',\n", + " 'live',\n", + " 'major_holders',\n", + " 'mutualfund_holders',\n", + " 'news',\n", + " 'option_chain',\n", + " 'options',\n", + " 'quarterly_balance_sheet',\n", + " 'quarterly_balancesheet',\n", + " 'quarterly_cash_flow',\n", + " 'quarterly_cashflow',\n", + " 'quarterly_earnings',\n", + " 'quarterly_financials',\n", + " 'quarterly_income_stmt',\n", + " 'quarterly_incomestmt',\n", + " 'recommendations',\n", + " 'recommendations_summary',\n", + " 'revenue_estimate',\n", + " 'sec_filings',\n", + " 'session',\n", + " 'shares',\n", + " 'splits',\n", + " 'sustainability',\n", + " 'ticker',\n", + " 'ttm_cash_flow',\n", + " 'ttm_cashflow',\n", + " 'ttm_financials',\n", + " 'ttm_income_stmt',\n", + " 'ttm_incomestmt',\n", + " 'upgrades_downgrades',\n", + " 'valuation',\n", + " 'ws']" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(yft)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.12.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/defeatbeta_mapping.org b/docs/defeatbeta_mapping.org new file mode 100644 index 0000000..261b4d6 --- /dev/null +++ b/docs/defeatbeta_mapping.org @@ -0,0 +1,291 @@ +# DEFEATBETA-API vs YFINANCE MAPPING +# A comprehensive guide for migrating from Yahoo Finance to DefeatBeta-API + +* DEFEATBETA-API vs YFINANCE MAPPING :noexport: + This document provides a mapping between Yahoo Finance (yfinance) + and DefeatBeta-API methods and attributes. + +# Overview + +| Category | Yahoo Finance | DefeatBeta-API | Notes | +|----------|--------------|----------------|-------| +| **Data Source** | Yahoo Finance API | HuggingFace + DuckDB | No rate limits | +| **Query Engine** | Direct API | DuckDB OLAP | Sub-second queries | +| **Update Frequency** | Real-time (15min delayed) | Daily batch | DefeatBeta is historical only | +| **Historical Depth** | Full history | Full history | Comparable coverage | +| **Special Features** | Limited | Earnings transcripts, DCF, AI | DefeatBeta has unique capabilities | + +* Price & Volume Data + +| Yahoo Finance | DefeatBeta-API | Return Type | Notes | +|--------------|----------------|-------------|-------| +| ~ticker.history(period='max')~ | ~ticker.price()~ | pandas.DataFrame | OHLCV data | +| ~ticker.history(period='1d')~ | N/A | - | Real-time not available | +| ~ticker.history(start='...', end='...')~ | ~ticker.price()~ (filter) | pandas.DataFrame | Date filtering available | + +* DefeatBeta Price Data Structure +#+BEGIN_SRC python +# Columns: ['symbol', 'report_date', 'open', 'close', 'high', 'low', 'volume'] +# Example: + symbol report_date open close high low volume +0 AAPL 2026-04-17 266.96 270.23 272.30 266.72 61314800 +#+END_SRC + +* Financial Statements + +| Yahoo Finance | DefeatBeta-API | Return Type | Notes | +|--------------|----------------|-------------|-------| +| ~ticker.quarterly_financials~ | ~ticker.quarterly_income_statement()~ | Statement object | Different format | +| ~ticker.financials~ | ~ticker.annual_income_statement()~ | Statement object | Annual version | +| ~ticker.quarterly_balance_sheet~ | ~ticker.quarterly_balance_sheet()~ | Statement object | Same structure | +| ~ticker.balance_sheet~ | ~ticker.annual_balance_sheet()~ | Statement object | Annual version | +| ~ticker.quarterly_cashflow~ | ~ticker.quarterly_cash_flow()~ | Statement object | Note: 'flow' vs 'flow' | +| ~ticker.cashflow~ | ~ticker.annual_cash_flow()~ | Statement object | Annual version | + +** Statement Object Methods +#+BEGIN_SRC python +# DefeatBeta Statement objects have these methods: +income_stmt = ticker.quarterly_income_statement() +income_stmt.df() # Returns pandas.DataFrame +income_stmt.data() # Alternative access +income_stmt.print_pretty_table() # Formatted output +#+END_SRC + +* Valuation Metrics + +| Yahoo Finance | DefeatBeta-API | Return Type | Notes | +|--------------|----------------|-------------|-------| +| ~ticker.info['trailingPE']~ | ~ticker.ttm_pe()~ | pandas.DataFrame | **Historical** time series! | +| ~ticker.info['forwardPE']~ | N/A | - | Not available | +| ~ticker.info['trailingEps']~ | ~ticker.ttm_eps()~ | pandas.DataFrame | **Historical** time series! | +| ~ticker.info['forwardEps']~ | N/A | - | Not available | +| ~ticker.info['marketCap']~ | ~ticker.market_capitalization()~ | pandas.DataFrame | **Historical** time series! | +| ~ticker.info['priceToBook']~ | ~ticker.pb_ratio()~ | pandas.DataFrame | Price/Book ratio | +| ~ticker.info['priceToSalesTrailing12Months']~ | ~ticker.ps_ratio()~ | pandas.DataFrame | Price/Sales ratio | +| N/A | ~ticker.peg_ratio()~ | pandas.DataFrame | PEG ratio (unique) | + +** Key Advantage: Historical Valuation Data +DefeatBeta provides **full historical time series** for: +- TTM P/E ratios (all daily closes) +- TTM EPS history +- Market cap history +- Price/Book, Price/Sales ratios + +Yahoo Finance only provides **current values** in ~.info~ + +* Financial Ratios + +| Yahoo Finance | DefeatBeta-API | Return Type | Notes | +|--------------|----------------|-------------|-------| +| ~ticker.info['returnOnEquity']~ | ~ticker.roe()~ | pandas.DataFrame | **Historical** time series! | +| ~ticker.info['returnOnAssets']~ | ~ticker.roa()~ | pandas.DataFrame | **Historical** time series! | +| N/A | ~ticker.roic()~ | pandas.DataFrame | Return on Invested Capital | +| N/A | ~ticker.wacc()~ | pandas.DataFrame | Weighted Avg Cost of Capital | +| ~ticker.info['beta']~ | ~ticker.beta()~ | pandas.DataFrame | 5Y monthly beta | + +** WACC Components Available in DefeatBeta +#+BEGIN_SRC python +# Full breakdown of WACC calculation: +wacc = ticker.wacc() +# Columns: market_capitalization, beta_5y, sp500_10y_cagr, treasure_10y_yield, +# weight_of_debt, weight_of_equity, cost_of_debt, cost_of_equity, wacc +#+END_SRC + +* Growth Metrics + +| Yahoo Finance | DefeatBeta-API | Return Type | Notes | +|--------------|----------------|-------------|-------| +| ~ticker.info['revenueGrowth']~ | ~ticker.quarterly_revenue_yoy_growth()~ | pandas.DataFrame | YoY growth | +| ~ticker.info['earningsGrowth']~ | ~ticker.quarterly_eps_yoy_growth()~ | pandas.DataFrame | EPS YoY growth | +| N/A | ~ticker.quarterly_net_income_yoy_growth()~ | pandas.DataFrame | Net income growth | +| N/A | ~ticker.quarterly_operating_income_yoy_growth()~ | pandas.DataFrame | Operating income growth | +| N/A | ~ticker.quarterly_ebitda_yoy_growth()~ | pandas.DataFrame | EBITDA growth | +| N/A | ~ticker.quarterly_fcf_yoy_growth()~ | pandas.DataFrame | Free cash flow growth | +| N/A | ~ticker.annual_revenue_yoy_growth()~ | pandas.DataFrame | Annual revenue growth | + +* Margin Metrics + +| Yahoo Finance | DefeatBeta-API | Return Type | Notes | +|--------------|----------------|-------------|-------| +| ~ticker.info['profitMargins']~ | ~ticker.quarterly_net_margin()~ | pandas.DataFrame | **Historical** time series! | +| ~ticker.info['grossMargins']~ | ~ticker.quarterly_gross_margin()~ | pandas.DataFrame | **Historical** time series! | +| ~ticker.info['operatingMargins']~ | ~ticker.quarterly_operating_margin()~ | pandas.DataFrame | **Historical** time series! | +| N/A | ~ticker.quarterly_ebitda_margin()~ | pandas.DataFrame | EBITDA margin | +| N/A | ~ticker.quarterly_fcf_margin()~ | pandas.DataFrame | Free cash flow margin | +| N/A | ~ticker.industry_quarterly_gross_margin()~ | pandas.DataFrame | Industry comparison | + +* Dividends & Stock Splits + +| Yahoo Finance | DefeatBeta-API | Return Type | Notes | +|--------------|----------------|-------------|-------| +| ~ticker.dividends~ | ~ticker.dividends()~ | pandas.DataFrame | Dividend history | +| ~ticker.splits~ | ~ticker.splits()~ | pandas.DataFrame | Stock split history | +| ~ticker.info['dividendYield']~ | N/A | - | Not in separate field | +| ~ticker.info['trailingAnnualDividendYield']~ | N/A | - | Not available | + +* Company Info & Metadata + +| Yahoo Finance | DefeatBeta-API | Return Type | Notes | +|--------------|----------------|-------------|-------| +| ~ticker.info~ | ~ticker.info()~ | pandas.DataFrame | One row, many columns | +| ~ticker.info['longName']~ | ~ticker.info()['long_business_summary']~ | string | Business summary | +| ~ticker.info['sector']~ | ~ticker.info()['sector']~ | string | Sector classification | +| ~ticker.info['industry']~ | ~ticker.info()['industry']~ | string | Industry classification | +| ~ticker.info['website']~ | ~ticker.info()['web_site']~ | string | Company website | +| ~ticker.info['fullTimeEmployees']~ | ~ticker.info()['full_time_employees']~ | int | Employee count | +| N/A | ~ticker.officers()~ | pandas.DataFrame | Company officers | +| N/A | ~ticker.calendar()~ | pandas.DataFrame | Earnings calendar | + +* Unique DefeatBeta Features (Not in Yahoo Finance) + +| Feature | Method | Description | +|---------|--------|-------------| +| **Earnings Transcripts** | ~ticker.earning_call_transcripts()~ | Full earnings call transcripts | +| | ~transcripts.get_transcripts_list()~ | List all available transcripts | +| | ~transcripts.get_transcript(year, quarter)~ | Get specific quarter's transcript | +| | ~transcripts.summarize_key_financial_data_with_ai()~ | AI-powered summary | +| **Revenue Breakdown** | ~ticker.revenue_by_segment()~ | Revenue by product segment | +| | ~ticker.revenue_by_product()~ | Detailed product breakdown | +| | ~ticker.revenue_by_geography()~ | Revenue by geographic region | +| **Automated DCF** | ~ticker.dcf()~ | Generates Excel DCF valuation | +| **AI Analysis** | ~transcripts.analyze_financial_metrics_change...~ | LLM analysis of quarter changes | +| | ~transcripts.analyze_financial_metrics_forecast...~ | LLM forecast analysis | +| **Industry Metrics** | ~ticker.industry_ttm_pe()~ | Industry P/E comparison | +| | ~ticker.industry_roe()~ | Industry ROE comparison | +| | ~ticker.industry_quarterly_gross_margin()~ | Industry margin comparison | + +* Example: yfinance โ†’ DefeatBeta Migration + +** Yahoo Finance Style +#+BEGIN_SRC python +import yfinance as yf + +ticker = yf.Ticker('AAPL') + +# Current valuation +pe = ticker.info['trailingPE'] +eps = ticker.info['trailingEps'] +market_cap = ticker.info['marketCap'] + +# Financial statements +quarterly_financials = ticker.quarterly_financials +quarterly_balance = ticker.quarterly_balance_sheet + +# Growth +revenue_growth = ticker.info['revenueGrowth'] +#+END_SRC + +** DefeatBeta Equivalent +#+BEGIN_SRC python +from defeatbeta_api.data.ticker import Ticker + +ticker = Ticker('AAPL') + +# Historical valuation time series +ttm_pe = ticker.ttm_pe() # Full daily P/E history +ttm_eps = ticker.ttm_eps() # Full EPS history +market_cap = ticker.market_capitalization() # Daily market cap + +# Financial statements +quarterly_income = ticker.quarterly_income_statement() +quarterly_balance = ticker.quarterly_balance_sheet() + +# Convert to DataFrame +income_df = quarterly_income.df() + +# Growth metrics (time series!) +revenue_growth = ticker.quarterly_revenue_yoy_growth() +eps_growth = ticker.quarterly_eps_yoy_growth() +#+END_SRC + +** Getting Current Values from DefeatBeta +#+BEGIN_SRC python +# DefeatBeta provides time series, but getting current value is easy: +current_pe = ticker.ttm_pe().iloc[-1]['ttm_pe'] +current_eps = ticker.ttm_eps().iloc[-1]['tailing_eps'] +current_mcap = ticker.market_capitalization().iloc[-1]['market_capitalization'] +current_roe = ticker.roe().iloc[-1]['roe'] +#+END_SRC + +* Quick Reference: Common Operations + +| Operation | Yahoo Finance | DefeatBeta-API | +|-----------|--------------|----------------| +| Get current price | ~ticker.info['currentPrice']~ | ~ticker.price().iloc[-1]['close']~ | +| Get current P/E | ~ticker.info['trailingPE']~ | ~ticker.ttm_pe().iloc[-1]['ttm_pe']~ | +| Get current EPS | ~ticker.info['trailingEps']~ | ~ticker.ttm_eps().iloc[-1]['tailing_eps']~ | +| Get market cap | ~ticker.info['marketCap']~ | ~ticker.market_capitalization().iloc[-1]['market_capitalization']~ | +| Get ROE | ~ticker.info['returnOnEquity']~ | ~ticker.roe().iloc[-1]['roe']~ | +| Get revenue (TTM) | ~ticker.info['totalRevenue']~ | ~ticker.quarterly_income_statement().df().iloc[0]['TTM']~ | +| Get 5Y beta | ~ticker.info['beta']~ | ~ticker.beta().iloc[-1]['beta']~ | + +* Data Type Differences + +| Aspect | Yahoo Finance | DefeatBeta-API | +|--------|--------------|----------------| +| Dates in DataFrame | DatetimeIndex | 'report_date' column | +| Column naming | Title case (Open, Close) | Snake case (open, close) | +| Dividends/Splits | Separate columns in history | Separate DataFrames | +| Quarterly data | Transposed (dates as columns) | Wide format (TTM + quarters as columns) | +| Missing data | NaN | NaN | +| Numeric types | float | Decimal (convert with ~float()~) | + +* Converting Decimal to Float +#+BEGIN_SRC python +# DefeatBeta returns Decimal types for financial data +# Always convert before arithmetic operations + +value = ticker.ttm_eps().iloc[-1]['tailing_eps'] +value_float = float(value) # Convert Decimal โ†’ float + +# Use in calculations +market_cap_billions = float(market_cap.iloc[-1]['market_capitalization']) / 1e9 +#+END_SRC + +* When to Use Each + +| Use Case | Recommendation | Reason | +|----------|---------------|--------| +| Backtesting trading strategies | **DefeatBeta** | No rate limits, consistent historical data | +| DCF Valuation modeling | **DefeatBeta** | Automated Excel output | +| Revenue segment analysis | **DefeatBeta** | Unique revenue breakdown | +| Earnings call research | **DefeatBeta** | Full transcripts available | +| Real-time price alerts | **Yahoo Finance** | 15min delayed but real-time | +| Analyst recommendations | **Yahoo Finance** | Price targets, ratings | +| Institutional ownership | **Yahoo Finance** | Major holders data | +| Options/derivatives data | **Yahoo Finance** | Not available in DefeatBeta | +| Quick stock lookup | **Either** | Both work well | +| Multi-year historical analysis | **DefeatBeta** | Faster queries, no rate limits | + +* Environment Setup + +| Task | Command | +|------|---------| +| Install DefeatBeta | ~uv add defeatbeta-api~ | +| Install yfinance | ~uv add yfinance~ | +| Run notebook | ~uv run jupyter notebook~ | +| Check version | ~ticker.price()~ shows data update date | + +* Common Issues & Solutions + +| Issue | Solution | +|-------|----------| +| ~TypeError: unsupported operand type(s) for /: 'Decimal' and 'float'~ | Wrap values in ~float()~ | +| ~Rate limit exceeded~ | Switch to DefeatBeta | +| ~Real-time data needed~ | Use Yahoo Finance | +| ~Missing revenue breakdown~ | Use DefeatBeta ~revenue_by_segment()~ | +| ~Slow queries~ | Use DefeatBeta (DuckDB engine) | + +* Additional Resources + +- DefeatBeta-API: https://github.com/defeat-beta/defeatbeta-api +- Documentation: https://github.com/defeat-beta/defeatbeta-api/tree/main/doc +- DCF Examples: https://github.com/defeat-beta/defeatbeta-api/tree/main/doc/api/DCF_Examples.md +- Value Examples: https://github.com/defeat-beta/defeatbeta-api/tree/main/doc/api/Value_Examples.md + +* Footer +#+BEGIN_COMMENT +Last updated: 2026-04-25 +Author: Documentation +Version: 1.0 +#+END_COMMENT \ No newline at end of file diff --git a/explore_data.py b/explore_data.py new file mode 100644 index 0000000..94d1d12 --- /dev/null +++ b/explore_data.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python3 +""" +Explore defeatbeta-api data types and structure +""" + +from defeatbeta_api.data.ticker import Ticker + +def explore_data_types(): + """Explore the different data types returned by the API""" + + print("EXPLORING DEFEATBETA-API DATA TYPES") + print("="*70) + + # Test with Microsoft + msft = Ticker('MSFT') + + # 1. Explore Statement object + print("\n1. STATEMENT OBJECT EXPLORATION:") + print("-" * 40) + + income_stmt = msft.quarterly_income_statement() + print(f"Type: {type(income_stmt)}") + print(f"Available methods: {[m for m in dir(income_stmt) if not m.startswith('_')]}") + + # Try to get the data + try: + print("\nTrying income_stmt.data():") + data_result = income_stmt.data() + print(f"Result type: {type(data_result)}") + if hasattr(data_result, 'shape'): + print(f"Shape: {data_result.shape}") + except Exception as e: + print(f"data() method error: {type(e).__name__}: {e}") + + try: + print("\nTrying income_stmt.df():") + df_result = income_stmt.df() + print(f"Result type: {type(df_result)}") + if hasattr(df_result, 'shape'): + print(f"Shape: {df_result.shape}") + print(f"Columns: {list(df_result.columns)}") + print(f"\nFirst few breakdown items:") + print(df_result['Breakdown'].head(10).tolist()) + except Exception as e: + print(f"df() method error: {type(e).__name__}: {e}") + + # 2. Explore News object + print("\n\n2. NEWS OBJECT EXPLORATION:") + print("-" * 40) + + news = msft.news() + print(f"Type: {type(news)}") + print(f"Available methods: {[m for m in dir(news) if not m.startswith('_')]}") + + # 3. Explore Transcripts object + print("\n\n3. TRANSCRIPTS OBJECT EXPLORATION:") + print("-" * 40) + + transcripts = msft.earning_call_transcripts() + print(f"Type: {type(transcripts)}") + print(f"Available methods: {[m for m in dir(transcripts) if not m.startswith('_')]}") + + # Get transcripts list + try: + transcript_list = transcripts.get_transcripts_list() + print(f"\nget_transcripts_list() type: {type(transcript_list)}") + if hasattr(transcript_list, 'shape'): + print(f"Shape: {transcript_list.shape}") + print(f"Columns: {list(transcript_list.columns)}") + print(f"\nMost recent transcript: FY{transcript_list.iloc[-1]['fiscal_year']} Q{transcript_list.iloc[-1]['fiscal_quarter']}") + except Exception as e: + print(f"get_transcripts_list() error: {type(e).__name__}: {e}") + + # 4. Test practical data retrieval + print("\n\n4. PRACTICAL DATA RETRIEVAL:") + print("-" * 40) + + # Get recent financials + print("Recent quarterly metrics for MSFT:") + + # Price + price = msft.price() + print(f"\nPrice data: {len(price)} rows, from {price.iloc[0]['report_date']} to {price.iloc[-1]['report_date']}") + + # TTM metrics + ttm_eps = msft.ttm_eps() + print(f"TTM EPS: Latest = ${ttm_eps.iloc[-1]['tailing_eps']:.2f}") + + # Growth + growth = msft.quarterly_revenue_yoy_growth() + if not growth.empty: + print(f"Revenue YoY Growth: {growth.iloc[-1]['yoy_growth']:.2%}") + + # Ratios + ratios = msft.roe() + if not ratios.empty: + print(f"ROE: {ratios.iloc[-1]['roe']:.2%}") + + # Beta + beta = msft.beta() + if not beta.empty: + print(f"Beta: {beta.iloc[-1]['beta']:.2f}") + +def test_different_companies(): + """Test API with different types of companies""" + + print("\n\n5. TESTING DIFFERENT COMPANIES:") + print("="*70) + + companies = [ + ('GOOGL', 'Alphabet', 'Tech'), + ('JPM', 'JPMorgan Chase', 'Financial'), + ('JNJ', 'Johnson & Johnson', 'Healthcare'), + ('XOM', 'Exxon Mobil', 'Energy') + ] + + for symbol, name, sector in companies: + print(f"\n{symbol} - {name} ({sector}):") + print("-" * 30) + + try: + ticker = Ticker(symbol) + + # Quick stats + price = ticker.price() + if not price.empty: + print(f" Price: ${price.iloc[-1]['close']:.2f}") + + ttm_pe = ticker.ttm_pe() + if not ttm_pe.empty: + print(f" P/E: {ttm_pe.iloc[-1]['ttm_pe']:.2f}") + + market_cap = ticker.market_capitalization() + if not market_cap.empty: + mcap = market_cap.iloc[-1]['market_capitalization'] + print(f" Market Cap: ${mcap/1e9:.1f}B") + + roe = ticker.roe() + if not roe.empty: + print(f" ROE: {roe.iloc[-1]['roe']:.2%}") + + except Exception as e: + print(f" Error: {type(e).__name__}") + +if __name__ == "__main__": + explore_data_types() + test_different_companies() \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 67f8ed1..0e9d7ef 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,6 +40,7 @@ dependencies = [ "vectorbt>=1.0.0", "xgboost>=3.2.0", "yfinance>=1.3.0", + "defeatbeta-api>=0.0.45", ] [[tool.uv.index]] diff --git a/references/defeatbeta-api b/references/defeatbeta-api new file mode 160000 index 0000000..268d1b8 --- /dev/null +++ b/references/defeatbeta-api @@ -0,0 +1 @@ +Subproject commit 268d1b8df6b3b79be85d8bd0067b0349370676b5 diff --git a/run_notebook.sh b/run_notebook.sh new file mode 100755 index 0000000..7927367 --- /dev/null +++ b/run_notebook.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# Run the DefeatBeta tutorial notebook with proper environment + +echo "๐Ÿ“š DefeatBeta-API Tutorial Notebook" +echo "====================================" +echo "" +echo "This script will open the tutorial notebook with proper uv environment." +echo "" + +# Check if jupyter is available +if ! command -v jupyter &> /dev/null; then + echo "โŒ Jupyter not found. Installing..." + uv add jupyter +fi + +# Check if the notebook exists +if [ ! -f "defeatbeta_tutorial.ipynb" ]; then + echo "โŒ Notebook not found: defeatbeta_tutorial.ipynb" + exit 1 +fi + +echo "โœ… Environment ready" +echo "" +echo "Starting Jupyter notebook..." +echo "" +echo "๐Ÿ“ Contents:" +echo " 1. Quick Performance Test" +echo " 2. Price Data Comparison" +echo " 3. Valuation Metrics" +echo " 4. Financial Statements" +echo " 5. Financial Ratios" +echo " 6. Growth & Margin Metrics" +echo " 7. Earnings Transcripts (Unique!)" +echo " 8. Revenue Breakdown (Unique!)" +echo " 9. DCF Valuation (Unique!)" +echo " 10. Interactive Stock Analysis" +echo " 11. Stock Comparison" +echo " 12. Complete Method Reference" +echo "" +echo "๐Ÿš€ Launching notebook..." +echo "" + +# Run jupyter with uv +cd /home/df/scratch/trading/learn-trading +uv run jupyter notebook defeatbeta_tutorial.ipynb \ No newline at end of file diff --git a/test_defeatbeta.py b/test_defeatbeta.py new file mode 100644 index 0000000..7b24d5e --- /dev/null +++ b/test_defeatbeta.py @@ -0,0 +1,203 @@ +#!/usr/bin/env python3 +""" +Test script for defeatbeta-api demonstrating practical use cases +""" + +import pandas as pd +from defeatbeta_api.data.ticker import Ticker + +def analyze_stock(ticker_symbol): + """Analyze a stock using defeatbeta-api""" + print(f"\n{'='*60}") + print(f"ANALYZING {ticker_symbol}") + print(f"{'='*60}") + + # Create ticker instance + ticker = Ticker(ticker_symbol) + + # 1. Get basic price and valuation + print("\n1. PRICE AND VALUATION:") + price_data = ticker.price() + latest_price = price_data.iloc[-1] + print(f" Latest price: ${latest_price['close']:.2f}") + print(f" Date: {latest_price['report_date']}") + print(f" Volume: {latest_price['volume']:,}") + + # 2. Get TTM metrics + ttm_eps = ticker.ttm_eps() + if not ttm_eps.empty: + latest_eps = ttm_eps.iloc[-1]['tailing_eps'] + print(f"\n2. TTM METRICS:") + print(f" TTM EPS: ${latest_eps:.2f}") + + ttm_pe = ticker.ttm_pe() + if not ttm_pe.empty: + latest_pe = ttm_pe.iloc[-1]['ttm_pe'] + print(f" TTM P/E: {latest_pe:.2f}") + + # 3. Get market cap + market_cap = ticker.market_capitalization() + if not market_cap.empty: + latest_mcap = market_cap.iloc[-1]['market_capitalization'] + print(f" Market Cap: ${latest_mcap:,.2f}") + + # 4. Get financial ratios + print(f"\n3. FINANCIAL RATIOS:") + + roe = ticker.roe() + if not roe.empty: + latest_roe = roe.iloc[-1]['roe'] + print(f" ROE: {latest_roe:.2%}") + + roic = ticker.roic() + if not roic.empty: + latest_roic = roic.iloc[-1]['roic'] + print(f" ROIC: {latest_roic:.2%}") + + wacc = ticker.wacc() + if not wacc.empty: + latest_wacc = wacc.iloc[-1]['wacc'] + print(f" WACC: {latest_wacc:.2%}") + + # 5. Get beta + beta_data = ticker.beta() + if not beta_data.empty: + latest_beta = beta_data.iloc[-1]['beta'] + print(f" Beta (5Y): {latest_beta:.2f}") + + # 6. Get growth metrics + print(f"\n4. GROWTH METRICS:") + + revenue_growth = ticker.quarterly_revenue_yoy_growth() + if not revenue_growth.empty: + latest_rev_growth = revenue_growth.iloc[-1]['yoy_growth'] + print(f" Quarterly Revenue YoY Growth: {latest_rev_growth:.2%}") + + eps_growth = ticker.quarterly_eps_yoy_growth() + if not eps_growth.empty: + latest_eps_growth = eps_growth.iloc[-1]['yoy_growth'] + print(f" Quarterly EPS YoY Growth: {latest_eps_growth:.2%}") + + # 7. Get margin metrics + print(f"\n5. MARGIN METRICS:") + + gross_margin = ticker.quarterly_gross_margin() + if not gross_margin.empty: + latest_gross_margin = gross_margin.iloc[-1]['gross_margin'] + print(f" Gross Margin: {latest_gross_margin:.2%}") + + net_margin = ticker.quarterly_net_margin() + if not net_margin.empty: + latest_net_margin = net_margin.iloc[-1]['net_margin'] + print(f" Net Margin: {latest_net_margin:.2%}") + + # 8. Get income statement summary + print(f"\n6. INCOME STATEMENT SUMMARY (Latest Quarter):") + income_stmt = ticker.quarterly_income_statement() + try: + income_df = income_stmt.df() # df is a method, not a property + # Get key metrics + key_metrics = ['Total Revenue', 'Gross Profit', 'Operating Income', + 'Net Income Common Stockholders', 'Diluted EPS'] + + for metric in key_metrics: + if metric in income_df['Breakdown'].values: + row = income_df[income_df['Breakdown'] == metric] + if not row.empty: + latest_q = row.iloc[0]['TTM'] # TTM column has latest + print(f" {metric}: ${latest_q/1e6:,.2f}M" if 'Revenue' in metric or 'Profit' in metric or 'Income' in metric else f" {metric}: ${latest_q:.2f}") + except Exception as e: + print(f" Could not retrieve income statement details: {type(e).__name__}") + + # 9. Get revenue breakdown + print(f"\n7. REVENUE BREAKDOWN (Latest):") + revenue_segment = ticker.revenue_by_segment() + if not revenue_segment.empty: + latest_rev = revenue_segment.iloc[-1] + print(f" Total Revenue: ${latest_rev.iloc[2:].sum():,.0f}") + for col in revenue_segment.columns[2:]: # Skip symbol and report_date + if col in latest_rev: + value = latest_rev[col] + if pd.notna(value): + print(f" {col}: ${value:,.0f}") + + return ticker + +def compare_stocks(tickers): + """Compare multiple stocks""" + print(f"\n{'='*60}") + print(f"COMPARING STOCKS: {', '.join(tickers)}") + print(f"{'='*60}") + + comparison_data = [] + + for symbol in tickers: + ticker = Ticker(symbol) + + # Get key metrics + metrics = {'Symbol': symbol} + + # Price + price_data = ticker.price() + if not price_data.empty: + metrics['Price'] = price_data.iloc[-1]['close'] + + # TTM P/E + ttm_pe = ticker.ttm_pe() + if not ttm_pe.empty: + metrics['P/E'] = ttm_pe.iloc[-1]['ttm_pe'] + + # Market Cap + market_cap = ticker.market_capitalization() + if not market_cap.empty: + metrics['Market Cap'] = market_cap.iloc[-1]['market_capitalization'] + + # ROE + roe = ticker.roe() + if not roe.empty: + metrics['ROE'] = roe.iloc[-1]['roe'] + + # Revenue Growth + rev_growth = ticker.quarterly_revenue_yoy_growth() + if not rev_growth.empty: + metrics['Rev Growth'] = rev_growth.iloc[-1]['yoy_growth'] + + comparison_data.append(metrics) + + # Create comparison table + df = pd.DataFrame(comparison_data) + df.set_index('Symbol', inplace=True) + + # Format the table + print(f"\n{df.to_string(float_format=lambda x: f'{x:,.2f}' if isinstance(x, (int, float)) else str(x))}") + +def main(): + """Main function""" + print("DEFEATBETA-API DEMONSTRATION") + print("="*60) + + # Analyze individual stocks + stocks = ['NVDA', 'TSLA', 'AAPL'] + + for stock in stocks[:2]: # Just analyze first 2 to keep output manageable + analyze_stock(stock) + + # Compare all stocks + compare_stocks(stocks) + + print(f"\n{'='*60}") + print("API FEATURES DEMONSTRATED:") + print("1. Price and volume data") + print("2. TTM EPS and P/E ratios") + print("3. Market capitalization") + print("4. Financial ratios (ROE, ROIC, WACC)") + print("5. Beta calculation") + print("6. Growth metrics (Revenue, EPS YoY)") + print("7. Margin analysis") + print("8. Income statement summary") + print("9. Revenue segmentation") + print("10. Multi-stock comparison") + print(f"{'='*60}") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/uv.lock b/uv.lock index a6d9557..9e12d62 100644 --- a/uv.lock +++ b/uv.lock @@ -140,6 +140,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, ] +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + [[package]] name = "anyio" version = "4.13.0" @@ -176,6 +185,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" }, ] +[[package]] +name = "appscript" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lxml", marker = "sys_platform == 'darwin'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/52/2fa70edfd98f0058219ecc2e365a3ba7aabd42db14ff9d7f44bbdcc5400d/appscript-1.4.0.tar.gz", hash = "sha256:b2c6fc770bf822ea45529c7084bc0ee340e67ab260016b01d28e0449ec8723be", size = 295279, upload-time = "2025-10-08T07:56:39.126Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/5f/ac82464026fb5b9b63e3f08c935ac0e983ad7723b3959b9d0187f36eed82/appscript-1.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ddecaff061f829fcfe5b0452a272f9aa5ac1f61b3929fa18b6f0f100e8eaf306", size = 99623, upload-time = "2025-10-08T07:56:33.199Z" }, + { url = "https://files.pythonhosted.org/packages/6f/66/a18c2b519efa8f36d03c7e835748f13a2cef8179f6eb4e957d96e3d8c668/appscript-1.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8edab6b8def4862c9582e5d8f5f72c23a3749f2d059f80e4b5ae101a53805116", size = 85545, upload-time = "2025-10-08T07:56:34.27Z" }, + { url = "https://files.pythonhosted.org/packages/a3/04/d6f3889a9e281c5ae86913f427441c9b04fb1975e61548ad0525a73d6981/appscript-1.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7710db497d279d819f487dea686866b56c6c1e557befef4631b78553c523334c", size = 99618, upload-time = "2025-10-08T07:56:35.259Z" }, + { url = "https://files.pythonhosted.org/packages/59/fd/2259a7c6996628cabd9c7d5cc340bb695af31f047de17d70872caa4d7963/appscript-1.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0396978b95e06c2cabba117cc172add1df188c51a1b80fc6648aad16890a84c8", size = 85551, upload-time = "2025-10-08T07:56:36.311Z" }, + { url = "https://files.pythonhosted.org/packages/4d/15/748adf302d8f1f8f975bb26c1b918d84f1d39bb6c4730e0b91f551297984/appscript-1.4.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:1a5747425d2a5732e2854cab0d0dc893ef077cabd7d57f7ec4caea2ac313e19f", size = 99700, upload-time = "2025-10-08T07:56:37.313Z" }, + { url = "https://files.pythonhosted.org/packages/dd/e3/03dc0f97eab839f72061342d69bd34424e89876ce4026509aab3d74d4f23/appscript-1.4.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:5efce3302c00674b769b79938cc5f66f7791ef45c6419e850a5f1c8f9fcefcc1", size = 85610, upload-time = "2025-10-08T07:56:38.103Z" }, +] + [[package]] name = "arch" version = "8.0.0" @@ -896,6 +922,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, ] +[[package]] +name = "datasets" +version = "4.8.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dill" }, + { name = "filelock" }, + { name = "fsspec", extra = ["http"] }, + { name = "httpx" }, + { name = "huggingface-hub" }, + { name = "multiprocess" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pandas" }, + { name = "pyarrow" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "tqdm" }, + { name = "xxhash" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/22/73e46ac7a8c25e7ef0b3bd6f10da3465021d90219a32eb0b4d2afea4c56e/datasets-4.8.4.tar.gz", hash = "sha256:a1429ed853275ce7943a01c6d2e25475b4501eb758934362106a280470df3a52", size = 604382, upload-time = "2026-03-23T14:21:17.987Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/e5/247d094108e42ac26363ab8dc57f168840cf7c05774b40ffeb0d78868fcc/datasets-4.8.4-py3-none-any.whl", hash = "sha256:cdc8bee4698e549d78bf1fed6aea2eebc760b22b084f07e6fc020c6577a6ce6d", size = 526991, upload-time = "2026-03-23T14:21:15.89Z" }, +] + [[package]] name = "dateparser" version = "1.4.0" @@ -941,6 +992,37 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, ] +[[package]] +name = "defeatbeta-api" +version = "0.0.45" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "datasets" }, + { name = "duckdb" }, + { name = "huggingface-hub" }, + { name = "ipython" }, + { name = "matplotlib" }, + { name = "mcp" }, + { name = "nltk" }, + { name = "numpy" }, + { name = "openai" }, + { name = "openpyxl" }, + { name = "pandas" }, + { name = "psutil" }, + { name = "pyarrow" }, + { name = "pyfiglet" }, + { name = "requests" }, + { name = "rich" }, + { name = "seaborn" }, + { name = "tabulate" }, + { name = "urllib3" }, + { name = "xlwings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/44/df838bf9433e2ea28267b9aced8378801a26ae7392d1f060dd6235b8966c/defeatbeta_api-0.0.45.tar.gz", hash = "sha256:51ce4e073c677f5cc270166dac5ab85f37d83ae9c64417d53b454e78527d291c", size = 319836, upload-time = "2026-02-25T06:36:18.94Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/7a/ff42c57a9ae57423c3236e952166a92acf898356b2b1b318c2cd9eb95fab/defeatbeta_api-0.0.45-py3-none-any.whl", hash = "sha256:4dc355623a9eac400003f1bd1ab6818a6e1a8c780c19aed41b8f4cf6fcb5b6b2", size = 301609, upload-time = "2026-02-25T06:36:17.252Z" }, +] + [[package]] name = "defusedxml" version = "0.7.1" @@ -959,6 +1041,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl", hash = "sha256:1e1ce33e978ae97fcfcff5638477032b801c46c7c65cf717f95fbc2248f79a9d", size = 120019, upload-time = "2026-01-19T02:36:55.663Z" }, ] +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, +] + [[package]] name = "docutils" version = "0.22.4" @@ -968,6 +1059,35 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl", hash = "sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de", size = 633196, upload-time = "2025-12-18T19:00:18.077Z" }, ] +[[package]] +name = "duckdb" +version = "1.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7f/da/17c3eb5458af69d54dedc8d18e4a32ceaa8ce4d4c699d45d6d8287e790c3/duckdb-1.4.3.tar.gz", hash = "sha256:fea43e03604c713e25a25211ada87d30cd2a044d8f27afab5deba26ac49e5268", size = 18478418, upload-time = "2025-12-09T10:59:22.945Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/d7/fdc2139b94297fc5659110a38adde293d025e320673ae5e472b95d323c50/duckdb-1.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:6302452e57aef29aae3977063810ed7b2927967b97912947b9cca45c1c21955f", size = 29033112, upload-time = "2025-12-09T10:58:16.52Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d9/ca93df1ce19aef8f799e3aaacf754a4dde7e9169c0b333557752d21d076a/duckdb-1.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:deab351ac43b6282a3270e3d40e3d57b3b50f472d9fd8c30975d88a31be41231", size = 15414646, upload-time = "2025-12-09T10:58:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/16/90/9f2748e740f5fc05b739e7c5c25aab6ab4363e5da4c3c70419c7121dc806/duckdb-1.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5634e40e1e2d972e4f75bced1fbdd9e9e90faa26445c1052b27de97ee546944a", size = 13740477, upload-time = "2025-12-09T10:58:21.778Z" }, + { url = "https://files.pythonhosted.org/packages/5f/ec/279723615b4fb454efd823b7efe97cf2504569e2e74d15defbbd6b027901/duckdb-1.4.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:274d4a31aba63115f23e7e7b401e3e3a937f3626dc9dea820a9c7d3073f450d2", size = 18483715, upload-time = "2025-12-09T10:58:24.346Z" }, + { url = "https://files.pythonhosted.org/packages/10/63/af20cd20fd7fd6565ea5a1578c16157b6a6e07923e459a6f9b0dc9ada308/duckdb-1.4.3-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f868a7e6d9b37274a1aa34849ea92aa964e9bd59a5237d6c17e8540533a1e4f", size = 20495188, upload-time = "2025-12-09T10:58:26.806Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ab/0acb4b64afb2cc6c1d458a391c64e36be40137460f176c04686c965ce0e0/duckdb-1.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:ef7ef15347ce97201b1b5182a5697682679b04c3374d5a01ac10ba31cf791b95", size = 12335622, upload-time = "2025-12-09T10:58:29.707Z" }, + { url = "https://files.pythonhosted.org/packages/50/d5/2a795745f6597a5e65770141da6efdc4fd754e5ee6d652f74bcb7f9c7759/duckdb-1.4.3-cp312-cp312-win_arm64.whl", hash = "sha256:1b9b445970fd18274d5ac07a0b24c032e228f967332fb5ebab3d7db27738c0e4", size = 13075834, upload-time = "2025-12-09T10:58:32.036Z" }, + { url = "https://files.pythonhosted.org/packages/fd/76/288cca43a10ddd082788e1a71f1dc68d9130b5d078c3ffd0edf2f3a8719f/duckdb-1.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:16952ac05bd7e7b39946695452bf450db1ebbe387e1e7178e10f593f2ea7b9a8", size = 29033392, upload-time = "2025-12-09T10:58:34.631Z" }, + { url = "https://files.pythonhosted.org/packages/64/07/cbad3d3da24af4d1add9bccb5fb390fac726ffa0c0cebd29bf5591cef334/duckdb-1.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de984cd24a6cbefdd6d4a349f7b9a46e583ca3e58ce10d8def0b20a6e5fcbe78", size = 15414567, upload-time = "2025-12-09T10:58:37.051Z" }, + { url = "https://files.pythonhosted.org/packages/c4/19/57af0cc66ba2ffb8900f567c9aec188c6ab2a7b3f2260e9c6c3c5f9b57b1/duckdb-1.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e5457dda91b67258aae30fb1a0df84183a9f6cd27abac1d5536c0d876c6dfa1", size = 13740960, upload-time = "2025-12-09T10:58:39.658Z" }, + { url = "https://files.pythonhosted.org/packages/73/dd/23152458cf5fd51e813fadda60b9b5f011517634aa4bb9301f5f3aa951d8/duckdb-1.4.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:006aca6a6d6736c441b02ff5c7600b099bb8b7f4de094b8b062137efddce42df", size = 18484312, upload-time = "2025-12-09T10:58:42.054Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7b/adf3f611f11997fc429d4b00a730604b65d952417f36a10c4be6e38e064d/duckdb-1.4.3-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2813f4635f4d6681cc3304020374c46aca82758c6740d7edbc237fe3aae2744", size = 20495571, upload-time = "2025-12-09T10:58:44.646Z" }, + { url = "https://files.pythonhosted.org/packages/40/d5/6b7ddda7713a788ab2d622c7267ec317718f2bdc746ce1fca49b7ff0e50f/duckdb-1.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:6db124f53a3edcb32b0a896ad3519e37477f7e67bf4811cb41ab60c1ef74e4c8", size = 12335680, upload-time = "2025-12-09T10:58:46.883Z" }, + { url = "https://files.pythonhosted.org/packages/e8/28/0670135cf54525081fded9bac1254f78984e3b96a6059cd15aca262e3430/duckdb-1.4.3-cp313-cp313-win_arm64.whl", hash = "sha256:a8b0a8764e1b5dd043d168c8f749314f7a1252b5a260fa415adaa26fa3b958fd", size = 13075161, upload-time = "2025-12-09T10:58:49.47Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f4/a38651e478fa41eeb8e43a0a9c0d4cd8633adea856e3ac5ac95124b0fdbf/duckdb-1.4.3-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:316711a9e852bcfe1ed6241a5f654983f67e909e290495f3562cccdf43be8180", size = 29042272, upload-time = "2025-12-09T10:58:51.826Z" }, + { url = "https://files.pythonhosted.org/packages/16/de/2cf171a66098ce5aeeb7371511bd2b3d7b73a2090603b0b9df39f8aaf814/duckdb-1.4.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:9e625b2b4d52bafa1fd0ebdb0990c3961dac8bb00e30d327185de95b68202131", size = 15419343, upload-time = "2025-12-09T10:58:54.439Z" }, + { url = "https://files.pythonhosted.org/packages/35/28/6b0a7830828d4e9a37420d87e80fe6171d2869a9d3d960bf5d7c3b8c7ee4/duckdb-1.4.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:130c6760f6c573f9c9fe9aba56adba0fab48811a4871b7b8fd667318b4a3e8da", size = 13748905, upload-time = "2025-12-09T10:58:56.656Z" }, + { url = "https://files.pythonhosted.org/packages/15/4d/778628e194d63967870873b9581c8a6b4626974aa4fbe09f32708a2d3d3a/duckdb-1.4.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20c88effaa557a11267706b01419c542fe42f893dee66e5a6daa5974ea2d4a46", size = 18487261, upload-time = "2025-12-09T10:58:58.866Z" }, + { url = "https://files.pythonhosted.org/packages/c6/5f/87e43af2e4a0135f9675449563e7c2f9b6f1fe6a2d1691c96b091f3904dd/duckdb-1.4.3-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1b35491db98ccd11d151165497c084a9d29d3dc42fc80abea2715a6c861ca43d", size = 20497138, upload-time = "2025-12-09T10:59:01.241Z" }, + { url = "https://files.pythonhosted.org/packages/94/41/abec537cc7c519121a2a83b9a6f180af8915fabb433777dc147744513e74/duckdb-1.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:23b12854032c1a58d0452e2b212afa908d4ce64171862f3792ba9a596ba7c765", size = 12836056, upload-time = "2025-12-09T10:59:03.388Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5a/8af5b96ce5622b6168854f479ce846cf7fb589813dcc7d8724233c37ded3/duckdb-1.4.3-cp314-cp314-win_arm64.whl", hash = "sha256:90f241f25cffe7241bf9f376754a5845c74775e00e1c5731119dc88cd71e0cb2", size = 13527759, upload-time = "2025-12-09T10:59:05.496Z" }, +] + [[package]] name = "empyrical-reloaded" version = "0.5.12" @@ -984,6 +1104,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/69/54/23d8f6d36c66575b8d31e354c8bba2c857f9ca41e4b76388c6ca53938fd8/empyrical_reloaded-0.5.12-py3-none-any.whl", hash = "sha256:1bd8b53810c760ae5a12a03f2cefc6af0e905f854b71e7d99074b673abdd4fd6", size = 33048, upload-time = "2025-06-01T23:17:09.958Z" }, ] +[[package]] +name = "et-xmlfile" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234, upload-time = "2024-10-25T17:25:40.039Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059, upload-time = "2024-10-25T17:25:39.051Z" }, +] + [[package]] name = "executing" version = "2.2.1" @@ -1174,11 +1303,16 @@ wheels = [ [[package]] name = "fsspec" -version = "2026.3.0" +version = "2026.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e1/cf/b50ddf667c15276a9ab15a70ef5f257564de271957933ffea49d2cdbcdfb/fsspec-2026.3.0.tar.gz", hash = "sha256:1ee6a0e28677557f8c2f994e3eea77db6392b4de9cd1f5d7a9e87a0ae9d01b41", size = 313547, upload-time = "2026-03-27T19:11:14.892Z" } +sdist = { url = "https://files.pythonhosted.org/packages/51/7c/f60c259dcbf4f0c47cc4ddb8f7720d2dcdc8888c8e5ad84c73ea4531cc5b/fsspec-2026.2.0.tar.gz", hash = "sha256:6544e34b16869f5aacd5b90bdf1a71acb37792ea3ddf6125ee69a22a53fb8bff", size = 313441, upload-time = "2026-02-05T21:50:53.743Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/1f/5f4a3cd9e4440e9d9bc78ad0a91a1c8d46b4d429d5239ebe6793c9fe5c41/fsspec-2026.3.0-py3-none-any.whl", hash = "sha256:d2ceafaad1b3457968ed14efa28798162f1638dbb5d2a6868a2db002a5ee39a4", size = 202595, upload-time = "2026-03-27T19:11:13.595Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl", hash = "sha256:98de475b5cb3bd66bedd5c4679e87b4fdfe1a3bf4d707b151b3c07e58c9a2437", size = 202505, upload-time = "2026-02-05T21:50:51.819Z" }, +] + +[package.optional-dependencies] +http = [ + { name = "aiohttp" }, ] [[package]] @@ -1314,6 +1448,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, ] +[[package]] +name = "httpx-sse" +version = "0.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/4c/751061ffa58615a32c31b2d82e8482be8dd4a89154f003147acee90f2be9/httpx_sse-0.4.3.tar.gz", hash = "sha256:9b1ed0127459a66014aec3c56bebd93da3c1bc8bb6618c8082039a44889a755d", size = 15943, upload-time = "2025-10-10T21:48:22.271Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/fd/6668e5aec43ab844de6fc74927e155a3b37bf40d7c3790e49fc0406b6578/httpx_sse-0.4.3-py3-none-any.whl", hash = "sha256:0ac1c9fe3c0afad2e0ebb25a934a59f4c7823b60792691f779fad2c5568830fc", size = 8960, upload-time = "2025-10-10T21:48:21.158Z" }, +] + [[package]] name = "huggingface-hub" version = "1.12.0" @@ -1382,36 +1525,22 @@ wheels = [ [[package]] name = "ipython" -version = "9.13.0" +version = "8.37.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "decorator" }, - { name = "ipython-pygments-lexers" }, { name = "jedi" }, { name = "matplotlib-inline" }, { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, { name = "prompt-toolkit" }, - { name = "psutil" }, { name = "pygments" }, { name = "stack-data" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cd/c4/87cda5842cf5c31837c06ddb588e11c3c35d8ece89b7a0108c06b8c9b00a/ipython-9.13.0.tar.gz", hash = "sha256:7e834b6afc99f020e3f05966ced34792f40267d64cb1ea9043886dab0dde5967", size = 4430549, upload-time = "2026-04-24T12:24:55.221Z" } +sdist = { url = "https://files.pythonhosted.org/packages/85/31/10ac88f3357fc276dc8a64e8880c82e80e7459326ae1d0a211b40abf6665/ipython-8.37.0.tar.gz", hash = "sha256:ca815841e1a41a1e6b73a0b08f3038af9b2252564d01fc405356d34033012216", size = 5606088, upload-time = "2025-05-31T16:39:09.613Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl", hash = "sha256:57f9d4639e20818d328d287c7b549af3d05f12486ea8f2e7f73e52a36ec4d201", size = 627274, upload-time = "2026-04-24T12:24:53.038Z" }, -] - -[[package]] -name = "ipython-pygments-lexers" -version = "1.1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pygments" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, + { url = "https://files.pythonhosted.org/packages/91/d0/274fbf7b0b12643cbbc001ce13e6a5b1607ac4929d1b11c72460152c9fc3/ipython-8.37.0-py3-none-any.whl", hash = "sha256:ed87326596b878932dbcb171e3e698845434d8c61b8d8cd474bf663041a9dcf2", size = 831864, upload-time = "2025-05-31T16:39:06.38Z" }, ] [[package]] @@ -1475,6 +1604,78 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] +[[package]] +name = "jiter" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/c1/0cddc6eb17d4c53a99840953f95dd3accdc5cfc7a337b0e9b26476276be9/jiter-0.14.0.tar.gz", hash = "sha256:e8a39e66dac7153cf3f964a12aad515afa8d74938ec5cc0018adcdae5367c79e", size = 165725, upload-time = "2026-04-10T14:28:42.01Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/68/7390a418f10897da93b158f2d5a8bd0bcd73a0f9ec3bb36917085bb759ef/jiter-0.14.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:2fb2ce3a7bc331256dfb14cefc34832366bb28a9aca81deaf43bbf2a5659e607", size = 316295, upload-time = "2026-04-10T14:26:24.887Z" }, + { url = "https://files.pythonhosted.org/packages/60/a0/5854ac00ff63551c52c6c89534ec6aba4b93474e7924d64e860b1c94165b/jiter-0.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5252a7ca23785cef5d02d4ece6077a1b556a410c591b379f82091c3001e14844", size = 315898, upload-time = "2026-04-10T14:26:26.601Z" }, + { url = "https://files.pythonhosted.org/packages/41/a1/4f44832650a16b18e8391f1bf1d6ca4909bc738351826bcc198bba4357f4/jiter-0.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c409578cbd77c338975670ada777add4efd53379667edf0aceea730cabede6fb", size = 343730, upload-time = "2026-04-10T14:26:28.326Z" }, + { url = "https://files.pythonhosted.org/packages/48/64/a329e9d469f86307203594b1707e11ae51c3348d03bfd514a5f997870012/jiter-0.14.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7ede4331a1899d604463369c730dbb961ffdc5312bc7f16c41c2896415b1304a", size = 370102, upload-time = "2026-04-10T14:26:30.089Z" }, + { url = "https://files.pythonhosted.org/packages/94/c1/5e3dfc59635aa4d4c7bd20a820ac1d09b8ed851568356802cf1c08edb3cf/jiter-0.14.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92cd8b6025981a041f5310430310b55b25ca593972c16407af8837d3d7d2ca01", size = 461335, upload-time = "2026-04-10T14:26:31.911Z" }, + { url = "https://files.pythonhosted.org/packages/e3/1b/dd157009dbc058f7b00108f545ccb72a2d56461395c4fc7b9cfdccb00af4/jiter-0.14.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:351bf6eda4e3a7ceb876377840c702e9a3e4ecc4624dbfb2d6463c67ae52637d", size = 378536, upload-time = "2026-04-10T14:26:33.595Z" }, + { url = "https://files.pythonhosted.org/packages/91/78/256013667b7c10b8834f8e6e54cd3e562d4c6e34227a1596addccc05e38c/jiter-0.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1dcfbeb93d9ecd9ca128bbf8910120367777973fa193fb9a39c31237d8df165", size = 353859, upload-time = "2026-04-10T14:26:35.098Z" }, + { url = "https://files.pythonhosted.org/packages/de/d9/137d65ade9093a409fe80955ce60b12bb753722c986467aeda47faf450ad/jiter-0.14.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:ae039aaef8de3f8157ecc1fdd4d85043ac4f57538c245a0afaecb8321ec951c3", size = 357626, upload-time = "2026-04-10T14:26:36.685Z" }, + { url = "https://files.pythonhosted.org/packages/2e/48/76750835b87029342727c1a268bea8878ab988caf81ee4e7b880900eeb5a/jiter-0.14.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7d9d51eb96c82a9652933bd769fe6de66877d6eb2b2440e281f2938c51b5643e", size = 393172, upload-time = "2026-04-10T14:26:38.097Z" }, + { url = "https://files.pythonhosted.org/packages/a6/60/456c4e81d5c8045279aefe60e9e483be08793828800a4e64add8fdde7f2a/jiter-0.14.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d824ca4148b705970bf4e120924a212fdfca9859a73e42bd7889a63a4ea6bb98", size = 520300, upload-time = "2026-04-10T14:26:39.532Z" }, + { url = "https://files.pythonhosted.org/packages/a8/9f/2020e0984c235f678dced38fe4eec3058cf528e6af36ebf969b410305941/jiter-0.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ff3a6465b3a0f54b1a430f45c3c0ba7d61ceb45cbc3e33f9e1a7f638d690baf3", size = 553059, upload-time = "2026-04-10T14:26:40.991Z" }, + { url = "https://files.pythonhosted.org/packages/ef/32/e2d298e1a22a4bbe6062136d1c7192db7dba003a6975e51d9a9eecabc4c2/jiter-0.14.0-cp312-cp312-win32.whl", hash = "sha256:5dec7c0a3e98d2a3f8a2e67382d0d7c3ac60c69103a4b271da889b4e8bb1e129", size = 206030, upload-time = "2026-04-10T14:26:42.517Z" }, + { url = "https://files.pythonhosted.org/packages/36/ac/96369141b3d8a4a8e4590e983085efe1c436f35c0cda940dd76d942e3e40/jiter-0.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:fc7e37b4b8bc7e80a63ad6cfa5fc11fab27dbfea4cc4ae644b1ab3f273dc348f", size = 201603, upload-time = "2026-04-10T14:26:44.328Z" }, + { url = "https://files.pythonhosted.org/packages/01/c3/75d847f264647017d7e3052bbcc8b1e24b95fa139c320c5f5066fa7a0bdd/jiter-0.14.0-cp312-cp312-win_arm64.whl", hash = "sha256:ee4a72f12847ef29b072aee9ad5474041ab2924106bdca9fcf5d7d965853e057", size = 191525, upload-time = "2026-04-10T14:26:46Z" }, + { url = "https://files.pythonhosted.org/packages/97/2a/09f70020898507a89279659a1afe3364d57fc1b2c89949081975d135f6f5/jiter-0.14.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:af72f204cf4d44258e5b4c1745130ac45ddab0e71a06333b01de660ab4187a94", size = 315502, upload-time = "2026-04-10T14:26:47.697Z" }, + { url = "https://files.pythonhosted.org/packages/d6/be/080c96a45cd74f9fce5db4fd68510b88087fb37ffe2541ff73c12db92535/jiter-0.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4b77da71f6e819be5fbcec11a453fde5b1d0267ef6ed487e2a392fd8e14e4e3a", size = 314870, upload-time = "2026-04-10T14:26:49.149Z" }, + { url = "https://files.pythonhosted.org/packages/7d/5e/2d0fee155826a968a832cc32438de5e2a193292c8721ca70d0b53e58245b/jiter-0.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f4ea612fe8b84b8b04e51d0e78029ecf3466348e25973f953de6e6a59aa4c1", size = 343406, upload-time = "2026-04-10T14:26:50.762Z" }, + { url = "https://files.pythonhosted.org/packages/70/af/bf9ee0d3a4f8dc0d679fc1337f874fe60cdbf841ebbb304b374e1c9aaceb/jiter-0.14.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62fe2451f8fcc0240261e6a4df18ecbcd58327857e61e625b2393ea3b468aac9", size = 369415, upload-time = "2026-04-10T14:26:52.188Z" }, + { url = "https://files.pythonhosted.org/packages/0f/83/8e8561eadba31f4d3948a5b712fb0447ec71c3560b57a855449e7b8ddc98/jiter-0.14.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6112f26f5afc75bcb475787d29da3aa92f9d09c7858f632f4be6ffe607be82e9", size = 461456, upload-time = "2026-04-10T14:26:53.611Z" }, + { url = "https://files.pythonhosted.org/packages/f6/c9/c5299e826a5fe6108d172b344033f61c69b1bb979dd8d9ddd4278a160971/jiter-0.14.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:215a6cb8fb7dc702aa35d475cc00ddc7f970e5c0b1417fb4b4ac5d82fa2a29db", size = 378488, upload-time = "2026-04-10T14:26:55.211Z" }, + { url = "https://files.pythonhosted.org/packages/5d/37/c16d9d15c0a471b8644b1abe3c82668092a707d9bedcf076f24ff2e380cd/jiter-0.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4ab96a30fb3cb2c7e0cd33f7616c8860da5f5674438988a54ac717caccdbaa", size = 353242, upload-time = "2026-04-10T14:26:56.705Z" }, + { url = "https://files.pythonhosted.org/packages/58/ea/8050cb0dc654e728e1bfacbc0c640772f2181af5dedd13ae70145743a439/jiter-0.14.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:3a99c1387b1f2928f799a9de899193484d66206a50e98233b6b088a7f0c1edb2", size = 356823, upload-time = "2026-04-10T14:26:58.281Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3b/cf71506d270e5f84d97326bf220e47aed9b95e9a4a060758fb07772170ab/jiter-0.14.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ab18d11074485438695f8d34a1b6da61db9754248f96d51341956607a8f39985", size = 392564, upload-time = "2026-04-10T14:27:00.018Z" }, + { url = "https://files.pythonhosted.org/packages/b0/cc/8c6c74a3efb5bd671bfd14f51e8a73375464ca914b1551bc3b40e26ac2c9/jiter-0.14.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:801028dcfc26ac0895e4964cbc0fd62c73be9fd4a7d7b1aaf6e5790033a719b7", size = 520322, upload-time = "2026-04-10T14:27:01.664Z" }, + { url = "https://files.pythonhosted.org/packages/41/24/68d7b883ec959884ddf00d019b2e0e82ba81b167e1253684fa90519ce33c/jiter-0.14.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ad425b087aafb4a1c7e1e98a279200743b9aaf30c3e0ba723aec93f061bd9bc8", size = 552619, upload-time = "2026-04-10T14:27:03.316Z" }, + { url = "https://files.pythonhosted.org/packages/b6/89/b1a0985223bbf3150ff9e8f46f98fc9360c1de94f48abe271bbe1b465682/jiter-0.14.0-cp313-cp313-win32.whl", hash = "sha256:882bcb9b334318e233950b8be366fe5f92c86b66a7e449e76975dfd6d776a01f", size = 205699, upload-time = "2026-04-10T14:27:04.662Z" }, + { url = "https://files.pythonhosted.org/packages/4c/19/3f339a5a7f14a11730e67f6be34f9d5105751d547b615ef593fa122a5ded/jiter-0.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:9b8c571a5dba09b98bd3462b5a53f27209a5cbbe85670391692ede71974e979f", size = 201323, upload-time = "2026-04-10T14:27:06.139Z" }, + { url = "https://files.pythonhosted.org/packages/50/56/752dd89c84be0e022a8ea3720bcfa0a8431db79a962578544812ce061739/jiter-0.14.0-cp313-cp313-win_arm64.whl", hash = "sha256:34f19dcc35cb1abe7c369b3756babf8c7f04595c0807a848df8f26ef8298ef92", size = 191099, upload-time = "2026-04-10T14:27:07.564Z" }, + { url = "https://files.pythonhosted.org/packages/91/28/292916f354f25a1fe8cf2c918d1415c699a4a659ae00be0430e1c5d9ffea/jiter-0.14.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e89bcd7d426a75bb4952c696b267075790d854a07aad4c9894551a82c5b574ab", size = 320880, upload-time = "2026-04-10T14:27:09.326Z" }, + { url = "https://files.pythonhosted.org/packages/ad/c7/b002a7d8b8957ac3d469bd59c18ef4b1595a5216ae0de639a287b9816023/jiter-0.14.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b25beaa0d4447ea8c7ae0c18c688905d34840d7d0b937f2f7bdd52162c98a40", size = 346563, upload-time = "2026-04-10T14:27:11.287Z" }, + { url = "https://files.pythonhosted.org/packages/f9/3b/f8d07580d8706021d255a6356b8fab13ee4c869412995550ce6ed4ddf97d/jiter-0.14.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:651a8758dd413c51e3b7f6557cdc6921faf70b14106f45f969f091f5cda990ea", size = 357928, upload-time = "2026-04-10T14:27:12.729Z" }, + { url = "https://files.pythonhosted.org/packages/47/5b/ac1a974da29e35507230383110ffec59998b290a8732585d04e19a9eb5ba/jiter-0.14.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e1a7eead856a5038a8d291f1447176ab0b525c77a279a058121b5fccee257f6f", size = 203519, upload-time = "2026-04-10T14:27:14.125Z" }, + { url = "https://files.pythonhosted.org/packages/96/6d/9fc8433d667d2454271378a79747d8c76c10b51b482b454e6190e511f244/jiter-0.14.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e692633a12cda97e352fdcd1c4acc971b1c28707e1e33aeef782b0cbf051975", size = 190113, upload-time = "2026-04-10T14:27:16.638Z" }, + { url = "https://files.pythonhosted.org/packages/4f/1e/354ed92461b165bd581f9ef5150971a572c873ec3b68a916d5aa91da3cc2/jiter-0.14.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:6f396837fc7577871ca8c12edaf239ed9ccef3bbe39904ae9b8b63ce0a48b140", size = 315277, upload-time = "2026-04-10T14:27:18.109Z" }, + { url = "https://files.pythonhosted.org/packages/a6/95/8c7c7028aa8636ac21b7a55faef3e34215e6ed0cbf5ae58258427f621aa3/jiter-0.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a4d50ea3d8ba4176f79754333bd35f1bbcd28e91adc13eb9b7ca91bc52a6cef9", size = 315923, upload-time = "2026-04-10T14:27:19.603Z" }, + { url = "https://files.pythonhosted.org/packages/47/40/e2a852a44c4a089f2681a16611b7ce113224a80fd8504c46d78491b47220/jiter-0.14.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce17f8a050447d1b4153bda4fb7d26e6a9e74eb4f4a41913f30934c5075bf615", size = 344943, upload-time = "2026-04-10T14:27:21.262Z" }, + { url = "https://files.pythonhosted.org/packages/fc/1f/670f92adee1e9895eac41e8a4d623b6da68c4d46249d8b556b60b63f949e/jiter-0.14.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f4f1c4b125e1652aefbc2e2c1617b60a160ab789d180e3d423c41439e5f32850", size = 369725, upload-time = "2026-04-10T14:27:22.766Z" }, + { url = "https://files.pythonhosted.org/packages/01/2f/541c9ba567d05de1c4874a0f8f8c5e3fd78e2b874266623da9a775cf46e0/jiter-0.14.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be808176a6a3a14321d18c603f2d40741858a7c4fc982f83232842689fe86dd9", size = 461210, upload-time = "2026-04-10T14:27:24.315Z" }, + { url = "https://files.pythonhosted.org/packages/ce/a9/c31cbec09627e0d5de7aeaec7690dba03e090caa808fefd8133137cf45bc/jiter-0.14.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26679d58ba816f88c3849306dd58cb863a90a1cf352cdd4ef67e30ccf8a77994", size = 380002, upload-time = "2026-04-10T14:27:26.155Z" }, + { url = "https://files.pythonhosted.org/packages/50/02/3c05c1666c41904a2f607475a73e7a4763d1cbde2d18229c4f85b22dc253/jiter-0.14.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80381f5a19af8fa9aef743f080e34f6b25ebd89656475f8cf0470ec6157052aa", size = 354678, upload-time = "2026-04-10T14:27:27.701Z" }, + { url = "https://files.pythonhosted.org/packages/7d/97/e15b33545c2b13518f560d695f974b9891b311641bdcf178d63177e8801e/jiter-0.14.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:004df5fdb8ecbd6d99f3227df18ba1a259254c4359736a2e6f036c944e02d7c5", size = 358920, upload-time = "2026-04-10T14:27:29.256Z" }, + { url = "https://files.pythonhosted.org/packages/ad/d2/8b1461def6b96ba44530df20d07ef7a1c7da22f3f9bf1727e2d611077bf1/jiter-0.14.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cff5708f7ed0fa098f2b53446c6fa74c48469118e5cd7497b4f1cd569ab06928", size = 394512, upload-time = "2026-04-10T14:27:31.344Z" }, + { url = "https://files.pythonhosted.org/packages/e3/88/837566dd6ed6e452e8d3205355afd484ce44b2533edfa4ed73a298ea893e/jiter-0.14.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:2492e5f06c36a976d25c7cc347a60e26d5470178d44cde1b9b75e60b4e519f28", size = 521120, upload-time = "2026-04-10T14:27:33.299Z" }, + { url = "https://files.pythonhosted.org/packages/89/6b/b00b45c4d1b4c031777fe161d620b755b5b02cdade1e316dcb46e4471d63/jiter-0.14.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:7609cfbe3a03d37bfdbf5052012d5a879e72b83168a363deae7b3a26564d57de", size = 553668, upload-time = "2026-04-10T14:27:34.868Z" }, + { url = "https://files.pythonhosted.org/packages/ad/d8/6fe5b42011d19397433d345716eac16728ac241862a2aac9c91923c7509a/jiter-0.14.0-cp314-cp314-win32.whl", hash = "sha256:7282342d32e357543565286b6450378c3cd402eea333fc1ebe146f1fabb306fc", size = 207001, upload-time = "2026-04-10T14:27:36.455Z" }, + { url = "https://files.pythonhosted.org/packages/e5/43/5c2e08da1efad5e410f0eaaabeadd954812612c33fbbd8fd5328b489139d/jiter-0.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:bd77945f38866a448e73b0b7637366afa814d4617790ecd88a18ca74377e6c02", size = 202187, upload-time = "2026-04-10T14:27:38Z" }, + { url = "https://files.pythonhosted.org/packages/aa/1f/6e39ac0b4cdfa23e606af5b245df5f9adaa76f35e0c5096790da430ca506/jiter-0.14.0-cp314-cp314-win_arm64.whl", hash = "sha256:f2d4c61da0821ee42e0cdf5489da60a6d074306313a377c2b35af464955a3611", size = 192257, upload-time = "2026-04-10T14:27:39.504Z" }, + { url = "https://files.pythonhosted.org/packages/05/57/7dbc0ffbbb5176a27e3518716608aa464aee2e2887dc938f0b900a120449/jiter-0.14.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1bf7ff85517dd2f20a5750081d2b75083c1b269cf75afc7511bdf1f9548beb3b", size = 323441, upload-time = "2026-04-10T14:27:41.039Z" }, + { url = "https://files.pythonhosted.org/packages/83/6e/7b3314398d8983f06b557aa21b670511ec72d3b79a68ee5e4d9bff972286/jiter-0.14.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8ef8791c3e78d6c6b157c6d360fbb5c715bebb8113bc6a9303c5caff012754a", size = 348109, upload-time = "2026-04-10T14:27:42.552Z" }, + { url = "https://files.pythonhosted.org/packages/ae/4f/8dc674bcd7db6dba566de73c08c763c337058baff1dbeb34567045b27cdc/jiter-0.14.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e74663b8b10da1fe0f4e4703fd7980d24ad17174b6bb35d8498d6e3ebce2ae6a", size = 368328, upload-time = "2026-04-10T14:27:44.574Z" }, + { url = "https://files.pythonhosted.org/packages/3b/5f/188e09a1f20906f98bbdec44ed820e19f4e8eb8aff88b9d1a5a497587ff3/jiter-0.14.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1aca29ba52913f78362ec9c2da62f22cdc4c3083313403f90c15460979b84d9b", size = 463301, upload-time = "2026-04-10T14:27:46.717Z" }, + { url = "https://files.pythonhosted.org/packages/ac/f0/19046ef965ed8f349e8554775bb12ff4352f443fbe12b95d31f575891256/jiter-0.14.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8b39b7d87a952b79949af5fef44d2544e58c21a28da7f1bae3ef166455c61746", size = 378891, upload-time = "2026-04-10T14:27:48.32Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c3/da43bd8431ee175695777ee78cf0e93eacbb47393ff493f18c45231b427d/jiter-0.14.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d918a68b26e9fab068c2b5453577ef04943ab2807b9a6275df2a812599a310", size = 360749, upload-time = "2026-04-10T14:27:49.88Z" }, + { url = "https://files.pythonhosted.org/packages/72/26/e054771be889707c6161dbdec9c23d33a9ec70945395d70f07cfea1e9a6f/jiter-0.14.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:b08997c35aee1201c1a5361466a8fb9162d03ae7bf6568df70b6c859f1e654a4", size = 358526, upload-time = "2026-04-10T14:27:51.504Z" }, + { url = "https://files.pythonhosted.org/packages/c3/0f/7bea65ea2a6d91f2bf989ff11a18136644392bf2b0497a1fa50934c30a9c/jiter-0.14.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:260bf7ca20704d58d41f669e5e9fe7fe2fa72901a6b324e79056f5d52e9c9be2", size = 393926, upload-time = "2026-04-10T14:27:53.368Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a1/b1ff7d70deef61ac0b7c6c2f12d2ace950cdeecb4fdc94500a0926802857/jiter-0.14.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:37826e3df29e60f30a382f9294348d0238ef127f4b5d7f5f8da78b5b9e050560", size = 521052, upload-time = "2026-04-10T14:27:55.058Z" }, + { url = "https://files.pythonhosted.org/packages/0b/7b/3b0649983cbaf15eda26a414b5b1982e910c67bd6f7b1b490f3cfc76896a/jiter-0.14.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:645be49c46f2900937ba0eaf871ad5183c96858c0af74b6becc7f4e367e36e06", size = 553716, upload-time = "2026-04-10T14:27:57.269Z" }, + { url = "https://files.pythonhosted.org/packages/97/f8/33d78c83bd93ae0c0af05293a6660f88a1977caef39a6d72a84afab94ce0/jiter-0.14.0-cp314-cp314t-win32.whl", hash = "sha256:2f7877ed45118de283786178eceaf877110abacd04fde31efff3940ae9672674", size = 207957, upload-time = "2026-04-10T14:27:59.285Z" }, + { url = "https://files.pythonhosted.org/packages/d6/ac/2b760516c03e2227826d1f7025d89bf6bf6357a28fe75c2a2800873c50bf/jiter-0.14.0-cp314-cp314t-win_amd64.whl", hash = "sha256:14c0cb10337c49f5eafe8e7364daca5e29a020ea03580b8f8e6c597fed4e1588", size = 204690, upload-time = "2026-04-10T14:28:00.962Z" }, + { url = "https://files.pythonhosted.org/packages/dc/2e/a44c20c58aeed0355f2d326969a181696aeb551a25195f47563908a815be/jiter-0.14.0-cp314-cp314t-win_arm64.whl", hash = "sha256:5419d4aa2024961da9fe12a9cfe7484996735dca99e8e090b5c88595ef1951ff", size = 191338, upload-time = "2026-04-10T14:28:02.853Z" }, + { url = "https://files.pythonhosted.org/packages/21/42/9042c3f3019de4adcb8c16591c325ec7255beea9fcd33a42a43f3b0b1000/jiter-0.14.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:fbd9e482663ca9d005d051330e4d2d8150bb208a209409c10f7e7dfdf7c49da9", size = 308810, upload-time = "2026-04-10T14:28:34.673Z" }, + { url = "https://files.pythonhosted.org/packages/60/cf/a7e19b308bd86bb04776803b1f01a5f9a287a4c55205f4708827ee487fbf/jiter-0.14.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:33a20d838b91ef376b3a56896d5b04e725c7df5bc4864cc6569cf046a8d73b6d", size = 308443, upload-time = "2026-04-10T14:28:36.658Z" }, + { url = "https://files.pythonhosted.org/packages/ca/44/e26ede3f0caeff93f222559cb0cc4ca68579f07d009d7b6010c5b586f9b1/jiter-0.14.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:432c4db5255d86a259efde91e55cb4c8d18c0521d844c9e2e7efcce3899fb016", size = 343039, upload-time = "2026-04-10T14:28:38.356Z" }, + { url = "https://files.pythonhosted.org/packages/da/e9/1f9ada30cef7b05e74bb06f52127e7a724976c225f46adb65c37b1dadfb6/jiter-0.14.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67f00d94b281174144d6532a04b66a12cb866cbdc47c3af3bfe2973677f9861a", size = 349613, upload-time = "2026-04-10T14:28:40.066Z" }, +] + [[package]] name = "joblib" version = "1.5.3" @@ -1808,6 +2009,7 @@ dependencies = [ { name = "backtesting" }, { name = "backtrader" }, { name = "ccxt" }, + { name = "defeatbeta-api" }, { name = "empyrical-reloaded" }, { name = "finta" }, { name = "hmmlearn" }, @@ -1848,6 +2050,7 @@ requires-dist = [ { name = "backtesting", specifier = ">=0.6.5" }, { name = "backtrader", specifier = ">=1.9.78.123" }, { name = "ccxt", specifier = ">=4.5.50" }, + { name = "defeatbeta-api", specifier = ">=0.0.45" }, { name = "empyrical-reloaded", specifier = ">=0.5.12" }, { name = "finta", specifier = ">=1.3" }, { name = "hmmlearn", specifier = ">=0.3.3" }, @@ -2241,6 +2444,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, ] +[[package]] +name = "mcp" +version = "1.27.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "httpx" }, + { name = "httpx-sse" }, + { name = "jsonschema" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "pyjwt", extra = ["crypto"] }, + { name = "python-multipart" }, + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "sse-starlette" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, + { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/eb/c0cfc62075dc6e1ec1c64d352ae09ac051d9334311ed226f1f425312848a/mcp-1.27.0.tar.gz", hash = "sha256:d3dc35a7eec0d458c1da4976a48f982097ddaab87e278c5511d5a4a56e852b83", size = 607509, upload-time = "2026-04-02T14:48:08.88Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/46/f6b4ad632c67ef35209a66127e4bddc95759649dd595f71f13fba11bdf9a/mcp-1.27.0-py3-none-any.whl", hash = "sha256:5ce1fa81614958e267b21fb2aa34e0aea8e2c6ede60d52aba45fd47246b4d741", size = 215967, upload-time = "2026-04-02T14:48:07.24Z" }, +] + [[package]] name = "mdurl" version = "0.1.2" @@ -2420,6 +2648,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, ] +[[package]] +name = "multiprocess" +version = "0.70.19" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dill" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a2/f2/e783ac7f2aeeed14e9e12801f22529cc7e6b7ab80928d6dcce4e9f00922d/multiprocess-0.70.19.tar.gz", hash = "sha256:952021e0e6c55a4a9fe4cd787895b86e239a40e76802a789d6305398d3975897", size = 2079989, upload-time = "2026-01-19T06:47:39.744Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/45/8004d1e6b9185c1a444d6b55ac5682acf9d98035e54386d967366035a03a/multiprocess-0.70.19-py310-none-any.whl", hash = "sha256:97404393419dcb2a8385910864eedf47a3cadf82c66345b44f036420eb0b5d87", size = 134948, upload-time = "2026-01-19T06:47:32.325Z" }, + { url = "https://files.pythonhosted.org/packages/86/c2/dec9722dc3474c164a0b6bcd9a7ed7da542c98af8cabce05374abab35edd/multiprocess-0.70.19-py311-none-any.whl", hash = "sha256:928851ae7973aea4ce0eaf330bbdafb2e01398a91518d5c8818802845564f45c", size = 144457, upload-time = "2026-01-19T06:47:33.711Z" }, + { url = "https://files.pythonhosted.org/packages/71/70/38998b950a97ea279e6bd657575d22d1a2047256caf707d9a10fbce4f065/multiprocess-0.70.19-py312-none-any.whl", hash = "sha256:3a56c0e85dd5025161bac5ce138dcac1e49174c7d8e74596537e729fd5c53c28", size = 150281, upload-time = "2026-01-19T06:47:35.037Z" }, + { url = "https://files.pythonhosted.org/packages/7f/74/d2c27e03cb84251dfe7249b8e82923643c6d48fa4883b9476b025e7dc7eb/multiprocess-0.70.19-py313-none-any.whl", hash = "sha256:8d5eb4ec5017ba2fab4e34a747c6d2c2b6fecfe9e7236e77988db91580ada952", size = 156414, upload-time = "2026-01-19T06:47:35.915Z" }, + { url = "https://files.pythonhosted.org/packages/a0/61/af9115673a5870fd885247e2f1b68c4f1197737da315b520a91c757a861a/multiprocess-0.70.19-py314-none-any.whl", hash = "sha256:e8cc7fbdff15c0613f0a1f1f8744bef961b0a164c0ca29bdff53e9d2d93c5e5f", size = 160318, upload-time = "2026-01-19T06:47:37.497Z" }, + { url = "https://files.pythonhosted.org/packages/7e/82/69e539c4c2027f1e1697e09aaa2449243085a0edf81ae2c6341e84d769b6/multiprocess-0.70.19-py39-none-any.whl", hash = "sha256:0d4b4397ed669d371c81dcd1ef33fd384a44d6c3de1bd0ca7ac06d837720d3c5", size = 133477, upload-time = "2026-01-19T06:47:38.619Z" }, +] + [[package]] name = "multitasking" version = "0.0.13" @@ -2520,6 +2765,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762", size = 2068504, upload-time = "2025-12-08T17:02:38.159Z" }, ] +[[package]] +name = "nltk" +version = "3.9.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "joblib" }, + { name = "regex" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/a1/b3b4adf15585a5bc4c357adde150c01ebeeb642173ded4d871e89468767c/nltk-3.9.4.tar.gz", hash = "sha256:ed03bc098a40481310320808b2db712d95d13ca65b27372f8a403949c8b523d0", size = 2946864, upload-time = "2026-03-24T06:13:40.641Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/91/04e965f8e717ba0ab4bdca5c112deeab11c9e750d94c4d4602f050295d39/nltk-3.9.4-py3-none-any.whl", hash = "sha256:f2fa301c3a12718ce4a0e9305c5675299da5ad9e26068218b69d692fda84828f", size = 1552087, upload-time = "2026-03-24T06:13:38.47Z" }, +] + [[package]] name = "notebook-shim" version = "0.2.4" @@ -2601,6 +2861,37 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6b/c3/0e45ff4dce8401f6ea7c25d80d75738813a47f5ae2691e2478f2fd1e5e93/nvidia_nccl_cu12-2.30.4-py3-none-manylinux_2_18_x86_64.whl", hash = "sha256:040974b261edec4b8b793e59e92ab7176fe4ab4bc61b800f9f3bfaeec2d436f3", size = 300164158, upload-time = "2026-04-23T03:23:19.589Z" }, ] +[[package]] +name = "openai" +version = "2.32.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ed/59/bdcc6b759b8c42dd73afaf5bf8f902c04b37987a5514dbc1c64dba390fef/openai-2.32.0.tar.gz", hash = "sha256:c54b27a9e4cb8d51f0dd94972ffd1a04437efeb259a9e60d8922b8bd26fe55e0", size = 693286, upload-time = "2026-04-15T22:28:19.434Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/c1/d6e64ccd0536bf616556f0cad2b6d94a8125f508d25cfd814b1d2db4e2f1/openai-2.32.0-py3-none-any.whl", hash = "sha256:4dcc9badeb4bf54ad0d187453742f290226d30150890b7890711bda4f32f192f", size = 1162570, upload-time = "2026-04-15T22:28:17.714Z" }, +] + +[[package]] +name = "openpyxl" +version = "3.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "et-xmlfile" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464, upload-time = "2024-06-28T14:03:44.161Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910, upload-time = "2024-06-28T14:03:41.161Z" }, +] + [[package]] name = "osqp" version = "1.1.1" @@ -3179,6 +3470,110 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, ] +[[package]] +name = "pydantic" +version = "2.13.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d9/e4/40d09941a2cebcb20609b86a559817d5b9291c49dd6f8c87e5feffbe703a/pydantic-2.13.3.tar.gz", hash = "sha256:af09e9d1d09f4e7fe37145c1f577e1d61ceb9a41924bf0094a36506285d0a84d", size = 844068, upload-time = "2026-04-20T14:46:43.632Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/0a/fd7d723f8f8153418fb40cf9c940e82004fce7e987026b08a68a36dd3fe7/pydantic-2.13.3-py3-none-any.whl", hash = "sha256:6db14ac8dfc9a1e57f87ea2c0de670c251240f43cb0c30a5130e9720dc612927", size = 471981, upload-time = "2026-04-20T14:46:41.402Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.46.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2a/ef/f7abb56c49382a246fd2ce9c799691e3c3e7175ec74b14d99e798bcddb1a/pydantic_core-2.46.3.tar.gz", hash = "sha256:41c178f65b8c29807239d47e6050262eb6bf84eb695e41101e62e38df4a5bc2c", size = 471412, upload-time = "2026-04-20T14:40:56.672Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/cb/5b47425556ecc1f3fe18ed2a0083188aa46e1dd812b06e406475b3a5d536/pydantic_core-2.46.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b11b59b3eee90a80a36701ddb4576d9ae31f93f05cb9e277ceaa09e6bf074a67", size = 2101946, upload-time = "2026-04-20T14:40:52.581Z" }, + { url = "https://files.pythonhosted.org/packages/a1/4f/2fb62c2267cae99b815bbf4a7b9283812c88ca3153ef29f7707200f1d4e5/pydantic_core-2.46.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af8653713055ea18a3abc1537fe2ebc42f5b0bbb768d1eb79fd74eb47c0ac089", size = 1951612, upload-time = "2026-04-20T14:42:42.996Z" }, + { url = "https://files.pythonhosted.org/packages/50/6e/b7348fd30d6556d132cddd5bd79f37f96f2601fe0608afac4f5fb01ec0b3/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75a519dab6d63c514f3a81053e5266c549679e4aa88f6ec57f2b7b854aceb1b0", size = 1977027, upload-time = "2026-04-20T14:42:02.001Z" }, + { url = "https://files.pythonhosted.org/packages/82/11/31d60ee2b45540d3fb0b29302a393dbc01cd771c473f5b5147bcd353e593/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6cd87cb1575b1ad05ba98894c5b5c96411ef678fa2f6ed2576607095b8d9789", size = 2063008, upload-time = "2026-04-20T14:44:17.952Z" }, + { url = "https://files.pythonhosted.org/packages/8a/db/3a9d1957181b59258f44a2300ab0f0be9d1e12d662a4f57bb31250455c52/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f80a55484b8d843c8ada81ebf70a682f3f00a3d40e378c06cf17ecb44d280d7d", size = 2233082, upload-time = "2026-04-20T14:40:57.934Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e1/3277c38792aeb5cfb18c2f0c5785a221d9ff4e149abbe1184d53d5f72273/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3861f1731b90c50a3266316b9044f5c9b405eecb8e299b0a7120596334e4fe9c", size = 2304615, upload-time = "2026-04-20T14:42:12.584Z" }, + { url = "https://files.pythonhosted.org/packages/5e/d5/e3d9717c9eba10855325650afd2a9cba8e607321697f18953af9d562da2f/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb528e295ed31570ac3dcc9bfdd6e0150bc11ce6168ac87a8082055cf1a67395", size = 2094380, upload-time = "2026-04-20T14:43:05.522Z" }, + { url = "https://files.pythonhosted.org/packages/a1/20/abac35dedcbfd66c6f0b03e4e3564511771d6c9b7ede10a362d03e110d9b/pydantic_core-2.46.3-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:367508faa4973b992b271ba1494acaab36eb7e8739d1e47be5035fb1ea225396", size = 2135429, upload-time = "2026-04-20T14:41:55.549Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a5/41bfd1df69afad71b5cf0535055bccc73022715ad362edbc124bc1e021d7/pydantic_core-2.46.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ad3c826fe523e4becf4fe39baa44286cff85ef137c729a2c5e269afbfd0905d", size = 2174582, upload-time = "2026-04-20T14:41:45.96Z" }, + { url = "https://files.pythonhosted.org/packages/79/65/38d86ea056b29b2b10734eb23329b7a7672ca604df4f2b6e9c02d4ee22fe/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ec638c5d194ef8af27db69f16c954a09797c0dc25015ad6123eb2c73a4d271ca", size = 2187533, upload-time = "2026-04-20T14:40:55.367Z" }, + { url = "https://files.pythonhosted.org/packages/b6/55/a1129141678a2026badc539ad1dee0a71d06f54c2f06a4bd68c030ac781b/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:28ed528c45446062ee66edb1d33df5d88828ae167de76e773a3c7f64bd14e976", size = 2332985, upload-time = "2026-04-20T14:44:13.05Z" }, + { url = "https://files.pythonhosted.org/packages/d7/60/cb26f4077719f709e54819f4e8e1d43f4091f94e285eb6bd21e1190a7b7c/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aed19d0c783886d5bd86d80ae5030006b45e28464218747dcf83dabfdd092c7b", size = 2373670, upload-time = "2026-04-20T14:41:53.421Z" }, + { url = "https://files.pythonhosted.org/packages/6b/7e/c3f21882bdf1d8d086876f81b5e296206c69c6082551d776895de7801fa0/pydantic_core-2.46.3-cp312-cp312-win32.whl", hash = "sha256:06d5d8820cbbdb4147578c1fe7ffcd5b83f34508cb9f9ab76e807be7db6ff0a4", size = 1966722, upload-time = "2026-04-20T14:44:30.588Z" }, + { url = "https://files.pythonhosted.org/packages/57/be/6b5e757b859013ebfbd7adba02f23b428f37c86dcbf78b5bb0b4ffd36e99/pydantic_core-2.46.3-cp312-cp312-win_amd64.whl", hash = "sha256:c3212fda0ee959c1dd04c60b601ec31097aaa893573a3a1abd0a47bcac2968c1", size = 2072970, upload-time = "2026-04-20T14:42:54.248Z" }, + { url = "https://files.pythonhosted.org/packages/bf/f8/a989b21cc75e9a32d24192ef700eea606521221a89faa40c919ce884f2b1/pydantic_core-2.46.3-cp312-cp312-win_arm64.whl", hash = "sha256:f1f8338dd7a7f31761f1f1a3c47503a9a3b34eea3c8b01fa6ee96408affb5e72", size = 2035963, upload-time = "2026-04-20T14:44:20.4Z" }, + { url = "https://files.pythonhosted.org/packages/9b/3c/9b5e8eb9821936d065439c3b0fb1490ffa64163bfe7e1595985a47896073/pydantic_core-2.46.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:12bc98de041458b80c86c56b24df1d23832f3e166cbaff011f25d187f5c62c37", size = 2102109, upload-time = "2026-04-20T14:41:24.219Z" }, + { url = "https://files.pythonhosted.org/packages/91/97/1c41d1f5a19f241d8069f1e249853bcce378cdb76eec8ab636d7bc426280/pydantic_core-2.46.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:85348b8f89d2c3508b65b16c3c33a4da22b8215138d8b996912bb1532868885f", size = 1951820, upload-time = "2026-04-20T14:42:14.236Z" }, + { url = "https://files.pythonhosted.org/packages/30/b4/d03a7ae14571bc2b6b3c7b122441154720619afe9a336fa3a95434df5e2f/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1105677a6df914b1fb71a81b96c8cce7726857e1717d86001f29be06a25ee6f8", size = 1977785, upload-time = "2026-04-20T14:42:31.648Z" }, + { url = "https://files.pythonhosted.org/packages/ae/0c/4086f808834b59e3c8f1aa26df8f4b6d998cdcf354a143d18ef41529d1fe/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87082cd65669a33adeba5470769e9704c7cf026cc30afb9cc77fd865578ebaad", size = 2062761, upload-time = "2026-04-20T14:40:37.093Z" }, + { url = "https://files.pythonhosted.org/packages/fa/71/a649be5a5064c2df0db06e0a512c2281134ed2fcc981f52a657936a7527c/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60e5f66e12c4f5212d08522963380eaaeac5ebd795826cfd19b2dfb0c7a52b9c", size = 2232989, upload-time = "2026-04-20T14:42:59.254Z" }, + { url = "https://files.pythonhosted.org/packages/a2/84/7756e75763e810b3a710f4724441d1ecc5883b94aacb07ca71c5fb5cfb69/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6cdf19bf84128d5e7c37e8a73a0c5c10d51103a650ac585d42dd6ae233f2b7f", size = 2303975, upload-time = "2026-04-20T14:41:32.287Z" }, + { url = "https://files.pythonhosted.org/packages/6c/35/68a762e0c1e31f35fa0dac733cbd9f5b118042853698de9509c8e5bf128b/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031bb17f4885a43773c8c763089499f242aee2ea85cf17154168775dccdecf35", size = 2095325, upload-time = "2026-04-20T14:42:47.685Z" }, + { url = "https://files.pythonhosted.org/packages/77/bf/1bf8c9a8e91836c926eae5e3e51dce009bf495a60ca56060689d3df3f340/pydantic_core-2.46.3-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:bcf2a8b2982a6673693eae7348ef3d8cf3979c1d63b54fca7c397a635cc68687", size = 2133368, upload-time = "2026-04-20T14:41:22.766Z" }, + { url = "https://files.pythonhosted.org/packages/e5/50/87d818d6bab915984995157ceb2380f5aac4e563dddbed6b56f0ed057aba/pydantic_core-2.46.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28e8cf2f52d72ced402a137145923a762cbb5081e48b34312f7a0c8f55928ec3", size = 2173908, upload-time = "2026-04-20T14:42:52.044Z" }, + { url = "https://files.pythonhosted.org/packages/91/88/a311fb306d0bd6185db41fa14ae888fb81d0baf648a761ae760d30819d33/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:17eaface65d9fc5abb940003020309c1bf7a211f5f608d7870297c367e6f9022", size = 2186422, upload-time = "2026-04-20T14:43:29.55Z" }, + { url = "https://files.pythonhosted.org/packages/8f/79/28fd0d81508525ab2054fef7c77a638c8b5b0afcbbaeee493cf7c3fef7e1/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:93fd339f23408a07e98950a89644f92c54d8729719a40b30c0a30bb9ebc55d23", size = 2332709, upload-time = "2026-04-20T14:42:16.134Z" }, + { url = "https://files.pythonhosted.org/packages/b3/21/795bf5fe5c0f379308b8ef19c50dedab2e7711dbc8d0c2acf08f1c7daa05/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:23cbdb3aaa74dfe0837975dbf69b469753bbde8eacace524519ffdb6b6e89eb7", size = 2372428, upload-time = "2026-04-20T14:41:10.974Z" }, + { url = "https://files.pythonhosted.org/packages/45/b3/ed14c659cbe7605e3ef063077680a64680aec81eb1a04763a05190d49b7f/pydantic_core-2.46.3-cp313-cp313-win32.whl", hash = "sha256:610eda2e3838f401105e6326ca304f5da1e15393ae25dacae5c5c63f2c275b13", size = 1965601, upload-time = "2026-04-20T14:41:42.128Z" }, + { url = "https://files.pythonhosted.org/packages/ef/bb/adb70d9a762ddd002d723fbf1bd492244d37da41e3af7b74ad212609027e/pydantic_core-2.46.3-cp313-cp313-win_amd64.whl", hash = "sha256:68cc7866ed863db34351294187f9b729964c371ba33e31c26f478471c52e1ed0", size = 2071517, upload-time = "2026-04-20T14:43:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/52/eb/66faefabebfe68bd7788339c9c9127231e680b11906368c67ce112fdb47f/pydantic_core-2.46.3-cp313-cp313-win_arm64.whl", hash = "sha256:f64b5537ac62b231572879cd08ec05600308636a5d63bcbdb15063a466977bec", size = 2035802, upload-time = "2026-04-20T14:43:38.507Z" }, + { url = "https://files.pythonhosted.org/packages/7f/db/a7bcb4940183fda36022cd18ba8dd12f2dff40740ec7b58ce7457befa416/pydantic_core-2.46.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:afa3aa644f74e290cdede48a7b0bee37d1c35e71b05105f6b340d484af536d9b", size = 2097614, upload-time = "2026-04-20T14:44:38.374Z" }, + { url = "https://files.pythonhosted.org/packages/24/35/e4066358a22e3e99519db370494c7528f5a2aa1367370e80e27e20283543/pydantic_core-2.46.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ced3310e51aa425f7f77da8bbbb5212616655bedbe82c70944320bc1dbe5e018", size = 1951896, upload-time = "2026-04-20T14:40:53.996Z" }, + { url = "https://files.pythonhosted.org/packages/87/92/37cf4049d1636996e4b888c05a501f40a43ff218983a551d57f9d5e14f0d/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e29908922ce9da1a30b4da490bd1d3d82c01dcfdf864d2a74aacee674d0bfa34", size = 1979314, upload-time = "2026-04-20T14:41:49.446Z" }, + { url = "https://files.pythonhosted.org/packages/d8/36/9ff4d676dfbdfb2d591cf43f3d90ded01e15b1404fd101180ed2d62a2fd3/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0c9ff69140423eea8ed2d5477df3ba037f671f5e897d206d921bc9fdc39613e7", size = 2056133, upload-time = "2026-04-20T14:42:23.574Z" }, + { url = "https://files.pythonhosted.org/packages/bc/f0/405b442a4d7ba855b06eec8b2bf9c617d43b8432d099dfdc7bf999293495/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b675ab0a0d5b1c8fdb81195dc5bcefea3f3c240871cdd7ff9a2de8aa50772eb2", size = 2228726, upload-time = "2026-04-20T14:44:22.816Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f8/65cd92dd5a0bd89ba277a98ecbfaf6fc36bbd3300973c7a4b826d6ab1391/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0087084960f209a9a4af50ecd1fb063d9ad3658c07bb81a7a53f452dacbfb2ba", size = 2301214, upload-time = "2026-04-20T14:44:48.792Z" }, + { url = "https://files.pythonhosted.org/packages/fd/86/ef96a4c6e79e7a2d0410826a68fbc0eccc0fd44aa733be199d5fcac3bb87/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed42e6cc8e1b0e2b9b96e2276bad70ae625d10d6d524aed0c93de974ae029f9f", size = 2099927, upload-time = "2026-04-20T14:41:40.196Z" }, + { url = "https://files.pythonhosted.org/packages/6d/53/269caf30e0096e0a8a8f929d1982a27b3879872cca2d917d17c2f9fdf4fe/pydantic_core-2.46.3-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:f1771ce258afb3e4201e67d154edbbae712a76a6081079fe247c2f53c6322c22", size = 2128789, upload-time = "2026-04-20T14:41:15.868Z" }, + { url = "https://files.pythonhosted.org/packages/00/b0/1a6d9b6a587e118482910c244a1c5acf4d192604174132efd12bf0ac486f/pydantic_core-2.46.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a7610b6a5242a6c736d8ad47fd5fff87fcfe8f833b281b1c409c3d6835d9227f", size = 2173815, upload-time = "2026-04-20T14:44:25.152Z" }, + { url = "https://files.pythonhosted.org/packages/87/56/e7e00d4041a7e62b5a40815590114db3b535bf3ca0bf4dca9f16cef25246/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:ff5e7783bcc5476e1db448bf268f11cb257b1c276d3e89f00b5727be86dd0127", size = 2181608, upload-time = "2026-04-20T14:41:28.933Z" }, + { url = "https://files.pythonhosted.org/packages/e8/22/4bd23c3d41f7c185d60808a1de83c76cf5aeabf792f6c636a55c3b1ec7f9/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:9d2e32edcc143bc01e95300671915d9ca052d4f745aa0a49c48d4803f8a85f2c", size = 2326968, upload-time = "2026-04-20T14:42:03.962Z" }, + { url = "https://files.pythonhosted.org/packages/24/ac/66cd45129e3915e5ade3b292cb3bc7fd537f58f8f8dbdaba6170f7cabb74/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:6e42d83d1c6b87fa56b521479cff237e626a292f3b31b6345c15a99121b454c1", size = 2369842, upload-time = "2026-04-20T14:41:35.52Z" }, + { url = "https://files.pythonhosted.org/packages/a2/51/dd4248abb84113615473aa20d5545b7c4cd73c8644003b5259686f93996c/pydantic_core-2.46.3-cp314-cp314-win32.whl", hash = "sha256:07bc6d2a28c3adb4f7c6ae46aa4f2d2929af127f587ed44057af50bf1ce0f505", size = 1959661, upload-time = "2026-04-20T14:41:00.042Z" }, + { url = "https://files.pythonhosted.org/packages/20/eb/59980e5f1ae54a3b86372bd9f0fa373ea2d402e8cdcd3459334430f91e91/pydantic_core-2.46.3-cp314-cp314-win_amd64.whl", hash = "sha256:8940562319bc621da30714617e6a7eaa6b98c84e8c685bcdc02d7ed5e7c7c44e", size = 2071686, upload-time = "2026-04-20T14:43:16.471Z" }, + { url = "https://files.pythonhosted.org/packages/8c/db/1cf77e5247047dfee34bc01fa9bca134854f528c8eb053e144298893d370/pydantic_core-2.46.3-cp314-cp314-win_arm64.whl", hash = "sha256:5dcbbcf4d22210ced8f837c96db941bdb078f419543472aca5d9a0bb7cddc7df", size = 2026907, upload-time = "2026-04-20T14:43:31.732Z" }, + { url = "https://files.pythonhosted.org/packages/57/c0/b3df9f6a543276eadba0a48487b082ca1f201745329d97dbfa287034a230/pydantic_core-2.46.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:d0fe3dce1e836e418f912c1ad91c73357d03e556a4d286f441bf34fed2dbeecf", size = 2095047, upload-time = "2026-04-20T14:42:37.982Z" }, + { url = "https://files.pythonhosted.org/packages/66/57/886a938073b97556c168fd99e1a7305bb363cd30a6d2c76086bf0587b32a/pydantic_core-2.46.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9ce92e58abc722dac1bf835a6798a60b294e48eb0e625ec9fd994b932ac5feee", size = 1934329, upload-time = "2026-04-20T14:43:49.655Z" }, + { url = "https://files.pythonhosted.org/packages/0b/7c/b42eaa5c34b13b07ecb51da21761297a9b8eb43044c864a035999998f328/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a03e6467f0f5ab796a486146d1b887b2dc5e5f9b3288898c1b1c3ad974e53e4a", size = 1974847, upload-time = "2026-04-20T14:42:10.737Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9b/92b42db6543e7de4f99ae977101a2967b63122d4b6cf7773812da2d7d5b5/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2798b6ba041b9d70acfb9071a2ea13c8456dd1e6a5555798e41ba7b0790e329c", size = 2041742, upload-time = "2026-04-20T14:40:44.262Z" }, + { url = "https://files.pythonhosted.org/packages/0f/19/46fbe1efabb5aa2834b43b9454e70f9a83ad9c338c1291e48bdc4fecf167/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9be3e221bdc6d69abf294dcf7aff6af19c31a5cdcc8f0aa3b14be29df4bd03b1", size = 2236235, upload-time = "2026-04-20T14:41:27.307Z" }, + { url = "https://files.pythonhosted.org/packages/77/da/b3f95bc009ad60ec53120f5d16c6faa8cabdbe8a20d83849a1f2b8728148/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f13936129ce841f2a5ddf6f126fea3c43cd128807b5a59588c37cf10178c2e64", size = 2282633, upload-time = "2026-04-20T14:44:33.271Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6e/401336117722e28f32fb8220df676769d28ebdf08f2f4469646d404c43a3/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28b5f2ef03416facccb1c6ef744c69793175fd27e44ef15669201601cf423acb", size = 2109679, upload-time = "2026-04-20T14:44:41.065Z" }, + { url = "https://files.pythonhosted.org/packages/fc/53/b289f9bc8756a32fe718c46f55afaeaf8d489ee18d1a1e7be1db73f42cc4/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:830d1247d77ad23852314f069e9d7ddafeec5f684baf9d7e7065ed46a049c4e6", size = 2108342, upload-time = "2026-04-20T14:42:50.144Z" }, + { url = "https://files.pythonhosted.org/packages/10/5b/8292fc7c1f9111f1b2b7c1b0dcf1179edcd014fc3ea4517499f50b829d71/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0793c90c1a3c74966e7975eaef3ed30ebdff3260a0f815a62a22adc17e4c01c", size = 2157208, upload-time = "2026-04-20T14:42:08.133Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9e/f80044e9ec07580f057a89fc131f78dda7a58751ddf52bbe05eaf31db50f/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:d2d0aead851b66f5245ec0c4fb2612ef457f8bbafefdf65a2bf9d6bac6140f47", size = 2167237, upload-time = "2026-04-20T14:42:25.412Z" }, + { url = "https://files.pythonhosted.org/packages/f8/84/6781a1b037f3b96be9227edbd1101f6d3946746056231bf4ac48cdff1a8d/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:2f40e4246676beb31c5ce77c38a55ca4e465c6b38d11ea1bd935420568e0b1ab", size = 2312540, upload-time = "2026-04-20T14:40:40.313Z" }, + { url = "https://files.pythonhosted.org/packages/3e/db/19c0839feeb728e7df03255581f198dfdf1c2aeb1e174a8420b63c5252e5/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:cf489cf8986c543939aeee17a09c04d6ffb43bfef8ca16fcbcc5cfdcbed24dba", size = 2369556, upload-time = "2026-04-20T14:41:09.427Z" }, + { url = "https://files.pythonhosted.org/packages/e0/15/3228774cb7cd45f5f721ddf1b2242747f4eb834d0c491f0c02d606f09fed/pydantic_core-2.46.3-cp314-cp314t-win32.whl", hash = "sha256:ffe0883b56cfc05798bf994164d2b2ff03efe2d22022a2bb080f3b626176dd56", size = 1949756, upload-time = "2026-04-20T14:41:25.717Z" }, + { url = "https://files.pythonhosted.org/packages/b8/2a/c79cf53fd91e5a87e30d481809f52f9a60dd221e39de66455cf04deaad37/pydantic_core-2.46.3-cp314-cp314t-win_amd64.whl", hash = "sha256:706d9d0ce9cf4593d07270d8e9f53b161f90c57d315aeec4fb4fd7a8b10240d8", size = 2051305, upload-time = "2026-04-20T14:43:18.627Z" }, + { url = "https://files.pythonhosted.org/packages/0b/db/d8182a7f1d9343a032265aae186eb063fe26ca4c40f256b21e8da4498e89/pydantic_core-2.46.3-cp314-cp314t-win_arm64.whl", hash = "sha256:77706aeb41df6a76568434701e0917da10692da28cb69d5fb6919ce5fdb07374", size = 2026310, upload-time = "2026-04-20T14:41:01.778Z" }, + { url = "https://files.pythonhosted.org/packages/34/42/f426db557e8ab2791bc7562052299944a118655496fbff99914e564c0a94/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:b12dd51f1187c2eb489af8e20f880362db98e954b54ab792fa5d92e8bcc6b803", size = 2091877, upload-time = "2026-04-20T14:43:27.091Z" }, + { url = "https://files.pythonhosted.org/packages/5c/4f/86a832a9d14df58e663bfdf4627dc00d3317c2bd583c4fb23390b0f04b8e/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f00a0961b125f1a47af7bcc17f00782e12f4cd056f83416006b30111d941dfa3", size = 1932428, upload-time = "2026-04-20T14:40:45.781Z" }, + { url = "https://files.pythonhosted.org/packages/11/1a/fe857968954d93fb78e0d4b6df5c988c74c4aaa67181c60be7cfe327c0ca/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57697d7c056aca4bbb680200f96563e841a6386ac1129370a0102592f4dddff5", size = 1997550, upload-time = "2026-04-20T14:44:02.425Z" }, + { url = "https://files.pythonhosted.org/packages/17/eb/9d89ad2d9b0ba8cd65393d434471621b98912abb10fbe1df08e480ba57b5/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd35aa21299def8db7ef4fe5c4ff862941a9a158ca7b63d61e66fe67d30416b4", size = 2137657, upload-time = "2026-04-20T14:42:45.149Z" }, +] + +[[package]] +name = "pydantic-settings" +version = "2.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/98/c8345dccdc31de4228c039a98f6467a941e39558da41c1744fbe29fa5666/pydantic_settings-2.14.0.tar.gz", hash = "sha256:24285fd4b0e0c06507dd9fdfd331ee23794305352aaec8fc4eb92d4047aeb67d", size = 235709, upload-time = "2026-04-20T13:37:40.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/dd/bebff3040138f00ae8a102d426b27349b9a49acc310fcae7f92112d867e3/pydantic_settings-2.14.0-py3-none-any.whl", hash = "sha256:fc8d5d692eb7092e43c8647c1c35a3ecd00e040fcf02ed86f4cb5458ca62182e", size = 60940, upload-time = "2026-04-20T13:37:38.586Z" }, +] + [[package]] name = "pyerfa" version = "2.0.1.5" @@ -3197,6 +3592,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b4/11/97233cf23ad5411ac6f13b1d6ee3888f90ace4f974d9bf9db887aa428912/pyerfa-2.0.1.5-cp39-abi3-win_amd64.whl", hash = "sha256:66292d437dcf75925b694977aa06eb697126e7b86553e620371ed3e48b5e0ad0", size = 349410, upload-time = "2024-11-11T15:22:24.817Z" }, ] +[[package]] +name = "pyfiglet" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c8/e3/0a86276ad2c383ce08d76110a8eec2fe22e7051c4b8ba3fa163a0b08c428/pyfiglet-1.0.4.tar.gz", hash = "sha256:db9c9940ed1bf3048deff534ed52ff2dafbbc2cd7610b17bb5eca1df6d4278ef", size = 1560615, upload-time = "2025-08-15T18:32:47.302Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/5c/fe9f95abd5eaedfa69f31e450f7e2768bef121dbdf25bcddee2cd3087a16/pyfiglet-1.0.4-py3-none-any.whl", hash = "sha256:65b57b7a8e1dff8a67dc8e940a117238661d5e14c3e49121032bd404d9b2b39f", size = 1806118, upload-time = "2025-08-15T18:32:45.556Z" }, +] + [[package]] name = "pygments" version = "2.20.0" @@ -3206,6 +3610,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, ] +[[package]] +name = "pyjwt" +version = "2.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c2/27/a3b6e5bf6ff856d2509292e95c8f57f0df7017cf5394921fc4e4ef40308a/pyjwt-2.12.1.tar.gz", hash = "sha256:c74a7a2adf861c04d002db713dd85f84beb242228e671280bf709d765b03672b", size = 102564, upload-time = "2026-03-13T19:27:37.25Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/7a/8dd906bd22e79e47397a61742927f6747fe93242ef86645ee9092e610244/pyjwt-2.12.1-py3-none-any.whl", hash = "sha256:28ca37c070cad8ba8cd9790cd940535d40274d22f80ab87f3ac6a713e6e8454c", size = 29726, upload-time = "2026-03-13T19:27:35.677Z" }, +] + +[package.optional-dependencies] +crypto = [ + { name = "cryptography" }, +] + [[package]] name = "pymdown-extensions" version = "10.21.2" @@ -3266,6 +3684,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, ] +[[package]] +name = "python-dotenv" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, +] + [[package]] name = "python-json-logger" version = "4.1.0" @@ -3275,6 +3702,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/27/be/0631a861af4d1c875f096c07d34e9a63639560a717130e7a87cbc82b7e3f/python_json_logger-4.1.0-py3-none-any.whl", hash = "sha256:132994765cf75bf44554be9aa49b06ef2345d23661a96720262716438141b6b2", size = 15021, upload-time = "2026-03-29T04:39:55.266Z" }, ] +[[package]] +name = "python-multipart" +version = "0.0.26" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/88/71/b145a380824a960ebd60e1014256dbb7d2253f2316ff2d73dfd8928ec2c3/python_multipart-0.0.26.tar.gz", hash = "sha256:08fadc45918cd615e26846437f50c5d6d23304da32c341f289a617127b081f17", size = 43501, upload-time = "2026-04-10T14:09:59.473Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/22/f1925cdda983ab66fc8ec6ec8014b959262747e58bdca26a4e3d1da29d56/python_multipart-0.0.26-py3-none-any.whl", hash = "sha256:c0b169f8c4484c13b0dcf2ef0ec3a4adb255c4b7d18d8e420477d2b1dd03f185", size = 28847, upload-time = "2026-04-10T14:09:58.131Z" }, +] + [[package]] name = "pytz" version = "2026.1.post1" @@ -3284,6 +3720,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/10/99/781fe0c827be2742bcc775efefccb3b048a3a9c6ce9aec0cbf4a101677e5/pytz-2026.1.post1-py2.py3-none-any.whl", hash = "sha256:f2fd16142fda348286a75e1a524be810bb05d444e5a081f37f7affc635035f7a", size = 510489, upload-time = "2026-03-03T07:47:49.167Z" }, ] +[[package]] +name = "pywin32" +version = "311" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload-time = "2025-07-14T20:13:20.765Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload-time = "2025-07-14T20:13:22.543Z" }, + { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload-time = "2025-07-14T20:13:24.682Z" }, + { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" }, + { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" }, + { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" }, + { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" }, + { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" }, +] + [[package]] name = "pywinpty" version = "3.0.3" @@ -3523,7 +3975,7 @@ wheels = [ [[package]] name = "requests" -version = "2.33.1" +version = "2.32.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -3531,9 +3983,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5f/a4/98b9c7c6428a668bf7e42ebb7c79d576a1c3c1e3ae2d47e674b468388871/requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517", size = 134120, upload-time = "2026-03-30T16:09:15.531Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a", size = 64947, upload-time = "2026-03-30T16:09:13.83Z" }, + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, ] [[package]] @@ -3938,6 +4390,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/0d/3b2e5b51593009f72fb7fb6956e6c652da1450c8c5484c40a276113c2114/sktime-0.40.1-py3-none-any.whl", hash = "sha256:130bb0c39ca4377e491c4dfa64c8ac67c3de2660dd406dd7690db6a8ac349c4e", size = 36265753, upload-time = "2025-11-25T00:03:34.522Z" }, ] +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +] + [[package]] name = "soupsieve" version = "2.8.3" @@ -3947,6 +4408,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95", size = 37016, upload-time = "2026-01-20T04:27:01.012Z" }, ] +[[package]] +name = "sse-starlette" +version = "3.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "starlette" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/26/8c/f9290339ef6d79badbc010f067cd769d6601ec11a57d78569c683fb4dd87/sse_starlette-3.3.4.tar.gz", hash = "sha256:aaf92fc067af8a5427192895ac028e947b484ac01edbc3caf00e7e7137c7bef1", size = 32427, upload-time = "2026-03-29T09:00:23.307Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/7f/3de5402f39890ac5660b86bcf5c03f9d855dad5c4ed764866d7b592b46fd/sse_starlette-3.3.4-py3-none-any.whl", hash = "sha256:84bb06e58939a8b38d8341f1bc9792f06c2b53f48c608dd207582b664fc8f3c1", size = 14330, upload-time = "2026-03-29T09:00:21.846Z" }, +] + [[package]] name = "stack-data" version = "0.6.3" @@ -4311,6 +4785,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, ] +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + [[package]] name = "tzdata" version = "2026.2" @@ -4508,6 +4994,127 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3a/0c/3662f4a66880196a590b202f0db82d919dd2f89e99a27fadef91c4a33d41/xlsxwriter-3.2.9-py3-none-any.whl", hash = "sha256:9a5db42bc5dff014806c58a20b9eae7322a134abb6fce3c92c181bfb275ec5b3", size = 175315, upload-time = "2025-09-16T00:16:20.108Z" }, ] +[[package]] +name = "xlwings" +version = "0.35.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appscript", marker = "sys_platform == 'darwin'" }, + { name = "psutil", marker = "sys_platform == 'darwin'" }, + { name = "pywin32", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/c0/7c3e717f4d0e9ea9232b96b3f9e7b3657e3d6e4bf6f3b68154f770afd96d/xlwings-0.35.1.tar.gz", hash = "sha256:2e36954bd2630b275ea12f07cb84322f1a4ec5fb7797414bf750b96ff222a27f", size = 2479605, upload-time = "2026-04-10T15:10:25.462Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/23/203b979272c94f437b6310f0a5c253d1074271eaeaeed1d55f84fa75999a/xlwings-0.35.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:2c614ab22a1d4f9cd33b856b73d88db98596084b615ef662cd652f1be5c21cb2", size = 1357161, upload-time = "2026-04-10T15:10:48.218Z" }, + { url = "https://files.pythonhosted.org/packages/67/f2/f8ac18a535a5fc33bfccad5f5c5ae3ffc0914a0190ccea312d906cf9ee47/xlwings-0.35.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:484e0a87e517249a01dd85827f27a5481192a0cd1445f696689cc751e4acd749", size = 1339831, upload-time = "2026-04-10T15:10:49.472Z" }, + { url = "https://files.pythonhosted.org/packages/a5/22/f273527439b6eb5765707cd2a1258909ded28cf424c82985aa40c0d55949/xlwings-0.35.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c231f420da4eb032afee4d5a140a6d7afa140ca2a2850f59c3d6ab191fc26864", size = 1398358, upload-time = "2026-04-10T15:10:51.099Z" }, + { url = "https://files.pythonhosted.org/packages/ed/02/443eb6c0d77321876d014e01477ca3f5b2aac869ee4d558baa287071b91e/xlwings-0.35.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:97473d16a32c251d93c67b947e88d0ec9c5bc42b0858eb3198822284a1937f13", size = 1405078, upload-time = "2026-04-10T15:10:52.439Z" }, + { url = "https://files.pythonhosted.org/packages/41/0b/6390106672f62dfea3a785821f9e28b2bcaee66880c74c474e991fdf1a93/xlwings-0.35.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15be04504e059de2e4cc1ce495e88ab0f07355a0ec2da7bf6bcac510d2be6526", size = 1409397, upload-time = "2026-04-10T15:10:54.529Z" }, + { url = "https://files.pythonhosted.org/packages/ca/1e/db621625766a634aedf8a6571a2a44eb844d0ffbbe6546e052047c3bc037/xlwings-0.35.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:88d28727e557f6e0025c330184ed8ad3787baea2b7e406a069a5bae6a82ce2c4", size = 1570555, upload-time = "2026-04-10T15:10:56.104Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8e/78d817939a47687ac15a0504e7261fc95a52a3c8ab536fc0f0e9ce9ad251/xlwings-0.35.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:26488689444eed9fa8e9dc888f1226f6dcefcdce03b16bb43475d53e473c80a2", size = 1614275, upload-time = "2026-04-10T15:10:57.414Z" }, + { url = "https://files.pythonhosted.org/packages/33/82/febaa06ce1d6837ce3e279560f31b552ca2a225e5c57ceeb935d5a1bc3fc/xlwings-0.35.1-cp312-cp312-win_amd64.whl", hash = "sha256:c08d7afba327c4b076c83e5d577a6c015be58dc9bc554cfb5c6a51b61899e693", size = 1557731, upload-time = "2026-04-10T15:10:58.684Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b4/ae0f6ee35b51aff832d0edfe306400461be0a769e9229fc1222b1279f49f/xlwings-0.35.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:62a1714be0a5c9d02dcac6b90dc086b479cb138b4fe780b57bb3660b504a63c6", size = 1357137, upload-time = "2026-04-10T15:11:00.277Z" }, + { url = "https://files.pythonhosted.org/packages/3d/18/c02feb716e22f7fd6d7e9d40205fc131cb263be5e2e2a68e85d10014aa6b/xlwings-0.35.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:96841abb57658cf24079b3c1b770f24425f8544598d174b4fa553279ef88b1b5", size = 1339863, upload-time = "2026-04-10T15:11:01.528Z" }, + { url = "https://files.pythonhosted.org/packages/9d/60/56b8490d75c1d13f5690a1d5a13f28455cbfabb47d8e0ee676f55bae9020/xlwings-0.35.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26ec78ee0f34c8fc5a8b7d942d586c7f79edaece28e8a6b68fd280f102b7a127", size = 1398349, upload-time = "2026-04-10T15:11:02.845Z" }, + { url = "https://files.pythonhosted.org/packages/5b/1f/63bec497af665ff2583196a7a1947c09692ed9833330f52ae1901b5a3368/xlwings-0.35.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3b53745408c64025e02f024f651bafc311aabc642d2080cae45115f387e60616", size = 1404957, upload-time = "2026-04-10T15:11:04.464Z" }, + { url = "https://files.pythonhosted.org/packages/07/bf/99f3c1dae55a3f07f2f39f658cb3132dadcbc55b3da4cfc9e949151faf60/xlwings-0.35.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1028d45429d4e30d94b2dc2b58a9949a3bd6ceaf86d67208ea3521cec6d75840", size = 1409455, upload-time = "2026-04-10T15:11:06.017Z" }, + { url = "https://files.pythonhosted.org/packages/4b/77/59454ffa022eeb4ba63357ab764655451d6e7098134276637701e89c05af/xlwings-0.35.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0b62fb66989f41b48d5ebf5d135ec9531c7a2ab6506c8e218338d5a1e0792647", size = 1570362, upload-time = "2026-04-10T15:11:08.04Z" }, + { url = "https://files.pythonhosted.org/packages/de/20/9df7b063a16f1ce7cccba53269d404af95a7731b1e495623bf8c46fc9de8/xlwings-0.35.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:b160a443ad5aef306b06209df808cf693c2d12f35ff48775698a2916f7b7cdb4", size = 1614584, upload-time = "2026-04-10T15:11:09.718Z" }, + { url = "https://files.pythonhosted.org/packages/c4/e7/785f82b0ff963e22d8c3a04b1ab7aadb79861b4964e856104de5b4b31b62/xlwings-0.35.1-cp313-cp313-win_amd64.whl", hash = "sha256:26345b6523ad911037441f20b1cf6addc269d83d464b9c617d0be4f402f05aa8", size = 1557309, upload-time = "2026-04-10T15:11:11.04Z" }, + { url = "https://files.pythonhosted.org/packages/c1/e1/7267b23d722591475d6446146072585796ad1110991e531baa9a62dfadf3/xlwings-0.35.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:6cad6ac49d38e8367673a3684faf3c9d587c459c2e2c79527d0774fb08a5005d", size = 1357337, upload-time = "2026-04-10T15:11:13.358Z" }, + { url = "https://files.pythonhosted.org/packages/01/92/c8eb75e1bd2e12dbd82db0671e9b7199a74b5a6e22e8ef01056e2a11fe8e/xlwings-0.35.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2d459f94210f4d59773303b6d0648f5952360a72a51968ba62fc60e80d43c8b5", size = 1339906, upload-time = "2026-04-10T15:11:14.736Z" }, + { url = "https://files.pythonhosted.org/packages/8e/de/2f69bf557d13dbffc6406d12ab7ea3d3fc5b09b1c6a4e03905c476df2aac/xlwings-0.35.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e5eac66ae01bf1f7f3f16c3f33dda95769460e2a1d97cbd9162563688705e07", size = 1399087, upload-time = "2026-04-10T15:11:16.006Z" }, + { url = "https://files.pythonhosted.org/packages/5d/54/f85899af119b0784301affd5042f9bfbc04734d888c34ceb919d3144855a/xlwings-0.35.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c35b0a20c634282dfe11939a413a1ea92c35928fa126b9f4762b7969d9749a78", size = 1404722, upload-time = "2026-04-10T15:11:17.41Z" }, + { url = "https://files.pythonhosted.org/packages/01/00/6a3604070fc4f6760b74a19b056ae93395ab287bdedbd646924d727b515b/xlwings-0.35.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:314ed8c5be699801c026ab2d3b9cdc4b4565cb725a2e082b63a84bdc7903cda4", size = 1409480, upload-time = "2026-04-10T15:11:18.858Z" }, + { url = "https://files.pythonhosted.org/packages/3b/9e/f99e693d1006c8c42f2432a3c5cd12f6c1457f7034cdfd33e5b7e065e476/xlwings-0.35.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3f6f28de07fc2f9165e5e0bd296d1cd70efe41a826c9eee150ba8b85ce606277", size = 1571235, upload-time = "2026-04-10T15:11:20.264Z" }, + { url = "https://files.pythonhosted.org/packages/94/6f/33dea22b35748832ce7a062c66507d74bda768bc6126f780bb072df73f97/xlwings-0.35.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:069942bd032fb4c858df0f24753909426ea31ba2382cbd35ef55841e4774c28d", size = 1615276, upload-time = "2026-04-10T15:11:21.658Z" }, + { url = "https://files.pythonhosted.org/packages/4f/50/0b904ae81a87d561dfd6869dcf9f4260a3bb6fd0843ffb7d8bceb192cb29/xlwings-0.35.1-cp314-cp314-win_amd64.whl", hash = "sha256:753e50c859a31949047cc12bb25379db36843495f28a51a5c333b220102a2f6f", size = 1579815, upload-time = "2026-04-10T15:11:22.986Z" }, + { url = "https://files.pythonhosted.org/packages/32/72/a38efbdbd1c9d3b57cf709f574b5d692e24202812c2e2e10a69c8b269651/xlwings-0.35.1-py3-none-any.whl", hash = "sha256:fc07b06d280b560c7c1162b22923a14d3c9859708a892974e93a4978361e985c", size = 688269, upload-time = "2026-04-10T15:11:24.572Z" }, +] + +[[package]] +name = "xxhash" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/02/84/30869e01909fb37a6cc7e18688ee8bf1e42d57e7e0777636bd47524c43c7/xxhash-3.6.0.tar.gz", hash = "sha256:f0162a78b13a0d7617b2845b90c763339d1f1d82bb04a4b07f4ab535cc5e05d6", size = 85160, upload-time = "2025-10-02T14:37:08.097Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/07/d9412f3d7d462347e4511181dea65e47e0d0e16e26fbee2ea86a2aefb657/xxhash-3.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:01362c4331775398e7bb34e3ab403bc9ee9f7c497bc7dee6272114055277dd3c", size = 32744, upload-time = "2025-10-02T14:34:34.622Z" }, + { url = "https://files.pythonhosted.org/packages/79/35/0429ee11d035fc33abe32dca1b2b69e8c18d236547b9a9b72c1929189b9a/xxhash-3.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b7b2df81a23f8cb99656378e72501b2cb41b1827c0f5a86f87d6b06b69f9f204", size = 30816, upload-time = "2025-10-02T14:34:36.043Z" }, + { url = "https://files.pythonhosted.org/packages/b7/f2/57eb99aa0f7d98624c0932c5b9a170e1806406cdbcdb510546634a1359e0/xxhash-3.6.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:dc94790144e66b14f67b10ac8ed75b39ca47536bf8800eb7c24b50271ea0c490", size = 194035, upload-time = "2025-10-02T14:34:37.354Z" }, + { url = "https://files.pythonhosted.org/packages/4c/ed/6224ba353690d73af7a3f1c7cdb1fc1b002e38f783cb991ae338e1eb3d79/xxhash-3.6.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93f107c673bccf0d592cdba077dedaf52fe7f42dcd7676eba1f6d6f0c3efffd2", size = 212914, upload-time = "2025-10-02T14:34:38.6Z" }, + { url = "https://files.pythonhosted.org/packages/38/86/fb6b6130d8dd6b8942cc17ab4d90e223653a89aa32ad2776f8af7064ed13/xxhash-3.6.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aa5ee3444c25b69813663c9f8067dcfaa2e126dc55e8dddf40f4d1c25d7effa", size = 212163, upload-time = "2025-10-02T14:34:39.872Z" }, + { url = "https://files.pythonhosted.org/packages/ee/dc/e84875682b0593e884ad73b2d40767b5790d417bde603cceb6878901d647/xxhash-3.6.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f7f99123f0e1194fa59cc69ad46dbae2e07becec5df50a0509a808f90a0f03f0", size = 445411, upload-time = "2025-10-02T14:34:41.569Z" }, + { url = "https://files.pythonhosted.org/packages/11/4f/426f91b96701ec2f37bb2b8cec664eff4f658a11f3fa9d94f0a887ea6d2b/xxhash-3.6.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49e03e6fe2cac4a1bc64952dd250cf0dbc5ef4ebb7b8d96bce82e2de163c82a2", size = 193883, upload-time = "2025-10-02T14:34:43.249Z" }, + { url = "https://files.pythonhosted.org/packages/53/5a/ddbb83eee8e28b778eacfc5a85c969673e4023cdeedcfcef61f36731610b/xxhash-3.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bd17fede52a17a4f9a7bc4472a5867cb0b160deeb431795c0e4abe158bc784e9", size = 210392, upload-time = "2025-10-02T14:34:45.042Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c2/ff69efd07c8c074ccdf0a4f36fcdd3d27363665bcdf4ba399abebe643465/xxhash-3.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6fb5f5476bef678f69db04f2bd1efbed3030d2aba305b0fc1773645f187d6a4e", size = 197898, upload-time = "2025-10-02T14:34:46.302Z" }, + { url = "https://files.pythonhosted.org/packages/58/ca/faa05ac19b3b622c7c9317ac3e23954187516298a091eb02c976d0d3dd45/xxhash-3.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:843b52f6d88071f87eba1631b684fcb4b2068cd2180a0224122fe4ef011a9374", size = 210655, upload-time = "2025-10-02T14:34:47.571Z" }, + { url = "https://files.pythonhosted.org/packages/d4/7a/06aa7482345480cc0cb597f5c875b11a82c3953f534394f620b0be2f700c/xxhash-3.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7d14a6cfaf03b1b6f5f9790f76880601ccc7896aff7ab9cd8978a939c1eb7e0d", size = 414001, upload-time = "2025-10-02T14:34:49.273Z" }, + { url = "https://files.pythonhosted.org/packages/23/07/63ffb386cd47029aa2916b3d2f454e6cc5b9f5c5ada3790377d5430084e7/xxhash-3.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:418daf3db71e1413cfe211c2f9a528456936645c17f46b5204705581a45390ae", size = 191431, upload-time = "2025-10-02T14:34:50.798Z" }, + { url = "https://files.pythonhosted.org/packages/0f/93/14fde614cadb4ddf5e7cebf8918b7e8fac5ae7861c1875964f17e678205c/xxhash-3.6.0-cp312-cp312-win32.whl", hash = "sha256:50fc255f39428a27299c20e280d6193d8b63b8ef8028995323bf834a026b4fbb", size = 30617, upload-time = "2025-10-02T14:34:51.954Z" }, + { url = "https://files.pythonhosted.org/packages/13/5d/0d125536cbe7565a83d06e43783389ecae0c0f2ed037b48ede185de477c0/xxhash-3.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:c0f2ab8c715630565ab8991b536ecded9416d615538be8ecddce43ccf26cbc7c", size = 31534, upload-time = "2025-10-02T14:34:53.276Z" }, + { url = "https://files.pythonhosted.org/packages/54/85/6ec269b0952ec7e36ba019125982cf11d91256a778c7c3f98a4c5043d283/xxhash-3.6.0-cp312-cp312-win_arm64.whl", hash = "sha256:eae5c13f3bc455a3bbb68bdc513912dc7356de7e2280363ea235f71f54064829", size = 27876, upload-time = "2025-10-02T14:34:54.371Z" }, + { url = "https://files.pythonhosted.org/packages/33/76/35d05267ac82f53ae9b0e554da7c5e281ee61f3cad44c743f0fcd354f211/xxhash-3.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:599e64ba7f67472481ceb6ee80fa3bd828fd61ba59fb11475572cc5ee52b89ec", size = 32738, upload-time = "2025-10-02T14:34:55.839Z" }, + { url = "https://files.pythonhosted.org/packages/31/a8/3fbce1cd96534a95e35d5120637bf29b0d7f5d8fa2f6374e31b4156dd419/xxhash-3.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d8b8aaa30fca4f16f0c84a5c8d7ddee0e25250ec2796c973775373257dde8f1", size = 30821, upload-time = "2025-10-02T14:34:57.219Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ea/d387530ca7ecfa183cb358027f1833297c6ac6098223fd14f9782cd0015c/xxhash-3.6.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d597acf8506d6e7101a4a44a5e428977a51c0fadbbfd3c39650cca9253f6e5a6", size = 194127, upload-time = "2025-10-02T14:34:59.21Z" }, + { url = "https://files.pythonhosted.org/packages/ba/0c/71435dcb99874b09a43b8d7c54071e600a7481e42b3e3ce1eb5226a5711a/xxhash-3.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:858dc935963a33bc33490128edc1c12b0c14d9c7ebaa4e387a7869ecc4f3e263", size = 212975, upload-time = "2025-10-02T14:35:00.816Z" }, + { url = "https://files.pythonhosted.org/packages/84/7a/c2b3d071e4bb4a90b7057228a99b10d51744878f4a8a6dd643c8bd897620/xxhash-3.6.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba284920194615cb8edf73bf52236ce2e1664ccd4a38fdb543506413529cc546", size = 212241, upload-time = "2025-10-02T14:35:02.207Z" }, + { url = "https://files.pythonhosted.org/packages/81/5f/640b6eac0128e215f177df99eadcd0f1b7c42c274ab6a394a05059694c5a/xxhash-3.6.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b54219177f6c6674d5378bd862c6aedf64725f70dd29c472eaae154df1a2e89", size = 445471, upload-time = "2025-10-02T14:35:03.61Z" }, + { url = "https://files.pythonhosted.org/packages/5e/1e/3c3d3ef071b051cc3abbe3721ffb8365033a172613c04af2da89d5548a87/xxhash-3.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:42c36dd7dbad2f5238950c377fcbf6811b1cdb1c444fab447960030cea60504d", size = 193936, upload-time = "2025-10-02T14:35:05.013Z" }, + { url = "https://files.pythonhosted.org/packages/2c/bd/4a5f68381939219abfe1c22a9e3a5854a4f6f6f3c4983a87d255f21f2e5d/xxhash-3.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f22927652cba98c44639ffdc7aaf35828dccf679b10b31c4ad72a5b530a18eb7", size = 210440, upload-time = "2025-10-02T14:35:06.239Z" }, + { url = "https://files.pythonhosted.org/packages/eb/37/b80fe3d5cfb9faff01a02121a0f4d565eb7237e9e5fc66e73017e74dcd36/xxhash-3.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b45fad44d9c5c119e9c6fbf2e1c656a46dc68e280275007bbfd3d572b21426db", size = 197990, upload-time = "2025-10-02T14:35:07.735Z" }, + { url = "https://files.pythonhosted.org/packages/d7/fd/2c0a00c97b9e18f72e1f240ad4e8f8a90fd9d408289ba9c7c495ed7dc05c/xxhash-3.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6f2580ffab1a8b68ef2b901cde7e55fa8da5e4be0977c68f78fc80f3c143de42", size = 210689, upload-time = "2025-10-02T14:35:09.438Z" }, + { url = "https://files.pythonhosted.org/packages/93/86/5dd8076a926b9a95db3206aba20d89a7fc14dd5aac16e5c4de4b56033140/xxhash-3.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:40c391dd3cd041ebc3ffe6f2c862f402e306eb571422e0aa918d8070ba31da11", size = 414068, upload-time = "2025-10-02T14:35:11.162Z" }, + { url = "https://files.pythonhosted.org/packages/af/3c/0bb129170ee8f3650f08e993baee550a09593462a5cddd8e44d0011102b1/xxhash-3.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f205badabde7aafd1a31e8ca2a3e5a763107a71c397c4481d6a804eb5063d8bd", size = 191495, upload-time = "2025-10-02T14:35:12.971Z" }, + { url = "https://files.pythonhosted.org/packages/e9/3a/6797e0114c21d1725e2577508e24006fd7ff1d8c0c502d3b52e45c1771d8/xxhash-3.6.0-cp313-cp313-win32.whl", hash = "sha256:2577b276e060b73b73a53042ea5bd5203d3e6347ce0d09f98500f418a9fcf799", size = 30620, upload-time = "2025-10-02T14:35:14.129Z" }, + { url = "https://files.pythonhosted.org/packages/86/15/9bc32671e9a38b413a76d24722a2bf8784a132c043063a8f5152d390b0f9/xxhash-3.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:757320d45d2fbcce8f30c42a6b2f47862967aea7bf458b9625b4bbe7ee390392", size = 31542, upload-time = "2025-10-02T14:35:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/39/c5/cc01e4f6188656e56112d6a8e0dfe298a16934b8c47a247236549a3f7695/xxhash-3.6.0-cp313-cp313-win_arm64.whl", hash = "sha256:457b8f85dec5825eed7b69c11ae86834a018b8e3df5e77783c999663da2f96d6", size = 27880, upload-time = "2025-10-02T14:35:16.315Z" }, + { url = "https://files.pythonhosted.org/packages/f3/30/25e5321c8732759e930c555176d37e24ab84365482d257c3b16362235212/xxhash-3.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a42e633d75cdad6d625434e3468126c73f13f7584545a9cf34e883aa1710e702", size = 32956, upload-time = "2025-10-02T14:35:17.413Z" }, + { url = "https://files.pythonhosted.org/packages/9f/3c/0573299560d7d9f8ab1838f1efc021a280b5ae5ae2e849034ef3dee18810/xxhash-3.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:568a6d743219e717b07b4e03b0a828ce593833e498c3b64752e0f5df6bfe84db", size = 31072, upload-time = "2025-10-02T14:35:18.844Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1c/52d83a06e417cd9d4137722693424885cc9878249beb3a7c829e74bf7ce9/xxhash-3.6.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bec91b562d8012dae276af8025a55811b875baace6af510412a5e58e3121bc54", size = 196409, upload-time = "2025-10-02T14:35:20.31Z" }, + { url = "https://files.pythonhosted.org/packages/e3/8e/c6d158d12a79bbd0b878f8355432075fc82759e356ab5a111463422a239b/xxhash-3.6.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78e7f2f4c521c30ad5e786fdd6bae89d47a32672a80195467b5de0480aa97b1f", size = 215736, upload-time = "2025-10-02T14:35:21.616Z" }, + { url = "https://files.pythonhosted.org/packages/bc/68/c4c80614716345d55071a396cf03d06e34b5f4917a467faf43083c995155/xxhash-3.6.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3ed0df1b11a79856df5ffcab572cbd6b9627034c1c748c5566fa79df9048a7c5", size = 214833, upload-time = "2025-10-02T14:35:23.32Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e9/ae27c8ffec8b953efa84c7c4a6c6802c263d587b9fc0d6e7cea64e08c3af/xxhash-3.6.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0e4edbfc7d420925b0dd5e792478ed393d6e75ff8fc219a6546fb446b6a417b1", size = 448348, upload-time = "2025-10-02T14:35:25.111Z" }, + { url = "https://files.pythonhosted.org/packages/d7/6b/33e21afb1b5b3f46b74b6bd1913639066af218d704cc0941404ca717fc57/xxhash-3.6.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fba27a198363a7ef87f8c0f6b171ec36b674fe9053742c58dd7e3201c1ab30ee", size = 196070, upload-time = "2025-10-02T14:35:26.586Z" }, + { url = "https://files.pythonhosted.org/packages/96/b6/fcabd337bc5fa624e7203aa0fa7d0c49eed22f72e93229431752bddc83d9/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:794fe9145fe60191c6532fa95063765529770edcdd67b3d537793e8004cabbfd", size = 212907, upload-time = "2025-10-02T14:35:28.087Z" }, + { url = "https://files.pythonhosted.org/packages/4b/d3/9ee6160e644d660fcf176c5825e61411c7f62648728f69c79ba237250143/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:6105ef7e62b5ac73a837778efc331a591d8442f8ef5c7e102376506cb4ae2729", size = 200839, upload-time = "2025-10-02T14:35:29.857Z" }, + { url = "https://files.pythonhosted.org/packages/0d/98/e8de5baa5109394baf5118f5e72ab21a86387c4f89b0e77ef3e2f6b0327b/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f01375c0e55395b814a679b3eea205db7919ac2af213f4a6682e01220e5fe292", size = 213304, upload-time = "2025-10-02T14:35:31.222Z" }, + { url = "https://files.pythonhosted.org/packages/7b/1d/71056535dec5c3177eeb53e38e3d367dd1d16e024e63b1cee208d572a033/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:d706dca2d24d834a4661619dcacf51a75c16d65985718d6a7d73c1eeeb903ddf", size = 416930, upload-time = "2025-10-02T14:35:32.517Z" }, + { url = "https://files.pythonhosted.org/packages/dc/6c/5cbde9de2cd967c322e651c65c543700b19e7ae3e0aae8ece3469bf9683d/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5f059d9faeacd49c0215d66f4056e1326c80503f51a1532ca336a385edadd033", size = 193787, upload-time = "2025-10-02T14:35:33.827Z" }, + { url = "https://files.pythonhosted.org/packages/19/fa/0172e350361d61febcea941b0cc541d6e6c8d65d153e85f850a7b256ff8a/xxhash-3.6.0-cp313-cp313t-win32.whl", hash = "sha256:1244460adc3a9be84731d72b8e80625788e5815b68da3da8b83f78115a40a7ec", size = 30916, upload-time = "2025-10-02T14:35:35.107Z" }, + { url = "https://files.pythonhosted.org/packages/ad/e6/e8cf858a2b19d6d45820f072eff1bea413910592ff17157cabc5f1227a16/xxhash-3.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b1e420ef35c503869c4064f4a2f2b08ad6431ab7b229a05cce39d74268bca6b8", size = 31799, upload-time = "2025-10-02T14:35:36.165Z" }, + { url = "https://files.pythonhosted.org/packages/56/15/064b197e855bfb7b343210e82490ae672f8bc7cdf3ddb02e92f64304ee8a/xxhash-3.6.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ec44b73a4220623235f67a996c862049f375df3b1052d9899f40a6382c32d746", size = 28044, upload-time = "2025-10-02T14:35:37.195Z" }, + { url = "https://files.pythonhosted.org/packages/7e/5e/0138bc4484ea9b897864d59fce9be9086030825bc778b76cb5a33a906d37/xxhash-3.6.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:a40a3d35b204b7cc7643cbcf8c9976d818cb47befcfac8bbefec8038ac363f3e", size = 32754, upload-time = "2025-10-02T14:35:38.245Z" }, + { url = "https://files.pythonhosted.org/packages/18/d7/5dac2eb2ec75fd771957a13e5dda560efb2176d5203f39502a5fc571f899/xxhash-3.6.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a54844be970d3fc22630b32d515e79a90d0a3ddb2644d8d7402e3c4c8da61405", size = 30846, upload-time = "2025-10-02T14:35:39.6Z" }, + { url = "https://files.pythonhosted.org/packages/fe/71/8bc5be2bb00deb5682e92e8da955ebe5fa982da13a69da5a40a4c8db12fb/xxhash-3.6.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:016e9190af8f0a4e3741343777710e3d5717427f175adfdc3e72508f59e2a7f3", size = 194343, upload-time = "2025-10-02T14:35:40.69Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3b/52badfb2aecec2c377ddf1ae75f55db3ba2d321c5e164f14461c90837ef3/xxhash-3.6.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f6f72232f849eb9d0141e2ebe2677ece15adfd0fa599bc058aad83c714bb2c6", size = 213074, upload-time = "2025-10-02T14:35:42.29Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2b/ae46b4e9b92e537fa30d03dbc19cdae57ed407e9c26d163895e968e3de85/xxhash-3.6.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:63275a8aba7865e44b1813d2177e0f5ea7eadad3dd063a21f7cf9afdc7054063", size = 212388, upload-time = "2025-10-02T14:35:43.929Z" }, + { url = "https://files.pythonhosted.org/packages/f5/80/49f88d3afc724b4ac7fbd664c8452d6db51b49915be48c6982659e0e7942/xxhash-3.6.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cd01fa2aa00d8b017c97eb46b9a794fbdca53fc14f845f5a328c71254b0abb7", size = 445614, upload-time = "2025-10-02T14:35:45.216Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ba/603ce3961e339413543d8cd44f21f2c80e2a7c5cfe692a7b1f2cccf58f3c/xxhash-3.6.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0226aa89035b62b6a86d3c68df4d7c1f47a342b8683da2b60cedcddb46c4d95b", size = 194024, upload-time = "2025-10-02T14:35:46.959Z" }, + { url = "https://files.pythonhosted.org/packages/78/d1/8e225ff7113bf81545cfdcd79eef124a7b7064a0bba53605ff39590b95c2/xxhash-3.6.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c6e193e9f56e4ca4923c61238cdaced324f0feac782544eb4c6d55ad5cc99ddd", size = 210541, upload-time = "2025-10-02T14:35:48.301Z" }, + { url = "https://files.pythonhosted.org/packages/6f/58/0f89d149f0bad89def1a8dd38feb50ccdeb643d9797ec84707091d4cb494/xxhash-3.6.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9176dcaddf4ca963d4deb93866d739a343c01c969231dbe21680e13a5d1a5bf0", size = 198305, upload-time = "2025-10-02T14:35:49.584Z" }, + { url = "https://files.pythonhosted.org/packages/11/38/5eab81580703c4df93feb5f32ff8fa7fe1e2c51c1f183ee4e48d4bb9d3d7/xxhash-3.6.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c1ce4009c97a752e682b897aa99aef84191077a9433eb237774689f14f8ec152", size = 210848, upload-time = "2025-10-02T14:35:50.877Z" }, + { url = "https://files.pythonhosted.org/packages/5e/6b/953dc4b05c3ce678abca756416e4c130d2382f877a9c30a20d08ee6a77c0/xxhash-3.6.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:8cb2f4f679b01513b7adbb9b1b2f0f9cdc31b70007eaf9d59d0878809f385b11", size = 414142, upload-time = "2025-10-02T14:35:52.15Z" }, + { url = "https://files.pythonhosted.org/packages/08/a9/238ec0d4e81a10eb5026d4a6972677cbc898ba6c8b9dbaec12ae001b1b35/xxhash-3.6.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:653a91d7c2ab54a92c19ccf43508b6a555440b9be1bc8be553376778be7f20b5", size = 191547, upload-time = "2025-10-02T14:35:53.547Z" }, + { url = "https://files.pythonhosted.org/packages/f1/ee/3cf8589e06c2164ac77c3bf0aa127012801128f1feebf2a079272da5737c/xxhash-3.6.0-cp314-cp314-win32.whl", hash = "sha256:a756fe893389483ee8c394d06b5ab765d96e68fbbfe6fde7aa17e11f5720559f", size = 31214, upload-time = "2025-10-02T14:35:54.746Z" }, + { url = "https://files.pythonhosted.org/packages/02/5d/a19552fbc6ad4cb54ff953c3908bbc095f4a921bc569433d791f755186f1/xxhash-3.6.0-cp314-cp314-win_amd64.whl", hash = "sha256:39be8e4e142550ef69629c9cd71b88c90e9a5db703fecbcf265546d9536ca4ad", size = 32290, upload-time = "2025-10-02T14:35:55.791Z" }, + { url = "https://files.pythonhosted.org/packages/b1/11/dafa0643bc30442c887b55baf8e73353a344ee89c1901b5a5c54a6c17d39/xxhash-3.6.0-cp314-cp314-win_arm64.whl", hash = "sha256:25915e6000338999236f1eb68a02a32c3275ac338628a7eaa5a269c401995679", size = 28795, upload-time = "2025-10-02T14:35:57.162Z" }, + { url = "https://files.pythonhosted.org/packages/2c/db/0e99732ed7f64182aef4a6fb145e1a295558deec2a746265dcdec12d191e/xxhash-3.6.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c5294f596a9017ca5a3e3f8884c00b91ab2ad2933cf288f4923c3fd4346cf3d4", size = 32955, upload-time = "2025-10-02T14:35:58.267Z" }, + { url = "https://files.pythonhosted.org/packages/55/f4/2a7c3c68e564a099becfa44bb3d398810cc0ff6749b0d3cb8ccb93f23c14/xxhash-3.6.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1cf9dcc4ab9cff01dfbba78544297a3a01dafd60f3bde4e2bfd016cf7e4ddc67", size = 31072, upload-time = "2025-10-02T14:35:59.382Z" }, + { url = "https://files.pythonhosted.org/packages/c6/d9/72a29cddc7250e8a5819dad5d466facb5dc4c802ce120645630149127e73/xxhash-3.6.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:01262da8798422d0685f7cef03b2bd3f4f46511b02830861df548d7def4402ad", size = 196579, upload-time = "2025-10-02T14:36:00.838Z" }, + { url = "https://files.pythonhosted.org/packages/63/93/b21590e1e381040e2ca305a884d89e1c345b347404f7780f07f2cdd47ef4/xxhash-3.6.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51a73fb7cb3a3ead9f7a8b583ffd9b8038e277cdb8cb87cf890e88b3456afa0b", size = 215854, upload-time = "2025-10-02T14:36:02.207Z" }, + { url = "https://files.pythonhosted.org/packages/ce/b8/edab8a7d4fa14e924b29be877d54155dcbd8b80be85ea00d2be3413a9ed4/xxhash-3.6.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b9c6df83594f7df8f7f708ce5ebeacfc69f72c9fbaaababf6cf4758eaada0c9b", size = 214965, upload-time = "2025-10-02T14:36:03.507Z" }, + { url = "https://files.pythonhosted.org/packages/27/67/dfa980ac7f0d509d54ea0d5a486d2bb4b80c3f1bb22b66e6a05d3efaf6c0/xxhash-3.6.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:627f0af069b0ea56f312fd5189001c24578868643203bca1abbc2c52d3a6f3ca", size = 448484, upload-time = "2025-10-02T14:36:04.828Z" }, + { url = "https://files.pythonhosted.org/packages/8c/63/8ffc2cc97e811c0ca5d00ab36604b3ea6f4254f20b7bc658ca825ce6c954/xxhash-3.6.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aa912c62f842dfd013c5f21a642c9c10cd9f4c4e943e0af83618b4a404d9091a", size = 196162, upload-time = "2025-10-02T14:36:06.182Z" }, + { url = "https://files.pythonhosted.org/packages/4b/77/07f0e7a3edd11a6097e990f6e5b815b6592459cb16dae990d967693e6ea9/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:b465afd7909db30168ab62afe40b2fcf79eedc0b89a6c0ab3123515dc0df8b99", size = 213007, upload-time = "2025-10-02T14:36:07.733Z" }, + { url = "https://files.pythonhosted.org/packages/ae/d8/bc5fa0d152837117eb0bef6f83f956c509332ce133c91c63ce07ee7c4873/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a881851cf38b0a70e7c4d3ce81fc7afd86fbc2a024f4cfb2a97cf49ce04b75d3", size = 200956, upload-time = "2025-10-02T14:36:09.106Z" }, + { url = "https://files.pythonhosted.org/packages/26/a5/d749334130de9411783873e9b98ecc46688dad5db64ca6e04b02acc8b473/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9b3222c686a919a0f3253cfc12bb118b8b103506612253b5baeaac10d8027cf6", size = 213401, upload-time = "2025-10-02T14:36:10.585Z" }, + { url = "https://files.pythonhosted.org/packages/89/72/abed959c956a4bfc72b58c0384bb7940663c678127538634d896b1195c10/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:c5aa639bc113e9286137cec8fadc20e9cd732b2cc385c0b7fa673b84fc1f2a93", size = 417083, upload-time = "2025-10-02T14:36:12.276Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b3/62fd2b586283b7d7d665fb98e266decadf31f058f1cf6c478741f68af0cb/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5c1343d49ac102799905e115aee590183c3921d475356cb24b4de29a4bc56518", size = 193913, upload-time = "2025-10-02T14:36:14.025Z" }, + { url = "https://files.pythonhosted.org/packages/9a/9a/c19c42c5b3f5a4aad748a6d5b4f23df3bed7ee5445accc65a0fb3ff03953/xxhash-3.6.0-cp314-cp314t-win32.whl", hash = "sha256:5851f033c3030dd95c086b4a36a2683c2ff4a799b23af60977188b057e467119", size = 31586, upload-time = "2025-10-02T14:36:15.603Z" }, + { url = "https://files.pythonhosted.org/packages/03/d6/4cc450345be9924fd5dc8c590ceda1db5b43a0a889587b0ae81a95511360/xxhash-3.6.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0444e7967dac37569052d2409b00a8860c2135cff05502df4da80267d384849f", size = 32526, upload-time = "2025-10-02T14:36:16.708Z" }, + { url = "https://files.pythonhosted.org/packages/0f/c9/7243eb3f9eaabd1a88a5a5acadf06df2d83b100c62684b7425c6a11bcaa8/xxhash-3.6.0-cp314-cp314t-win_arm64.whl", hash = "sha256:bb79b1e63f6fd84ec778a4b1916dfe0a7c3fdb986c06addd5db3a0d413819d95", size = 28898, upload-time = "2025-10-02T14:36:17.843Z" }, +] + [[package]] name = "xyzservices" version = "2026.3.0"