python for reading data from recording
This commit is contained in:
parent
19aa551af1
commit
8f87e6890b
153
read_recording.py
Normal file
153
read_recording.py
Normal file
|
|
@ -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()
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user