Ich möchte unbedingt meinen Einzahlungssaldo in Python-Visualize Cash Flow Flow mit Seaborn sehen

Einführung

Selbst wenn Sie Geld sparen möchten, wissen Sie nicht, ob Ihr Geld überhaupt steigt oder fällt. Es ist möglicherweise möglich, es mit Zaim oder Moneyforward zu visualisieren, aber es ist schwierig, es zu verwalten, da es erforderlich ist, ein Premium-Mitglied für die Analyse zu werden, und es jedes Mal schwierig ist, Eingaben vorzunehmen. Da ich den Bareinzahlungs- / Auszahlungsstatus visualisieren möchte, habe ich ein Skript implementiert, das die Zunahme / Abnahme des Geldes auf dem Einzahlungskonto mit Pythons "Seaborn" visualisiert.

Politik

Die meisten Online-Bankgeschäfte können mit csv einen Einzahlungs- / Auszahlungsverlauf im Wert von einem Jahr exportieren. Verwenden Sie diese CSV als Eingabe, um den Verlauf der Bareinzahlung / -auszahlung zu visualisieren. Es gibt viele Möglichkeiten, die Visualisierung des Geldflusses zu betrachten. Hier werden wir grob zwei Dinge visualisieren, "** stock " und " flow **". Wenn Sie ein Einzahlungskonto mit einer Badewanne und Bargeld mit Wasser vergleichen, können Lagerbestand und Durchfluss wie folgt erklärt werden. image.png

** (1) Lager ** Die Menge an Wasser in der Wanne irgendwann. Das heißt, es entspricht dem Einzahlungssaldo eines bestimmten Monats. Wenn Sie die Bestände verschiedener Monate vergleichen, sehen Sie den ** Trend der Zunahme / Abnahme des Einlagensaldos **.

** (2) Durchfluss ** Die Menge an Wasser, die in einem bestimmten Zeitraum geflossen ist. Darüber hinaus kann es in (2a) Zufluss und (2b) Abfluss unterteilt werden und repräsentiert die Einnahmen und Ausgaben eines bestimmten Monats. Wenn Sie den Zu- und Abfluss im selben Monat vergleichen, können Sie den ** Gewinn- und Verlustbetrag ** in einem bestimmten Monat anzeigen.

Implementierung

Jeder Abschnitt soll in ein Notizbuch wie "Jupyter Notebook" geschrieben werden. Sobald Sie es in Ihr Notizbuch geschrieben haben, können Sie die CSV-Datei ersetzen und nacheinander ausführen, auch wenn die Einzahlung später aktualisiert wird, so dass es einfach ist. Die Version sollte funktionieren, solange Sie Python3 verwenden.

Es ist zu beachten, dass es sich bei den verwendeten Daten um Daten handelt, bei denen ein ähnlicher Wert zufällig generiert wird. ~~ Es ist mehr als meine eigene Einstellung ~~.

Paketimport

import numpy as np
import pandas as pd
import codecs
import seaborn as sns
sns.set(font='Hiragino Sans')
import matplotlib.pyplot as plt

Wenn Sie anaconda verwenden, sollten Sie in der Lage sein, alles ohne Probleme zu importieren. Im Falle eines Mac erkennt seaborn Japanisch nicht so wie es ist. Geben Sie daher eine Schriftart an, die Japanisch mit "sns.set ()" unterstützt.

Datenimport / Vorverarbeitung

Code

#Lesen Sie die Einzahlungs- / Auszahlungshistorie
with codecs.open("../input/20200517212253.csv", "r", "Shift-JIS", "ignore") as file:
    df = pd.read_table(file, delimiter=",")

#Vorverarbeitung
"""
Implementieren Sie die Vorverarbeitung des gelesenen df.
df verwendet "Transaktionsdatum" als Index und hat die folgenden vier Spalten.
 1.Transaktionsname: Hat zwei Werte, "Zahlung" oder "Zahlung".
 2.Betrag: Transaktionsbetrag (Flow)
 3.Saldo nach Transaktion: Einzahlungssaldo (Lagerbestand) zu diesem Zeitpunkt
"""

Geben Sie beim Lesen von csv den Zeichencode an, um verstümmelte Zeichen zu vermeiden. Der Vorverarbeitungscode wird weggelassen, da er von den vom verwendeten Net Banking ausgegebenen Elementen abhängt. Wie im Code beschrieben, kann der Index das Transaktionsdatum sowie den "Transaktionsnamen", "Betrag (= Fluss)" und "Saldo nach Transaktion (= Bestand)" haben.

** df Probe ** image.png

Übrigens kann im Fall von Net Banking die Spalte mit den Ausgabeergebnissen in "Jahr", "Monat" und "Tag" unterteilt werden. Sie können sie jedoch wie folgt in einer Spalte mit dem Typ "Datum / Uhrzeit" kombinieren.

