valuein-sdk 7.2.0__tar.gz → 7.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of valuein-sdk might be problematic. Click here for more details.

Files changed (122) hide show
  1. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/PKG-INFO +2 -1
  2. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/README.md +1 -0
  3. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/pyproject.toml +1 -1
  4. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/__init__.py +2 -1
  5. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/catalog/tables.py +5 -0
  6. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/SQL_CHEATSHEET.md +21 -1
  7. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/.gitignore +0 -0
  8. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/LICENSE +0 -0
  9. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/NOTICE +0 -0
  10. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/_standard_concepts.txt +0 -0
  11. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/aio.py +0 -0
  12. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/alpha/__init__.py +0 -0
  13. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/alpha/engine.py +0 -0
  14. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/alpha/factors.py +0 -0
  15. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/cache/__init__.py +0 -0
  16. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/cache/store.py +0 -0
  17. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/catalog/__init__.py +0 -0
  18. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/cli/__init__.py +0 -0
  19. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/cli/main.py +0 -0
  20. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/client.py +0 -0
  21. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/config.py +0 -0
  22. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/domain/__init__.py +0 -0
  23. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/domain/fundamentals.py +0 -0
  24. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/domain/panels.py +0 -0
  25. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/domain/prices.py +0 -0
  26. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/domain/restatements.py +0 -0
  27. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/domain/screen.py +0 -0
  28. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/domain/smart_money.py +0 -0
  29. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/domain/valuation.py +0 -0
  30. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/engine/__init__.py +0 -0
  31. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/engine/corporate_actions.py +0 -0
  32. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/engine/fundamentals.py +0 -0
  33. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/engine/pit.py +0 -0
  34. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/engine/safe_mode.py +0 -0
  35. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/engine/views.py +0 -0
  36. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/exceptions.py +0 -0
  37. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/hot.py +0 -0
  38. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/identifiers.py +0 -0
  39. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/mirror.py +0 -0
  40. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/models.py +0 -0
  41. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/observability.py +0 -0
  42. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/plans.py +0 -0
  43. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/py.typed +0 -0
  44. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/quant/__init__.py +0 -0
  45. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/quant/backtest.py +0 -0
  46. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/quant/bundle.py +0 -0
  47. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/quant/calendar.py +0 -0
  48. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/quant/interop.py +0 -0
  49. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/quant/library.py +0 -0
  50. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/quant/lineage.py +0 -0
  51. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/quant/regression.py +0 -0
  52. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/quant/report.py +0 -0
  53. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/quant/result.py +0 -0
  54. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/quant/returns.py +0 -0
  55. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/quant/robustness.py +0 -0
  56. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/quant/signals.py +0 -0
  57. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/quant/simulate.py +0 -0
  58. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/quant/stats.py +0 -0
  59. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/quant/universe.py +0 -0
  60. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/quant/vintages.py +0 -0
  61. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/8k_event_frequency.sql +0 -0
  62. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/8k_material_event_signal.sql +0 -0
  63. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/altman_z_score_inputs.sql +0 -0
  64. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/as_filed_vs_latest_restatements.sql +0 -0
  65. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/blockholders.sql +0 -0
  66. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/capex_to_revenue.sql +0 -0
  67. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/comprehensive_income_volatility.sql +0 -0
  68. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/cpa_verified_concepts.sql +0 -0
  69. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/cross_exchange_arbitrage_filter.sql +0 -0
  70. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/cross_sector_dupont_roe_breakdown.sql +0 -0
  71. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/dividend_history.sql +0 -0
  72. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/dupont_analysis_inputs.sql +0 -0
  73. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/earnings_quality_accruals_anomaly.sql +0 -0
  74. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/earnings_surprise_alpha.sql +0 -0
  75. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/efficiency_cash_conversion.sql +0 -0
  76. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/factor_screen_top_quintile.sql +0 -0
  77. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/figi_to_fundamentals_mapping.sql +0 -0
  78. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/filing_delay_screener.sql +0 -0
  79. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/filing_links_by_ticker.sql +0 -0
  80. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/financial_ratios_by_ticker.sql +0 -0
  81. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/financial_ratios_category.sql +0 -0
  82. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/financial_ratios_comparison.sql +0 -0
  83. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/financial_ratios_screener.sql +0 -0
  84. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/free_cash_flow.sql +0 -0
  85. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/fundamentals_by_ticker.sql +0 -0
  86. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/geographic_fundamental_concentration.sql +0 -0
  87. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/ghost_company_screener.sql +0 -0
  88. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/high_confidence_data_screener.sql +0 -0
  89. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/index_constituent_aggregate_fundamentals.sql +0 -0
  90. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/industry_leader_vs_laggard_sic_ranking.sql +0 -0
  91. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/insider_buys.sql +0 -0
  92. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/interest_coverage.sql +0 -0
  93. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/late_reporter_short_signal.sql +0 -0
  94. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/liquidity_ratios.sql +0 -0
  95. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/manager_portfolio.sql +0 -0
  96. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/margin_analysis.sql +0 -0
  97. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/peer_group_comparison.sql +0 -0
  98. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/piotroski_f_score_inputs.sql +0 -0
  99. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/pit_universe_announcement.sql +0 -0
  100. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/price_history.sql +0 -0
  101. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/price_momentum_screen.sql +0 -0
  102. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/price_return.sql +0 -0
  103. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/restatement_history.sql +0 -0
  104. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/restatement_negative_revision_alpha.sql +0 -0
  105. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/revenue_yoy_growth.sql +0 -0
  106. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/rnd_intensity.sql +0 -0
  107. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/seasonal_frame_based_extraction.sql +0 -0
  108. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/sector_relative_valuation_outperformers.sql +0 -0
  109. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/shareholder_dilution.sql +0 -0
  110. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/solvency_debt_to_equity.sql +0 -0
  111. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/survivorship_bias_free_screen.sql +0 -0
  112. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/taxonomy_guide_automated_reporting.sql +0 -0
  113. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/time_series_outlier_detection_zscore.sql +0 -0
  114. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/top_institutional_holders.sql +0 -0
  115. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/trailing_twelve_months_ttm.sql +0 -0
  116. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/true_point_in_time_backtest_engine.sql +0 -0
  117. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/queries/xbrl_mapping_lineage_audit.sql +0 -0
  118. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/reliability.py +0 -0
  119. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/telemetry.py +0 -0
  120. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/transport/__init__.py +0 -0
  121. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/transport/httpx_sync.py +0 -0
  122. {valuein_sdk-7.2.0 → valuein_sdk-7.3.0}/valuein_sdk/transport/protocol.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: valuein-sdk
