From 8858f3177cddd557b312732bffe8f7a2b2e80506 Mon Sep 17 00:00:00 2001 From: Oumaima Date: Fri, 31 May 2024 12:05:57 +0200 Subject: [PATCH 1/3] Enregistrer les modifications locales --- app/odi_functions.py | 32 +++++++++++++++++++++ app/odi_streamlit.py | 68 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) diff --git a/app/odi_functions.py b/app/odi_functions.py index dec5dfc..a24109c 100644 --- a/app/odi_functions.py +++ b/app/odi_functions.py @@ -121,3 +121,35 @@ def extract_text_between_brackets(string: str) -> str: ).strip() # Return the matched group and strip any extra whitespace return None # Return None if no match is found +def prepare_mobility_data(data, colname_suffixes): + """ + Extracts and prepares mobility data for analysis from multiple characters. + + Parameters: + data (DataFrame): The original dataset containing mobility information for characters. + colname_suffixes (Set): Set of suffixes indicating different types of mobility information. + + Returns: + DataFrame: A long-format DataFrame ready for analysis and visualization. + """ + + # Prepare and concatenate data for all characters with accurate column names + all_characters_mobility_data = pd.DataFrame() + + # Loop through each character number + for i in range(1, 5): + # Prepare the mapping for each character's mobility columns using the correct format + colnames = { + f"character{i}_mobility_vehicule [{suffix}]": f"{suffix}" for suffix in colname_suffixes + } + + if len(colnames) > 0: + # Select and rename the relevant columns for each character's mobility information + temp_data = data[list(colnames.keys())].rename(columns=colnames) + + # Append to the overall DataFrame + all_characters_mobility_data = pd.concat([all_characters_mobility_data, temp_data], ignore_index=True) + # Afficher le DataFrame all_characters_mobility_data + + + return all_characters_mobility_data \ No newline at end of file diff --git a/app/odi_streamlit.py b/app/odi_streamlit.py index 7a63566..d2b1c50 100644 --- a/app/odi_streamlit.py +++ b/app/odi_streamlit.py @@ -10,6 +10,7 @@ # Other Pkgs from odi_functions import ( + prepare_mobility_data, extract_text_between_brackets, prepare_character_data, prepare_technology_data, @@ -1059,6 +1060,73 @@ def get_chart_82052330(df: pd.DataFrame, liste: list[str], titre: str) -> None: # Objectif: répondre aux questions suivantes: # Comment se déplace-t-on à l'écran ? # Est-ce que ça varie selon le type de personnage et leur sensibilité à l'écologie ? +# Préparer les données pour l'analyse de la mobilité + +colname_suffixes={'Voiture individuelle','Covoiturage','Transports en commun', 'VTC/Taxi', 'Chauffeur privé', 'Hélicoptère', 'Deux-roues motorisés' } + +# Définir un dictionnaire de correspondance pour les noms de colonne +column_mapping = { + 'Voiture individuelle': 'Voiture individuelle', + 'Covoiturage': 'Covoiturage', + 'Transports en commun': 'Transports en commun', + 'VTC/Taxi': 'VTC/Taxi', + 'Chauffeur privé': 'Chauffeur privé', + 'Hélicoptère': 'Hélicoptère', + 'Deux-roues motorisés': 'Deux-roues motorisés', + 'Autre': 'Autre' +} + +# Maintenant, vous pouvez utiliser ce dictionnaire pour convertir les noms de colonne +nouveau_colname_suffixes = {column_mapping[nom] for nom in colname_suffixes} +# Convertir l'ensemble en un dictionnaire où chaque nom est associé à lui-même +nouveau_colname_suffixes = {nom: nom for nom in nouveau_colname_suffixes} + +with st.container(): + st.subheader("Analyse de la mobilité à l'écran") + # Utiliser le nouveau dictionnaire de suffixes dans la fonction prepare_mobility_data + mobility_data = prepare_mobility_data(data=data, colname_suffixes=nouveau_colname_suffixes) + + attribut_personne = prepare_character_data(data=data,colname_suffixes={'name', 'gender', 'ethnic_origin', 'interested_ecology', 'age_group', 'importance', 'sentiment'}) + + ct = pd.crosstab(attribut_personne['age_group'], mobility_data['Voiture individuelle']) + + + # Visualiser la proportion des modes de transport individuel en fonction d'age + # Définir la palette de couleurs discrètes + color_map = [ + (0, "#98FB98"), # Adolescent + (0.25, "#99CCFF"), # Jeune adulte (moins de 30 ans) + (0.5, "#3A4EC6"), # Adulte (30 - 50 ans) + (0.75, "#FF5050"), # Senior (plus de 50 ans) + (1, "#101727") # Plus de 70 ans + ] + + # Generate a heatmap + fig = px.imshow(ct, text_auto=True, aspect="auto", + labels=dict(x="Voiture individuelle", y="age_group", color="Count"), + title="Répartition de la mobilité par Voiture individuelles selon l'age_group", + color_continuous_scale=color_map) + + # Update layout for clarity + fig.update_xaxes(side="bottom") + + # Display the plot + st.plotly_chart(fig) + + ct = pd.crosstab(index=attribut_personne['gender'], columns=mobility_data['Voiture individuelle']) + # Visualiser la proportion des modes de transport individuel en fonction de l'âge + + # Générer un heatmap avec la palette de couleurs spécifiée + fig = px.imshow(ct, text_auto=True, aspect="auto", + labels=dict(x="Voiture individuelle", y="gender", color="Count"), + title='Répartition de la mobilité par Voiture individuelles selon le genre', + color_continuous_scale=color_map) + + # Mettre à jour la mise en page pour plus de clarté + fig.update_xaxes(side="bottom") + + # Display the plot + st.plotly_chart(fig) # TODO Analyse de l'habitat # Visualisation générale des modes d'habitat à l'écran, avec filtres possibles sur les From a0f1e5142caaed24019ac6894183c4e824ebadac Mon Sep 17 00:00:00 2001 From: Oumaima Date: Fri, 31 May 2024 12:22:53 +0200 Subject: [PATCH 2/3] formatage et precommit --- app/odi_functions.py | 2 +- app/odi_streamlit.py | 34 +++++++++++++++++----------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/app/odi_functions.py b/app/odi_functions.py index a24109c..e33fb71 100644 --- a/app/odi_functions.py +++ b/app/odi_functions.py @@ -152,4 +152,4 @@ def prepare_mobility_data(data, colname_suffixes): # Afficher le DataFrame all_characters_mobility_data - return all_characters_mobility_data \ No newline at end of file + return all_characters_mobility_data diff --git a/app/odi_streamlit.py b/app/odi_streamlit.py index d2b1c50..a483de4 100644 --- a/app/odi_streamlit.py +++ b/app/odi_streamlit.py @@ -10,9 +10,9 @@ # Other Pkgs from odi_functions import ( - prepare_mobility_data, extract_text_between_brackets, prepare_character_data, + prepare_mobility_data, prepare_technology_data, ) @@ -1062,18 +1062,18 @@ def get_chart_82052330(df: pd.DataFrame, liste: list[str], titre: str) -> None: # Est-ce que ça varie selon le type de personnage et leur sensibilité à l'écologie ? # Préparer les données pour l'analyse de la mobilité -colname_suffixes={'Voiture individuelle','Covoiturage','Transports en commun', 'VTC/Taxi', 'Chauffeur privé', 'Hélicoptère', 'Deux-roues motorisés' } +colname_suffixes={"Voiture individuelle","Covoiturage","Transports en commun", "VTC/Taxi", "Chauffeur privé", "Hélicoptère", "Deux-roues motorisés" } # Définir un dictionnaire de correspondance pour les noms de colonne column_mapping = { - 'Voiture individuelle': 'Voiture individuelle', - 'Covoiturage': 'Covoiturage', - 'Transports en commun': 'Transports en commun', - 'VTC/Taxi': 'VTC/Taxi', - 'Chauffeur privé': 'Chauffeur privé', - 'Hélicoptère': 'Hélicoptère', - 'Deux-roues motorisés': 'Deux-roues motorisés', - 'Autre': 'Autre' + "Voiture individuelle": "Voiture individuelle", + "Covoiturage": "Covoiturage", + "Transports en commun": "Transports en commun", + "VTC/Taxi": "VTC/Taxi", + "Chauffeur privé": "Chauffeur privé", + "Hélicoptère": "Hélicoptère", + "Deux-roues motorisés": "Deux-roues motorisés", + "Autre": "Autre", } # Maintenant, vous pouvez utiliser ce dictionnaire pour convertir les noms de colonne @@ -1086,9 +1086,9 @@ def get_chart_82052330(df: pd.DataFrame, liste: list[str], titre: str) -> None: # Utiliser le nouveau dictionnaire de suffixes dans la fonction prepare_mobility_data mobility_data = prepare_mobility_data(data=data, colname_suffixes=nouveau_colname_suffixes) - attribut_personne = prepare_character_data(data=data,colname_suffixes={'name', 'gender', 'ethnic_origin', 'interested_ecology', 'age_group', 'importance', 'sentiment'}) + attribut_personne = prepare_character_data(data=data,colname_suffixes={"name", "gender", "ethnic_origin", "interested_ecology", "age_group", "importance", "sentiment"}) - ct = pd.crosstab(attribut_personne['age_group'], mobility_data['Voiture individuelle']) + ct = pd.crosstab(attribut_personne["age_group"], mobility_data["Voiture individuelle"]) # Visualiser la proportion des modes de transport individuel en fonction d'age @@ -1098,9 +1098,9 @@ def get_chart_82052330(df: pd.DataFrame, liste: list[str], titre: str) -> None: (0.25, "#99CCFF"), # Jeune adulte (moins de 30 ans) (0.5, "#3A4EC6"), # Adulte (30 - 50 ans) (0.75, "#FF5050"), # Senior (plus de 50 ans) - (1, "#101727") # Plus de 70 ans + (1, "#101727"), # Plus de 70 ans ] - + # Generate a heatmap fig = px.imshow(ct, text_auto=True, aspect="auto", labels=dict(x="Voiture individuelle", y="age_group", color="Count"), @@ -1112,14 +1112,14 @@ def get_chart_82052330(df: pd.DataFrame, liste: list[str], titre: str) -> None: # Display the plot st.plotly_chart(fig) - - ct = pd.crosstab(index=attribut_personne['gender'], columns=mobility_data['Voiture individuelle']) + + ct = pd.crosstab(index=attribut_personne["gender"], columns=mobility_data["Voiture individuelle"]) # Visualiser la proportion des modes de transport individuel en fonction de l'âge # Générer un heatmap avec la palette de couleurs spécifiée fig = px.imshow(ct, text_auto=True, aspect="auto", labels=dict(x="Voiture individuelle", y="gender", color="Count"), - title='Répartition de la mobilité par Voiture individuelles selon le genre', + title="Répartition de la mobilité par Voiture individuelles selon le genre", color_continuous_scale=color_map) # Mettre à jour la mise en page pour plus de clarté From b0f53e8a9b87c4be83542f79656c1925f070bf4b Mon Sep 17 00:00:00 2001 From: Oumaima Date: Fri, 31 May 2024 13:40:23 +0200 Subject: [PATCH 3/3] =?UTF-8?q?mobilit=C3=A9=20=C3=A9cran?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/odi_functions.py | 10 +++--- app/odi_streamlit.py | 78 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 80 insertions(+), 8 deletions(-) diff --git a/app/odi_functions.py b/app/odi_functions.py index e33fb71..93eb941 100644 --- a/app/odi_functions.py +++ b/app/odi_functions.py @@ -121,13 +121,14 @@ def extract_text_between_brackets(string: str) -> str: ).strip() # Return the matched group and strip any extra whitespace return None # Return None if no match is found -def prepare_mobility_data(data, colname_suffixes): +def prepare_mobility_data(data: DataFrame, colname_suffixes: set[str]) -> DataFrame: """ Extracts and prepares mobility data for analysis from multiple characters. Parameters: data (DataFrame): The original dataset containing mobility information for characters. - colname_suffixes (Set): Set of suffixes indicating different types of mobility information. + colname_suffixes (Set): Set of suffixes indicating different types of mobility + information. Returns: DataFrame: A long-format DataFrame ready for analysis and visualization. @@ -140,7 +141,7 @@ def prepare_mobility_data(data, colname_suffixes): for i in range(1, 5): # Prepare the mapping for each character's mobility columns using the correct format colnames = { - f"character{i}_mobility_vehicule [{suffix}]": f"{suffix}" for suffix in colname_suffixes + f"character{i}_mobility_vehicule [{suffix}]": f"{suffix}" for suffix in colname_suffixes # noqa: E501 } if len(colnames) > 0: @@ -148,7 +149,8 @@ def prepare_mobility_data(data, colname_suffixes): temp_data = data[list(colnames.keys())].rename(columns=colnames) # Append to the overall DataFrame - all_characters_mobility_data = pd.concat([all_characters_mobility_data, temp_data], ignore_index=True) + all_characters_mobility_data = pd.concat([all_characters_mobility_data, temp_data], + ignore_index=True) # Afficher le DataFrame all_characters_mobility_data diff --git a/app/odi_streamlit.py b/app/odi_streamlit.py index a483de4..5fd3303 100644 --- a/app/odi_streamlit.py +++ b/app/odi_streamlit.py @@ -1062,7 +1062,8 @@ def get_chart_82052330(df: pd.DataFrame, liste: list[str], titre: str) -> None: # Est-ce que ça varie selon le type de personnage et leur sensibilité à l'écologie ? # Préparer les données pour l'analyse de la mobilité -colname_suffixes={"Voiture individuelle","Covoiturage","Transports en commun", "VTC/Taxi", "Chauffeur privé", "Hélicoptère", "Deux-roues motorisés" } +colname_suffixes={"Voiture individuelle","Covoiturage","Transports en commun", "VTC/Taxi", + "Chauffeur privé", "Hélicoptère", "Deux-roues motorisés" } # Définir un dictionnaire de correspondance pour les noms de colonne column_mapping = { @@ -1083,11 +1084,18 @@ def get_chart_82052330(df: pd.DataFrame, liste: list[str], titre: str) -> None: with st.container(): st.subheader("Analyse de la mobilité à l'écran") + st.markdown("- **Transport individuel**") # Utiliser le nouveau dictionnaire de suffixes dans la fonction prepare_mobility_data mobility_data = prepare_mobility_data(data=data, colname_suffixes=nouveau_colname_suffixes) - attribut_personne = prepare_character_data(data=data,colname_suffixes={"name", "gender", "ethnic_origin", "interested_ecology", "age_group", "importance", "sentiment"}) + attribut_personne = prepare_character_data(data=data,colname_suffixes={"name", "gender", + "ethnic_origin", + "interested_ecology", + "age_group", + "importance", + "sentiment"}) + ##Selon l'age de group## ct = pd.crosstab(attribut_personne["age_group"], mobility_data["Voiture individuelle"]) @@ -1104,16 +1112,18 @@ def get_chart_82052330(df: pd.DataFrame, liste: list[str], titre: str) -> None: # Generate a heatmap fig = px.imshow(ct, text_auto=True, aspect="auto", labels=dict(x="Voiture individuelle", y="age_group", color="Count"), - title="Répartition de la mobilité par Voiture individuelles selon l'age_group", + title="Répartition de la mobilité par Voiture individuelles selon l'age_group", # noqa: E501 color_continuous_scale=color_map) # Update layout for clarity fig.update_xaxes(side="bottom") + ##Selon le genre## + # Display the plot st.plotly_chart(fig) - ct = pd.crosstab(index=attribut_personne["gender"], columns=mobility_data["Voiture individuelle"]) + ct = pd.crosstab(index=attribut_personne["gender"], columns=mobility_data["Voiture individuelle"]) # noqa: E501 # Visualiser la proportion des modes de transport individuel en fonction de l'âge # Générer un heatmap avec la palette de couleurs spécifiée @@ -1128,6 +1138,66 @@ def get_chart_82052330(df: pd.DataFrame, liste: list[str], titre: str) -> None: # Display the plot st.plotly_chart(fig) + ##Selon l'origine ethnique## + ct = pd.crosstab(index=attribut_personne["ethnic_origin"], + columns=mobility_data["Voiture individuelle"]) + # Visualiser la proportion des modes de transport individuel en fonction de l'âge + + # Générer un heatmap avec la palette de couleurs spécifiée + fig = px.imshow(ct, text_auto=True, aspect="auto", + labels=dict(x="Voiture individuelle", y="ethnic_origin", color="Count"), + title="Répartition de la mobilité par Voiture individuelles selon l'origine " # noqa: E501 + "ethnique", + color_continuous_scale=color_map) + + # Mettre à jour la mise en page pour plus de clarté + fig.update_xaxes(side="bottom") + + # Display the plot + st.plotly_chart(fig) + + ##Selon l'écologie## + + ct = pd.crosstab(index=attribut_personne["interested_ecology"], + columns=mobility_data["Voiture individuelle"]) + # Visualiser la proportion des modes de transport individuel en fonction de l'âge + # Générer un heatmap avec la palette de couleurs spécifiée + fig = px.imshow(ct, text_auto=True, aspect="auto", + labels=dict(x="Voiture individuelle", y="interested_ecology", + color="Count"), + title="Répartition de la mobilité par Voiture individuelles selon" + "l'écologie", + color_continuous_scale=color_map) + + # Mettre à jour la mise en page pour plus de clarté + fig.update_xaxes(side="bottom") + + # Display the plot + st.plotly_chart(fig) + + st.markdown("- **Transports en commun**") + ##Selon l'age groupe## + + ct = pd.crosstab(index=attribut_personne["age_group"], + columns=mobility_data["Transports en commun"]) + + # Visualiser la proportion des modes de transport individuel en fonction de l'âge + + # Générer un heatmap avec la palette de couleurs spécifiée + fig = px.imshow(ct, text_auto=True, aspect="auto", + labels=dict(x="Transports en commun", y="age_group", color="Count"), + title="Répartition de la mobilité par transport commun selon l'age_group", + color_continuous_scale=color_map) + + # Mettre à jour la mise en page pour plus de clarté + fig.update_xaxes(side="bottom") + + # Display the plot + st.plotly_chart(fig) + + + + # TODO Analyse de l'habitat # Visualisation générale des modes d'habitat à l'écran, avec filtres possibles sur les # types de contenu ou sur les caractéristiques des personnages (ex. comment habitent les