a-langlais's picture
Update app.py
d8e6abf verified
from taipy import Gui
import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
import plotly.io as pio
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import matplotlib.cm as cm
from functions import *
from dashboard import *
pio.templates.default = "simple_white"
# CHARGEMENT DES DONNEES
df_controls, df_individus, df_sites, df_distances, df_mapping = load_data_antenna()
liste_sites_antennes = sorted(["Brelouze", "Mairie d'Annepont", "Grottes de Loubeau", "Le Plessis", "Puy-Chenin", "Cézelle", "La Bourtière", "Goizet (W)", "Château de Gagemont", "Faye-L'Abbesse - Bourg", "Guibaud", "Cave Billard", "Grotte de Boisdichon", "Les Roches", "Barrage de l'Aigle", "Gouffre de la Fage",
"Ancienne citerne à eau", "Château de Verteuil", "Les Dames", "Château de Hautefort", "Les Tours de Merle - Tour Fulcon", "Le Petit Pin", "Maison Brousse", "Caves de Laubenheimer", "Château de Villandraut", "Tunnel ferroviaire", "Grotte de la carrière", "Centrale hydroélectrique de Claredent", "Fermette des Nobis",
"Beauregard", "Grotte de la Deveze", "Petexaenea (Site générique Galeries N&S)", "Gouffre de Bexanka", "Mikelauenziloa"])
ETUDE_valides = ["Diag CEN", "Diag NATURA 2000", "Diag FDS_Oléron", "ECOFECT (GR/CCPNA)", "ECOFECT (Hors GR)", "TRANSPY ESPAGNE", "TRANSPY FRANCE"]
# Initialisation des variables d'état
selected_dpt = []
selected_dpt_gant = []
selected_sp = []
selected_gender = []
selected_age = []
selected_sites = []
selected_communes = []
selected_dates = [df_controls['DATE'].min(), df_controls['DATE'].max()]
selected_period = ['Transit', 'Parturition', 'Hivernale']
dates_gant = [df_controls['DATE'].min(), df_controls['DATE'].max()]
df_empty = pd.DataFrame()
# CONTENU
## ROOT PAGE
FEDER = "images/FEDER-NA.png"
PREFET = "images/Prefet_NA.jpg"
VERT = "images/FranceNationVerte.jpg"
with open("pages/home.md", "r", encoding = "utf-8") as file:
root_md = file.read()
## PAGE DE PRESENTATION
with open("pages/page1.md", "r", encoding = "utf-8") as file:
page1 = file.read()
## VISUALISATION DES DONNEES D'ANTENNES
communes = sorted(df_controls['COMMUNE'].unique().tolist())
departements = sorted(df_controls['DEPARTEMENT'].unique().tolist())
species = sorted(df_distances['CODE_ESP'].unique().tolist())
genders = sorted(df_individus['SEXE'].dropna().unique().tolist())
age = sorted(df_individus['AGE'].dropna().unique().tolist())
sites = sorted(df_controls['LIEU_DIT'].dropna().unique().tolist())
dates = [df_controls['DATE'].min(), df_controls['DATE'].max()]
periods = ['Transit', 'Parturition', 'Hivernale']
transit_months = [3, 4, 5, 9, 10, 11] # Printemps et Automne
parturition_months = [6, 7, 8] # Été
hivernale_months = [12, 1, 2] # Hiver
# Callback du sélécteur de sites
def refresh_sites(state):
selected_communes = state.selected_communes or []
if selected_communes:
filtered_df = df_controls[df_controls['COMMUNE'].isin(selected_communes)]
else:
filtered_df = df_controls
state.sites = sorted(filtered_df['LIEU_DIT'].unique().tolist())
m = generate_map(df_empty, df_sites)
with open("pages/page2.md", "r", encoding = "utf-8") as file:
page2 = file.read()
# Callback de la carte
def refresh_map_button(state):
df_filtered = df_distances.copy()
df_filtered['DATE_ARRIVEE'] = pd.to_datetime(df_filtered['DATE_ARRIVEE'])
# Filtrer par département d'origine
if state.selected_dpt:
equipped_pit = df_filtered[(df_filtered['DPT_DEPART'].isin(state.selected_dpt)) | (df_filtered['DPT_ARRIVEE'].isin(state.selected_dpt))]['NUM_PIT'].unique()
df_filtered = df_filtered[df_filtered['NUM_PIT'].isin(equipped_pit)]
# Filtrer par espèce
if state.selected_sp:
df_filtered = df_filtered[df_filtered['CODE_ESP'].isin(state.selected_sp)]
# Filtrer par genre
if state.selected_gender:
df_filtered = df_filtered[df_filtered['SEXE'].isin(state.selected_gender)]
# Filtrer par âge
if state.selected_age:
df_filtered = df_filtered[df_filtered['AGE'].isin(state.selected_age)]
# Filtrer par site d'origine
if state.selected_sites:
site_pit = df_filtered[(df_filtered['SITE_DEPART'].isin(state.selected_sites)) | (df_filtered['SITE_ARRIVEE'].isin(state.selected_sites))]['NUM_PIT'].unique()
df_filtered = df_filtered[df_filtered['NUM_PIT'].isin(site_pit)]
# Filtrer par intervalle de dates
if state.selected_dates and len(state.selected_dates) == 2:
start_date = pd.Timestamp(state.selected_dates[0])
end_date = pd.Timestamp(state.selected_dates[1])
df_filtered = df_filtered[(df_filtered['DATE_DEPART'] >= start_date) & (df_filtered['DATE_ARRIVEE'] <= end_date)]
# Filtrage en fonction des périodes
mask = pd.Series([False] * len(df_filtered), index = df_filtered.index)
if "Transit" in state.selected_period:
mask |= df_filtered['DATE_ARRIVEE'].dt.month.isin(transit_months)
if "Parturition" in state.selected_period:
mask |= df_filtered['DATE_ARRIVEE'].dt.month.isin(parturition_months)
if "Hivernale" in state.selected_period:
mask |= df_filtered['DATE_ARRIVEE'].dt.month.isin(hivernale_months)
df_filtered = df_filtered[mask]
# Rafraichir la carte
state.m = generate_map(df_filtered, df_sites)
## PHENOLOGIES DES SITES
gant_global = gant_diagram(df_controls)
with open("pages/page3.md", "r", encoding = "utf-8") as file:
page3 = file.read()
# Callbacks du diagramme de Gant
def update_gant(state):
df_filtered_gant = df_controls.copy()
df_filtered_gant = df_filtered_gant[df_filtered_gant['LIEU_DIT'].isin(liste_sites_antennes)]
# Convertir les dates sélectionnées en objets Timestamp
if state.selected_dpt_gant:
df_filtered_gant = df_filtered_gant[df_filtered_gant['DEPARTEMENT'].isin(state.selected_dpt_gant)]
if state.dates_gant and len(state.dates_gant) == 2:
start_date = pd.Timestamp(state.dates_gant[0])
end_date = pd.Timestamp(state.dates_gant[1])
# Filtrer les dates
df_filtered_gant = df_filtered_gant[(df_filtered_gant['DATE'] >= start_date) & (df_filtered_gant['DATE'] <= end_date)]
state.gant_global = gant_diagram(df_filtered_gant)
## STATISTIQUES ANALYTIQUES
# Initialisation de tous les plots
df_controls_valide = df_controls[df_controls['ETUDE'].isin(ETUDE_valides)]
df_individus_valide = df_individus[df_individus['ETUDE'].isin(ETUDE_valides)]
plot_detection_year = detection_by_year(df_controls_valide) # Barplot du nombre de détections par an et par espèce
plot_capture_year = capture_by_year(df_individus_valide) # Barplot du nombre de captures par an et par espèces
plot_control_year = control_by_year(df_controls_valide) # Barplot du nombre de contrôles par an et par espèces
plot_frequencies = detection_frequencies(df_controls_valide) # Courbes de fréquences de détections par jour de l'année et par site
plot_frequencies_global = detection_frequencies_global(df_controls_valide) # Courbes de fréquences de détections totales par jour de l'année
plot_pie_controled = pie_controled(df_controls_valide) # Pieplot des individus contrôlés
plot_pie_marked = pie_marked(df_individus_valide) # Pieplot des individus marqués
plot_top_detection = top_detection(df_controls_valide) # Barplot horizontal des 10 individus les plus détectés
plot_box_distances = distance_boxplot(df_distances) # Boxplot des distances par espèce
# Initialisation des variables à plot
total_recaptured = df_controls.query('ACTION == "C"')['NUM_PIT'].nunique() # Individus contrôlés
total_marked = df_individus['NUM_PIT'].nunique() # Individus marqués
sites_capture = df_individus['LIEU_DIT'].nunique() # Sites capturés au moins une fois
sites_antennes = df_sites['LIEU_DIT'].nunique() # Sites contrôlés au moins une fois
transition_table_plot = df_distances[['NUM_PIT', 'CODE_ESP', 'DATE_DEPART', 'SITE_DEPART', 'DATE_ARRIVEE', 'SITE_ARRIVEE', 'DIST_KM']].sort_values(by='DIST_KM', ascending = False)
transition_table_plot['DIST_KM'] = transition_table_plot['DIST_KM'].round(2)
with open("pages/page4.md", "r", encoding = "utf-8") as file:
page4 = file.read()
## FICHE SITE
# Initialisation du sélecteur et des plots
selection_fiche = ['Ancienne citerne à eau']
df_controls_fiche = df_controls[df_controls['LIEU_DIT'].isin(selection_fiche)]
df_individus_fiche = df_individus[df_individus['LIEU_DIT'].isin(selection_fiche)]
df_distances_fiche = df_distances[(df_distances['SITE_DEPART'].isin(selection_fiche)) | (df_distances['SITE_ARRIVEE'].isin(selection_fiche))]
plot_detection_year_fiche = detection_by_year(df_controls_fiche) # Barplot du nombre de détections par an et par espèce
plot_capture_year_fiche = capture_by_year(df_individus_fiche) # Barplot du nombre de captures par an et par espèces
plot_control_year_fiche = control_by_year(df_controls_fiche) # Barplot du nombre de contrôles par an et par espèces
plot_frequencies_fiche = detection_frequencies(df_controls_fiche) # Courbes de fréquences de détections par jour de l'année et par site
plot_frequencies_global_fiche = detection_frequencies_global(df_controls_fiche) # Courbes de fréquences de détections totales par jour de l'année
plot_pie_controled_fiche = pie_controled(df_controls_fiche) # Pieplot des individus contrôlés
plot_pie_marked_fiche = pie_marked(df_individus_fiche) # Pieplot des individus marqués
# Initialisation des variables à plot
total_recaptured_fiche = df_controls_fiche['NUM_PIT'].nunique() # Individus contrôlés
total_marked_fiche = df_individus_fiche['NUM_PIT'].nunique() # Individus marqués
sites_antennes_fiche = df_sites['LIEU_DIT'].nunique() # Sites contrôlés au moins une fois
map_fiche = generate_map(df_distances_fiche, df_sites) # Map du site et des connexions
gant_diagram_fiche = gant_diagram_concat(df_controls_fiche)
def update_fiche(state):
# Filtrage en fonction de la sélection
selected_sites = [state.selection_fiche]
df_controls_fiche = df_controls[df_controls['LIEU_DIT'].isin(selected_sites)]
df_individus_fiche = df_individus[df_individus['LIEU_DIT'].isin(selected_sites)]
df_distances_fiche = df_distances[(df_distances['SITE_DEPART'].isin(selected_sites)) | (df_distances['SITE_ARRIVEE'].isin(selected_sites))]
# Mise à jour des visualisations
state.plot_detection_year_fiche = detection_by_year(df_controls_fiche)
state.plot_capture_year_fiche = capture_by_year(df_individus_fiche)
state.plot_control_year_fiche = control_by_year(df_controls_fiche)
state.plot_frequencies_fiche = detection_frequencies(df_controls_fiche)
state.plot_frequencies_global_fiche = detection_frequencies_global(df_controls_fiche)
state.plot_pie_controled_fiche = pie_controled(df_controls_fiche)
state.plot_pie_marked_fiche = pie_marked(df_individus_fiche)
state.map_fiche = generate_map(df_distances_fiche, df_sites)
state.gant_diagram_fiche = gant_diagram_concat(df_controls_fiche)
# Mise à jour des variables globales
state.total_recaptured_fiche = df_controls_fiche['NUM_PIT'].nunique()
state.total_marked_fiche = df_individus_fiche['NUM_PIT'].nunique()
state.sites_antennes_fiche = df_sites['LIEU_DIT'].nunique()
with open("pages/page5.md", "r", encoding = "utf-8") as file:
page5 = file.read()
# DEMARRAGE DE L'APPLICATION
pages = {
"/": root_md,
# "presentation": page1,
"carto_cmr": page2,
"phenologie": page3,
"statistiques": page4,
"fiche_site": page5
}
Gui.register_content_provider(Map, expose_folium)
gui = Gui(pages = pages, css_file = "assets/styles.css")
gui.run(host = '0.0.0.0', port = 7860, use_session = True, dark_mode = False, stylekit = False, watermark = "") # use_session = True pour permettre l'usage de plusieurs users en même temps