3
- Version: 7.2.0
3
+ Version: 7.3.0
4
4
  Summary: Point-in-time, survivorship-free SEC EDGAR fundamentals in Python: DuckDB SQL over Parquet, traceable fact_ids, factor backtests.
5
5
  Project-URL: Homepage, https://valuein.biz
6
6
  Project-URL: Documentation, https://valuein.biz/developers/python-sdk
@@ -543,6 +543,7 @@ snapshot and schema version you are reading. "PIT" means the view is filtered to
543
543
  | `stock_price` | Close and `total_return_index` at period ends and completed month ends | Yes | All |
544
544
  | `stock_price_daily` | Daily OHLCV bars, `div_cash`, `split_factor`, `total_return_index`, `is_primary_listing` | Yes | Pro, Institutional |
545
545
  | `restatement_events` | Values a later filing changed, with both accessions and a `disclosure_class` | | All |
546
+ | `industry_classification` | Point-in-time SIC spells keyed on `cik`: `sic_code`, `sic_industry_group`, `sic_major_group`, `sic_division`, `sector`, `industry`, `valid_from`, `valid_to` (exclusive, NULL = current). `references.sector` is current only | | All |
546
547
  | Smart money | `insider_party`, `insider_filing`, `insider_transaction`, `insider_ownership`, `insider_footnote`, `insider_ownership_purpose`, `institutional_filing`, `institutional_holding`, `institutional_other_manager` | Yes, except `insider_party` | Institutional |
