up follow livre

This commit is contained in:
Tykayn 2025-08-30 18:14:14 +02:00 committed by tykayn
parent b4b4398bb0
commit 3a7a3849ae
12242 changed files with 2564461 additions and 6914 deletions

View file

@ -4,9 +4,6 @@
import csv
from datetime import date, timedelta, datetime
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import make_interp_spline
def mise_a_jour_suivi(fichier_csv, fichier_livre, fichier_personnages):
# Lire le fichier livre.org
@ -44,27 +41,8 @@ def analyse_csv(fichier_csv):
donnees = list(reader)
# Récupérer les dates et les nombres de mots
dates_raw = [datetime.fromisoformat(donnee[0]) for donnee in donnees]
mots_raw = [int(donnee[1]) for donnee in donnees]
chapitres_raw = [int(donnee[5]) for donnee in donnees]
# Gérer les entrées dupliquées en gardant la dernière valeur pour chaque date
date_data = {}
for i, dt in enumerate(dates_raw):
date_key = dt.date()
date_data[date_key] = {
'mots': mots_raw[i],
'chapitres': chapitres_raw[i]
}
# Trier les dates et extraire les valeurs uniques
dates = sorted(date_data.keys())
mots = [date_data[d]['mots'] for d in dates]
chapitres = [date_data[d]['chapitres'] for d in dates]
# Créer les graphiques en aire adoucie
create_smooth_area_chart(dates, mots, "Evolution du nombre de mots", "evolution_mots.png")
create_smooth_area_chart(dates, chapitres, "Evolution du nombre de chapitres", "evolution_chapitres.png")
dates = [datetime.fromisoformat(donnee[0]).date() for donnee in donnees]
mots = [int(donnee[1]) for donnee in donnees]
# Récupérer la date du jour
@ -121,76 +99,4 @@ def analyse_csv(fichier_csv):
print("Total : ", most_recent," mots")
mise_a_jour_suivi(fichier_csv, fichier_livre, fichier_personnages)
def create_smooth_area_chart(dates, values, title, filename):
"""
Crée un graphique en aire adoucie à partir des dates et des valeurs.
Args:
dates: Liste des dates
values: Liste des valeurs correspondantes
title: Titre du graphique
filename: Nom du fichier pour sauvegarder le graphique
"""
# Vérifier qu'il y a assez de données pour créer un graphique
if len(dates) < 2:
print(f"Pas assez de données pour créer le graphique {title}")
return
# Convertir les dates en nombres (jours depuis la première date)
date_nums = [(d - dates[0]).days for d in dates]
# Créer des points x pour l'interpolation (plus de points pour une courbe plus lisse)
if len(date_nums) > 2:
x_smooth = np.linspace(min(date_nums), max(date_nums), 300)
# Créer la spline pour l'interpolation
spl = make_interp_spline(date_nums, values, k=min(3, len(dates)-1))
y_smooth = spl(x_smooth)
else:
# Si seulement 2 points, utiliser une interpolation linéaire
x_smooth = np.linspace(min(date_nums), max(date_nums), 300)
y_smooth = np.interp(x_smooth, date_nums, values)
# Créer la figure
plt.figure(figsize=(10, 6))
# Tracer l'aire sous la courbe
plt.fill_between(x_smooth, y_smooth, alpha=0.5, color='skyblue')
# Tracer la ligne
plt.plot(x_smooth, y_smooth, color='blue', linewidth=2)
# Ajouter les points de données réels
plt.scatter(date_nums, values, color='darkblue', s=30)
# Configurer les étiquettes de l'axe x (dates)
if len(dates) > 1:
# Sélectionner quelques dates pour l'affichage
num_ticks = min(10, len(dates))
tick_indices = np.linspace(0, len(dates)-1, num_ticks, dtype=int)
tick_positions = [date_nums[i] for i in tick_indices]
tick_labels = [dates[i].strftime('%Y-%m-%d') for i in tick_indices]
plt.xticks(tick_positions, tick_labels, rotation=45)
# Ajouter les titres et les étiquettes
plt.title(title, fontsize=16)
plt.xlabel('Date', fontsize=12)
plt.ylabel('Valeur', fontsize=12)
# Ajouter une grille
plt.grid(True, linestyle='--', alpha=0.7)
# Ajuster la mise en page
plt.tight_layout()
# Sauvegarder le graphique
plt.savefig(filename, dpi=150, bbox_inches='tight')
plt.savefig(filename.replace('.png', '.svg'), format='svg', bbox_inches='tight')
# Fermer la figure pour libérer la mémoire
plt.close()
print(f"Graphique '{title}' sauvegardé sous {filename} et {filename.replace('.png', '.svg')}")
analyse_csv(fichier_csv)