From 8f87e6890b5a068e6b9d61cc1ff83efb77c70f75 Mon Sep 17 00:00:00 2001 From: Etienne Chassaing <60154720+cetiennec@users.noreply.github.com> Date: Wed, 30 Jul 2025 14:27:00 +0200 Subject: [PATCH] python for reading data from recording --- read_recording.py | 153 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 read_recording.py diff --git a/read_recording.py b/read_recording.py new file mode 100644 index 0000000..b9ae53c --- /dev/null +++ b/read_recording.py @@ -0,0 +1,153 @@ +# 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() + +