Spaces:
Sleeping
Sleeping
File size: 5,380 Bytes
72b45b0 1efb0d1 72b45b0 1efb0d1 72b45b0 1efb0d1 1ae7d42 72b45b0 1ae7d42 72b45b0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
import streamlit as st
import pandas as pd
import re
from datetime import datetime
import pdfplumber
import plotly.express as px
import io
def extract_data_from_pdf(pdf_content):
data_list = []
current_record = {}
for line in pdf_content.split('\n'):
# Extract header information
if 'Entreprise::' in line:
if current_record and 'temperature_data' in current_record:
data_list.append(current_record)
current_record = {'temperature_data': []}
# Extract metadata
if 'Date:' in line:
try:
date_str = re.search(r'Date:\s*(\d{2}[./]\d{2}[./]\d{4})', line).group(1)
date_str = date_str.replace('/', '.')
current_record['date'] = datetime.strptime(date_str, '%d.%m.%Y').strftime('%Y-%m-%d')
except:
current_record['date'] = None
if 'Produit:' in line:
current_record['produit'] = line.split('Produit:')[-1].strip()
if 'Utilisateur:' in line:
current_record['utilisateur'] = line.split('Utilisateur:')[-1].strip()
# Extract temperature data
if any(x in line for x in ['Début', '+ ', 'Fin']) and '°C' in line:
try:
parts = line.strip().split()
time = parts[0] if 'Début' in line or 'Fin' in line else parts[1]
# Extract temperature values
temp_sterilisateur = float(parts[-3].replace('°C', ''))
temp_coeur = float(parts[-2].replace('°C', ''))
valeur_f = float(parts[-1])
current_record['temperature_data'].append({
'temps': time,
'temp_sterilisateur': temp_sterilisateur,
'temp_coeur': temp_coeur,
'valeur_f': valeur_f
})
except Exception as e:
# If extraction fails, skip the line
continue
# Add last record
if current_record and 'temperature_data' in current_record:
data_list.append(current_record)
return data_list
def analyze_sterilization(data):
results = []
for record in data:
temp_data = pd.DataFrame(record['temperature_data'])
# Skip if temperature data is empty
if temp_data.empty:
st.warning(f"Données de température manquantes pour l'enregistrement du {record['date']}")
continue
# Determine product type and required temperature
is_nutabreizh = 'NutaBreizh' in record['produit']
required_temp = 108 if is_nutabreizh else 103
# Count minutes at required temperature
minutes_at_temp = len(temp_data[temp_data['temp_coeur'] >= required_temp])
# Calculate max temperatures
max_temp_sterilisateur = temp_data['temp_sterilisateur'].max()
max_temp_coeur = temp_data['temp_coeur'].max()
# Determine if criteria met
criteria_met = minutes_at_temp >= 30
results.append({
'Date': record['date'],
'Produit': record['produit'],
'Utilisateur': record['utilisateur'],
'Temperature_Requise': required_temp,
'Minutes_Temperature_Requise': minutes_at_temp,
'Temperature_Max_Sterilisateur': max_temp_sterilisateur,
'Temperature_Max_Coeur': max_temp_coeur,
'Criteres_Respectes': criteria_met
})
return pd.DataFrame(results)
def main():
st.title("Analyse des Protocoles de Stérilisation")
uploaded_file = st.file_uploader("Choisir un fichier PDF", type="pdf")
if uploaded_file is not None:
# Read PDF content
pdf_text = ""
with pdfplumber.open(uploaded_file) as pdf:
for page in pdf.pages:
pdf_text += page.extract_text() + "\n"
# Process data
data = extract_data_from_pdf(pdf_text)
results_df = analyze_sterilization(data)
# Display results
st.subheader("Résultats de l'analyse")
st.dataframe(results_df)
# Create visualization
if not results_df.empty:
fig = px.scatter(results_df,
x='Date',
y='Minutes_Temperature_Requise',
color='Criteres_Respectes',
hover_data=['Produit', 'Temperature_Requise'],
title="Minutes à température requise par production")
st.plotly_chart(fig)
else:
st.warning("Aucune donnée valide à afficher.")
# Export button
if st.button("Exporter en Excel"):
output = io.BytesIO()
with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
results_df.to_excel(writer, index=False)
output.seek(0)
st.download_button(
label="Télécharger l'analyse",
data=output,
file_name="analyse_sterilisation.xlsx",
mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
)
if __name__ == "__main__":
main() |