{"id":6419,"date":"2026-10-14T18:02:07","date_gmt":"2026-10-14T18:02:07","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/pandas-remodeler-dataframe-format-large-en-long\/"},"modified":"2026-10-14T18:02:07","modified_gmt":"2026-10-14T18:02:07","slug":"pandas-remodeler-dataframe-format-large-en-long","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=pandas-remodeler-dataframe-format-large-en-long","title":{"rendered":"Pandas : Comment remodeler un DataFrame du format large au format long"},"content":{"rendered":"<p>Dans le paysage contemporain de la science des donn\u00e9es et de l&rsquo;ing\u00e9nierie analytique, la manipulation structurelle des tableaux repr\u00e9sente une part pr\u00e9pond\u00e9rante du temps allou\u00e9 au pr\u00e9traitement de l&rsquo;information. Loin d&rsquo;\u00eatre un simple artifice cosm\u00e9tique, l&rsquo;agencement morphologique des matrices de donn\u00e9es conditionne directement l&rsquo;applicabilit\u00e9 des algorithmes d&rsquo;apprentissage automatique, la validit\u00e9 des mod\u00e9lisations statistiques inf\u00e9rentielles ainsi que l&rsquo;efficacit\u00e9 computationnelle des repr\u00e9sentations graphiques. La biblioth\u00e8que logicielle <a rel=\"noopener noreferrer\" href=\"https:\/\/pandas.pydata.org\/\">Pandas<\/a>, d\u00e9velopp\u00e9e initialement par Wes McKinney pour r\u00e9pondre aux exigences quantitatives de la finance de march\u00e9, s&rsquo;est impos\u00e9e comme la r\u00e9f\u00e9rence incontournable de l&rsquo;\u00e9cosyst\u00e8me Python pour orchestrer ces m\u00e9tamorphoses architecturales gr\u00e2ce \u00e0 des op\u00e9rateurs d&rsquo;alg\u00e8bre relationnelle puissants et hautement optimis\u00e9s.<\/p>\n<p>Parmi les op\u00e9rations fondamentales de restructuration tabulaire, la transition du format large vers le format long \u2014 fr\u00e9quemment d\u00e9sign\u00e9e sous l&rsquo;anglicisme de d\u00e9pivotement ou <em>unpivoting<\/em> \u2014 constitue une \u00e9tape charni\u00e8re. Les donn\u00e9es collect\u00e9es sur le terrain empirique, qu&rsquo;il s&rsquo;agisse de suivis \u00e9pid\u00e9miologiques longitudinaux, de protocoles exp\u00e9rimentaux en psychom\u00e9trie ou de m\u00e9triques industrielles issues de capteurs connect\u00e9s, sont quasi syst\u00e9matiquement consign\u00e9es dans des matrices larges o\u00f9 chaque r\u00e9p\u00e9tition temporelle ou condition d&rsquo;observation s&rsquo;\u00e9tale horizontalement. Or, cette topologie, si intuitive soit-elle pour l&rsquo;op\u00e9rateur humain, se heurte de plein fouet aux pr\u00e9suppos\u00e9s formels des environnements d&rsquo;analyse modernes, lesquels exigent une organisation atomique standardis\u00e9e.<\/p>\n<p>Le pr\u00e9sent article propose une exploration m\u00e9thodique, conceptuelle et pratique des m\u00e9canismes pr\u00e9sidant au remodelage des structures tabulaires avec Pandas. En d\u00e9cortiquant les fondements th\u00e9oriques \u00e9tablis par la th\u00e9orie des donn\u00e9es ordonn\u00e9es, en analysant en profondeur les signatures algorithmiques de fonctions cl\u00e9s telles que <em>melt<\/em>, <em>wide_to_long<\/em> et <em>stack<\/em>, et en examinant les enjeux sous-jacents de gestion de la m\u00e9moire vive et de rigueur statistique, ce guide exhaustif offre aux chercheurs, analystes et ing\u00e9nieurs les cl\u00e9s m\u00e9thodologiques indispensables pour transformer des matrices complexes en repr\u00e9sentations rigoureuses, exploitables et p\u00e9rennes.<\/p>\n<h2>1. Fondements conceptuels des structures de donn\u00e9es : Formats large et long<\/h2>\n<h3>1.1 D\u00e9finition et propri\u00e9t\u00e9s structurales du format large (Wide Format)<\/h3>\n<p>Le format large, ou <em>wide format<\/em>, se caract\u00e9rise par une organisation matricielle bidimensionnelle dans laquelle chaque ligne renvoie rigoureusement \u00e0 une entit\u00e9 observationnelle unique, tandis que les attributs, les conditions exp\u00e9rimentales ou les pas temporels successifs sont projet\u00e9s horizontalement le long de l&rsquo;axe des colonnes. Dans cette disposition, une unit\u00e9 statistique donn\u00e9e \u2014 par exemple un patient dans une \u00e9tude clinique ou une machine au sein d&rsquo;une cha\u00eene de production \u2014 ne poss\u00e8de qu&rsquo;un seul enregistrement vectoriel horizontal. Si l&rsquo;on administre \u00e0 ce patient un traitement mesur\u00e9 \u00e0 trois reprises distinctes, la matrice int\u00e9grera trois colonnes d\u00e9di\u00e9es pour consigner ces r\u00e9ponses, cr\u00e9ant ainsi une expansion lat\u00e9rale continue des dimensions du tableau.<\/p>\n<p>Cette prolif\u00e9ration horizontale pr\u00e9sente ind\u00e9niablement des avantages ergonomiques notables pour la saisie manuelle et la consultation humaine directe. Au sein de tableurs conventionnels, la lecture d&rsquo;une ligne d&rsquo;un seul coup d&rsquo;\u0153il permet \u00e0 un observateur d&#8217;embrasser l&rsquo;int\u00e9gralit\u00e9 du profil longitudinal d&rsquo;une entit\u00e9 sans n\u00e9cessiter d&rsquo;op\u00e9ration de filtrage ou d&rsquo;agr\u00e9gation. L&rsquo;intelligibilit\u00e9 imm\u00e9diate des matrices de corr\u00e9lation ou des r\u00e9sum\u00e9s bivari\u00e9s s&rsquo;en trouve facilit\u00e9e, ce qui explique la pr\u00e9dominance historique de cette morphologie dans les protocoles de collecte de donn\u00e9es brutes sur tableur ou formulaires web.<\/p>\n<p>Toutefois, cette structure matricielle montre de profondes limites d\u00e8s lors que l&rsquo;on aborde la mod\u00e9lisation statistique avanc\u00e9e et la programmation d\u00e9clarative. Sur le plan informatique, la variabilit\u00e9 du nombre de colonnes rend les sch\u00e9mas de bases de donn\u00e9es dynamiques et instables, compliquant l&rsquo;\u00e9criture de requ\u00eates d&rsquo;interrogation syst\u00e9matiques. De plus, les moteurs graphiques modernes et les biblioth\u00e8ques d&rsquo;estimation \u00e9conom\u00e9trique peinent \u00e0 interpr\u00e9ter des s\u00e9ries dont la variable explicative temporelle est diss\u00e9min\u00e9e dans les en-t\u00eates m\u00eames du tableau, plut\u00f4t que d&rsquo;\u00eatre explicit\u00e9e en tant que variable factorielle dans un vecteur ind\u00e9pendant.<\/p>\n<h3>1.2 D\u00e9finition et morphologie du format long (Long Format ou Tidy Data)<\/h3>\n<p>\u00c0 l&rsquo;oppos\u00e9 du paradigme pr\u00e9c\u00e9dent, le format long \u2014 conceptuellement formalis\u00e9 sous l&rsquo;appellation de <a rel=\"noopener noreferrer\" href=\"https:\/\/vita.had.co.nz\/papers\/tidy-data.html\">donn\u00e9es ordonn\u00e9es (Tidy Data)<\/a> par le statisticien Hadley Wickham \u2014 repose sur une correspondance stricte et univoque entre la topologie tabulaire et la s\u00e9mantique statistique. Dans ce sch\u00e9ma canonique, chaque variable correspond \u00e0 une colonne unique, chaque unit\u00e9 d&rsquo;observation correspond \u00e0 une ligne distincte, et chaque cellule individuelle h\u00e9berge une valeur scalaire atomique. Par cons\u00e9quent, les mesures r\u00e9p\u00e9t\u00e9es pour une m\u00eame entit\u00e9 ne sont plus distribu\u00e9es le long de l&rsquo;axe horizontal, mais empil\u00e9es verticalement le long de l&rsquo;axe des lignes, l&rsquo;entit\u00e9 \u00e9tant r\u00e9p\u00e9t\u00e9e autant de fois qu&rsquo;il existe de points d&rsquo;observation.<\/p>\n<p>La morphologie du format long centralise ainsi l&rsquo;ensemble des observations quantitatives au sein d&rsquo;un ou plusieurs vecteurs de valeurs homog\u00e8nes, flanqu\u00e9s de descripteurs contextuels ou d&rsquo;indices temporels. Si un sujet subit dix sessions d&rsquo;\u00e9valuation, la matrice pr\u00e9sentera dix lignes distinctes partageant le m\u00eame identifiant de sujet, mais diff\u00e9renci\u00e9es par une colonne indicatrice d\u00e9signant l&rsquo;ordre de passage ou l&rsquo;instant pr\u00e9cis de la capture. Cette r\u00e9organisation vectorielle assure une coh\u00e9rence formelle des types de donn\u00e9es sous-jacents, \u00e9liminant la dispersion des types scalaires sur plusieurs colonnes arbitraires.<\/p>\n<p>Cette g\u00e9om\u00e9trie s&rsquo;av\u00e8re optimale pour le d\u00e9ploiement des mod\u00e8les mixtes lin\u00e9aires, des analyses de variance \u00e0 mesures r\u00e9p\u00e9t\u00e9es (ANOVA) et des r\u00e9gressions longitudinales. Dans la mesure o\u00f9 les progiciels statistiques op\u00e8rent majoritairement par vectorisation sur des colonnes enti\u00e8res, l&rsquo;isolation de la variable d\u00e9pendante dans une dimension continue unique simplifie la formalisation math\u00e9matique des mod\u00e8les. De surcro\u00eet, les biblioth\u00e8ques de visualisation d\u00e9clarative, fond\u00e9es sur la grammaire des graphiques, d\u00e9pendent intrins\u00e8quement de cette structure pour projeter des attributs visuels tels que la couleur, la forme ou les facettes \u00e0 partir de colonnes de regroupement cat\u00e9gorielles.<\/p>\n<h3>1.3 La pertinence du format long dans la recherche empirique et psychom\u00e9trique<\/h3>\n<p>Dans le domaine des sciences exp\u00e9rimentales, de la m\u00e9decine translationnelle et de la psychom\u00e9trie, les protocoles d&rsquo;investigation mobilisent de mani\u00e8re quasi universelle des protocoles longitudinaux ou des t\u00e2ches comportementales r\u00e9p\u00e9t\u00e9es. Un sujet soumis \u00e0 une \u00e9preuve cognitive effectue g\u00e9n\u00e9ralement plusieurs centaines d&rsquo;essais sous diff\u00e9rentes conditions d&rsquo;amor\u00e7age ou d&rsquo;interf\u00e9rence. Consigner ces observations dans un format large conduirait \u00e0 des architectures tabulaires ing\u00e9rables, comptant des centaines de colonnes redondantes pour chaque variation exp\u00e9rimentale, ce qui obscurcit la hi\u00e9rarchie intrins\u00e8que des facteurs.<\/p>\n<p>Le recours au format long permet d&rsquo;aborder avec une grande rigueur l&rsquo;estimation conjointe des trajectoires intra-individuelles (comment un sujet sp\u00e9cifique \u00e9volue-t-il au fil des essais) et de la variabilit\u00e9 inter-individuelle (comment les participants diff\u00e8rent-ils les uns des autres). Cette double \u00e9chelle de variabilit\u00e9 constitue le fondement m\u00eame de la mod\u00e9lisation hi\u00e9rarchique bay\u00e9sienne et des mod\u00e8les \u00e0 effets al\u00e9atoires. Le format long pr\u00e9serve la granularit\u00e9 fine de chaque essai sans exiger de compactage pr\u00e9alable artificiel, autorisant l&rsquo;inclusion de covariables dynamiques variant au cours de l&rsquo;exp\u00e9rience, telles que la fatigue mesur\u00e9e par le temps de r\u00e9action continu ou la d\u00e9rive de fixation oculaire.<\/p>\n<p>Enfin, la recherche empirique est continuellement confront\u00e9e au ph\u00e9nom\u00e8ne d&rsquo;attrition des donn\u00e9es, caract\u00e9ris\u00e9 par des abandons de participants ou des d\u00e9faillances de capteurs lors de sessions interm\u00e9diaires. Dans une matrice au format large, l&rsquo;absence d&rsquo;une mesure ponctuelle se traduit par l&rsquo;insertion de valeurs manquantes qui peuvent contraindre certains algorithmes \u00e0 supprimer purement et simplement la ligne enti\u00e8re de l&rsquo;entit\u00e9 concern\u00e9e. En revanche, le format long absorbe naturellement les d\u00e9s\u00e9quilibres structurels : l&rsquo;absence d&rsquo;une session se traduit simplement par l&rsquo;omission d&rsquo;une ligne sp\u00e9cifique, permettant aux estimateurs \u00e0 maximum de vraisemblance de conserver l&rsquo;ensemble de l&rsquo;information partielle disponible sans biais d&rsquo;exclusion syst\u00e9matique.<\/p>\n<h2>2. Principes th\u00e9oriques du d\u00e9pivotement (Unpivoting) avec Pandas<\/h2>\n<h3>2.1 M\u00e9canisme formel de la transformation de dimensionnalit\u00e9<\/h3>\n<p>L&rsquo;op\u00e9ration de d\u00e9pivotement, au sens math\u00e9matique et informatique, s&rsquo;analyse comme une projection inverse de l&rsquo;alg\u00e8bre relationnelle, transformant une partie de l&rsquo;espace des descripteurs de colonnes en un espace vectoriel de valeurs textuelles ou cat\u00e9gorielles associ\u00e9es \u00e0 un axe de lignes. Consid\u00e9rons une matrice initiale poss\u00e9dant un ensemble de dimensions d&rsquo;identification et un ensemble de dimensions de mesures. Le d\u00e9pivotement d\u00e9construit les en-t\u00eates des dimensions de mesures pour les r\u00e9affecter \u00e0 une nouvelle variable d&rsquo;indexation qualitative, tout en collectant les scalaires log\u00e9s \u00e0 l&rsquo;intersection des coordonn\u00e9es cart\u00e9siennes originelles pour les agencer dans un vecteur d&rsquo;observation unifi\u00e9.<\/p>\n<p>Ce basculement pr\u00e9serve scrupuleusement l&rsquo;int\u00e9grit\u00e9 relationnelle du jeu de donn\u00e9es par un proc\u00e9d\u00e9 de duplication contr\u00f4l\u00e9e. Les cl\u00e9s d&rsquo;identification caract\u00e9risant l&rsquo;entit\u00e9 statistique sont dupliqu\u00e9es autant de fois qu&rsquo;il existe de colonnes cibl\u00e9es pour la restructuration. Si une entit\u00e9 d\u00e9finie par un identifiant unique est associ\u00e9e \u00e0 quatre colonnes temporelles, la ligne originelle engendre une matrice interm\u00e9diaire de quatre lignes, chaque ligne h\u00e9ritant de la m\u00eame cl\u00e9 d&rsquo;identification invariante tout en recevant le nom d&rsquo;une des anciennes colonnes et sa valeur associ\u00e9e.<\/p>\n<p>Il s&rsquo;\u00e9tablit ainsi une cartographie bijective entre chaque doublet form\u00e9 par l&rsquo;indice de ligne initial et l&rsquo;en-t\u00eate de colonne s\u00e9lectionn\u00e9, d&rsquo;une part, et la cellule r\u00e9sultante dans le nouveau vecteur de mesures, d&rsquo;autre part. Aucune d\u00e9perdition d&rsquo;information n&rsquo;intervient lors de ce processus d\u00e9terministe ; la dimension de l&rsquo;espace est simplement redistribu\u00e9e. L&rsquo;entropie structurelle du tableau diminue au profit d&rsquo;une uniformisation s\u00e9mantique, convertissant une topologie matricielle h\u00e9t\u00e9rog\u00e8ne en une liste structur\u00e9e de tuples relationnels.<\/p>\n<h3>2.2 L&rsquo;\u00e9cosyst\u00e8me algorithmique de Pandas d\u00e9di\u00e9 au remodelage<\/h3>\n<p>Pour mat\u00e9rialiser cette transformation dimensionnelle, <a rel=\"noopener noreferrer\" href=\"https:\/\/pandas.pydata.org\/docs\/reference\/api\/pandas.melt.html\">Pandas<\/a> offre un \u00e9cosyst\u00e8me d&rsquo;op\u00e9rateurs aux fondements algorithmiques distincts mais compl\u00e9mentaires. La fonction de premier plan <em>pandas.melt()<\/em> repr\u00e9sente l&rsquo;outil le plus universel et le plus accessible, con\u00e7u explicitement pour aplatir des colonnes arbitraires en paires cl\u00e9-valeur avec une grande souplesse syntaxique. Parall\u00e8lement, la m\u00e9thode <em>DataFrame.stack()<\/em> s&rsquo;enracine dans la manipulation des index hi\u00e9rarchiques ou MultiIndex, d\u00e9pla\u00e7ant le niveau le plus profond des colonnes vers l&rsquo;index des lignes, ce qui implique une architecture de tableau orient\u00e9e vers l&rsquo;indexation matricielle formelle.<\/p>\n<p>Dans des configurations sp\u00e9cifiques o\u00f9 les libell\u00e9s de colonnes ob\u00e9issent \u00e0 une nomenclature norm\u00e9e \u2014 par exemple lorsqu&rsquo;ils combinent un pr\u00e9fixe conceptuel et un suffixe num\u00e9rique d\u00e9signant un temps de mesure \u2014, la fonction sp\u00e9cialis\u00e9e <em>pandas.wide_to_long()<\/em> apporte une r\u00e9ponse algorithmique vectoris\u00e9e particuli\u00e8rement efficiente. Contrairement \u00e0 <em>melt()<\/em>, qui n\u00e9cessite des manipulations de cha\u00eenes ult\u00e9rieures pour scinder les noms composites, <em>wide_to_long()<\/em> int\u00e8gre un analyseur lexical capable de s\u00e9parer directement les radicaux des identifiants d&rsquo;it\u00e9ration, produisant un DataFrame pr\u00eat pour l&rsquo;analyse sans \u00e9tapes interm\u00e9diaires de nettoyage.<\/p>\n<p>Ces diff\u00e9rentes strat\u00e9gies algorithmiques impliquent toutefois des compromis substantiels en mati\u00e8re de co\u00fbt computationnel et de gestion de la m\u00e9moire vive. Le passage au format long implique syst\u00e9matiquement une r\u00e9allocation de m\u00e9moire proportionnelle au produit du nombre initial de lignes par le nombre de colonnes d\u00e9pivot\u00e9es. L&rsquo;instanciation de nouveaux blocs de m\u00e9moire pour accueillir les colonnes d&rsquo;identifiants dupliqu\u00e9es et la cr\u00e9ation des nouveaux vecteurs de s\u00e9ries peuvent induire des copies d\u00e9fensives sous le capot, augmentant temporairement la pression sur le ramasse-miettes de Python lors du traitement de tr\u00e8s volumineuses tables de donn\u00e9es.<\/p>\n<h2>3. Anatomie d\u00e9taill\u00e9e de la fonction pd.melt()<\/h2>\n<h3>3.1 Examen de la signature de fonction et des param\u00e8tres obligatoires<\/h3>\n<p>La fonction <em>pandas.melt()<\/em> pr\u00e9sente une interface d\u00e9clarative pens\u00e9e pour concilier simplicit\u00e9 d&rsquo;usage et haute configurabilit\u00e9. Sa signature canonique se d\u00e9cline formellement comme suit : <code>pandas.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None, ignore_index=True)<\/code>. Dans cette d\u00e9claration, le premier argument <em>frame<\/em> constitue la cible obligatoire de l&rsquo;op\u00e9ration, attendant un objet instanci\u00e9 de type DataFrame. Il est \u00e0 noter que la m\u00e9thode est \u00e9galement accessible directement sous la forme orient\u00e9e objet <code>DataFrame.melt()<\/code>, auquel cas l&rsquo;argument <em>frame<\/em> est implicitement assign\u00e9 \u00e0 l&rsquo;instance courante via la variable d&rsquo;instance.<\/p>\n<p>Le comportement par d\u00e9faut de la fonction en l&rsquo;absence d&rsquo;arguments secondaires m\u00e9rite une attention particuli\u00e8re. Si un analyste applique l&rsquo;instruction <code>pd.melt(df)<\/code> sans sp\u00e9cifier ni <em>id_vars<\/em> ni <em>value_vars<\/em>, l&rsquo;algorithme consid\u00e8re l&rsquo;int\u00e9gralit\u00e9 des colonnes de la matrice source comme des dimensions de mesures \u00e0 d\u00e9pivoter. La structure r\u00e9sultante se r\u00e9duit alors \u00e0 un tableau strict \u00e0 deux colonnes : la premi\u00e8re, nomm\u00e9e arbitrairement <em>variable<\/em>, h\u00e9berge l&rsquo;ensemble des anciens en-t\u00eates, tandis que la seconde, nomm\u00e9e <em>value<\/em>, regroupe toutes les observations num\u00e9riques ou textuelles de la table, empil\u00e9es sur une longueur \u00e9quivalente au produit du nombre de lignes par le nombre de colonnes d&rsquo;origine.<\/p>\n<p>Cette configuration par d\u00e9faut, bien que rarement exploitable dans le cadre d&rsquo;\u00e9tudes empiriques n\u00e9cessitant la pr\u00e9servation d&rsquo;ancrages contextuels, illustre la logique r\u00e9ductrice pure de la fonction. Le typage des colonnes trait\u00e9es est rigoureusement scrut\u00e9 lors de cette \u00e9tape : si les diff\u00e9rentes colonnes cibl\u00e9es poss\u00e8dent des types de donn\u00e9es disparates, Pandas tente de trouver le type commun le plus proche selon les r\u00e8gles de coercition de NumPy, ce qui peut r\u00e9sulter en une conversion subreptice vers le type <em>object<\/em> g\u00e9n\u00e9rique, au d\u00e9triment de l&rsquo;optimisation m\u00e9moire et des performances de calcul.<\/p>\n<h3>3.2 Le r\u00f4le charni\u00e8re du param\u00e8tre id_vars<\/h3>\n<p>Le param\u00e8tre <em>id_vars<\/em> (abr\u00e9viation d&rsquo;<em>identifier variables<\/em>) constitue la cl\u00e9 de vo\u00fbte de l&rsquo;int\u00e9grit\u00e9 relationnelle lors du remodelage. Il attend un scalaire, un tuple ou, plus fr\u00e9quemment, une liste de cha\u00eenes de caract\u00e8res correspondant aux \u00e9tiquettes des colonnes qui doivent imp\u00e9rativement conserver leur statut de descripteurs invariants. Ces colonnes ne subissent aucune d\u00e9construction dimensionnelle ; elles sont maintenues le long de l&rsquo;axe vertical mais voient leurs valeurs dupliqu\u00e9es m\u00e9thodiquement pour accompagner chaque segment de mesure d\u00e9pivot\u00e9.<\/p>\n<p>L&rsquo;assignation des variables \u00e0 <em>id_vars<\/em> refl\u00e8te directement la structure de stratification du protocole exp\u00e9rimental. On y int\u00e8gre classiquement les identifiants uniques des sujets, les affectations aux groupes t\u00e9moins ou exp\u00e9rimentaux, les cohortes d\u00e9mographiques, ou toute autre m\u00e9tadonn\u00e9e stable qui ancre contextuellement l&rsquo;observation. La sp\u00e9cification judicieuse de ces variables assure que chaque ligne issue du processus de d\u00e9pivotement demeure parfaitement individualis\u00e9e et rattachable \u00e0 son origine causale, \u00e9liminant tout risque de confusion statistique ult\u00e9rieure.<\/p>\n<p>D&rsquo;un point de vue m\u00e9canique, l&rsquo;omission involontaire d&rsquo;une variable contextuelle au sein de <em>id_vars<\/em> entra\u00eene sa rel\u00e9gation automatique dans l&rsquo;ensemble des colonnes \u00e0 d\u00e9pivoter (si <em>value_vars<\/em> n&rsquo;est pas restreint), ce qui constitue l&rsquo;une des erreurs logiques les plus r\u00e9currentes lors de l&rsquo;apprentissage de Pandas. La vigilance s&rsquo;impose donc pour s&rsquo;assurer que toutes les covariables fixes d&rsquo;un mod\u00e8le d&rsquo;analyse soient explicitement list\u00e9es dans ce vecteur de contr\u00f4le, garantissant leur propagation fid\u00e8le le long des lignes du nouveau tableau \u00e9tendu.<\/p>\n<h3>3.3 Le ciblage des dimensions de mesure avec value_vars<\/h3>\n<p>Compl\u00e9ment direct de <em>id_vars<\/em>, le param\u00e8tre <em>value_vars<\/em> circonscrit pr\u00e9cis\u00e9ment le p\u00e9rim\u00e8tre des colonnes destin\u00e9es \u00e0 \u00eatre dissoutes et converties en paires d&rsquo;attributs et de mesures. Par d\u00e9faut, si ce param\u00e8tre demeure non sp\u00e9cifi\u00e9 (\u00e9gal \u00e0 <em>None<\/em>), l&rsquo;algorithme s\u00e9lectionne automatiquement l&rsquo;ensemble des colonnes du DataFrame qui n&rsquo;ont pas \u00e9t\u00e9 d\u00e9clar\u00e9es au sein du param\u00e8tre <em>id_vars<\/em>. Bien que commode, cette s\u00e9lection implicite peut introduire des comportements inattendus lors de l&rsquo;int\u00e9gration de colonnes parasites ou d&rsquo;indicateurs de calcul temporaires pr\u00e9sents dans la matrice source.<\/p>\n<p>La d\u00e9finition explicite d&rsquo;une liste de cha\u00eenes pour <em>value_vars<\/em> garantit une herm\u00e9ticit\u00e9 absolue du processus de restructuration. Toute colonne qui n&rsquo;appara\u00eet ni dans <em>id_vars<\/em> ni dans <em>value_vars<\/em> est purement et simplement \u00e9cart\u00e9e du DataFrame r\u00e9sultant. Ce filtrage s\u00e9lectif conf\u00e8re \u00e0 l&rsquo;op\u00e9rateur une double comp\u00e9tence au sein de la m\u00eame instruction : il proc\u00e8de simultan\u00e9ment au d\u00e9pivotement des dimensions pertinentes et \u00e0 l&rsquo;\u00e9lagage des variables superflues ou confidentielles, optimisant d&#8217;embl\u00e9e la compacit\u00e9 du tableau final sans n\u00e9cessiter d&rsquo;appel pr\u00e9alable \u00e0 la m\u00e9thode <em>DataFrame.drop()<\/em>.<\/p>\n<p>Dans les environnements industriels o\u00f9 les jeux de donn\u00e9es comportent des dizaines d&rsquo;indicateurs temporels dynamiques (par exemple des dates mensuelles sous forme de colonnes), la construction manuelle de la liste <em>value_vars<\/em> devient fastidieuse et sujette aux erreurs de syntaxe. On privil\u00e9gie alors une approche programmatique et dynamique, exploitant les compr\u00e9hensions de listes en Python ou des filtres lexicaux fond\u00e9s sur les expressions r\u00e9guli\u00e8res appliqu\u00e9es \u00e0 l&rsquo;objet <code>DataFrame.columns<\/code>. Cette souplesse d&rsquo;assignation conf\u00e8re \u00e0 la m\u00e9thode un niveau d&rsquo;automatisation \u00e9lev\u00e9 au sein des pipelines d&rsquo;ingestion continue de donn\u00e9es.<\/p>\n<h2>4. Mise en \u0153uvre pratique \u00e9l\u00e9mentaire de pd.melt()<\/h2>\n<h3>4.1 Construction d&rsquo;un jeu de donn\u00e9es synth\u00e9tique repr\u00e9sentatif<\/h3>\n<p>Afin de concr\u00e9tiser les principes th\u00e9oriques expos\u00e9s, consid\u00e9rons un cas d&rsquo;usage classique en psychologie exp\u00e9rimentale o\u00f9 l&rsquo;on \u00e9value l&rsquo;efficacit\u00e9 d&rsquo;un protocole d&rsquo;entra\u00eenement cognitif sur la flexibilit\u00e9 mentale. Imaginons un \u00e9chantillon compos\u00e9 de participants identifi\u00e9s individuellement, caract\u00e9ris\u00e9s par leur groupe d&rsquo;appartenance (Contr\u00f4le vs Exp\u00e9rimental) et \u00e9valu\u00e9s \u00e0 travers un score psychom\u00e9trique standardis\u00e9 administr\u00e9 \u00e0 trois intervalles r\u00e9guliers : avant l&rsquo;intervention (Pr\u00e9-test), imm\u00e9diatement apr\u00e8s (Post-test), et lors d&rsquo;une session de suivi \u00e0 trois mois (Suivi).<\/p>\n<p>Sur le plan structurel, le tableau de donn\u00e9es initial se pr\u00e9sente sous la forme d&rsquo;un DataFrame de six lignes et cinq colonnes. Les deux premi\u00e8res colonnes repr\u00e9sentent respectivement l&rsquo;identifiant du sujet (par exemple <code>Sujet_01<\/code>, <code>Sujet_02<\/code>) et le groupe factoriel inter-sujets (<code>Contr\u00f4le<\/code>, <code>Actif<\/code>). Les trois colonnes subs\u00e9quentes mat\u00e9rialisent les scores continus obtenus aux trois moments de mesure : <code>Score_T1<\/code>, <code>Score_T2<\/code> et <code>Score_T3<\/code>. Dans cette disposition large, chaque individu n&rsquo;occupe qu&rsquo;une ligne unique, et les variations intra-individuelles s&rsquo;\u00e9talent sur le plan horizontal.<\/p>\n<p>L&rsquo;inspection analytique de cette matrice r\u00e9v\u00e8le une contrainte majeure pour les progiciels d&rsquo;analyse inf\u00e9rentielle : les mesures quantitatives d&rsquo;une m\u00eame m\u00e9trique sont morcel\u00e9es sur trois vecteurs disjoints. D\u00e8s lors, l&rsquo;application directe d&rsquo;un mod\u00e8le lin\u00e9aire g\u00e9n\u00e9ralis\u00e9 avec des progiciels comme <a rel=\"noopener noreferrer\" href=\"https:\/\/www.statsmodels.org\/\">Statsmodels<\/a> n\u00e9cessiterait une \u00e9criture complexe de contrastes multivari\u00e9s. La conversion au format long s&rsquo;impose comme un pr\u00e9requis incontournable pour unifier ces mesures sous l&rsquo;\u00e9gide d&rsquo;un facteur intra-sujet temporel explicite.<\/p>\n<h3>4.2 Application s\u00e9quentielle du remodelage par code<\/h3>\n<p>L&rsquo;op\u00e9ration de d\u00e9pivotement est ex\u00e9cut\u00e9e en faisant appel \u00e0 la fonction <em>pandas.melt()<\/em> en lui transmettant le DataFrame source, en assignant les colonnes d&rsquo;ancrage aux <em>id_vars<\/em>, et en ciblant les trois sessions temporelles dans <em>value_vars<\/em>. L&rsquo;instruction s&rsquo;articule de mani\u00e8re limpide : la liste contenant les en-t\u00eates d&rsquo;identifiants et de groupes est fournie au param\u00e8tre de fixation, tandis que la collection des trois labels de score est transmise au s\u00e9lecteur de variables d\u00e9pendantes.<\/p>\n<p>D\u00e8s l&rsquo;ex\u00e9cution de l&rsquo;instruction, le moteur de calcul de Pandas d\u00e9ploie sa routine de transformation. La table r\u00e9sultante voit sa dimension verticale cro\u00eetre instantan\u00e9ment. Les six sujets originaux, observ\u00e9s chacun \u00e0 trois reprises, g\u00e9n\u00e8rent d\u00e9sormais un ensemble compact de dix-huit lignes distinctes. Les identifiants et les indicateurs de groupes sont r\u00e9p\u00e9t\u00e9s fid\u00e8lement par blocs ordonn\u00e9s. Les anciens noms de colonnes (<code>Score_T1<\/code>, <code>Score_T2<\/code>, <code>Score_T3<\/code>) peuplent la colonne nouvellement cr\u00e9\u00e9e intitul\u00e9e <em>variable<\/em>, tandis que les valeurs num\u00e9riques associ\u00e9es sont align\u00e9es en parfaite contigu\u00eft\u00e9 dans la colonne <em>value<\/em>.<\/p>\n<p>Cette ex\u00e9cution met en \u00e9vidence la conservation absolue de la masse de donn\u00e9es scalaires : aucune observation n&rsquo;a \u00e9t\u00e9 alt\u00e9r\u00e9e, agr\u00e9g\u00e9e ou tronqu\u00e9e. Les dix-huit valeurs num\u00e9riques qui composaient la sous-matrice de scores initiale sont transf\u00e9r\u00e9es avec une exactitude arithm\u00e9tique rigoureuse dans un unique vecteur continu. L&rsquo;index de ligne par d\u00e9faut est r\u00e9initialis\u00e9 sous forme d&rsquo;une s\u00e9quence lin\u00e9aire de z\u00e9ro \u00e0 dix-sept gr\u00e2ce \u00e0 l&rsquo;argument implicite <code>ignore_index=True<\/code>, fournissant une table propre pr\u00eate \u00e0 subir des transformations analytiques plus pouss\u00e9es.<\/p>\n<h3>4.3 Analyse comparative avant\/apr\u00e8s restructuration<\/h3>\n<p>L&rsquo;analyse rigoureuse des propri\u00e9t\u00e9s dimensionnelles confirme l&rsquo;ad\u00e9quation formelle de l&rsquo;op\u00e9ration. L&rsquo;\u00e9quation de conservation dimensionnelle v\u00e9rifie que le nombre de lignes finales est rigoureusement \u00e9gal au produit du nombre initial d&rsquo;enregistrements par le nombre de variables de mesures s\u00e9lectionn\u00e9es :<\/p>\n<p style=\"text-align: center; font-weight: bold; margin: 20px 0;\">N_lignes_finales = N_lignes_initiales \u00d7 Cardinalit\u00e9(value_vars)<\/p>\n<p>Dans notre cas d&rsquo;application, le calcul arithm\u00e9tique <code>6 \u00d7 3 = 18<\/code> confirme la conformit\u00e9 dimensionnelle absolue de l&rsquo;op\u00e9ration. En revanche, le nombre de colonnes subit une r\u00e9duction structurelle drastique. La matrice passe de cinq colonnes \u00e0 seulement quatre dimensions : les deux variables invariantes d&rsquo;ancrage, la colonne d&rsquo;assignation temporelle et le vecteur unique de valeurs num\u00e9riques. Si le jeu de donn\u00e9es initial comportait vingt moments de mesure au lieu de trois, le nombre de colonnes finales demeurerait invariable \u00e0 quatre, attestant de la scalabilit\u00e9 morphologique du format long.<\/p>\n<p>Un contr\u00f4le de conformit\u00e9 crois\u00e9 entre les deux repr\u00e9sentations valide l&rsquo;int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle des donn\u00e9es. En isolant un sujet donn\u00e9 dans le format long et en observant ses trois lignes cons\u00e9cutives, on retrouve exactement la suite ordonn\u00e9e des scores qui figuraient horizontalement dans son enregistrement d&rsquo;origine. Cette invariance fondamentale prouve que l&rsquo;op\u00e9ration n&rsquo;alt\u00e8re en rien l&rsquo;information sous-jacente, mais modifie uniquement sa distribution g\u00e9om\u00e9trique au sein du plan relationnel.<\/p>\n<h2>5. Personnalisation avanc\u00e9e de la nomenclature des variables g\u00e9n\u00e9r\u00e9es<\/h2>\n<h3>5.1 Standardisation s\u00e9mantique via var_name<\/h3>\n<p>Par d\u00e9faut, l&rsquo;application de <em>pandas.melt()<\/em> attribue l&rsquo;\u00e9tiquette g\u00e9n\u00e9rique et impersonnelle <em>variable<\/em> \u00e0 la colonne mat\u00e9rialisant les anciens en-t\u00eates de colonnes. Dans le cadre d&rsquo;un d\u00e9veloppement logiciel rigoureux ou de l&rsquo;\u00e9laboration de scripts de recherche reproductibles, l&rsquo;utilisation de tels libell\u00e9s par d\u00e9faut est vivement d\u00e9conseill\u00e9e car elle nuit \u00e0 la lisibilit\u00e9 conceptuelle du code et peut introduire des ambigu\u00eft\u00e9s s\u00e9mantiques lors d&rsquo;op\u00e9rations d&rsquo;agr\u00e9gation ou de fusion ult\u00e9rieures.<\/p>\n<p>L&rsquo;argument explicite <em>var_name<\/em> permet de rem\u00e9dier imm\u00e9diatement \u00e0 cette lacune en imposant une cha\u00eene de caract\u00e8res s\u00e9mantiquement univoque au nouveau descripteur de regroupement. Dans notre sc\u00e9nario d&rsquo;\u00e9valuation longitudinale, d\u00e9finir <code>var_name='Session'<\/code> ou <code>var_name='Temps_Mesure'<\/code> explicite imm\u00e9diatement la nature de la variable factorielle repr\u00e9sent\u00e9e. Cette pr\u00e9cision clarifie la signification m\u00e9thodologique du tableau pour tout collaborateur amen\u00e9 \u00e0 r\u00e9utiliser le script d&rsquo;analyse ou \u00e0 interpr\u00e9ter les visualisations qui en d\u00e9coulent.<\/p>\n<p>Sur le plan de l&rsquo;ing\u00e9nierie logicielle, l&rsquo;adoption pr\u00e9coce d&rsquo;une nomenclature explicite pr\u00e9vient les erreurs de r\u00e9gression lors des maintenances \u00e9volutives du code source. Les s\u00e9lections de colonnes, les filtres bool\u00e9ens et les groupements par la m\u00e9thode <em>groupby()<\/em> reposent sur des noms de champs signifiants, \u00e9vitant ainsi les confusions courantes qui surviennent lorsque plusieurs \u00e9tapes de remodelage successives g\u00e9n\u00e8rent accidentellement plusieurs colonnes anonymes intitul\u00e9es <em>variable<\/em>.<\/p>\n<h3>5.2 Pr\u00e9cision m\u00e9trologique via value_name<\/h3>\n<p>De fa\u00e7on strictement sym\u00e9trique au traitement de l&rsquo;\u00e9tiquette de variable, la colonne h\u00e9bergeant les valeurs quantitatives d\u00e9pivot\u00e9es re\u00e7oit par d\u00e9faut l&rsquo;en-t\u00eate st\u00e9r\u00e9otyp\u00e9 <em>value<\/em>. Cette d\u00e9nomination s&rsquo;av\u00e8re particuli\u00e8rement lacunaire sur le plan scientifique, car elle n&rsquo;informe ni sur la nature du construit psychologique ou physique mesur\u00e9, ni sur l&rsquo;\u00e9chelle m\u00e9trologique employ\u00e9e. L&rsquo;analyste se trouve contraint de consulter une documentation externe pour identifier la grandeur r\u00e9elle port\u00e9e par ce vecteur num\u00e9rique.<\/p>\n<p>Le param\u00e8tre <em>value_name<\/em> offre l&rsquo;opportunit\u00e9 de documenter la mesure avec exactitude d\u00e8s l&rsquo;op\u00e9ration de restructuration. En sp\u00e9cifiant par exemple <code>value_name='Score_Flexibilite_Points'<\/code> ou <code>value_name='Temps_Reaction_Millisecondes'<\/code>, on scelle l&rsquo;unit\u00e9 de mesure et l&rsquo;objet de l&rsquo;\u00e9valuation au sein m\u00eame de la m\u00e9tadonn\u00e9e du tableau. Cette pratique limite substantiellement le risque d&rsquo;erreurs d&rsquo;interpr\u00e9tation lors de calculs de ratios, de normalisations de scores ou de transformations logarithmiques en aval.<\/p>\n<p>En outre, l&rsquo;assignation d&rsquo;un <em>value_name<\/em> sp\u00e9cifique prend toute son importance m\u00e9thodologique dans les architectures de donn\u00e9es relationnelles complexes impliquant des op\u00e9rations de jointure ou d&#8217;empilement vertical de plusieurs \u00e9tudes. Lorsque deux tables remodel\u00e9es ind\u00e9pendamment doivent \u00eatre fusionn\u00e9es sur leurs cl\u00e9s factorielles, la diff\u00e9renciation de leurs colonnes de valeurs pr\u00e9vient les collisions de noms de colonnes et la g\u00e9n\u00e9ration ind\u00e9sirable de suffixes de d\u00e9sambigu\u00efsation (tels que <code>value_x<\/code> et <code>value_y<\/code>) qui compliquent l&rsquo;\u00e9criture des scripts de mod\u00e9lisation.<\/p>\n<h3>5.3 Homog\u00e9n\u00e9isation automatique des cha\u00eenes de caract\u00e8res<\/h3>\n<p>L&rsquo;un des corollaires du passage au format long est que les \u00e9tiquettes textuelles qui formaient initialement les noms de colonnes se retrouvent transform\u00e9es en valeurs scalaires r\u00e9p\u00e9t\u00e9es dans la colonne d\u00e9sign\u00e9e par <em>var_name<\/em>. Fr\u00e9quemment, ces libell\u00e9s d&rsquo;origine contiennent des artefacts de saisie, des pr\u00e9fixes redondants ou des s\u00e9parateurs techniques (par exemple <code>Score_T1<\/code>, <code>Score_T2<\/code>, <code>Score_T3<\/code>) qui ne sont pas optimaux pour servir de niveaux factoriels propres dans une analyse statistique.<\/p>\n<p>L&rsquo;utilisation des accesseurs vectoris\u00e9s de cha\u00eenes de caract\u00e8res de Pandas, accessibles via la syntaxe <em>.str<\/em>, permet de proc\u00e9der \u00e0 une normalisation lexicale imm\u00e9diate et hautement performante sur cette nouvelle colonne. L&rsquo;application de m\u00e9thodes telles que <code>.str.replace('Score_', '')<\/code> ou <code>.str.extract(r'(d+)')<\/code> permet d&rsquo;extraire directement la composante num\u00e9rique signifiante pour convertir une modalit\u00e9 textuelle brute en un indice d&rsquo;it\u00e9ration ordinal rigoureux, imm\u00e9diatement castable en type entier.<\/p>\n<p>Enfin, dans une optique d&rsquo;optimisation structurelle, il est fortement recommand\u00e9 de convertir sans d\u00e9lai cette colonne de descripteurs textuels normalis\u00e9s vers le type de donn\u00e9es cat\u00e9goriel de Pandas gr\u00e2ce \u00e0 l&rsquo;instruction <code>.astype('category')<\/code>. D\u00e8s lors que les m\u00eames cha\u00eenes de caract\u00e8res se r\u00e9p\u00e8tent sur des centaines ou des milliers de lignes, le recours aux variables cat\u00e9gorielles r\u00e9duit drastiquement la consommation de m\u00e9moire vive en substituant un tableau d&rsquo;entiers compacts coupl\u00e9 \u00e0 une table de hachage lexicale aux instanciations redondantes d&rsquo;objets cha\u00eenes de caract\u00e8res standards de Python.<\/p>\n<h2>6. Remodelage complexe avec identifiants composites multiples<\/h2>\n<h3>6.1 Gestion de structures hi\u00e9rarchiques et embo\u00eet\u00e9es<\/h3>\n<p>Dans la recherche observationnelle avanc\u00e9e et les essais cliniques multicentriques, les unit\u00e9s exp\u00e9rimentales s&rsquo;ins\u00e8rent fr\u00e9quemment dans des architectures hi\u00e9rarchiques complexes ou des plans factoriels embo\u00eet\u00e9s. Une \u00e9tude en neuro-imagerie peut ainsi suivre des individus distribu\u00e9s \u00e0 travers plusieurs centres hospitaliers, stratifi\u00e9s par cohortes d&rsquo;\u00e2ge, g\u00e9notypes sp\u00e9cifiques et r\u00e9gimes th\u00e9rapeutiques. Dans de telles configurations, une observation ne peut \u00eatre contextualis\u00e9e de mani\u00e8re univoque par un unique identifiant de sujet, mais n\u00e9cessite un ensemble coh\u00e9rent d&rsquo;identifiants composites.<\/p>\n<p>La fonction <em>pandas.melt()<\/em> r\u00e9pond avec une grande \u00e9l\u00e9gance \u00e0 ces exigences de complexit\u00e9 relationnelle gr\u00e2ce \u00e0 la capacit\u00e9 de son param\u00e8tre <em>id_vars<\/em> \u00e0 ing\u00e9rer une collection \u00e9tendue d&rsquo;attributs invariables. En d\u00e9clarant une liste exhaustive de variables de stratification, telle que <code>id_vars=['Hopital_ID', 'Cohorte', 'Patient_ID', 'Genotype', 'Traitement']<\/code>, l&rsquo;op\u00e9rateur garantit que l&rsquo;int\u00e9gralit\u00e9 du r\u00e9seau de d\u00e9pendances factorielles inter-sujets est fid\u00e8lement pr\u00e9serv\u00e9e et dupliqu\u00e9e de concert lors de l&rsquo;expansion verticale du tableau.<\/p>\n<p>Cette approche \u00e9limine tout risque de rupture de cardinalit\u00e9 conceptuelle. Chaque point d&rsquo;observation g\u00e9n\u00e9r\u00e9 dans le format long demeure ancr\u00e9 dans sa matrice causale compl\u00e8te. Cela permet ult\u00e9rieurement d&rsquo;impl\u00e9menter des mod\u00e8les de r\u00e9gression multiniveaux int\u00e9grant des effets al\u00e9atoires crois\u00e9s ou embo\u00eet\u00e9s sans aucune \u00e9tape pr\u00e9alable de r\u00e9conciliation de donn\u00e9es, les relations de d\u00e9pendance statistique entre les diff\u00e9rents niveaux hi\u00e9rarchiques \u00e9tant rigoureusement respect\u00e9es \u00e0 l&rsquo;\u00e9chelle de chaque ligne individuelle.<\/p>\n<h3>6.2 Traitement de variables d\u00e9pendantes h\u00e9t\u00e9rog\u00e8nes<\/h3>\n<p>Un d\u00e9fi r\u00e9current lors de la manipulation de matrices larges issues d&rsquo;environnements exp\u00e9rimentaux r\u00e9side dans la coexistence de variables d\u00e9pendantes de natures fondamentalement h\u00e9t\u00e9rog\u00e8nes. Un protocole peut enregistrer simultan\u00e9ment, pour chaque session temporelle, une m\u00e9trique continue (comme le temps de r\u00e9action mesur\u00e9 en millisecondes), un score ordinal (comme une auto-\u00e9valuation sur une \u00e9chelle de Likert de 1 \u00e0 7) et une variable binaire (comme la r\u00e9ussite ou l&rsquo;\u00e9chec \u00e0 l&rsquo;\u00e9preuve). L&rsquo;application na\u00efve et globale d&rsquo;un unique appel \u00e0 <em>pd.melt()<\/em> sur l&rsquo;ensemble de ces colonnes m\u00e9lang\u00e9es engendre une coercition de type destructrice.<\/p>\n<p>En effet, pour loger dans une m\u00eame colonne r\u00e9sultante des entiers, des nombres \u00e0 virgule flottante et des variables cat\u00e9gorielles, Pandas se trouve contraint de r\u00e9trograder le type de donn\u00e9es de la colonne <em>value<\/em> vers le type le plus permissif mais le moins efficient : le type <em>object<\/em> de Python. Cette alt\u00e9ration computationnelle d\u00e9sactive l&rsquo;acc\u00e8s aux routines math\u00e9matiques vectoris\u00e9es hautement optimis\u00e9es bas\u00e9es sur le langage C, augmente drastiquement l&#8217;empreinte m\u00e9moire et emp\u00eache l&rsquo;exploitation directe des modules statistiques standards.<\/p>\n<p>Pour contourner cet \u00e9cueil architectural, la strat\u00e9gie m\u00e9thodologique recommand\u00e9e consiste \u00e0 scinder le probl\u00e8me en plusieurs op\u00e9rations de remodelage distinctes et cibl\u00e9es, ou \u00e0 faire usage d&rsquo;op\u00e9rations d&rsquo;alignement avanc\u00e9es. On ex\u00e9cute des appels ind\u00e9pendants \u00e0 <em>pd.melt()<\/em> pour chaque famille homog\u00e8ne de mesures d\u00e9pendantes, en pr\u00e9servant syst\u00e9matiquement le m\u00eame ensemble d&rsquo;identifiants composites dans <em>id_vars<\/em>. Par la suite, les diff\u00e9rents DataFrames longs obtenus sont fusionn\u00e9s horizontalement via l&rsquo;op\u00e9rateur <em>pandas.merge()<\/em> en utilisant les identifiants et la variable de session comme cl\u00e9s de jointure composite. Cette m\u00e9thode garantit que le format long final h\u00e9berge plusieurs colonnes de valeurs distinctes mais align\u00e9es, chacune conservant son typage primitif optimal (<em>float32<\/em>, <em>int8<\/em>, etc.).<\/p>\n<h2>7. Restructuration avanc\u00e9e avec la fonction pandas.wide_to_long()<\/h2>\n<h3>7.1 Sp\u00e9cificit\u00e9s et syntaxe de wide_to_long()<\/h3>\n<p>Bien que la fonction <em>pd.melt()<\/em> excelle par sa flexibilit\u00e9 globale, elle impose des \u00e9tapes it\u00e9ratives de nettoyage textuel d\u00e8s lors que les donn\u00e9es matricielles encodent simultan\u00e9ment plusieurs variables d\u00e9pendantes mesur\u00e9es \u00e0 intervalles r\u00e9guliers. Pour r\u00e9pondre sp\u00e9cifiquement \u00e0 cette probl\u00e9matique sans n\u00e9cessiter de boucles de traitement complexes, l&rsquo;\u00e9cosyst\u00e8me Pandas propose une fonction hautement sp\u00e9cialis\u00e9e et vectoris\u00e9e : <a rel=\"noopener noreferrer\" href=\"https:\/\/pandas.pydata.org\/docs\/reference\/api\/pandas.wide_to_long.html\">pandas.wide_to_long()<\/a>. Cette routine est express\u00e9ment con\u00e7ue pour d\u00e9pivoter des colonnes dont les noms respectent un motif morphologique strict combinant un pr\u00e9fixe conceptuel et un index temporel ou conditionnel.<\/p>\n<p>La signature de <em>wide_to_long()<\/em> se distingue radicalement de celle de <em>melt()<\/em> par ses param\u00e8tres fondamentaux : <code>pandas.wide_to_long(df, stubnames, i, j, sep='', suffix='\\d+')<\/code>. Dans cette structure d\u00e9clarative :<\/p>\n<ul>\n<li>Le param\u00e8tre <strong>stubnames<\/strong> d\u00e9signe le ou les radicaux pr\u00e9fixes des colonnes de mesures \u00e0 restructurer, c&rsquo;est-\u00e0-dire la part invariante du nom de la variable d\u00e9pendante.<\/li>\n<li>L&rsquo;argument <strong>i<\/strong> sp\u00e9cifie la ou les colonnes d&rsquo;identification uniques servant de cl\u00e9s primaires d&rsquo;ancrage relationnel pour les entit\u00e9s observ\u00e9es.<\/li>\n<li>L&rsquo;argument <strong>j<\/strong> baptise la nouvelle colonne qui sera g\u00e9n\u00e9r\u00e9e pour h\u00e9berger les indices d&rsquo;it\u00e9ration extraits des suffixes des noms de colonnes originels.<\/li>\n<li>Le param\u00e8tre <strong>sep<\/strong> stipule le d\u00e9limiteur textuel \u00e9ventuel s\u00e9parant le radical lexical de son suffixe num\u00e9rique.<\/li>\n<li>Le param\u00e8tre <strong>suffix<\/strong> d\u00e9finit l&rsquo;expression r\u00e9guli\u00e8re permettant d&rsquo;isoler la structure morphologique du discriminant it\u00e9ratif.<\/li>\n<\/ul>\n<p>L&rsquo;analyseur syntaxique interne de cette m\u00e9thode d\u00e9compose automatiquement les en-t\u00eates de colonnes du format large. En identifiant les motifs correspondants, il projette simultan\u00e9ment le suffixe d&rsquo;indexation le long de l&rsquo;axe vertical tout en maintenant les diff\u00e9rentes mesures d\u00e9pendantes dans des colonnes horizontales s\u00e9par\u00e9es, accomplissant en une seule instruction une transformation structurelle qui exigerait autrement une longue cha\u00eene de manipulations combinant <em>melt<\/em>, extraction d&rsquo;expressions r\u00e9guli\u00e8res et repivotements partiels.<\/p>\n<h3>7.2 Cas d&rsquo;usage : Plusieurs s\u00e9ries de mesures r\u00e9p\u00e9t\u00e9es simultan\u00e9es<\/h3>\n<p>Consid\u00e9rons une situation d&rsquo;exp\u00e9rimentation clinique o\u00f9 deux m\u00e9triques distinctes sont mesur\u00e9es en parall\u00e8le sur les m\u00eames sujets \u00e0 travers quatre sessions successives (num\u00e9rot\u00e9es de 1 \u00e0 4) : le rythme cardiaque moyen d&rsquo;une part, consign\u00e9 sous les colonnes <code>Pouls_1<\/code>, <code>Pouls_2<\/code>, <code>Pouls_3<\/code>, <code>Pouls_4<\/code>, et le niveau d&rsquo;anxi\u00e9t\u00e9 auto-rapport\u00e9 d&rsquo;autre part, consign\u00e9 sous les colonnes <code>Anxiete_1<\/code>, <code>Anxiete_2<\/code>, <code>Anxiete_3<\/code>, <code>Anxiete_4<\/code>. La matrice source comporte ainsi huit colonnes de mesures longitudinales en sus des identifiants des participants.<\/p>\n<p>Le traitement d&rsquo;une telle structure via <em>pd.melt()<\/em> n\u00e9cessiterait soit d&rsquo;aplatir les huit colonnes dans un unique vecteur hybride \u2014 m\u00e9langeant des battements par minute et des scores psychologiques arbitraires \u2014, soit de proc\u00e9der \u00e0 deux op\u00e9rations de d\u00e9pivotement successives suivies d&rsquo;une jointure relationnelle. L&rsquo;appel \u00e0 <em>wide_to_long()<\/em> r\u00e9sout cette complexit\u00e9 avec une concision et une clart\u00e9 remarquables. En d\u00e9clarant <code>stubnames=['Pouls_', 'Anxiete_']<\/code>, <code>i='Sujet_ID'<\/code> et <code>j='Temps'<\/code>, l&rsquo;algorithme r\u00e9organise la table de fa\u00e7on cibl\u00e9e.<\/p>\n<p>Le DataFrame produit par cette ex\u00e9cution pr\u00e9sente une \u00e9l\u00e9gance morphologique optimale pour l&rsquo;investigation statistique. Les colonnes <code>Pouls_<\/code> et <code>Anxiete_<\/code> demeurent distinctes et parall\u00e8les, conservant chacune leur int\u00e9grit\u00e9 s\u00e9mantique et leur typage num\u00e9rique d&rsquo;origine, tandis que la nouvelle variable <code>Temps<\/code> indexe rigoureusement les sessions de 1 \u00e0 4 pour chaque sujet. L&rsquo;ensemble est coiff\u00e9 par un MultiIndex compos\u00e9 des identifiants de sujets et des pas temporels, pr\u00eat \u00e0 \u00eatre exploit\u00e9 directement par les mod\u00e8les de panel multivari\u00e9s.<\/p>\n<h3>7.3 Comparaison fonctionnelle entre pd.melt() et pd.wide_to_long()<\/h3>\n<p>Le choix entre <em>pd.melt()<\/em> et <em>pd.wide_to_long()<\/em> doit \u00eatre guid\u00e9 par une \u00e9valuation heuristique pr\u00e9cise de la morphologie du tableau source et des objectifs analytiques poursuivis. La fonction <em>wide_to_long()<\/em> s&rsquo;av\u00e8re sans rivale en mati\u00e8re d&rsquo;\u00e9l\u00e9gance et de rapidit\u00e9 d&rsquo;ex\u00e9cution lorsque le jeu de donn\u00e9es pr\u00e9sente une r\u00e9gularit\u00e9 stricte de nommage et que plusieurs s\u00e9ries temporelles parall\u00e8les doivent coexister dans la structure finale sans fusionner leurs m\u00e9triques au sein d&rsquo;un vecteur g\u00e9n\u00e9rique.<\/p>\n<p>Cependant, cette rigueur syntaxique constitue \u00e9galement la principale limite de <em>wide_to_long()<\/em>. Si la nomenclature des colonnes initiales est asym\u00e9trique, d\u00e9pourvue de pr\u00e9fixes unifi\u00e9s, ou int\u00e8gre des libell\u00e9s h\u00e9t\u00e9rog\u00e8nes (par exemple le m\u00e9lange arbitraire de <code>Baseline<\/code>, <code>MidTerm_Score<\/code> et <code>Final_Eval_3<\/code>), l&rsquo;analyseur interne par motif r\u00e9gulier \u00e9chouera \u00e0 cat\u00e9goriser correctement les variables sans un renommage pr\u00e9alable fastidieux de l&rsquo;ensemble des en-t\u00eates de colonnes. D\u00e8s lors que les motifs ne sont pas uniformes, la souplesse de <em>pd.melt()<\/em> redevient largement pr\u00e9pond\u00e9rante.<\/p>\n<p>La fonction <em>pd.melt()<\/em> demeure l&rsquo;outil polyvalent par excellence pour les op\u00e9rations de d\u00e9pivotement g\u00e9n\u00e9riques, le traitement de colonnes cat\u00e9gorielles polymorphes ou les cas o\u00f9 l&rsquo;ensemble des mesures d\u00e9pendantes gagne conceptuellement \u00e0 \u00eatre r\u00e9uni sous un vecteur unique avant des visualisations graphiques facett\u00e9es. Le tableau suivant synth\u00e9tise les crit\u00e8res de d\u00e9cision pour l&rsquo;ing\u00e9nieur de donn\u00e9es et le chercheur :<\/p>\n<ul>\n<li><strong>Structure de donn\u00e9es hautement standardis\u00e9e, plusieurs variables d\u00e9pendantes continues :<\/strong> Privil\u00e9gier syst\u00e9matiquement <em>pandas.wide_to_long()<\/em> pour \u00e9viter la r\u00e9trogradation de types et les jointures manuelles.<\/li>\n<li><strong>Nomenclature asym\u00e9trique, variable d\u00e9pendante unique, colonnes h\u00e9t\u00e9roclites :<\/strong> Privil\u00e9gier <em>pandas.melt()<\/em> pour sa plasticit\u00e9 et son contr\u00f4le direct via <em>id_vars<\/em> et <em>value_vars<\/em>.<\/li>\n<li><strong>Exigence d&rsquo;indexation hi\u00e9rarchique imm\u00e9diate :<\/strong> <em>wide_to_long()<\/em> int\u00e8gre nativement les variables d&rsquo;ancrage et de temps dans l&rsquo;index, facilitant les d\u00e9coupages matriciels ult\u00e9rieurs sans appel suppl\u00e9mentaire \u00e0 <em>set_index()<\/em>.<\/li>\n<\/ul>\n<h2>8. L&rsquo;alternative structurelle : Utilisation de DataFrame.stack() et des MultiIndex<\/h2>\n<h3>8.1 M\u00e9canique d&#8217;empilement par l&rsquo;indexation multiniveau<\/h3>\n<p>Au-del\u00e0 des fonctions de premier niveau que sont <em>melt()<\/em> et <em>wide_to_long()<\/em>, l&rsquo;architecture fondamentale de Pandas int\u00e8gre une m\u00e9thode intrins\u00e8quement li\u00e9e \u00e0 son mod\u00e8le de donn\u00e9es matriciel matric\u00e9 par indexation hi\u00e9rarchique : la m\u00e9thode <a rel=\"noopener noreferrer\" href=\"https:\/\/pandas.pydata.org\/docs\/reference\/api\/pandas.DataFrame.stack.html\">DataFrame.stack()<\/a>. Cette op\u00e9ration aborde la restructuration du format large vers le format long non pas comme un d\u00e9pivotement de colonnes isol\u00e9es, mais comme une compression dimensionnelle d&rsquo;un axe d&rsquo;indexation vers un autre, pivotant le niveau le plus profond de l&rsquo;index des colonnes vers l&rsquo;index des lignes.<\/p>\n<p>Pour exploiter pleinement la puissance de <em>stack()<\/em>, la matrice de donn\u00e9es doit pr\u00e9alablement adopter une architecture \u00e0 index hi\u00e9rarchique (MultiIndex) sur ses colonnes ou pr\u00e9parer ses axes de lignes par l&rsquo;instruction <em>set_index()<\/em>. Lorsque l&rsquo;analyste isole l&rsquo;ensemble des variables d&rsquo;ancrage invariant dans l&rsquo;index des lignes, la matrice ne pr\u00e9sente plus sur son axe horizontal que les colonnes de mesures pures. D\u00e8s cet instant, l&rsquo;ex\u00e9cution de l&rsquo;instruction <code>df.stack()<\/code> provoque l&rsquo;effondrement vertical de l&rsquo;axe des colonnes, transformant un DataFrame bidimensionnel en un objet Series hautement structur\u00e9 dot\u00e9 d&rsquo;un MultiIndex de lignes \u00e0 plusieurs niveaux.<\/p>\n<p>Ce m\u00e9canisme repose sur une alg\u00e8bre d&rsquo;index particuli\u00e8rement rigoureuse. L&rsquo;ordre des dimensions dans le r\u00e9sultat est strictement d\u00e9terministe et d\u00e9pend de la hi\u00e9rarchie des niveaux de colonnes originaux. L&rsquo;avantage conceptuel de cette m\u00e9thode r\u00e9side dans son ad\u00e9quation totale avec les op\u00e9rations de mod\u00e9lisation math\u00e9matique matricielle, l&rsquo;acc\u00e8s aux donn\u00e9es empil\u00e9es demeurant optimis\u00e9 par les routines de recherche binaire sous-jacentes aux structures MultiIndex de Pandas, ce qui permet des s\u00e9lections par tranches particuli\u00e8rement performantes.<\/p>\n<h3>8.2 Transition du r\u00e9sultat empil\u00e9 vers une structure plate<\/h3>\n<p>Bien que l&rsquo;objet r\u00e9sultant d&rsquo;une op\u00e9ration <em>stack()<\/em> soit math\u00e9matiquement \u00e9l\u00e9gant et compact, son format sous forme de Series \u00e0 index multiniveau ne s&rsquo;adapte pas directement aux sp\u00e9cifications de nombreuses biblioth\u00e8ques d&rsquo;analyse en aval, qui attendent une structure de table relationnelle conventionnelle pourvue de colonnes ind\u00e9pendantes standard. Il est donc indispensable d&rsquo;orchestrer la transition de cette structure hi\u00e9rarchique vers un DataFrame plat au moyen de la m\u00e9thode <em>DataFrame.reset_index()<\/em>.<\/p>\n<p>L&rsquo;application de <code>reset_index()<\/code> a pour effet de d\u00e9construire l&rsquo;int\u00e9gralit\u00e9 des niveaux de l&rsquo;index hi\u00e9rarchique des lignes pour les mat\u00e9rialiser sous forme de colonnes r\u00e9guli\u00e8res au sein d&rsquo;un nouveau DataFrame. Les niveaux d&rsquo;index correspondant aux identifiants initiaux redeviennent des attributs normaux, l&rsquo;ancien niveau de colonnes ayant pivot\u00e9 devient une variable cat\u00e9gorielle, et les valeurs num\u00e9riques de la Series sont log\u00e9es dans une colonne baptis\u00e9e par d\u00e9faut du nom de la s\u00e9rie d&rsquo;origine ou d&rsquo;un index num\u00e9rique.<\/p>\n<p>Bien que le couplage <code>df.set_index(...).stack().reset_index()<\/code> produise un r\u00e9sultat fonctionnellement \u00e9quivalent \u00e0 un appel \u00e0 <code>pandas.melt()<\/code>, il impose une charge cognitive et une verbosit\u00e9 sup\u00e9rieures dans l&rsquo;\u00e9criture du code source. De plus, la gestion interm\u00e9diaire d&rsquo;un objet MultiIndex peut induire des copies m\u00e9moires non n\u00e9gligeables lors de la r\u00e9organisation des blocs internes. En r\u00e8gle g\u00e9n\u00e9rale, on r\u00e9servera l&rsquo;utilisation de <em>stack()<\/em> aux jeux de donn\u00e9es qui poss\u00e8dent nativement des colonnes multiniveaux issues de calculs d&rsquo;agr\u00e9gation pr\u00e9alables (tels que ceux g\u00e9n\u00e9r\u00e9s par <em>pivot_table<\/em> ou des <em>groupby<\/em> multivari\u00e9s complexes).<\/p>\n<h2>9. Gestion des valeurs manquantes et int\u00e9grit\u00e9 structurelle<\/h2>\n<h3>9.1 Comportement des donn\u00e9es manquantes (NaN) lors du d\u00e9pivotement<\/h3>\n<p>L&rsquo;une des pierres d&rsquo;achoppement majeures du nettoyage de donn\u00e9es scientifiques r\u00e9side dans le traitement rigoureux des valeurs manquantes, d\u00e9sign\u00e9es conventionnellement par le marqueur <em>NaN<\/em> (<em>Not a Number<\/em>) sous Pandas et NumPy. Lors du passage d&rsquo;une structure large \u00e0 une structure longue via <em>pandas.melt()<\/em>, le comportement algorithmique par d\u00e9faut consiste \u00e0 pr\u00e9server scrupuleusement l&rsquo;int\u00e9gralit\u00e9 des cellules de la matrice d&rsquo;origine, y compris celles h\u00e9bergeant des valeurs manquantes. Cela signifie que si un participant n&rsquo;a pas compl\u00e9t\u00e9 la troisi\u00e8me session de mesure, une ligne compl\u00e8te sera tout de m\u00eame instanci\u00e9e pour cette session avec la valeur <em>NaN<\/em> log\u00e9e dans la colonne de r\u00e9sultats.<\/p>\n<p>Cette conservation syst\u00e9matique pr\u00e9sente des cons\u00e9quences directes sur la volum\u00e9trie globale du tableau r\u00e9sultant. Dans des bases de donn\u00e9es massives caract\u00e9ris\u00e9es par une forte dispersion ou une collecte intermittente, le maintien de millions de lignes compos\u00e9es uniquement de m\u00e9tadonn\u00e9es associ\u00e9es \u00e0 une valeur nulle alourdit inutilement l&#8217;empreinte en m\u00e9moire vive et ralentit les temps de calcul des fonctions d&rsquo;estimation statistique. Contrairement \u00e0 <em>melt()<\/em>, la m\u00e9thode alternative <em>DataFrame.stack()<\/em> int\u00e8gre historiquement un param\u00e8tre <code>dropna=True<\/code> qui \u00e9limine directement ces enregistrements incomplets lors de l&#8217;empilement vertical.<\/p>\n<p>Dans le cadre de l&rsquo;utilisation de <em>pd.melt()<\/em>, l&rsquo;analyste doit d\u00e9cider consciemment de purger ou non ces donn\u00e9es manquantes par un appel subs\u00e9quent \u00e0 la m\u00e9thode <code>DataFrame.dropna(subset=[nom_valeur])<\/code>. Cette d\u00e9cision ne doit pas \u00eatre purement technique, mais guid\u00e9e par une r\u00e9flexion m\u00e9thodologique approfondie sur la nature du m\u00e9canisme g\u00e9n\u00e9rateur de donn\u00e9es manquantes : s&rsquo;agit-il d&rsquo;une absence compl\u00e8tement al\u00e9atoire (MCAR &#8211; <em>Missing Completely at Random<\/em>) ou d&rsquo;une absence informative li\u00e9e \u00e0 l&rsquo;\u00e9volution de la condition du sujet, auquel cas l&rsquo;enregistrement explicite de l&rsquo;absence dans le tableau long peut \u00eatre indispensable pour renseigner des mod\u00e8les d&rsquo;analyse de survie ou d&rsquo;attrition.<\/p>\n<h3>9.2 Pr\u00e9servation de la rigueur m\u00e9thodologique face \u00e0 l&rsquo;attrition<\/h3>\n<p>L&rsquo;attrition exp\u00e9rimentale, c&rsquo;est-\u00e0-dire la perte progressive de participants au fur et \u00e0 mesure du d\u00e9roulement des sessions d&rsquo;une \u00e9tude longitudinale, induit un d\u00e9s\u00e9quilibre structurel profond au sein des jeux de donn\u00e9es. Dans un tableau au format large, cette attrition se manifeste par une augmentation progressive de la proportion de valeurs manquantes dans les colonnes des sessions tardives. Or, de nombreuses proc\u00e9dures statistiques multivari\u00e9es classiques (comme l&rsquo;analyse de variance multivari\u00e9e conventionnelle) recourent \u00e0 l&rsquo;\u00e9limination par liste (<em>listwise deletion<\/em>), supprimant purement et simplement toute entit\u00e9 pr\u00e9sentant au moins une valeur manquante sur l&rsquo;ensemble de la ligne, introduisant ainsi un biais de s\u00e9lection critique.<\/p>\n<p>Le remodelage au format long constitue la premi\u00e8re \u00e9tape incontournable pour assainir m\u00e9thodologiquement le traitement des donn\u00e9es d\u00e9s\u00e9quilibr\u00e9es. En convertissant la structure vers une morphologie verticale et en \u00e9liminant les lignes correspondant aux sessions non observ\u00e9es, on obtient un tableau non orthogonal o\u00f9 chaque individu contribue exactement \u00e0 hauteur du nombre d&rsquo;observations r\u00e9elles qu&rsquo;il a fournies. Les estimateurs statistiques modernes, au premier rang desquels figurent les mod\u00e8les mixtes lin\u00e9aires (LMM) reposant sur l&rsquo;estimation par le maximum de vraisemblance restreint (REML), s&rsquo;accommodent parfaitement de ces matrices \u00e0 nombres d&rsquo;observations in\u00e9gaux par sujet.<\/p>\n<p>Toutefois, cette flexibilit\u00e9 impose une vigilance accrue quant au contr\u00f4le de la compl\u00e9tude matricielle. Il incombe \u00e0 l&rsquo;ing\u00e9nieur de donn\u00e9es de proc\u00e9der \u00e0 des v\u00e9rifications formelles post-transformation, notamment en quantifiant pr\u00e9cis\u00e9ment la distribution du nombre de sessions observ\u00e9es par sujet \u00e0 l&rsquo;aide de commandes telles que <code>df_long.groupby('Sujet_ID').size().value_counts()<\/code>. Ce diagnostic permet de caract\u00e9riser l&rsquo;ampleur exacte de l&rsquo;attrition au sein de la cohorte et d&rsquo;\u00e9clairer le statisticien sur la n\u00e9cessit\u00e9 \u00e9ventuelle de recourir \u00e0 des techniques d&rsquo;imputation multiple adapt\u00e9es aux architectures de donn\u00e9es longitudinales.<\/p>\n<h2>10. Optimisation des performances et gestion de la m\u00e9moire volumique<\/h2>\n<h3>10.1 Optimisation des types de donn\u00e9es pr\u00e9alablement \u00e0 la conversion<\/h3>\n<p>L&rsquo;expansion dimensionnelle induite par le d\u00e9pivotement d\u00e9multiplie le nombre de lignes par un facteur \u00e9quivalent au nombre de variables de mesures restructur\u00e9es. Sur des jeux de donn\u00e9es volumineux comportant initialement des centaines de milliers de lignes, cette transformation peut rapidement saturer la m\u00e9moire vive disponible (RAM) si une strat\u00e9gie rigoureuse d&rsquo;optimisation des types de donn\u00e9es (<em>dtypes<\/em>) n&rsquo;est pas orchestr\u00e9e en amont du processus de remodelage.<\/p>\n<p>La premi\u00e8re mesure d&rsquo;optimisation consiste \u00e0 convertir syst\u00e9matiquement toutes les colonnes textuelles destin\u00e9es \u00e0 int\u00e9grer le param\u00e8tre <em>id_vars<\/em> vers le type <a rel=\"noopener noreferrer\" href=\"https:\/\/pandas.pydata.org\/docs\/user_guide\/categorical.html\">Categorical<\/a> de Pandas. Alors qu&rsquo;une s\u00e9rie de cha\u00eenes de caract\u00e8res de type <em>object<\/em> alloue un nouvel objet Python en m\u00e9moire pour chaque cellule \u2014 entra\u00eenant une surcharge consid\u00e9rable lors de la duplication des millions d&rsquo;identifiants \u2014, une colonne cat\u00e9gorielle stocke les \u00e9tiquettes textuelles uniques dans un lexique interne compact et ne manipule le long du tableau \u00e9tendu que de petits entiers non sign\u00e9s (par exemple des entiers 8 bits <em>int8<\/em>), r\u00e9duisant l&#8217;empreinte m\u00e9moire de cette dimension de plus de 80 %.<\/p>\n<p>La seconde technique repose sur le <em>downcasting<\/em> arithm\u00e9tique rigoureux des vecteurs de mesures. Par d\u00e9faut, les moteurs d&rsquo;ingestion de Pandas et de NumPy allouent des flottants 64 bits (<em>float64<\/em>) et des entiers 64 bits (<em>int64<\/em>). Si la pr\u00e9cision instrumentale de l&rsquo;exp\u00e9rimentation ne requiert pas une granularit\u00e9 double, la conversion pr\u00e9alable de ces colonnes vers des flottants 32 bits (<em>float32<\/em>) ou des entiers adapt\u00e9s (<em>int16<\/em> ou <em>int32<\/em>) divise par deux la m\u00e9moire n\u00e9cessaire pour instancier le nouveau vecteur de mesures dans le format long. Appliqu\u00e9es conjointement, ces optimisations permettent de traiter des volumes de donn\u00e9es consid\u00e9rablement plus vastes sur une station de travail conventionnelle sans provoquer d&rsquo;erreurs de d\u00e9passement de m\u00e9moire (<em>OutOfMemoryError<\/em>).<\/p>\n<h3>10.2 Traitement de tr\u00e8s grands volumes de donn\u00e9es (Big Data)<\/h3>\n<p>Lorsque la volum\u00e9trie brute d&rsquo;un fichier source au format large exc\u00e8de la capacit\u00e9 physique de la m\u00e9moire vive, l&rsquo;ex\u00e9cution directe d&rsquo;une commande globale <code>pd.melt(df)<\/code> devient impossible. L&rsquo;ing\u00e9nieur doit alors concevoir des flux de traitement segment\u00e9s en exploitant le m\u00e9canisme de lecture par morceaux (<em>chunking<\/em>) mis \u00e0 disposition par les interfaces d&rsquo;entr\u00e9es-sorties de Pandas, notamment au sein de la fonction <em>read_csv()<\/em> via le param\u00e8tre <code>chunksize<\/code>.<\/p>\n<p>Cette m\u00e9thodologie consiste \u00e0 it\u00e9rer sur le flux de donn\u00e9es entrant par blocs de quelques dizaines de milliers de lignes, d&rsquo;appliquer la transformation <em>melt()<\/em> de fa\u00e7on autonome \u00e0 chacun de ces sous-ensembles, puis de purger les valeurs superflues avant d&rsquo;\u00e9crire imm\u00e9diatement le r\u00e9sultat partiel sur le disque de stockage persistant. L&rsquo;\u00e9criture s&rsquo;effectue avantageusement dans un format colonnaire binaire et compress\u00e9 tel que le format <a rel=\"noopener noreferrer\" href=\"https:\/\/parquet.apache.org\/\">Apache Parquet<\/a>, qui pr\u00e9serve scrupuleusement le typage des colonnes et permet la concat\u00e9nation logique de plusieurs fragments via des partitions de fichiers sans saturation de la m\u00e9moire vive.<\/p>\n<p>Si la volum\u00e9trie d\u00e9passe d\u00e9finitivement l&rsquo;\u00e9chelle du traitement sur un n\u0153ud unique avec Pandas, l&rsquo;architecture de donn\u00e9es doit basculer vers des frameworks analytiques distribu\u00e9s ou parall\u00e9lis\u00e9s tels que <a rel=\"noopener noreferrer\" href=\"https:\/\/www.dask.org\/\">Dask<\/a> ou <a rel=\"noopener noreferrer\" href=\"https:\/\/pola.rs\/\">Polars<\/a>. Ces moteurs modernes adoptent des concepts morphologiques strictement analogues \u00e0 ceux de Pandas \u2014 proposant leurs propres variantes hautement parall\u00e9lis\u00e9es de la fonction <em>melt()<\/em> \u2014, tout en d\u00e9l\u00e9guant l&rsquo;ordonnancement des calculs \u00e0 des moteurs d&rsquo;ex\u00e9cution paresseuse (<em>lazy evaluation<\/em>) et \u00e0 des structures de donn\u00e9es sous-jacentes fond\u00e9es sur Apache Arrow, garantissant une mont\u00e9e en charge lin\u00e9aire face \u00e0 des t\u00e9raoctets de donn\u00e9es.<\/p>\n<h2>11. Pi\u00e8ges fr\u00e9quents, anomalies typographiques et solutions de d\u00e9bogage<\/h2>\n<h3>11.1 H\u00e9t\u00e9rog\u00e9n\u00e9it\u00e9 et coercition non d\u00e9sir\u00e9e des types de donn\u00e9es<\/h3>\n<p>L&rsquo;un des pi\u00e8ges les plus insidieux lors de l&rsquo;utilisation de <em>pd.melt()<\/em> r\u00e9side dans la d\u00e9gradation silencieuse du type de donn\u00e9es (<em>type coercion<\/em>) de la colonne r\u00e9sultante h\u00e9bergeant les valeurs d\u00e9pivot\u00e9es. Lorsque les diff\u00e9rentes colonnes fournies au param\u00e8tre <em>value_vars<\/em> ne partagent pas une stricte identit\u00e9 de typage \u2014 par exemple si l&rsquo;une des colonnes de score contient par inadvertance une cha\u00eene de caract\u00e8res textuelle comme <code>\"Non R\u00e9pondu\"<\/code> au milieu de scalaires d\u00e9cimaux \u2014, Pandas ne renvoie aucune exception fatale. Il proc\u00e8de au contraire \u00e0 une g\u00e9n\u00e9ralisation automatique de l&rsquo;ensemble de la s\u00e9rie vers le type <em>object<\/em>.<\/p>\n<p>Cette coercition a des r\u00e9percussions d\u00e9sastreuses sur la suite du pipeline de calcul : elle d\u00e9sactive l&rsquo;acc\u00e9l\u00e9ration vectoris\u00e9e, multiplie par dix la consommation de m\u00e9moire vive et provoque des \u00e9checs syst\u00e9matiques lors des futurs appels \u00e0 des fonctions d&rsquo;estimation statistique ou de visualisation quantitative. Pour diagnostiquer et pr\u00e9venir cette anomalie, l&rsquo;analyste doit imp\u00e9rativement inspecter la propri\u00e9t\u00e9 <code>df[value_name].dtype<\/code> imm\u00e9diatement apr\u00e8s le d\u00e9pivotement.<\/p>\n<p>En pr\u00e9sence d&rsquo;une telle contamination, la solution consiste \u00e0 isoler les anomalies au moyen de la fonction <code>pd.to_numeric(df[value_name], errors='coerce')<\/code>. Cette instruction force la conversion num\u00e9rique de l&rsquo;ensemble de la s\u00e9rie tout en substituant proprement les valeurs textuelles non conformes par des marqueurs <em>NaN<\/em>, pr\u00e9servant ainsi l&rsquo;int\u00e9grit\u00e9 du vecteur sous la forme d&rsquo;un type <em>float64<\/em> ou <em>float32<\/em> pur, imm\u00e9diatement exploitable pour le calcul matriciel.<\/p>\n<h3>11.2 Collisions de noms et gestion des ambigu\u00eft\u00e9s d&rsquo;index<\/h3>\n<p>Une anomalie fr\u00e9quente survient lors de collisions d&rsquo;identificateurs entre les noms de colonnes originaux et les \u00e9tiquettes assign\u00e9es aux nouveaux param\u00e8tres de remodelage. Si l&rsquo;analyste sp\u00e9cifie un <em>var_name<\/em> ou un <em>value_name<\/em> qui co\u00efncide exactement avec le nom d&rsquo;une variable d&rsquo;ancrage d\u00e9clar\u00e9e dans <em>id_vars<\/em>, Pandas g\u00e9n\u00e9rera un DataFrame comportant des colonnes dupliqu\u00e9es homonymes. Cette ambigu\u00eft\u00e9 structurelle rend l&rsquo;acc\u00e8s ult\u00e9rieur aux donn\u00e9es erratique et d\u00e9clenche des avertissements ou des erreurs critiques lors des filtrages par tranche.<\/p>\n<p>Un autre d\u00e9sagr\u00e9ment r\u00e9current r\u00e9side dans l&rsquo;oubli de la r\u00e9initialisation de l&rsquo;index avant l&rsquo;ex\u00e9cution du d\u00e9pivotement. Par d\u00e9faut, la fonction <em>pd.melt()<\/em> int\u00e8gre le param\u00e8tre <code>ignore_index=True<\/code>, ce qui engendre un nouvel index continu de z\u00e9ro \u00e0 <em>N-1<\/em>. Toutefois, si le DataFrame source poss\u00e9dait un index signifiant h\u00e9bergeant par exemple les identifiants de sujets (sans que ceux-ci ne constituent une colonne explicite), ces informations d&rsquo;ancrage capitales seront purement et simplement d\u00e9truites et perdues lors de l&rsquo;op\u00e9ration.<\/p>\n<p>La r\u00e8gle d&rsquo;or pour pr\u00e9venir toute d\u00e9perdition r\u00e9f\u00e9rentielle consiste \u00e0 s&rsquo;assurer, pr\u00e9alablement \u00e0 tout appel \u00e0 <em>melt()<\/em>, que l&rsquo;ensemble des dimensions de stratification et d&rsquo;identification r\u00e9sident bel et bien dans l&rsquo;espace des colonnes standard, en invoquant syst\u00e9matiquement l&rsquo;instruction pr\u00e9ventive <code>df = df.reset_index()<\/code>. De m\u00eame, un audit pr\u00e9liminaire des listes de cha\u00eenes attribu\u00e9es \u00e0 <em>id_vars<\/em>, <em>var_name<\/em> et <em>value_name<\/em> doit garantir l&rsquo;absence totale de recoupement lexical au sein de l&rsquo;espace de nommage de la table de donn\u00e9es.<\/p>\n<h3>11.3 Validation par assertions unitaires dans le pipeline de donn\u00e9es<\/h3>\n<p>Dans un contexte d&rsquo;ing\u00e9nierie logicielle robuste ou d&rsquo;analyse hautement reproductible, le remodelage tabulaire ne doit jamais \u00eatre ex\u00e9cut\u00e9 sans validation formelle automatique. L&rsquo;int\u00e9gration d&rsquo;assertions unitaires imm\u00e9diatement en aval de l&rsquo;op\u00e9ration de transformation permet de d\u00e9tecter instantan\u00e9ment toute r\u00e9gression ou perte d&rsquo;int\u00e9grit\u00e9 avant que les donn\u00e9es alt\u00e9r\u00e9es ne p\u00e9n\u00e8trent dans les moteurs de mod\u00e9lisation statistique.<\/p>\n<p>Une premi\u00e8re v\u00e9rification math\u00e9matique fondamentale consiste \u00e0 valider la conservation absolue des sommes marginales pour les m\u00e9triques quantitatives. La somme de l&rsquo;ensemble des valeurs de la colonne d\u00e9pivot\u00e9e (en excluant les <em>NaN<\/em>) doit \u00eatre rigoureusement identique, \u00e0 l&rsquo;arrondi machine pr\u00e8s, \u00e0 la somme cumul\u00e9e de l&rsquo;ensemble des colonnes d&rsquo;origine correspondantes, ce qui s&rsquo;exprime par l&rsquo;assertion suivante :<\/p>\n<p style=\"text-align: center; font-weight: bold; margin: 20px 0;\">assert np.isclose(df[colonnes_mesures].sum().sum(), df_long[value_name].sum(), equal_nan=True)<\/p>\n<p>Une seconde assertion indispensable porte sur l&rsquo;unicit\u00e9 des combinaisons de cl\u00e9s primaires dans la structure r\u00e9sultante. Dans un format long canonique, chaque entit\u00e9 statistique ne doit poss\u00e9der qu&rsquo;une et une seule observation par pas temporel ou condition factorielle. L&rsquo;instruction <code>assert not df_long.duplicated(subset=[id_vars + [var_name]]).any()<\/code> garantit formellement l&rsquo;absence de doublons parasites induits par des anomalies de collecte ou des fusions ant\u00e9rieures mal ma\u00eetris\u00e9es.<\/p>\n<p>Pour les infrastructures de donn\u00e9es institutionnelles, cette rigueur peut \u00eatre industrialis\u00e9e par le d\u00e9ploiement de frameworks de validation de sch\u00e9mas d\u00e9claratifs tels que <a rel=\"noopener noreferrer\" href=\"https:\/\/pandera.readthedocs.io\/\">Pandera<\/a> ou <a rel=\"noopener noreferrer\" href=\"https:\/\/greatexpectations.io\/\">Great Expectations<\/a>. Ces outils permettent de d\u00e9finir des contrats de donn\u00e9es stricts, v\u00e9rifiant automatiquement post-transformation le type des colonnes, les plages de valeurs admissibles, les taux de compl\u00e9tude et la conformit\u00e9 dimensionnelle du DataFrame avant toute ingestion par les algorithmes de production.<\/p>\n<h2>12. Int\u00e9gration du format long dans l&rsquo;analyse statistique et la visualisation avanc\u00e9e<\/h2>\n<h3>12.1 Exploitation graphique directe avec Seaborn et Plotly<\/h3>\n<p>L&rsquo;adoption de la morphologie en format long lib\u00e8re instantan\u00e9ment tout le potentiel expressif des biblioth\u00e8ques de visualisation statistique modernes, au premier rang desquelles figure <a rel=\"noopener noreferrer\" href=\"https:\/\/seaborn.pydata.org\/\">Seaborn<\/a> ainsi que le moteur interactif <a rel=\"noopener noreferrer\" href=\"https:\/\/plotly.com\/python\/\">Plotly<\/a>. Con\u00e7ues sur les principes de la grammaire des graphiques th\u00e9oris\u00e9e par Leland Wilkinson, ces interfaces attendent imp\u00e9rativement des repr\u00e9sentations matricielles ordonn\u00e9es o\u00f9 les dimensions esth\u00e9tiques (abscisse, ordonn\u00e9e, couleur, style de ligne, facettes) sont mapp\u00e9es directement \u00e0 des colonnes autonomes.<\/p>\n<p>Dans cette perspective, la g\u00e9n\u00e9ration d&rsquo;un graphique longitudinal individuel complexe \u2014 commun\u00e9ment qualifi\u00e9 de <em>spaghetti plot<\/em> \u2014, montrant les trajectoires singuli\u00e8res de centaines de participants diff\u00e9renci\u00e9es par un code couleur selon leur groupe exp\u00e9rimental, s&rsquo;ex\u00e9cute avec une remarquable concision de code :<\/p>\n<p style=\"text-align: center; font-style: italic; margin: 20px 0;\">sns.lineplot(data=df_long, x=&rsquo;Session&rsquo;, y=&rsquo;Score&rsquo;, hue=&rsquo;Groupe&rsquo;, units=&rsquo;Sujet_ID&rsquo;, estimator=None)<\/p>\n<p>La pr\u00e9sence d&rsquo;un format long permet \u00e0 l&rsquo;interpr\u00e9teur graphique d&rsquo;agr\u00e9ger automatiquement les donn\u00e9es \u00e0 la vol\u00e9e, de calculer les intervalles de confiance par bootstrap autour des moyennes de groupes et de propager ces estimations sur le canevas sans exiger la moindre ligne de code de calcul interm\u00e9diaire de la part de l&rsquo;utilisateur. De m\u00eame, la d\u00e9composition de trac\u00e9s en grilles de sous-graphiques multi-facettes via l&rsquo;op\u00e9rateur <em>FacetGrid<\/em> de Seaborn s&rsquo;effectue naturellement en fournissant simplement le nom d&rsquo;une des variables de stratification pr\u00e9serv\u00e9es au sein de <em>id_vars<\/em>, rendant l&rsquo;exploration visuelle multidimensionnelle fluide, concise et imm\u00e9diatement reproductible.<\/p>\n<h3>12.2 Alimentation des moteurs de mod\u00e9lisation statistique<\/h3>\n<p>L&rsquo;int\u00e9r\u00eat ultime de la m\u00e9tamorphose d&rsquo;un DataFrame vers le format long r\u00e9side dans son ad\u00e9quation parfaite avec les exigences computationnelles des moteurs d&rsquo;estimation statistique contemporains. Des modules Python sp\u00e9cialis\u00e9s tels que <em>Statsmodels<\/em> ou les architectures d&rsquo;apprentissage statistique comme <a rel=\"noopener noreferrer\" href=\"https:\/\/scikit-learn.org\/\">Scikit-Learn<\/a> reposent sur la vectorisation compl\u00e8te des variables d\u00e9pendantes pour formuler les \u00e9quations de r\u00e9gression.<\/p>\n<p>Dans l&rsquo;analyse des donn\u00e9es corr\u00e9l\u00e9es, des mesures r\u00e9p\u00e9t\u00e9es et des \u00e9tudes de panel, le mod\u00e8le lin\u00e9aire \u00e0 effets mixtes (<em>Linear Mixed-Effects Model<\/em> ou LMM) repr\u00e9sente le standard m\u00e9thodologique dominant. Sa formulation via l&rsquo;interface syntaxique de formules de <em>Statsmodels<\/em> (inspir\u00e9e de la syntaxe Patsy et du langage R) requiert que la variable \u00e0 expliquer soit concentr\u00e9e dans un vecteur unique, conditionn\u00e9 par les facteurs fixes et structur\u00e9 par les facteurs al\u00e9atoires :<\/p>\n<p style=\"text-align: center; font-style: italic; margin: 20px 0;\">smf.mixedlm(\u00ab\u00a0Score ~ Groupe * Session\u00a0\u00bb, data=df_long, groups=df_long[\u00ab\u00a0Sujet_ID\u00a0\u00bb]).fit()<\/p>\n<p>Une telle formalisation est rigoureusement impossible sur un DataFrame au format large, car les outils de mod\u00e9lisation ne peuvent inf\u00e9rer de mani\u00e8re autonome la corr\u00e9lation intra-sujet sous-jacente \u00e0 des colonnes disjointes. Le format long offre ainsi le substrat structurel n\u00e9cessaire pour d\u00e9composer pr\u00e9cis\u00e9ment la variance globale entre ses composantes inter-individuelles et intra-individuelles, garantissant une estimation robuste et non biais\u00e9e des erreurs standards et des valeurs de significativit\u00e9 statistique.<\/p>\n<h3>12.3 R\u00e9tro-ing\u00e9nierie : Le retour au format large via pivot_table()<\/h3>\n<p>L&rsquo;ing\u00e9nierie des donn\u00e9es tabulaires ne constitue pas un processus unidirectionnel fig\u00e9 ; elle proc\u00e8de au contraire d&rsquo;une dynamique circulaire d&rsquo;adaptation continue de la topologie aux contraintes des diff\u00e9rentes \u00e9tapes de traitement. Si le format long s&rsquo;impose indubitablement pour la mod\u00e9lisation statistique, le filtrage vectoris\u00e9 et la restitution graphique, le format large conserve toute sa pertinence ergonomique pour l&rsquo;\u00e9dition de rapports ex\u00e9cutifs synth\u00e9tiques, la pr\u00e9sentation tabulaire destin\u00e9e aux comit\u00e9s de lecture ou le calcul de matrices de corr\u00e9lation et de covariance bivari\u00e9es.<\/p>\n<p>La boucle m\u00e9thodologique se referme gr\u00e2ce \u00e0 l&rsquo;op\u00e9ration duale du d\u00e9pivotement : le repivotement structurel, orchestr\u00e9 sous Pandas par la puissante m\u00e9thode <a rel=\"noopener noreferrer\" href=\"https:\/\/pandas.pydata.org\/docs\/reference\/api\/pandas.pivot_table.html\">DataFrame.pivot_table()<\/a> ou sa variante simplifi\u00e9e <em>DataFrame.pivot()<\/em>. Cette op\u00e9ration r\u00e9assigne une variable factorielle du format long (telle que <code>Session<\/code>) \u00e0 l&rsquo;axe des colonnes, repositionne les identifiants en index de lignes et redistribue le vecteur num\u00e9rique au sein des nouvelles cellules matricielles transversales :<\/p>\n<p style=\"text-align: center; font-style: italic; margin: 20px 0;\">df_wide = df_long.pivot(index=&rsquo;Sujet_ID&rsquo;, columns=&rsquo;Session&rsquo;, values=&rsquo;Score&rsquo;)<\/p>\n<p>Dans l&rsquo;\u00e9ventualit\u00e9 o\u00f9 des observations multiples coexisteraient pour un m\u00eame croisement d&rsquo;indices, <em>pivot_table()<\/em> permet de stipuler une fonction d&rsquo;agr\u00e9gation math\u00e9matique r\u00e9ductrice (telle que la moyenne, la m\u00e9diane ou l&rsquo;\u00e9cart-type via le param\u00e8tre <code>aggfunc<\/code>), assurant la synth\u00e8se contr\u00f4l\u00e9e de l&rsquo;information. Cette r\u00e9versibilit\u00e9 bidirectionnelle absolue entre les g\u00e9om\u00e9tries large et longue conf\u00e8re au praticien de donn\u00e9es une ma\u00eetrise structurelle totale, lui permettant d&rsquo;osciller avec fluidit\u00e9 entre lisibilit\u00e9 humaine et rigueur calculatoire tout au long du cycle de vie de l&rsquo;analyse empirique.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<p>McKinney, W. (2010). Data structures for statistical computing in Python. In S. van der Walt &amp; J. Millman (Eds.), <em>Proceedings of the 9th Python in Science Conference<\/em> (pp. 51\u201356). <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.25080\/Majora-92bf1928-005\">https:\/\/doi.org\/10.25080\/Majora-92bf1928-005<\/a><\/p>\n<p>McKinney, W. (2022). <em>Python for data analysis: Data wrangling with Pandas, NumPy, and Jupyter<\/em> (3rd ed.). O&rsquo;Reilly Media.<\/p>\n<p>The Pandas Development Team. (2024). <em>pandas-dev\/pandas: Pandas documentation (Version 2.2.0)<\/em>. Zenodo. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.5281\/zenodo.10515159\">https:\/\/doi.org\/10.5281\/zenodo.10515159<\/a><\/p>\n<p>Wickham, H. (2014). Tidy data. <em>Journal of Statistical Software<\/em>, 59(10), 1\u201323. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.18637\/jss.v059.i10\">https:\/\/doi.org\/10.18637\/jss.v059.i10<\/a><\/p>\n<p>Wilkinson, L. (2005). <em>The grammar of graphics<\/em> (2nd ed.). Springer-Verlag. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1007\/0-387-28695-0\">https:\/\/doi.org\/10.1007\/0-387-28695-0<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Guide acad\u00e9mique complet pour restructurer un DataFrame Pandas du format large au format long avec pd.melt, wide_to_long et stack dans vos analyses de donn\u00e9es.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[2141,2464],"tags":[7250,2466,8052,2468,8051],"class_list":["post-6419","psych_stat","type-psych_stat","status-publish","hentry","category-methodologie-quantitative","category-science-des-donnees","tag-format-long","tag-pandas","tag-pd-melt","tag-python","tag-remodelage-de-donnees"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/6419","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat"}],"about":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/types\/psych_stat"}],"author":[{"embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6419"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/6419\/revisions"}],"predecessor-version":[{"id":16804,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/6419\/revisions\/16804"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6419"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6419"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6419"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}