États patient¶
etat_patient ¶
evenementsServeurEtatsPatient (diagnostics, IGS2…) — un fichier par événement.
evenements (1 ligne = 1 fichier ; colonnes-chemins relatives à la racine du message)
obligatoires : evt_id, ipp, sexe, date_naissance
facultatives : patient, venue et intervention comme pour le serveur d'actes,
date_observation, heure_observation (élément dateObservation),
recueil_id, recueil_date, recueil_heure, recueil_uf (élément recueil : date et UF
où les états ont été observés), identifiant_message, date_heure_production,
commentaire
Le XSD impose un repère, au choix : intervention (colonnes intervention_*),
dateObservation (date_observation) ou recueil (colonnes recueil_*). Le recueil est le
plus précis : il porte l'UF d'observation, qui permet au récepteur de retrouver le RUM.
Le contenu est un choix exclusif : Diagnostics (table ``diagnostics``), ou igs2,
dependances… (colonnes-chemins, par exemple ``igs2/@age``).
diagnostics (1 ligne = 1 diagnostic ; colonnes-chemins relatives à diagnostic)
obligatoires : evt_id, type, code
facultatives : date_action, action ("creation")
type suit l'énumération du XSD : dp, dr, da, ds, dd, fpc, mm, ae
(mis en minuscules ; DP et dp sont équivalents).
write_evenements_etat_patient ¶
write_evenements_etat_patient(
evenements: Table,
diagnostics: Table,
*,
entete: dict | None = None,
out_dir: str | Path,
filename: str | Callable[[dict], str] = "{evt_id}.xml",
version: str | None = None,
xmlns: str | None = HPRIM_NS,
encoding: str = "UTF-8",
validate_xsd: str | bool = "error",
colmap: dict | None = None,
identifiant_egal_nom_fichier: bool = True,
fichier_ok: bool = False,
par_diagnostic: bool = False,
) -> list[Path]
Écrit des fichiers evenementsServeurEtatsPatient (diagnostics), un par événement.
Unité atomique des états patient (pour les diagnostics) : le diagnostic, porteur
de l'attribut action et d'un identifiant. par_diagnostic=True écrit un message
par diagnostic. L'IGS2, unique par message, est atomique par construction.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
evenements
|
Table
|
une ligne par événement : patient, venue, intervention. Les colonnes-chemins sont relatives à la racine du message. |
required |
diagnostics
|
Table
|
une ligne par diagnostic ( |
required |
entete
|
dict | None
|
voir |
None
|
out_dir
|
str | Path
|
dossier de sortie. |
required |
filename
|
str | Callable[[dict], str]
|
gabarit ou fonction. |
'{evt_id}.xml'
|
version
|
str | None
|
version du schéma. |
None
|
xmlns
|
str | None
|
voir |
HPRIM_NS
|
encoding
|
str
|
encodage des fichiers. |
'UTF-8'
|
validate_xsd
|
str | bool
|
|
'error'
|
colmap
|
dict | None
|
renommage de colonnes. |
None
|
identifiant_egal_nom_fichier
|
bool
|
si vrai (défaut), l'identifiantMessage de chaque
message est exactement le nom de son fichier sans extension ( |
True
|
fichier_ok
|
bool
|
dépose un fichier |
False
|
par_diagnostic
|
bool
|
un message par diagnostic (unité atomique) au lieu d'un par
événement. Le contexte (patient, venue, repère) est répété ; |
False
|
Returns:
| Type | Description |
|---|---|
list[Path]
|
La liste des fichiers écrits. |
Examples:
Script examples/exemple_etat_patient.py :
# Régénère data/xml_tests/etat_patient/00001.xml : diagnostics DP et DR.
from datetime import date, datetime, time
import polars as pl
import pyhprimxml as hx
entete = {
"version": "2.00", # version HPRIM XML des messages
"emetteur": "TEST",
"destinataire": None,
"acquittement_attendu": "non",
"commentaire": "HPRIM-TEST",
"date_heure_production": datetime(2024, 1, 1, 1, 1, 1),
}
# Une ligne par événement : patient, venue, intervention
# (ici, les colonnes-chemins sont relatives à la racine du message)
evenements = pl.DataFrame({
"evt_id": ["00001_esep"],
"ipp": ["123456789"], "ipp_recepteur": ["123456789"],
"sexe": ["M"], "nom_usuel": ["SANDWICK"], "prenom": ["JOHN"],
"date_naissance": [date(1970, 1, 1)],
"nda": ["987654321"], "nda_recepteur": ["987654321"],
"venue_date_entree": [date(2024, 1, 1)], "venue_heure_entree": [time(8, 0)],
"venue_uf_responsable": ["4321"],
"intervention_id": ["000000000001"], "intervention_uf": ["4321"],
"patient/@confidentiel": ["non"], "venue/@prive": ["non"],
"patient/identifiant/emetteur/@etat": ["permanent"],
"patient/identifiant/emetteur/@portee": ["local"],
"patient/identifiant/emetteur/@referent": ["non"],
"patient/identifiant/recepteur/@etat": ["permanent"],
"patient/identifiant/recepteur/@portee": ["local"],
"patient/identifiant/recepteur/@referent": ["non"],
})
# Une ligne par diagnostic ; type dans dp, dr, da, ds, dd, fpc, mm, ae
diagnostics = pl.DataFrame({
"evt_id": ["00001_esep", "00001_esep"],
"type": ["dp", "dr"],
"code": ["Z511", "C10"],
"date_action": [datetime(2024, 1, 1, 8, 10)] * 2,
})
fichiers = hx.write_evenements_etat_patient(
evenements, diagnostics,
entete=entete,
out_dir="sortie/etat_patient", # -> sortie/etat_patient/00001_esep.xml
validate_xsd="warn",
)
read_evenements_etat_patient ¶
read_evenements_etat_patient(
sources: Sources,
*,
extra: dict[str, list[str]] | None = None,
version: str | None = None,
backend: str = "polars",
exiger_ok: bool = False,
) -> dict[str, Table]
Lit des fichiers evenementsServeurEtatsPatient vers des tables.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
sources
|
Sources
|
fichier, dossier, motif glob, bytes ou liste. |
required |
extra
|
dict[str, list[str]] | None
|
colonnes-chemins supplémentaires, par table ( |
None
|
version
|
str | None
|
forcer une version de schéma. |
None
|
backend
|
str
|
|
'polars'
|
exiger_ok
|
bool
|
ne lit que les |
False
|
Returns:
| Type | Description |
|---|---|
dict[str, Table]
|
|
iter_evenements_etat_patient ¶
iter_evenements_etat_patient(
evenements: Table,
diagnostics: Table,
*,
entete: dict | None = None,
version: str | None = None,
colmap: dict | None = None,
par_diagnostic: bool = False,
) -> Iterator[tuple[dict, dict]]
Itère sur (ligne evenement, arbre) : un arbre par événement, ou par diagnostic avec
par_diagnostic=True (unité atomique des états patient pour les diagnostics).