mirror of
https://github.com/K-Dense-AI/claude-scientific-skills.git
synced 2026-03-27 07:09:27 +08:00
6.9 KiB
6.9 KiB
edgartools — Financial Data Reference
Table of Contents
- Quick Start
- Available Statements
- Convenience Methods
- Detail Levels (Views)
- DataFrame Export
- Quarterly vs Annual
- Multi-Period Analysis
- Raw XBRL Facts Query
- API Quick Reference
- Troubleshooting
Quick Start
from edgar import Company
company = Company("AAPL")
# Annual (from latest 10-K)
financials = company.get_financials()
income = financials.income_statement()
# Quarterly (from latest 10-Q)
quarterly = company.get_quarterly_financials()
income = quarterly.income_statement()
Available Statements
financials = company.get_financials()
income = financials.income_statement()
balance = financials.balance_sheet()
cashflow = financials.cashflow_statement() # note: no underscore
equity = financials.statement_of_equity()
comprehensive = financials.comprehensive_income()
| Method | Description |
|---|---|
income_statement() |
Revenue, COGS, operating income, net income |
balance_sheet() |
Assets, liabilities, equity |
cashflow_statement() |
Operating, investing, financing cash flows |
statement_of_equity() |
Changes in stockholders' equity |
comprehensive_income() |
Net income + other comprehensive income |
Convenience Methods
Get single values directly:
financials = company.get_financials()
revenue = financials.get_revenue()
net_income = financials.get_net_income()
total_assets = financials.get_total_assets()
total_liabs = financials.get_total_liabilities()
equity = financials.get_stockholders_equity()
op_cash_flow = financials.get_operating_cash_flow()
free_cash_flow = financials.get_free_cash_flow()
capex = financials.get_capital_expenditures()
current_assets = financials.get_current_assets()
current_liabs = financials.get_current_liabilities()
# All key metrics at once
metrics = financials.get_financial_metrics() # dict
# Prior period: period_offset=1 (previous), 0=current
prev_revenue = financials.get_revenue(period_offset=1)
Detail Levels (Views)
Control the level of detail in financial statements:
income = financials.income_statement()
# Summary: ~15-20 rows, matches SEC Viewer
df_summary = income.to_dataframe(view="summary")
# Standard (default): ~25-35 rows, matches filing document
df_standard = income.to_dataframe(view="standard")
# Detailed: ~50+ rows, all dimensional breakdowns
df_detailed = income.to_dataframe(view="detailed")
| View | Use Case |
|---|---|
"summary" |
Quick overview, validating against SEC Viewer |
"standard" |
Display, full context (default) |
"detailed" |
Data extraction, segment analysis |
Example — Apple Revenue breakdown:
- Summary:
Revenue $391,035M - Standard:
Products $298,085M,Services $92,950M - Detailed: iPhone, Mac, iPad, Wearables separately
DataFrame Export
income = financials.income_statement()
# Convert to DataFrame
df = income.to_dataframe()
df = income.to_dataframe(view="detailed")
# Export
df.to_csv("apple_income.csv")
df.to_excel("apple_income.xlsx")
Quarterly vs Annual
| Need | Method |
|---|---|
| Annual (10-K) | company.get_financials() |
| Quarterly (10-Q) | company.get_quarterly_financials() |
quarterly = company.get_quarterly_financials()
q_income = quarterly.income_statement()
Multi-Period Analysis
Use XBRLS to analyze trends across multiple filings:
from edgar.xbrl import XBRLS
# Get last 3 annual filings (use amendments=False)
filings = company.get_filings(form="10-K", amendments=False).head(3)
# Stitch together
xbrls = XBRLS.from_filings(filings)
# Get aligned multi-period statements
income = xbrls.statements.income_statement()
income_detailed = xbrls.statements.income_statement(view="detailed")
balance = xbrls.statements.balance_sheet()
cashflow = xbrls.statements.cashflow_statement()
# Convert to DataFrame (periods as columns)
df = income.to_dataframe()
print(df)
Why amendments=False? Amended filings (10-K/A) sometimes contain only corrected sections, not complete financial statements, which breaks multi-period stitching.
Raw XBRL Facts Query
For research or custom calculations:
xbrl = filing.xbrl()
# Find revenue facts
revenue_facts = xbrl.facts.query()\
.by_concept("Revenue")\
.to_dataframe()
# Search by label
rd_facts = xbrl.facts.query()\
.by_label("Research", exact=False)\
.to_dataframe()
# Filter by value range
large_items = xbrl.facts.query()\
.by_value(min_value=1_000_000_000)\
.to_dataframe()
API Quick Reference
Company-Level
| Method | Description |
|---|---|
company.get_financials() |
Latest annual (10-K) |
company.get_quarterly_financials() |
Latest quarterly (10-Q) |
Financials Object
| Method | Description |
|---|---|
financials.income_statement() |
Income statement |
financials.balance_sheet() |
Balance sheet |
financials.cashflow_statement() |
Cash flow |
financials.get_revenue() |
Revenue scalar |
financials.get_net_income() |
Net income scalar |
financials.get_total_assets() |
Total assets scalar |
financials.get_financial_metrics() |
Dict of all key metrics |
Statement Object
| Method | Description |
|---|---|
statement.to_dataframe() |
Convert to DataFrame |
statement.to_dataframe(view="summary") |
SEC Viewer format |
statement.to_dataframe(view="standard") |
Filing document format |
statement.to_dataframe(view="detailed") |
All dimensional breakdowns |
Filing-Level (More Control)
| Method | Description |
|---|---|
filing.xbrl() |
Parse XBRL from filing |
xbrl.statements.income_statement() |
Income statement |
xbrl.facts.query() |
Query individual facts |
Multi-Period
| Method | Description |
|---|---|
XBRLS.from_filings(filings) |
Stitch multiple filings |
xbrls.statements.income_statement() |
Aligned multi-period |
Troubleshooting
"No financial data found"
filing = company.get_filings(form="10-K").latest()
if filing.xbrl():
print("XBRL available")
else:
# Older/smaller companies may not have XBRL
text = filing.text() # fallback to raw text
"Statement is empty"
Try the detailed view:
df = income.to_dataframe(view="detailed")
"Numbers don't match SEC website"
Check the reporting periods:
xbrl = filing.xbrl()
print(xbrl.reporting_periods)
Accessing financials from a 10-K filing
# WRONG: filing.financials does not exist
filing.financials # AttributeError!
# CORRECT:
tenk = filing.obj()
if tenk and tenk.financials:
income = tenk.financials.income_statement