# Cell 1: Import des bibliothèques import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # Configuration pour des graphiques lisibles sns.set(style="whitegrid") plt.rcParams['figure.figsize'] = (14, 6) # Chargement des données df = pd.read_csv("../recordings/recording_20250718_112807.csv", parse_dates=["timestamp"]) df_PatientSkid = df[df['pu'] == 'PatientSkid'].copy() # Cellule finale : Affichage multi-PU par grandeur import matplotlib.dates as mdates reference_lines = { 'Qperm': 1200, 'Pdilute': 2.5 } quantities = ['Qperm', 'Qdilute', 'Qdrain', 'Pro', 'Pdilute','MV07_sp'] n_quantities = len(quantities) pus_all =pus = ['PU_1','PU_2','PU_3'] fig, axes = plt.subplots(n_quantities, 1, figsize=(14, 3 * n_quantities), sharex=True) fig.suptitle("Évolution des grandeurs par PU", fontsize=16) for i, quantity in enumerate(quantities): ax = axes[i] for pu in pus_all: df_pu = df[df['pu'] == pu] if quantity in df_pu.columns: ax.plot(df_pu['timestamp'], df_pu[quantity], label=pu) if quantity in reference_lines: ax.axhline(reference_lines[quantity], linestyle='--', color='red') if quantity == 'Qdilute': ax.plot(df_PatientSkid['timestamp'], df_PatientSkid['QSkid'], label='QSkid') ax.set_ylabel(quantity) ax.grid(True) ax.legend(loc='upper right') if i == n_quantities - 1: ax.set_xlabel("Timestamp") else: ax.set_xlabel("") ax.xaxis.set_major_formatter(mdates.DateFormatter("%H:%M:%S")) plt.tight_layout(rect=[0, 0, 1, 0.96]) plt.show() # Analyse initiale pour PU_1 df_pu_1 = df[df['pu'] == 'PU_1'].copy() df_pu_1.sort_values('timestamp', inplace=True) df_pu_1['delta_t'] = df_pu_1['timestamp'].diff().dt.total_seconds() df_pu_1 = df_pu_1.iloc[1:] # Supprimer la première valeur NaN plt.figure('Time between messages',figsize=(10, 4)) sns.histplot(df_pu_1['delta_t'], bins=10,stat='probability') plt.title("Time between messages for PU_1") plt.xlabel("Timestamp") plt.ylabel("Δt (seconds)") plt.grid(True) plt.tight_layout() # plt.show() print("Average time is ", df_pu_1['delta_t'].mean()) def plot_pu_data(pu_name): # Filtrage df_pu = df[df['pu'] == pu_name].copy() df_pu['timestamp'] = pd.to_datetime(df_pu['timestamp'], errors='coerce') df_pu = df_pu.dropna(subset=['timestamp']) # --------- Plot 1: Débits --------- flow_cols = ['Qperm', 'Qdilute', 'Qdrain', 'Qrecirc'] available_flows = [col for col in flow_cols if col in df_pu.columns] if available_flows: fig, ax = plt.subplots(figsize=(10, 4)) for col in available_flows: ax.plot(df_pu['timestamp'], df_pu[col], label=col) ax.plot(df_PatientSkid['timestamp'], df_PatientSkid['QSkid'],label='QSkid') ax.set_title(f'{pu_name} - Flow Rates') ax.set_xlabel("Timestamp") ax.set_ylabel("Flow (L/min)") ax.legend(loc='upper right') ax.grid(True) fig.tight_layout() # plt.show() # --------- Plot 2: Pressions --------- pressure_cols = ['Pro', 'Pdilute', 'Pretentate'] available_pressures = [col for col in pressure_cols if col in df_pu.columns] if available_pressures: fig, ax = plt.subplots(figsize=(10, 4)) for col in available_pressures: ax.plot(df_pu['timestamp'], df_pu[col], label=col) ax.set_title(f'{pu_name} - Pressures') ax.set_xlabel("Timestamp") ax.set_ylabel("Pressure (bar)") ax.legend(loc='upper right') ax.grid(True) fig.tight_layout() # plt.show() # --------- Plot 3: Motor Valve Positions --------- mv_indices = range(2, 9) # MV02 à MV08 fig, axes = plt.subplots(3, 3, figsize=(15, 10), sharex=True) fig.suptitle(f'{pu_name} - Motor Valve Positions vs Setpoints', fontsize=16) plot_index = 0 for mv in mv_indices: mv_real = f"MV0{mv}" mv_sp = f"MV0{mv}_sp" row, col = divmod(plot_index, 3) ax = axes[row, col] if mv_real in df_pu.columns and mv_sp in df_pu.columns: ax.plot(df_pu['timestamp'], df_pu[mv_real], label='Actual', color='blue') ax.plot(df_pu['timestamp'], df_pu[mv_sp], label='Setpoint', linestyle='--', color='orange') ax.set_title(f"{mv_real}") ax.set_ylabel("Position (%)") ax.grid(True) if row == 2: ax.set_xlabel("Timestamp") else: ax.set_visible(False) plot_index += 1 # Cacher les sous-graphiques inutilisés while plot_index < 9: row, col = divmod(plot_index, 3) axes[row, col].set_visible(False) plot_index += 1 handles, labels = axes[0][0].get_legend_handles_labels() fig.legend(handles, labels, loc='upper right') fig.tight_layout(rect=[0, 0, 1, 0.96]) # plt.show() # Cell final : Affichage pour tous les PU pus = df['pu'].dropna().unique() print("PU disponibles :", pus) pus = ['PU_1'] for pu in pus: print(f"\n--- Data for {pu} ---\n") plot_pu_data(pu) plt.show()