Advisor / scripts /seed_demo.py
ps1811's picture
Initial HF Space deployment
39b31c0
Raw
History Blame Contribute Delete
3.53 kB
import sys
from pathlib import Path
# ✅ FIX: ensure project root is first in path BEFORE imports
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))
import random
from datetime import datetime
from app.db.repo import init_db, SessionLocal
from app.db.models import Campaign, Recommendation
from app.recs.rules import generate_recommendations
CAMPAIGN_NAMES = [
"Preschool Search",
"Brand Awareness",
"Local Leads",
"Early Education Ads",
"Enrollment Push"
]
# -------------------------
# Campaign generation
# -------------------------
def generate_campaigns(session):
campaigns = []
for i, name in enumerate(CAMPAIGN_NAMES):
campaign = Campaign(
google_campaign_id=f"gc_{1000+i}",
name=name,
budget=random.randint(50, 200),
spend=0,
clicks=0,
impressions=0,
ctr=0.0,
leads=0,
cpl=0.0,
last_synced=datetime.utcnow()
)
session.add(campaign)
campaigns.append(campaign)
session.commit()
return campaigns
# -------------------------
# Metrics simulation
# -------------------------
def simulate_metrics(session, campaigns):
for campaign in campaigns:
spend = 0
clicks = 0
impressions = 0
leads = 0
for _ in range(30):
daily_impressions = random.randint(50, 500)
daily_clicks = int(daily_impressions * random.uniform(0.01, 0.1))
daily_spend = daily_clicks * random.uniform(0.5, 3.0)
daily_leads = int(daily_clicks * random.uniform(0.05, 0.3))
impressions += daily_impressions
clicks += daily_clicks
spend += daily_spend
leads += daily_leads
ctr = clicks / impressions if impressions else 0
cpl = spend / leads if leads else 0
campaign.spend = round(spend, 2)
campaign.clicks = clicks
campaign.impressions = impressions
campaign.leads = leads
campaign.ctr = round(ctr, 4)
campaign.cpl = round(cpl, 2)
campaign.last_synced = datetime.utcnow()
session.commit()
# -------------------------
# Recommendations via rule engine
# -------------------------
def seed_recommendations(session, campaigns):
# ✅ prevent duplicate entries on re-run
session.query(Recommendation).delete()
session.commit()
metrics = [
{
"campaign_id": c.id,
"cpl": c.cpl,
"ctr": c.ctr,
}
for c in campaigns
]
recs = generate_recommendations(metrics)
for r in recs:
session.add(Recommendation(
campaign_id=r["campaign_id"],
recommendation_type=r["type"],
action=r["action"],
reason=r["reason"],
status="Pending",
created_at=datetime.utcnow()
))
session.commit()
# -------------------------
# Main pipeline
# -------------------------
def main():
print("Initializing DB...")
init_db()
session = SessionLocal()
try:
print("Seeding campaigns...")
campaigns = generate_campaigns(session)
print("Simulating metrics...")
simulate_metrics(session, campaigns)
print("Generating recommendations...")
seed_recommendations(session, campaigns)
print("✅ Demo database seeded successfully!")
finally:
session.close()
if __name__ == "__main__":
main()