Je veux vraiment voir le solde de mes dépôts en Python-Visualiser le flux de trésorerie avec seaborn

introduction

Même si vous voulez économiser de l'argent, vous ne savez pas si votre argent augmente ou diminue en premier lieu. Il peut être possible de le visualiser à l'aide de Zaim ou Moneyforward, mais il est difficile de le gérer car il est nécessaire de devenir membre premium pour l'analyse et il est difficile à saisir à chaque fois. Puisque je veux visualiser l'état du dépôt / retrait d'espèces, j'ai implémenté un script qui visualise l'augmentation / la diminution de l'argent dans le compte de dépôt en utilisant Seaborn de Python.

politique

La plupart des services bancaires en ligne peuvent exporter un an d'historique de dépôts / retraits avec csv. Utilisez ce csv comme entrée pour visualiser l'historique des dépôts / retraits d'espèces. Il existe de nombreuses façons de visualiser la visualisation du flux d'argent. Ici, nous allons visualiser approximativement deux choses, "** stock " et " flow **". Si vous comparez un compte de dépôt à une baignoire et de l'argent comptant à l'eau, le stock et le débit peuvent être expliqués comme suit. image.png

** (1) Stock ** La quantité d'eau dans la baignoire à un moment donné. Autrement dit, il représente le solde du dépôt d'un certain mois. Si vous comparez les stocks de différents mois, vous pouvez voir la ** tendance à la hausse / à la baisse du solde des dépôts **.

** (2) Débit ** La quantité d'eau qui a coulé au cours d'une certaine période. En outre, il peut être divisé en (2a) entrées et (2b) sorties, et représente les revenus et les dépenses d'un certain mois. Si vous comparez les entrées et les sorties au cours du même mois, vous pouvez voir le ** montant des profits et des pertes ** pour un mois donné.

la mise en oeuvre

Chaque section est censée être écrite dans un cahier tel que Jupyter Notebook. Une fois que vous l'avez écrit dans votre cahier, même si le dépôt est mis à jour plus tard, vous pouvez remplacer le fichier csv et l'exécuter séquentiellement, donc c'est facile. La version devrait fonctionner tant que vous utilisez `` Python3 ''.

De plus, les données utilisées sont celles qui ont généré aléatoirement une valeur comme celle-là. ~~ C'est plus que ma propre opinion ~~.

Importation de package

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

Si vous utilisez ʻanaconda, vous devriez pouvoir tout importer sans aucun problème. Dans le cas de mac, seaborn ne reconnaît pas le japonais tel quel, alors spécifiez une police qui prend en charge le japonais avec sns.set ()`.

Importation / prétraitement des données

code

#Lire le fichier d'historique des dépôts / retraits
with codecs.open("../input/20200517212253.csv", "r", "Shift-JIS", "ignore") as file:
    df = pd.read_table(file, delimiter=",")

#Prétraitement
"""
Implémentez le prétraitement du df lu.
df utilise "date de transaction" comme index et comporte les quatre colonnes suivantes.
 1.Nom de la transaction: a deux valeurs, "paiement" ou "paiement".
 2.Montant: montant de la transaction (flux)
 3.Solde post-transaction: solde du dépôt (stock) à ce moment
"""

Lors de la lecture de csv, spécifiez le code de caractère pour éviter les caractères déformés. Le code de prétraitement est omis car il dépend des éléments générés par la banque nette utilisée. Comme décrit dans le code, l'indice peut avoir la date de transaction, et également avoir le "nom de la transaction", "montant (= flux)" et "solde post-transaction (= stock)".

** échantillon df ** image.png

À propos, il y a des cas où la colonne de résultat de sortie est divisée en "année", "mois" et "jour", mais vous pouvez les combiner en une colonne avec le type datetime en procédant comme suit.

df["Date de la transaction"] = [pd.Timestamp(year=int(row["Date de traitement année"]), 
                            month=int(row["Date de traitement mois"]), 
                            day=int(row["Date de traitement"])) for i, row in df.iterrows()]

① Visualisation du stock - Tracez la tendance d'augmentation / diminution du solde des dépôts

Comparez le solde des dépôts (stock) de différents mois et vérifiez si le solde est sur une tendance à la hausse ou à la baisse.

image.png

Étant donné que le csv des données d'origine est inséré en fonction de l'historique des dépôts / retraits, c'est-à-dire de la base d'occurrence des transactions, il n'est pas possible de faire quelque chose comme "représenter graphiquement la transition mensuelle à partir du 1er du mois". Par conséquent, dessinez un graphique linéaire qui trace toutes les colonnes «solde post-transaction» de df.

code

#Générer un bloc de données pour le dessin de stock
df4stock = df.copy()

#Visualisation
fig, ax = plt.subplots(figsize=(20, 10))
sns.lineplot(x=df4stock.index, y="Solde post-transaction", data=df4stock, estimator=None);
fig.gca().ticklabel_format(style='plain', axis='y')

** Résultat de sortie **

image.png

Le marqueur circulaire bleu indique l'occurrence de la transaction et le solde à ce moment-là. Les revenus salariaux et les paiements par carte constituent une périodicité mensuelle. La tendance globale à la hausse / à la baisse est estimée à partir du solde mensuel maximal (jour de paie).

Dans l'analyse des séries chronologiques, la tendance globale à l'augmentation / à la diminution est définie comme ** composante de tendance **, et l'augmentation / diminution avec un cycle tel que le cycle mensuel est définie comme ** composante saisonnière **. Si vous souhaitez extraire le composant de tendance, vous pouvez séparer le composant de tendance et le composant saisonnier en insérant des données factices du jour où la transaction n'a pas eu lieu et en utilisant tsa.seasonal_decompose de stats model. L'implémentation est omise dans cet article. (Référence: Sakutto Trend Extraction: Introduction to Time Series Analysis with Python statsmodels)

(2) Visualisation des flux-Tracer le montant mensuel du dépôt / retrait

Comparez le montant des revenus et des dépenses (flux) au cours d'un mois donné et vérifiez à quel point le solde a augmenté ou diminué.

image.png

Regroupez les données originales par année et par mois, et générez une nouvelle base de données avec le montant des dépenses et des revenus pour chaque mois. Sur la base de la base de données créée, dessinez un graphique à barres qui trace le solde et la différence de chaque mois.

code

#Générer un bloc de données pour dessiner un flux
df4flow = df.groupby([df.index.year, df.index.month, "Nom de la transaction"]).sum().reset_index("Nom de la transaction")
df4flow

#Visualisation
fig, ax = plt.subplots(figsize=(20, 10))
ax = sns.barplot(x=df4flow.index, y="Somme d'argent", hue="Nom de la transaction", data=df4flow);

#Stocker le montant de chaque barre affichée par l'étiquette de valeur dans la liste
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])
    
    #Affichage des étiquettes de valeur
    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")

** Résultat de sortie **

image.png

Le cadre de données nouvellement généré «df4flow» pour le graphique a une colonne des montants totaux des transactions par revenus / dépenses avec année et mois dans MultiIndex. Dans le dessin, en plus du graphique à barres, les étiquettes de valeur de chaque revenu / dépense et la différence sont tracées par la méthode d'assistance ʻax.text () . La valeur de sortie est obtenue à partir de l'objet Rectangle ʻax.patches, qui contient des informations sous forme de rectangle de chaque graphique à barres. Puisque la hauteur du rectangle devient la quantité telle qu'elle est, la hauteur est obtenue par la méthode get_height () du même objet. La position de l'étiquette de valeur est calculée et placée de façon à ce qu'elle soit au milieu de chaque barre.

code

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

** Résultat de sortie ** image.png On peut voir que ʻax.pathces [0: 4] a un revenu (bleu) et ʻax.pathces [5: 9] a une barre d'information sur les dépenses (rouge). Notez que l'ordre de sortie est différent de la trame de données.

À la fin

Maintenant, je peux visualiser le flux de trésorerie et voir si l'argent augmente ou diminue (j'ai renoncé à acheter un PC car il diminuait). Comme mentionné ci-dessus, si vous associez le code ci-dessus dans Notebook, tout ce que vous avez à faire est de mettre à jour les données d'entrée, ce qui facilite la gestion.

Il est étonnamment difficile de créer des graphiques avec «Seaborn» ou «Matplotlib» comme vous le faites avec Excel. Il semble que nous ayons besoin d'en savoir plus sur la structure de l'objet ʻArtist` généré par le graphe.