df["Transaktionsdatum"] = [pd.Timestamp(year=int(row["Bearbeitungsdatum Jahr"]), 
                            month=int(row["Bearbeitungsdatum Monat"]), 
                            day=int(row["Bearbeitungsdatum"])) for i, row in df.iterrows()]

① Visualisierung der Bestände - Zeichnen Sie den Anstiegs- / Abnahme-Trend des Einzahlungssaldos

Vergleichen Sie den Einzahlungssaldo (Bestand) verschiedener Monate und prüfen Sie, ob der Saldo in einem zunehmenden oder einem abnehmenden Trend liegt.

image.png

Da die CSV der Originaldaten basierend auf dem Einzahlungs- / Auszahlungsverlauf, dh der Transaktionsereignisbasis, eingefügt wird, ist es nicht möglich, so etwas wie "Zeichnen Sie den monatlichen Übergang ab dem 1. des Monats grafisch darzustellen". Zeichnen Sie daher ein Liniendiagramm, in dem alle Spalten "Post-Transaction Balance" von df dargestellt sind.

Code

#Generieren Sie einen Datenrahmen für die Bestandszeichnung
df4stock = df.copy()

#Visualisierung
fig, ax = plt.subplots(figsize=(20, 10))
sns.lineplot(x=df4stock.index, y="Saldo nach Transaktion", data=df4stock, estimator=None);
fig.gca().ticklabel_format(style='plain', axis='y')

** Ausgabeergebnis **

image.png

Die blaue Kreismarkierung zeigt das Auftreten der Transaktion und den Saldo zu diesem Zeitpunkt an. Gehaltseinkommen und Kartenzahlungen bilden eine monatliche Periodizität. Der allgemeine Anstiegs- / Abnahme-Trend wird anhand des monatlichen Höchstbetrags (Zahltag) geschätzt.

In der Zeitreihenanalyse wird der Gesamttrend der Zunahme / Abnahme als ** Trendkomponente ** definiert, und die Zunahme / Abnahme mit Zyklen wie dem monatlichen Zyklus wird als ** saisonale Komponente ** definiert. Wenn Sie die Trendkomponente extrahieren möchten, können Sie die Trendkomponente und die saisonale Komponente trennen, indem Sie Dummy-Daten des Tages einfügen, an dem die Transaktion nicht stattgefunden hat, und "tsa.seasonal_decompose" von "stats model" verwenden. Die Implementierung wird in diesem Artikel weggelassen. (Referenz: Sakutto-Trendextraktion: Einführung in die Zeitreihenanalyse mit Python-Statistikmodellen)

(2) Flussvisualisierung - Zeichnen Sie den monatlichen Ein- / Auszahlungsbetrag

Vergleichen Sie die Höhe der Einnahmen und Ausgaben (Flow) in einem bestimmten Monat und prüfen Sie, um wie viel sich der Saldo erhöht oder verringert hat.

image.png

Gruppieren Sie die Originaldaten nach Jahr und Monat und generieren Sie einen neuen Datenrahmen mit der Höhe der Ausgaben und Einnahmen für jeden Monat. Zeichnen Sie basierend auf dem erstellten Datenrahmen ein Balkendiagramm, in dem der Saldo und die Differenz jedes Monats dargestellt sind.

Code

#Generieren Sie einen Datenrahmen für die Flusszeichnung
df4flow = df.groupby([df.index.year, df.index.month, "Transaktionsname"]).sum().reset_index("Transaktionsname")
df4flow

#Visualisierung
fig, ax = plt.subplots(figsize=(20, 10))
ax = sns.barplot(x=df4flow.index, y="Geldbetrag", hue="Transaktionsname", data=df4flow);

#Speichern Sie die Anzahl der Balken, die auf dem Wertelabel in der Liste angezeigt werden
height = [0 if np.isnan(i.get_height()) else i.get_height() for i in ax.patches]


