Hinweis: Obwohl JavaScript für diese Website nicht unbedingt erforderlich ist, werden Ihre Interaktionsmöglichkeiten mit den Inhalten eingeschränkt sein. Bitte aktivieren Sie JavaScript für das volle Erlebnis.

Wie wir ein Python-Entwicklungs-Framework für Nicht-Entwickler erstellt haben

Python ist die Kernprogrammiersprache, die von Bluevine genutzt wird und unser Backend, Data Engineering, Data Science, QA-Automatisierung und in jüngster Zeit auch Data Analytics antreibt.

Innerhalb von Data Analytics verwenden wir SQL-Abfragen, um Daten sowohl abzurufen als auch zu transformieren, insbesondere mit einer PostgreSQL-Datenbank.

Die ganzheitlichen Banklösungen von Bluevine sind speziell für kleine Unternehmen konzipiert, um ihnen zu helfen, in ihrem schnelllebigen Umfeld erfolgreich zu sein. Eine Möglichkeit, dies zu erreichen, ist, Geschäftsinhabern so schnell wie möglich mitzuteilen, ob sie für einen Bluevine-Service zugelassen sind. Dazu mussten wir eine Risikobewertung ihrer Daten durchführen, und zwar umgehend. Dies erwies sich als große Herausforderung, da die meisten unserer Abfragen zu lange liefen und um Ressourcen mit den wenigen Replikaten konkurrierten, die wir hatten.

Die von uns verwendeten Abfragen waren lang (die längste über 3.000 Zeilen!) und nutzten die Fähigkeiten der Datenbank ineffizient, ganz zu schweigen davon, dass sie unleserlich und sehr schwer zu aktualisieren und auszubauen waren. Angesichts dieser Abfragen und unseres Bedarfs an schnellen Antworten war die Lösung klar. Wir könnten Python verwenden, um die schwere Arbeit und die Datentransformation durchzuführen.

Leider hatte das Analyseteam nur minimale Erfahrung mit Python. Und die Migration einiger unserer wichtigsten Operationen könnte ohne entsprechende Sorgfalt zu schlechtem Code führen. Dieser schlechte Code wäre schwer zu verwalten und könnte sogar die gleichen Probleme wie die SQL-Skripte aufweisen, was uns wieder an den Anfang zurückbringen würde.

Wir haben die folgende Lösung entworfen

  1. Erstens, allen Ingenieuren Python-Schulungen anzubieten, die auf ihrer Rolle basieren, insbesondere mit datenorientierten Drittanbieterbibliotheken wie pandas und NumPy.
  2. Zweitens, ein Python-Framework zu entwerfen und zu erstellen, das es dem Team ermöglicht, sich auf seine Arbeit zu konzentrieren, während die Prinzipien des Software-Engineerings abstrahiert werden. Dies würde es ihnen ermöglichen, ihren Code auszuführen und zu testen, Prozesse zu aktualisieren oder neue zu erstellen.

Die Gestaltung des Frameworks erforderte, dass wir wiederkehrende Muster in den SQL-Skripten identifizierten und diese als modulare und einfach wiederverwendbare oder erweiterbare Bausteine etablierten.

Wir identifizierten eine gemeinsame Struktur innerhalb der SQL-Abfragen, die wir für die Skripte anwenden konnten

  1. Abrufen von Kunden basierend auf spezifischen Kriterien
  2. Anreicherung der Daten aus verschiedenen Tabellen
  3. Ausführung von Logik zur Entscheidungsfindung

Viele der Skripte verwendeten ähnliche Abfragen, um Kunden abzurufen, daher konnten wir parametrisierte Funktionen bereitstellen, die ORM-Abfragen ausführen, die die gleiche Funktionalität bieten und Code-Wiederholungen vermeiden.

Für den zweiten Schritt, anstatt schwerwiegende Abfragen und Datentransformationen innerhalb der Datenbank durchzuführen, ziehen wir nur Rohdaten für die Kunden ab und stellen generische Funktionen bereit, die stark auf pandas setzen, um die Daten anzureichern. Wir können vektorisierte Operationen verwenden, um komplexe Aggregationen auf den Daten und den darin enthaltenen reichhaltigen Datenstrukturen sowie Transformationen wie Transponieren und Pivoting durchzuführen.

Diese Methode liefert mehrere Vorteile, sowohl durch Steigerung der Leistung als auch durch Entlastung der Datenbankressourcen durch Vermeidung ineffizienter Operationen.

Die Ausführung der Logik ist kniffliger, da jeder Prozess unterschiedliche Dinge prüft. Um Flexibilität zu ermöglichen, bieten wir eine lockere Struktur vordefinierter Module, denen sie folgen müssen. Zum Beispiel benötigt jeder Prozess einige Module, die einer bestimmten Struktur folgen, z. B.: - preprocessing.py - calculations.py - conditions.py - decisions.py

Das Framework lädt diese Module und führt Einstiegspunktfunktionen in ihnen in einer bestimmten Reihenfolge aus. Dies gibt eine Klasseninstanz einer Entscheidung zurück. Das Entscheidungsobjekt enthält alle Informationen und Funktionalitäten, die wir benötigen, um es an unseren Kunden zurückzusenden.

Das Framework wurde so konzipiert, dass es auch für unerfahrenste Benutzer einfach zu bedienen ist, aber dennoch flexibel genug, um Entwicklern zu ermöglichen, neue Funktionalitäten für Wiederverwendung und Verbesserung zu entwickeln.

Wir freuen uns, Ihnen mitteilen zu können, dass wir alle unsere Prozesse auf dieses neue Framework migriert haben und alle neuen Prozesse damit erstellen. Wir haben bereits Verbesserungen seit der Umstellung festgestellt

  1. Die benutzerfreundliche Natur von Python ermöglicht es unseren Analysten, schnell zu lernen und neue Regeln zeitnah zu erstellen.
  2. Wir haben insgesamt erhebliche Verbesserungen der Prozesslaufzeit erzielt.
  3. Unsere Datenbanken führen einfachere und verfeinerte Abfragen aus und reduzieren insgesamt die Auslastung.
  4. Nachvollziehbarkeit und verbesserte Beobachtbarkeit durch Protokoll- und Überwachungsbibliotheken.

Wir sind stolz darauf, dass unser Projekt erfolgreich war, aber es ist wichtig zu bedenken, dass die Nutzung von Python möglicherweise nicht für jeden geeignet ist. Wenn Sie ein ähnliches Vorhaben in Betracht ziehen, denken Sie über Folgendes nach

  • Besitzen Ihre Kunden (in diesem Fall Analysten) die erforderliche technische Eignung, um qualitativ hochwertigeren Code zu liefern?
  • Können Sie die Unterstützung des Altsystems und die Entwicklung des neuen Frameworks im Hinblick auf die Unternehmenszeitpläne bewältigen?
  • Wird dieses Framework zukünftige Anforderungen erfüllen oder nur bestehende Prozesse verbessern?