Référence: Connaissance de base de matplotlib que je voulais connaître très tôt, ou l'histoire d'un artiste qui peut ajuster l'apparence.

Recommended Posts

Je veux vraiment voir le solde de mes dépôts en Python-Visualiser le flux de trésorerie avec seaborn
Même avec JavaScript, je veux voir Python `range ()`!
Je veux travailler avec un robot en python.
Je veux résoudre APG4b avec Python (seulement 4.01 et 4.04 au chapitre 4)
Je veux utiliser des rails avec des rails même dans un environnement vagabond
Je veux vérifier la position de mon visage avec OpenCV!
Je veux vraiment utiliser GitHub Flavored Markdown (GFM) avec Pelican!
Je veux faire ○○ avec les Pandas
Je veux me mettre en colère contre ma mère quand la mémoire est serrée
(Matplotlib) Je veux dessiner un graphique avec une taille spécifiée en pixels
Je souhaite utiliser Django Debug Toolbar dans les applications Ajax
Je veux exprimer mes sentiments avec les paroles de Mr. Children
Maintenance de l'environnement réalisée avec Docker (je souhaite post-traiter GrADS en Python
Je veux détecter des objets avec OpenCV
Je veux imprimer dans la notation d'inclusion
Je veux écrire un blog avec Jupyter Notebook
Je veux installer Python avec PythonAnywhere
Je veux analyser les journaux avec Python
Je veux jouer avec aws avec python
Je veux intégrer Matplotlib dans PySimpleGUI
Je voulais vraiment copier avec du sélénium
Je souhaite voir une liste de fichiers WebDAV dans le module Requêtes
Je veux faire le test de Dunnett en Python
Je veux pouvoir penser à la récurrence
Je veux utiliser MATLAB feval avec python
Je veux créer une fenêtre avec Python
J'ai essayé d'intégrer Keras dans TFv1.1
Je souhaite afficher plusieurs images avec matplotlib.
Je veux faire un jeu avec Python
Je veux être OREMO avec setParam!
Je souhaite stocker les informations de la base de données dans la liste
Je veux fusionner des dictionnaires imbriqués en Python
Je veux faire des crises de ma tête
Je souhaite utiliser le répertoire temporaire avec Python2
Je ne veux pas utiliser -inf avec np.log
#Unresolved Je veux compiler gobject-introspection avec Python3
Je souhaite utiliser ip vrf avec SONiC
Je veux résoudre APG4b avec Python (chapitre 2)
Je veux recommencer avec Migrate de Django
Je veux écrire dans un fichier avec Python
Je veux afficher la progression en Python!
Je souhaite envoyer un message d'erreur en japonais avec le formulaire de changement de mot de passe django
Je souhaite extraire uniquement les pods avec l'étiquette spécifiée à l'aide du sélecteur d'étiquettes dans Client-go