for i, patch in enumerate(ax.patches):
    
    diff = height[i//2] - height[i//2 + len(height)//2]
    maxh = max(height[i//2], height[i//2 + len(height)//2])
    
    #Anzeigen von Wertelabels
    if i % 2 == 0:
        colidx = i//2
        ax.text(i//2 - patch.get_width()/2.0, height[colidx]/2.0, int(height[colidx]), color='black', ha="center")
        ax.text(i//2, maxh+10000, int(diff), color='black', ha="center")
        
    else:
        colidx = i//2 + len(height)//2
        ax.text(i//2 + patch.get_width()/2.0, height[colidx]/2.0, int(height[colidx]), color='black', ha="center")

** Ausgabeergebnis **

image.png

Der neu generierte Datenrahmen "df4flow" für das Diagramm enthält eine Spalte mit den gesamten Transaktionsbeträgen nach Einnahmen / Ausgaben mit Jahr und Monat in MultiIndex. Beim Zeichnen werden zusätzlich zum Balkendiagramm die Wertelabels der einzelnen Einnahmen / Ausgaben und die Differenz mit der Hilfsmethode "ax.text ()" gezeichnet. Der Ausgabewert wird vom Rechteckobjekt "ax.patches" erhalten, das Informationen als Rechteck jedes Balkendiagramms enthält. Da die Höhe des Rechtecks so groß wird, wie sie ist, wird die Höhe durch die Methode "get_height ()" desselben Objekts erhalten. Die Position des Wertelabels wird berechnet und so platziert, dass sie sich in der Mitte jedes Balkens befindet.

Code

for i in ax.patches:
    print(i.get_height())

** Ausgabeergebnis ** image.png Es ist ersichtlich, dass "ax.pathces [0: 4]" Informationen zum Einkommen (blau) und "ax.pathces [5: 9]" Informationen zu Ausgaben (rot) enthält. Beachten Sie, dass sich die Ausgabereihenfolge vom Datenrahmen unterscheidet.

Am Ende

Jetzt kann ich den Cash-Stock-Flow visualisieren und sehen, ob das Geld steigt oder fällt (ich habe den Kauf eines PCs aufgegeben, weil er gesunken ist). Wie oben erwähnt, müssen Sie nur die Eingabedaten aktualisieren, wenn Sie den obigen Code in Notebook zusammenstellen, was die Verwaltung erleichtert.

Es ist überraschend schwierig, mit Seaborn oder Matplotlib eine Grafikausgabe durchzuführen, wie Sie es mit Excel tun. Es scheint, dass wir mehr über die Struktur des vom Graphen erzeugten "Artist" -Objekts wissen müssen.

Referenz: Grundkenntnisse über Matplotlib, die ich früh kennenlernen wollte, oder die Geschichte eines Künstlers, der das Erscheinungsbild anpassen kann.

Recommended Posts

Ich möchte unbedingt meinen Einzahlungssaldo in Python-Visualize Cash Flow Flow mit Seaborn sehen
Auch mit JavaScript möchte ich Python `range ()` sehen!
Ich möchte mit einem Roboter in Python arbeiten.
Ich möchte APG4b mit Python lösen (nur 4.01 und 4.04 in Kapitel 4)
Ich möchte Rails mit Rails auch in einer vagabundierenden Umgebung betreiben
Ich möchte die Position meines Gesichts mit OpenCV überprüfen!
Ich möchte wirklich GitHub Flavored Markdown (GFM) mit Pelican verwenden!
Ich möchte ○○ mit Pandas machen
Ich möchte wütend auf meine Mutter werden, wenn die Erinnerung knapp ist
(Matplotlib) Ich möchte ein Diagramm mit einer in Pixel angegebenen Größe zeichnen
Ich möchte die Django Debug Toolbar in Ajax-Anwendungen verwenden
Ich möchte meine Gefühle mit den Texten von Mr. Children ausdrücken
Mit Docker durchgeführte Umgebungswartung (Ich möchte GrADS in Python nachbearbeiten
Ich möchte Objekte mit OpenCV erkennen
Ich möchte in der Einschlussnotation drucken
Ich möchte einen Blog mit Jupyter Notebook schreiben
Ich möchte eine Pip-Installation mit PythonAnywhere durchführen
Ich möchte Protokolle mit Python analysieren
Ich möchte mit aws mit Python spielen
Ich möchte Matplotlib in PySimpleGUI einbetten
Ich wollte unbedingt mit Selen kopieren
Ich möchte eine Liste der WebDAV-Dateien im Modul Anfragen anzeigen
Ich möchte Dunnetts Test in Python machen
Ich möchte an eine Wiederholung denken können
Ich möchte MATLAB feval mit Python verwenden
Ich möchte mit Python ein Fenster erstellen
Ich habe versucht, Keras in TFv1.1 zu integrieren
Ich möchte mehrere Bilder mit matplotlib anzeigen.
Ich möchte ein Spiel mit Python machen
Ich möchte OREMO mit setParam sein!
Ich möchte DB-Informationen in einer Liste speichern
Ich möchte verschachtelte Dicts in Python zusammenführen
Ich möchte Passungen aus meinem Kopf machen
Ich möchte Temporäres Verzeichnis mit Python2 verwenden
Ich möchte -inf nicht mit np.log verwenden
#Unresolved Ich möchte Gobject-Introspection mit Python3 kompilieren
Ich möchte ip vrf mit SONiC verwenden
Ich möchte APG4b mit Python lösen (Kapitel 2)
Ich möchte mit Djangos Migrate von vorne beginnen
Ich möchte mit Python in eine Datei schreiben
Ich möchte den Fortschritt in Python anzeigen!
Ich möchte eine Fehlermeldung auf Japanisch mit dem Django-Passwortänderungsformular ausgeben
Ich möchte nur Pods mit dem angegebenen Label mit Label Selector in Client-go extrahieren