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)})
|
r = self.games.create({"Mes": str(mes), "Año": str(anio)})
|
||||||
return r["id"]
|
return r["id"]
|
||||||
|
|
||||||
def update_games_metricas(self, record_id: str, metricas_json: str) -> None:
|
def update_games_metricas(self, record_id: str, metricas_json: str, totales: dict = None) -> None:
|
||||||
self.games.update(record_id, {"MetricasDiarias": metricas_json})
|
fields = {"MetricasDiarias": metricas_json}
|
||||||
|
if totales:
|
||||||
|
fields.update(totales)
|
||||||
|
self.games.update(record_id, fields)
|
||||||
|
|
||||||
def get_games_metricas(self, record_id: str) -> dict:
|
def get_games_metricas(self, record_id: str) -> dict:
|
||||||
r = self.games.get(record_id)
|
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
|
advice_updates = [] # (gcm_record_id, consejo, criticidad) para batch update final
|
||||||
metricas_updates = [] # {airtable_id, metricas_json} para MetricasDiarias
|
metricas_updates = [] # {airtable_id, metricas_json} para MetricasDiarias
|
||||||
games_agg: dict = {} # dia_hoy → {coste, ingreso_sum, ingreso_lxp, leads, leads_lake}
|
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)
|
ayer = datetime.now() - timedelta(days=1)
|
||||||
dia_hoy = ayer.strftime("%d")
|
dia_hoy = ayer.strftime("%d")
|
||||||
cambio_mes = ayer.month != datetime.now().month
|
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]["ingreso_lxp"] += leads_lake_hoy * campaign["ppl"]
|
||||||
games_agg[dia_hoy]["leads"] += int(conv_hoy)
|
games_agg[dia_hoy]["leads"] += int(conv_hoy)
|
||||||
games_agg[dia_hoy]["leads_lake"] += leads_lake_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({
|
metricas_updates.append({
|
||||||
"airtable_id": campaign["airtable_id"],
|
"airtable_id": campaign["airtable_id"],
|
||||||
"metricas_json": json.dumps(md, ensure_ascii=False),
|
"metricas_json": json.dumps(md, ensure_ascii=False),
|
||||||
@ -372,7 +379,17 @@ def run():
|
|||||||
games_md = at.get_games_metricas(games_rid)
|
games_md = at.get_games_metricas(games_rid)
|
||||||
for d, vals in games_agg.items():
|
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()}
|
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.")
|
print(" ✓ GAMes actualizado.")
|
||||||
|
|
||||||
# Snapshot diario: ConvLeadsLakeMesFinal + ConvLeadsLakeMesGrupo
|
# Snapshot diario: ConvLeadsLakeMesFinal + ConvLeadsLakeMesGrupo
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user