547
548
  | Form ADV | `investment_adviser`, `investment_adviser_private_fund` (keyed on CRD, not CIK) | | Institutional |
548
549
 
@@ -483,6 +483,7 @@ snapshot and schema version you are reading. "PIT" means the view is filtered to
483
483
  | `stock_price` | Close and `total_return_index` at period ends and completed month ends | Yes | All |
484
484
  | `stock_price_daily` | Daily OHLCV bars, `div_cash`, `split_factor`, `total_return_index`, `is_primary_listing` | Yes | Pro, Institutional |
485
485
  | `restatement_events` | Values a later filing changed, with both accessions and a `disclosure_class` | | All |
486
+ | `industry_classification` | Point-in-time SIC spells keyed on `cik`: `sic_code`, `sic_industry_group`, `sic_major_group`, `sic_division`, `sector`, `industry`, `valid_from`, `valid_to` (exclusive, NULL = current). `references.sector` is current only | | All |
486
487
  | Smart money | `insider_party`, `insider_filing`, `insider_transaction`, `insider_ownership`, `insider_footnote`, `insider_ownership_purpose`, `institutional_filing`, `institutional_holding`, `institutional_other_manager` | Yes, except `insider_party` | Institutional |
487
488
  | Form ADV | `investment_adviser`, `investment_adviser_private_fund` (keyed on CRD, not CIK) | | Institutional |
