Point-in-time SEC EDGAR financial data pipeline
Project description
pitedgar
Point-in-time SEC EDGAR financial data pipeline.
Downloads SEC EDGAR companyfacts.zip, parses XBRL JSON facts into a local
parquet file, and exposes a query API with zero look-ahead bias — every
value is stamped with the filed date (when the data was actually available
to the market), not the period-end date.
Installation
pip install pitedgar
# or with Poetry
poetry install
Quick start
from pathlib import Path
from pitedgar import PitEdgarConfig, build_cik_map, download_bulk, parse_all, PitQuery
config = PitEdgarConfig(
edgar_identity="Mario Rossi mario@example.com", # required by SEC
data_dir=Path("./data"),
)
# Step 1 — one-shot ticker → CIK mapping
tickers = ["AAPL", "MSFT", "JPM", "GOOGL"]
cik_map = build_cik_map(tickers, config)
# Step 2 — download ~1.5 GB bulk ZIP (do this periodically, not every run)
download_bulk(config)
# Step 3 — parse JSON → parquet (sub-minute for 500 companies)
master = parse_all(config, cik_map)
# Step 4 — query
q = PitQuery(config.data_dir / "pit_financials.parquet")
# What revenue figure was available to the market on 2022-06-30?
result = q.as_of(["AAPL", "MSFT"], "us-gaap:Revenues", "2022-06-30")
# Full history
hist = q.history("AAPL", "us-gaap:NetIncomeLoss", freq="A")
# Portfolio cross-section signal
xs = q.cross_section("us-gaap:NetIncomeLoss", "2023-12-31")
CLI
# Resolve tickers (tickers.txt has one ticker per line)
pitedgar map --tickers tickers.txt --identity "Name name@email.com"
# Download bulk ZIP
pitedgar fetch --identity "Name name@email.com"
# Parse to parquet
pitedgar build --identity "Name name@email.com"
# Query a single value
pitedgar query --ticker AAPL --concept us-gaap:Revenues --as-of 2023-06-30
Key design decisions
| Decision | Rationale |
|---|---|
filed as PIT timestamp |
The date the filing was submitted to SEC — this is when information became public |
Deduplication keeps latest filed per (concept, end) |
Companies sometimes refile restated figures; keep the superseding value |
| Raw USD values, no scale conversion | SEC reports values as-filed; downstream code applies any needed normalization |
| Local parquet, no runtime HTTP | Queries run at DataFrame speed with no network dependency |
Supported XBRL concepts (defaults)
See pitedgar.config.DEFAULT_CONCEPTS for the full list, which includes
revenues, net income, assets, liabilities, equity, EPS, cash, debt, operating
cash flow, capex, and R&D expense.
Examples
examples/fcf_sp500.py— S&P 500 free cash flow benchmark: fetches constituents, builds the parquet, and queries FCF cross-sections across 20 quarters. Useful as an end-to-end performance reference.
Contributing
Contributions are welcome. See CONTRIBUTING.md for setup instructions, coding conventions, and the PR process.
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pitedgar-0.1.2.tar.gz.
File metadata
- Download URL: pitedgar-0.1.2.tar.gz
- Upload date:
- Size: 9.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.3.2 CPython/3.11.15 Linux/6.17.0-1008-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a74fcdc4a6d437aa4ebb408afef1109b593f08f7fc673657316a8161321de3b3
|
|
| MD5 |
2161466aec46b17d2ffd2ed64e1b350c
|
|
| BLAKE2b-256 |
43b08a978671632a7d131e6d189592401a4af4824fea86c8d3fad3268a172cfd
|
File details
Details for the file pitedgar-0.1.2-py3-none-any.whl.
File metadata
- Download URL: pitedgar-0.1.2-py3-none-any.whl
- Upload date:
- Size: 12.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.3.2 CPython/3.11.15 Linux/6.17.0-1008-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5a5464f8e4fd198c7a27725e51477449af93e5c804deb4824c676708a1b6fd79
|
|
| MD5 |
71d7d2e4da60ff8ed4efe9807e7b88a8
|
|
| BLAKE2b-256 |
adba2b0c3578efbe641ba39e1aa85f18c16aa98c57a2dd88d9f69a303bac4a59
|