Skip to content

v0.3.0 — Accuracy, Performance & Architecture Audit

Choose a tag to compare

@zoharbabin zoharbabin released this 17 Apr 03:47
· 36 commits to main since this release

What's Changed

Critical Accuracy Fixes

  • Operating Margin now correctly reflects D&A-in-COGS adjustments (was using pre-adjustment value)
  • adjust_for_dep_in_cogs properly handles negative depreciation values via abs() sign-flip
  • Debt-to-Equity, ROE, Interest Coverage return NaN for degenerate denominators (zero/negative equity, zero interest expense) instead of misleading 0.0
  • Net Debt/EBITDA returns NaN when EBITDA ≤ 0, with an alert explaining the undefined ratio
  • Tangible Equity no longer clamped to 0 — negative values now surface as insolvency signals
  • Duplicate index handling: df.loc[] returning a DataFrame (instead of Series) for duplicate index entries is now handled correctly across all synonym matching functions

New Alerts

  • Negative shareholders' equity (potential insolvency)
  • Negative tangible equity (intangibles exceed equity)
  • Net Debt positive but EBITDA non-positive (leverage ratio undefined)

Forecasting Improvements

  • MIN_DATA_POINTS raised from 4 → 6 for ARIMA reliability
  • SARIMAX requires 12+ data points (was 6) to avoid overfitting
  • Fixed SARIMAX over-differencing: seasonal_order changed from (1,1,1,4) to (1,0,1,4)
  • Enabled enforce_stationarity=True for numerically stable fits

Data Parsing

  • Quarter-format labels (Q1-2023, Q2 2023, Q4_2021) now parse correctly for chronological sorting
  • custom_float_format displays N/A for NaN/Inf values instead of raw nan

Architecture & Performance

  • Eliminated duplicated synonym-matching code via shared find_best_synonym_row
  • NormalizedIndex caching eliminates redundant DataFrame index normalization
  • RotatingFileHandler (10MB, 3 backups) with atexit cleanup prevents unbounded log growth
  • Removed raw DataFrames from multi-period return values (memory optimization)
  • Consolidated alert display methods in reporting module

Compatibility

  • edgartools API migration: Transparently handles both old method-based (get_balance_sheet()) and new property-based (balance_sheet) APIs — fixes #2

Tests

  • 127 tests (11 new), all passing across Python 3.10, 3.11, 3.12
  • New coverage: negative equity, duplicate indices, quarter parsing, D&A-adjusted margins, degenerate denominators, NaN formatting

Install / Upgrade

pip install --upgrade edgar-analytics

Breaking change: Metrics that previously returned 0.0 for undefined ratios (e.g., Debt-to-Equity with zero equity) now return NaN. Code that checks == 0.0 should use pd.isna() instead.