Programming

1. ingest snapshot

"""Load one monthly file (or a full history file) into the parquet lake."""
from pathlib import Path

import pandas as pd
from django.core.management.base import BaseCommand, CommandError

from lending_analytics import io_layer as io
from portfolio.bridge import sha256
from portfolio.models import Snapshot


class Command(BaseCommand):
    help = "Ingest a raw loan tape into the parquet lake."

    def add_arguments(self, parser):
        parser.add_argument("path")
        parser.add_argument("--force", action="store_true",
                            help="re-ingest even if this exact file was already loaded")

    def handle(self, *args, **o):
        path = Path(o["path"])
        if not path.exists():
            raise CommandError(f"not found: {path}")

        digest = sha256(path)
        if not o["force"] and Snapshot.objects.filter(source_sha256=digest).exists():
            self.stdout.write(self.style.WARNING(
                f"{path.name} already ingested (sha256 match) — nothing to do"))
            return

        written = io.ingest(path, verbose=self.stdout.write)
        for rd in written:
            as_of = rd - pd.Timedelta(days=1)
            Snapshot.objects.update_or_create(
                report_date=rd.date(),
                defaults=dict(
                    period=as_of.year * 100 + as_of.month,
                    source_name=path.name,
                    source_sha256=digest,
                    status="stale",   # marts not rebuilt yet
                ))
        self.stdout.write(self.style.SUCCESS(
            f"ingested {len(written)} snapshot(s): {written[0]:%Y-%m} … {written[-1]:%Y-%m}"))
        self.stdout.write("next: python manage.py build_marts")
Helpful? Dislike 0 Log in to react