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. |
||
|---|---|---|
| .. | ||
| __init__.py | ||
| complex_buildings.py | ||
| concept.py | ||
| custom_poi.py | ||
| job_settings.py | ||
| nspd_bulk.py | ||
| parcel.py | ||
| recommend.py | ||
| trade_in.py | ||