488
489
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "valuein-sdk"
3
- version = "7.2.0"
3
+ version = "7.3.0"
4
4
  description = "Point-in-time, survivorship-free SEC EDGAR fundamentals in Python: DuckDB SQL over Parquet, traceable fact_ids, factor backtests."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -62,7 +62,8 @@ listed in ``valuein_sdk.catalog.PIT_TABLES`` (``filing``, ``fact``,
62
62
  template and typed method; ``ratio`` also keeps only the latest vintage per
63
63
  key. Not filtered by ``as_of``: ``references``, ``entity``, ``security``,
64
64
  ``filing_registrant`` (join it to ``filing`` for the filter),
65
- ``index_membership``, ``restatement_events``, the Form ADV tables and the
65
+ ``index_membership``, ``restatement_events``, ``industry_classification`` (its
66
+ own ``valid_from`` / ``valid_to`` spells), the Form ADV tables and the
66
67
  reference/taxonomy tables, and ``client.get(table)``, which downloads a
67
68
  table raw.
68
69
  """
@@ -98,6 +98,11 @@ KNOWN_TABLES = frozenset(
98
98
  # domain/restatements.py and the naming-discipline test, which
99
99
  # enforces this at build time).
100
100
  "restatement_events",
101
+ # Point-in-time SIC classification SPELLS per CIK (schema 4.5.0+),
102
+ # every tier. Not PIT-classified: no accepted_at; the spell's own
103
+ # valid_from / valid_to (exclusive, NULL = current) answer as-of
104
+ # questions. No GICS (licensed).
105
+ "industry_classification",
101
106
  # ── Core: market data (EOD prices, every tier) ───────────────────
102
107
  # Coarse pre-aggregation of stock_price_daily, on every tier: one row
103
108
  # per entity at each period_end + monthly closes (`observation`
@@ -34,6 +34,7 @@ from the manifest: `client.get_schema("fact")`.
34
34
  | `standard_concept` | curated concept | The dictionary for `fact.standard_concept`: `definition`, `statement_type`, `unit_default`, `is_flow`, `review_confidence`. | no | all |
35
35
  | `taxonomy_guide` | raw XBRL tag | Labels and definitions for raw tags. Its `standard_concept` column holds the tag name without prefix (`Revenues`); join it on `split_part(fact.concept, ':', 2)`. | no | all |
36
36
  | `restatement_events` | restated fact | Before/after pairs with `delta_pct`, `severity`, both accessions and `disclosure_class` (`non_reliance`, `amended`, `undisclosed`). | no (public diff feed) | all |
37
+ | `industry_classification` | (company, SIC spell) | `sic_code` (4-digit), `sic_industry_group` (3), `sic_major_group` (2), `sic_division`, `sic_division_name`, `sector`, `industry`, `valid_from`, `valid_to` (exclusive, NULL = current), `first_accession_id`, `last_accession_id`, `evidence_count`, `valid_from_basis`. No GICS. | no (spell dates are in the rows) | all |
37
38
  | `stock_price` | (company, observation) | Coarse closes: `observation = 'period_end'` (at fiscal period ends) or `'monthly'`; raw `close`, `total_return_index`, primary listing only. | yes | all |
38
39
  | `stock_price_daily` | (security, trading day) | Daily OHLCV, `total_return_index`, `is_primary_listing`, `adjusted_close` (recent bars only). | yes | Pro, Institutional |
39
40
  | `insider_party`, `insider_filing`, `insider_transaction`, `institutional_filing`, `institutional_holding`, `insider_ownership` | see `client.get_schema()` | Smart money: Forms 3/4/5/144, 13F-HR, SC 13D/13G. | yes (except `insider_party`) | Institutional |
@@ -257,6 +258,23 @@ LIMIT 20;
257
258
  filings), `amended` (corrected in a 10-K/A or 10-Q/A) or `undisclosed` (the value
258
259
  changed inside a routine periodic filing).
259
260
 
261
+ ### Industry on a date (spells, not current values)
262
+
263
+ `references.sector`, `references.industry` and `references.sic_code` are CURRENT
264
+ values. For history use `industry_classification` and keep the spell in force at
265
+ the date: `valid_from <= t AND (valid_to IS NULL OR t < valid_to)`. There are no
266
+ rows before a company's first evidence.
267
+
268
+ ```sql
269
+ -- Max one position per sub-industry (4-digit SIC) on 2020-06-30
270
+ SELECT ic.sic_code, ANY_VALUE(ic.industry) AS industry, COUNT(*) AS companies
271
+ FROM industry_classification ic
272
+ WHERE ic.valid_from <= TIMESTAMPTZ '2020-06-30 00:00:00+00'
273
+ AND (ic.valid_to IS NULL OR TIMESTAMPTZ '2020-06-30 00:00:00+00' < ic.valid_to)
274
+ GROUP BY ic.sic_code
275
+ ORDER BY companies DESC;
276
+ ```
277
+
260
278
  ---
261
279
 
262
280
  ## Pattern 8 — Human-readable concept labels
@@ -521,7 +539,9 @@ published: compute one locally with your own assumptions via `client.dcf()`
521
539
  ### `rank` — sector percentiles
522
540
 
523
541
  `{ratio}_sector_pctile`, unit `percentile`, a value from 0 to 1 placing the
524
- company within its sector. FY and TTM for `roic`, `roce`, `return_on_equity`,
542
+ company within its sector, the sector in force at the underlying filing's
543
+ acceptance time (`industry_classification`), not today's. The percentile rows
544
+ themselves still carry `accepted_at` NULL. FY and TTM for `roic`, `roce`, `return_on_equity`,
525
545
  `return_on_assets`, `net_margin`, `operating_margin`, `gross_profit_margin`,
526
546
  `ebitda_margin`, `fcf_margin`, `ocf_margin`, `fcf_conversion`, `debt_to_equity`,
527
547
  `net_debt_to_ebitda`, `current_ratio`, `interest_coverage`, `asset_turnover`,
File without changes
File without changes
File without changes