feat(sales-finder): ранг горячести из трёх сигналов
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
"""«Горячесть» фирмы = взвешенная сумма сигналов рекламы. Больше сигналов и «крутит сейчас»
|
||||
(бюджет Директа) → выше. Deterministic, легко тестируется."""
|
||||
|
||||
def score(f) -> int:
|
||||
s = 0
|
||||
if f.advertises == "да":
|
||||
s += 40
|
||||
s += {"высокая": 30, "средняя": 15, "низкая": 0}.get(f.confidence, 0)
|
||||
if f.two_gis_promoted:
|
||||
s += 20
|
||||
if f.direct_budget > 0:
|
||||
s += min(30, f.direct_budget // 5000) # до +30 за бюджет Директа
|
||||
if f.legal_status and f.legal_status != "действующая":
|
||||
s -= 25 # мёртвых вниз
|
||||
return s
|
||||
|
||||
def rank(firms: list) -> list:
|
||||
for f in firms:
|
||||
f.hotness = score(f)
|
||||
return sorted(firms, key=lambda x: -x.hotness)
|
||||
@@ -0,0 +1,15 @@
|
||||
from salesfinder.models import Firm
|
||||
from salesfinder.ranker import score, rank
|
||||
|
||||
def test_more_signals_more_hotness():
|
||||
hot = Firm(name="H", domain="h.ru", two_gis_promoted=True,
|
||||
advertises="да", confidence="высокая", direct_budget=50000)
|
||||
cold = Firm(name="C", domain="c.ru", advertises="нет", confidence="низкая")
|
||||
assert score(hot) > score(cold)
|
||||
|
||||
def test_rank_sorts_desc_and_sets_field():
|
||||
a = Firm(name="A", domain="a.ru", advertises="нет")
|
||||
b = Firm(name="B", domain="b.ru", advertises="да", confidence="высокая", two_gis_promoted=True)
|
||||
out = rank([a, b])
|
||||
assert out[0].name == "B"
|
||||
assert out[0].hotness > 0
|
||||
Reference in New Issue
Block a user