SPB Git

spb/findata

Public
3.4 KB · 61 lines python
1from __future__ import annotations23from fastapi import APIRouter, Depends4from findata_core.db import connection56from findata_api import auth as A7from findata_api.errors import ApiError89router = APIRouter(prefix="/catalog", tags=["catalog"])1011LICENSE_TEXT = {12    "frd-private": "FirstRate Data license: private use by the subscriber only. Raw bars/tables may not be redistributed to third parties "13                   "(no public API, CSV or tables). Derived results and charts may be published with attribution to FirstRate Data.",14    "public-domain": "U.S. government work (SEC EDGAR): public domain; SEC fair-access policy applies to retrieval.",15    "pending": "License not yet determined.",16}171819@router.get("/datasets")20def datasets(p: A.Principal = Depends(A.require("read:market"))):21    with connection() as conn:22        rows = conn.execute(23            "SELECT d.*, s.name source_name, s.vendor, s.product, v.snapshot_id, v.file_count, v.row_count, v.bytes, v.created_at version_created_at, "24            "(SELECT min(session_date) FROM coverage c WHERE c.dataset_id=d.id) first_session, (SELECT max(session_date) FROM coverage c WHERE c.dataset_id=d.id) last_session, "25            "(SELECT count(DISTINCT symbol) FROM coverage c WHERE c.dataset_id=d.id) symbols "26            "FROM datasets d JOIN sources s ON s.id=d.source_id LEFT JOIN dataset_versions v ON v.dataset_id=d.id AND v.version=d.current_version ORDER BY d.kind, d.id").fetchall()27    out = []28    for r in rows:29        r = dict(r)30        r["license_text"] = LICENSE_TEXT.get(r["license_class"], "")31        out.append(r)32    return {"data": out, "meta": {"count": len(out)}}333435@router.get("/datasets/{dataset_id}")36def dataset(dataset_id: str, p: A.Principal = Depends(A.require("read:market"))):37    with connection() as conn:38        d = conn.execute("SELECT d.*, s.name source_name, s.vendor, s.license_class src_license FROM datasets d JOIN sources s ON s.id=d.source_id WHERE d.id=%s", (dataset_id,)).fetchone()39        if not d:40            raise ApiError(404, "not_found", "unknown dataset")41        versions = conn.execute("SELECT version, snapshot_id, file_count, row_count, bytes, created_at, note FROM dataset_versions WHERE dataset_id=%s ORDER BY version DESC LIMIT 50", (dataset_id,)).fetchall()42        files = conn.execute("SELECT layout, count(*) n, sum(row_count) rows, sum(bytes) bytes, min(date_min) d0, max(date_max) d1 FROM lake_files WHERE dataset_id=%s AND version_removed IS NULL GROUP BY layout", (dataset_id,)).fetchall()43        ck = conn.execute("SELECT key, value, updated_at FROM checkpoints WHERE scope=%s", (f"dataset:{dataset_id}",)).fetchall()44    d = dict(d)45    d["license_text"] = LICENSE_TEXT.get(d["license_class"], "")46    return {"data": d, "versions": versions, "files": files, "checkpoints": ck}474849@router.get("/sources")50def sources(p: A.Principal = Depends(A.require("read:market"))):51    with connection() as conn:52        rows = conn.execute("SELECT * FROM sources ORDER BY id").fetchall()53    return {"data": rows}545556@router.get("/schema/bars")57def schema_bars(p: A.Principal = Depends(A.require("read:market"))):58    from findata_schema import BARS_SCHEMA, BARS_SCHEMA_VERSION59    return {"schema_version": BARS_SCHEMA_VERSION, "timestamp_convention": "bar_open", "timezone_storage": "UTC",60            "fields": [{"name": f.name, "type": str(f.type), "nullable": f.nullable} for f in BARS_SCHEMA]}61
Files · main
Menu

Theme