Advisor-test / app /recs /rules.py
ps1811's picture
initial push
fcda9b0
Raw
History Blame Contribute Delete
1.63 kB
from typing import Dict, List
TARGET_CPL = 20.0
CTR_THRESHOLD = 2.0
def generate_recommendations(metrics: List[Dict]) -> List[Dict]:
"""
Rule engine that converts metrics → recommendations
"""
recommendations = []
for m in metrics:
campaign_id = m["campaign_id"]
cpl = m["cpl"]
ctr = m["ctr"]
# Rule 1: High CPL
if cpl > TARGET_CPL * 1.5:
recommendations.append({
"campaign_id": campaign_id,
"type": "high_cpl",
"action": "reduce_budget",
"reason": f"CPL {cpl} is significantly above target {TARGET_CPL}",
"cpl": cpl,
"target_cpl": TARGET_CPL,
"ctr": ctr,
})
# Rule 2: Strong campaign
elif cpl < TARGET_CPL * 0.8:
recommendations.append({
"campaign_id": campaign_id,
"type": "strong_campaign",
"action": "increase_budget",
"reason": f"CPL {cpl} is well below target {TARGET_CPL}",
"cpl": cpl,
"target_cpl": TARGET_CPL,
"ctr": ctr,
})
# Rule 3: Low CTR
if ctr < CTR_THRESHOLD:
recommendations.append({
"campaign_id": campaign_id,
"type": "low_ctr",
"action": "review_ad_copy",
"reason": f"CTR {ctr}% is below threshold {CTR_THRESHOLD}%",
"cpl": cpl,
"target_cpl": TARGET_CPL,
"ctr": ctr,
})
return recommendations