Add PPLMedio, CPAMedio, CosteMes, ConvMes to GAMes record
Recalculated each day from fco_ campaign totals: - CosteMes / ConvMes: from Google Ads monthly accumulated data - PPLMedio: weighted average by Airtable leads - CPAMedio: CosteMes / ConvMes Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
a489a08785
commit
aa9225d338
@ -488,8 +488,11 @@ class AirtableClient:
|
||||
r = self.games.create({"Mes": str(mes), "Año": str(anio)})
|
||||
return r["id"]
|
||||
|
||||
def update_games_metricas(self, record_id: str, metricas_json: str) -> None:
|
||||
self.games.update(record_id, {"MetricasDiarias": metricas_json})
|
||||
def update_games_metricas(self, record_id: str, metricas_json: str, totales: dict = None) -> None:
|
||||
fields = {"MetricasDiarias": metricas_json}
|
||||
if totales:
|
||||
fields.update(totales)
|
||||
self.games.update(record_id, fields)
|
||||
|
||||
def get_games_metricas(self, record_id: str) -> dict:
|
||||
r = self.games.get(record_id)
|
||||
|
||||
19
run.py
19
run.py
@ -220,6 +220,7 @@ def run():
|
||||
advice_updates = [] # (gcm_record_id, consejo, criticidad) para batch update final
|
||||
metricas_updates = [] # {airtable_id, metricas_json} para MetricasDiarias
|
||||
games_agg: dict = {} # dia_hoy → {coste, ingreso_sum, ingreso_lxp, leads, leads_lake}
|
||||
games_mes = {"coste_mes": 0.0, "conv_mes": 0, "ppl_leads": 0.0, "leads_total": 0}
|
||||
ayer = datetime.now() - timedelta(days=1)
|
||||
dia_hoy = ayer.strftime("%d")
|
||||
cambio_mes = ayer.month != datetime.now().month
|
||||
@ -316,6 +317,12 @@ def run():
|
||||
games_agg[dia_hoy]["ingreso_lxp"] += leads_lake_hoy * campaign["ppl"]
|
||||
games_agg[dia_hoy]["leads"] += int(conv_hoy)
|
||||
games_agg[dia_hoy]["leads_lake"] += leads_lake_hoy
|
||||
# Totales mes (fuente: Google Ads acumulado mensual)
|
||||
games_mes["coste_mes"] += metrics.get("cost", 0)
|
||||
games_mes["conv_mes"] += int(analysis["conversiones_google"])
|
||||
# PPLMedio ponderado por leads Airtable
|
||||
games_mes["ppl_leads"] += campaign["ppl"] * leads
|
||||
games_mes["leads_total"] += leads
|
||||
metricas_updates.append({
|
||||
"airtable_id": campaign["airtable_id"],
|
||||
"metricas_json": json.dumps(md, ensure_ascii=False),
|
||||
@ -372,7 +379,17 @@ def run():
|
||||
games_md = at.get_games_metricas(games_rid)
|
||||
for d, vals in games_agg.items():
|
||||
games_md[d] = {k: round(v, 2) if isinstance(v, float) else v for k, v in vals.items()}
|
||||
at.update_games_metricas(games_rid, json.dumps(games_md, ensure_ascii=False))
|
||||
coste_mes = round(games_mes["coste_mes"], 2)
|
||||
conv_mes = games_mes["conv_mes"]
|
||||
ppl_medio = round(games_mes["ppl_leads"] / games_mes["leads_total"], 2) if games_mes["leads_total"] > 0 else 0.0
|
||||
cpa_medio = round(coste_mes / conv_mes, 2) if conv_mes > 0 else 0.0
|
||||
totales = {
|
||||
"CosteMes": coste_mes,
|
||||
"ConvMes": conv_mes,
|
||||
"PPLMedio": ppl_medio,
|
||||
"CPAMedio": cpa_medio,
|
||||
}
|
||||
at.update_games_metricas(games_rid, json.dumps(games_md, ensure_ascii=False), totales)
|
||||
print(" ✓ GAMes actualizado.")
|
||||
|
||||
# Snapshot diario: ConvLeadsLakeMesFinal + ConvLeadsLakeMesGrupo
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user