Adds deterministic horizon-aware relevance_weight ∈[0,1] to get_competitors (ТЗ §9.1): weighted mean of geo_proximity (0.30), class_similarity (0.25), price_similarity (0.20), stage_at_horizon (0.25). stage_at_horizon projects each competitor's sell-out to horizon_months (request param, default 12) so a competitor sold-out by our launch ranks lower. class_similarity uses a domrf class-ladder vs the local dominant class (no target class yet). Orders by relevance_weight DESC (distance still present + tie-break). relevance_breakdown (4 sub-scores) exposed for explainability (§16). Additive: all legacy Competitor fields intact, new fields Optional; zero frontend consumers of /competitors (UI uses /analyze). sold-count folded into existing price query (no extra db.execute, #227 regression green). Graceful: thin data → neutral 0.5. 57 new pure-helper tests. Completes #949. |
||
|---|---|---|
| .. | ||
| api | ||
| integration | ||
| scrapers | ||
| services | ||
| smoke | ||
| sql | ||
| workers | ||
| __init__.py | ||
| test_admin_weight_profiles.py | ||
| test_concepts_stub.py | ||
| test_gate_verdict.py | ||
| test_health.py | ||
| test_layout_signature.py | ||
| test_layout_tz_pdf.py | ||
| test_nspd_client.py | ||
| test_nspd_sync.py | ||
| test_ping.py | ||
| test_poi_score.py | ||
| test_quarter_dump_lookup.py | ||
| test_rbac.py | ||
| test_sentry_init.py | ||
| test_velocity.py | ||
| test_weight_profiles.py | ||