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.
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.
** (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.
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 ~~.
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.
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 **
Ü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()]
Vergleichen Sie den Einzahlungssaldo (Bestand) verschiedener Monate und prüfen Sie, ob der Saldo in einem zunehmenden oder einem abnehmenden Trend liegt.
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 **
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)
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.
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 **
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.
ax.patches.get_height ()
Code
for i in ax.patches:
print(i.get_height())
** Ausgabeergebnis ** 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.
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.
Recommended Posts