2 votes

Comment lire plusieurs fichiers csv et tracer un histogramme ?

J'ai déjà posé la même question, mais il semble qu'elle n'était pas claire, alors laissez-moi la poser d'une autre manière. J'ai quatre fichiers .csv nommés I_séisme2016.csv I_séisme2017.csv I_séisme2018.csv I_séisme2019.csv (données sur les séismes de différentes années). Ils ont tous les mêmes colonnes mais le nombre de lignes est différent. J'ai fait quelques codes pour lire un des fichiers, et faire l'histogramme pour voir combien de tremblements de terre se produisent chaque mois.

Questions :

  • Je ne sais pas comment faire un code pour lire tous les fichiers et tracer l'image. le même histogramme pour chacun d'eux(use loop)
  • Je ne sais pas comment faire un histogramme pour montrer le nombre de séismes pour chaque année (entre 2016 et 2019).

Quelqu'un peut-il m'apprendre à le faire ? Merci.

import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

data = pd.read_csv('I_earthquake2017.csv')
print(data[:1])

Ligne de sortie 1 :

time  latitude  longitude  depth  mag

0 2017-12-30 20:53:24.700000+00:00   29.4481    51.9793   10.0  4.9

data['time']=pd.to_datetime(data['time'])
data['MONTH']=data['time'].dt.month
data['YEAR']=data['time'].dt.year
print(data[:1])

Ligne de sortie 1

time  latitude  longitude  depth  mag  MONTH  YEAR

0 2017-12-30 20:53:24.700000+00:00   29.4481    51.9793   10.0  4.9   12   2017

plt.hist(x=[data.MONTH],bins=12,alpha=0.5)
plt.show()

1voto

Björn Points 1012

EDITAR: Inclusion d'un tri dans l'affectation de csv_list pour réorganiser les sous-plans dans le bon ordre.
ligne modifiée -> csv_list = sorted(list(base_dir.glob("*.csv")))

J'ai donc simulé vos données (pour ceux qui sont intéressés, le code de la simulation se trouve dans la dernière partie de cette réponse).

Importations nécessaires pour le code

#!/usr/bin/env python3
import calendar
from pathlib import Path
import matplotlib.pyplot as plt
import pandas as pd

Réponse 1 : lire plusieurs fichiers .csv

Il y a la bibliothèque globe terrestre Cependant, je préfère l'implémentation de pathlib intégrée de globe terrestre . Les deux permettent de rechercher un motif regex (comme *.csv), voir la citation ci-dessous de la documentation :

Globaliser le motif relatif donné dans le répertoire représenté par ce fichier chemin, produisant tous les fichiers correspondants (de n'importe quel type)

Le code ci-dessous vous donne une liste de DataFrame pandas. L'argument parse_dates=['time'] convertit automatiquement la colonne time en datetime. Vous n'avez donc pas besoin de pd.to_datetime() plus. Vous devrez adapter la base en base_dir pour correspondre au répertoire correct sur votre PC.

# Read in mulitple CSV Files
base_dir = Path("C:/Test/Earthquake-Data")
csv_list = sorted(list(base_dir.glob("*.csv")))
df_list = [pd.read_csv(file, index_col=0,parse_dates=['time']) for file in csv_list]

Réponse 2 : tracer des histogrammes multiples

Vous pouvez créer un sous-plot 2 x 2 avec plt.subplots() dans le code ci-dessous, j'itère sur la liste des dataframes ainsi que sur la liste des axes avec zip(df_list,fig.get_axes()) et les dépaqueter le tuple résultant de *(df, axes) dans les variables to df y ax . Dans la boucle, j'utilise la méthode vectorielle .dt.month sur la colonne de temps pour créer l'histogramme et changer certains des paramètres d'apparence, c'est-à-dire :

  1. Titre de l'intrigue secondaire fixé à l'année title=str(df['time'].dt.year[0])
  2. Définissez les étiquettes sur les ticks de l'axe des x sur les noms de mois abrégés (stockés dans le fichier list(calendar.month_abbr[1:]) ). Veuillez reconnaître que je import calendar dans la première partie de ma réponse (ci-dessus).
  3. Faites pivoter les étiquettes x (mois abrégés) pour améliorer la lisibilité.

Code :

fig, ax = plt.subplots(2,2)
for df, ax in zip(df_list,fig.get_axes()):
    df['time'].dt.month.plot(kind="hist",ax=ax,bins=12,title=str(df['time'].dt.year[0]))
    ax.set_xticks(range(1,13))
    ax.set_xticklabels(list(calendar.month_abbr[1:]))
    # Rotate the xticks for increased readability
    for tick in ax.get_xticklabels():
        tick.set_rotation(45)
fig.tight_layout()
plt.show()

Simulation de données sismiques

#!/usr/bin/env python3
import numpy as np
import pandas as pd
from my_utils.advDateTime import random_datetimes
from pathlib import Path

year_range = range(2016,2020)
time = [random_datetimes(pd.to_datetime(f"1/1/{year}"), pd.to_datetime(f"1/1/{year + 1}"), n=100) \
                for year in year_range]
lattitude = [np.random.randint(0,100,100) for i in range(4)]
data = {'Lattitude': lattitude[0],'time':time[0]}
list_dfs = [pd.DataFrame({'Lattitude': data,'time':y}).sort_values("time").reset_index(drop=True) for data,y in zip(lattitude,time)]

# # Export to CSV
base_dir = Path("C:/Test/Earthquake-Data")
[df.to_csv(base_dir/f"I_earthquake{year}.csv") for df,year in zip(list_dfs,year_range)]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X