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.
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.
** (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é.
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 ~~.
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 ()`.
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 **
À 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()]
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.
É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 **
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)
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é.
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 **
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 **
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.
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.