Update app.py
Browse files
app.py
CHANGED
|
@@ -3,6 +3,7 @@ import pandas as pd
|
|
| 3 |
import numpy as np
|
| 4 |
import plotly.express as px
|
| 5 |
import plotly.graph_objects as go
|
|
|
|
| 6 |
import matplotlib.pyplot as plt
|
| 7 |
import matplotlib.colors as mcolors
|
| 8 |
import matplotlib.cm as cm
|
|
@@ -10,6 +11,8 @@ import matplotlib.cm as cm
|
|
| 10 |
from functions import *
|
| 11 |
from dashboard import *
|
| 12 |
|
|
|
|
|
|
|
| 13 |
# CHARGEMENT DES DONNEES
|
| 14 |
df_controls, df_individus, df_sites, df_distances, df_mapping = load_data_antenna()
|
| 15 |
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",
|
|
@@ -22,9 +25,11 @@ selected_dpt = []
|
|
| 22 |
selected_dpt_gant = []
|
| 23 |
selected_sp = []
|
| 24 |
selected_gender = []
|
|
|
|
| 25 |
selected_sites = []
|
| 26 |
selected_communes = []
|
| 27 |
selected_dates = [df_controls['DATE'].min(), df_controls['DATE'].max()]
|
|
|
|
| 28 |
dates_gant = [df_controls['DATE'].min(), df_controls['DATE'].max()]
|
| 29 |
df_empty = pd.DataFrame()
|
| 30 |
|
|
@@ -46,8 +51,13 @@ communes = sorted(df_controls['COMMUNE'].unique().tolist())
|
|
| 46 |
departements = sorted(df_controls['DEPARTEMENT'].unique().tolist())
|
| 47 |
species = sorted(df_distances['CODE_ESP'].unique().tolist())
|
| 48 |
genders = sorted(df_individus['SEXE'].dropna().unique().tolist())
|
|
|
|
| 49 |
sites = sorted(df_controls['LIEU_DIT'].dropna().unique().tolist())
|
| 50 |
dates = [df_controls['DATE'].min(), df_controls['DATE'].max()]
|
|
|
|
|
|
|
|
|
|
|
|
|
| 51 |
|
| 52 |
# Callback du sélécteur de sites
|
| 53 |
def refresh_sites(state):
|
|
@@ -68,6 +78,7 @@ with open("pages/page2.md", "r", encoding = "utf-8") as file:
|
|
| 68 |
# Callback de la carte
|
| 69 |
def refresh_map_button(state):
|
| 70 |
df_filtered = df_distances.copy()
|
|
|
|
| 71 |
|
| 72 |
# Filtrer par département d'origine
|
| 73 |
if state.selected_dpt:
|
|
@@ -82,6 +93,10 @@ def refresh_map_button(state):
|
|
| 82 |
if state.selected_gender:
|
| 83 |
df_filtered = df_filtered[df_filtered['SEXE'].isin(state.selected_gender)]
|
| 84 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 85 |
# Filtrer par site d'origine
|
| 86 |
if state.selected_sites:
|
| 87 |
site_pit = df_filtered[(df_filtered['SITE_DEPART'].isin(state.selected_sites)) | (df_filtered['SITE_ARRIVEE'].isin(state.selected_sites))]['NUM_PIT'].unique()
|
|
@@ -91,8 +106,18 @@ def refresh_map_button(state):
|
|
| 91 |
if state.selected_dates and len(state.selected_dates) == 2:
|
| 92 |
start_date = pd.Timestamp(state.selected_dates[0])
|
| 93 |
end_date = pd.Timestamp(state.selected_dates[1])
|
| 94 |
-
df_filtered = df_filtered[(df_filtered['DATE_DEPART'] >= start_date) & (df_filtered['
|
| 95 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 96 |
# Rafraichir la carte
|
| 97 |
state.m = generate_map(df_filtered, df_sites)
|
| 98 |
|
|
@@ -129,6 +154,7 @@ plot_detection_year = detection_by_year(df_controls_valide) # Barplot du no
|
|
| 129 |
plot_capture_year = capture_by_year(df_individus_valide) # Barplot du nombre de captures par an et par espèces
|
| 130 |
plot_control_year = control_by_year(df_controls_valide) # Barplot du nombre de contrôles par an et par espèces
|
| 131 |
plot_frequencies = detection_frequencies(df_controls_valide) # Courbes de fréquences de détections par jour de l'année et par site
|
|
|
|
| 132 |
plot_pie_controled = pie_controled(df_controls_valide) # Pieplot des individus contrôlés
|
| 133 |
plot_pie_marked = pie_marked(df_individus_valide) # Pieplot des individus marqués
|
| 134 |
plot_top_detection = top_detection(df_controls_valide) # Barplot horizontal des 10 individus les plus détectés
|
|
@@ -136,9 +162,9 @@ plot_box_distances = distance_boxplot(df_distances) # Boxplot des d
|
|
| 136 |
|
| 137 |
# Initialisation des variables à plot
|
| 138 |
total_recaptured = df_controls.query('ACTION == "C"')['NUM_PIT'].nunique() # Individus contrôlés
|
| 139 |
-
total_marked = df_individus['NUM_PIT'].nunique()
|
| 140 |
-
sites_capture = df_individus['LIEU_DIT'].nunique()
|
| 141 |
-
sites_antennes = df_sites['LIEU_DIT'].nunique()
|
| 142 |
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)
|
| 143 |
transition_table_plot['DIST_KM'] = transition_table_plot['DIST_KM'].round(2)
|
| 144 |
|
|
@@ -156,6 +182,7 @@ plot_detection_year_fiche = detection_by_year(df_controls_fiche) # Barplot
|
|
| 156 |
plot_capture_year_fiche = capture_by_year(df_individus_fiche) # Barplot du nombre de captures par an et par espèces
|
| 157 |
plot_control_year_fiche = control_by_year(df_controls_fiche) # Barplot du nombre de contrôles par an et par espèces
|
| 158 |
plot_frequencies_fiche = detection_frequencies(df_controls_fiche) # Courbes de fréquences de détections par jour de l'année et par site
|
|
|
|
| 159 |
plot_pie_controled_fiche = pie_controled(df_controls_fiche) # Pieplot des individus contrôlés
|
| 160 |
plot_pie_marked_fiche = pie_marked(df_individus_fiche) # Pieplot des individus marqués
|
| 161 |
|
|
@@ -178,6 +205,7 @@ def update_fiche(state):
|
|
| 178 |
state.plot_capture_year_fiche = capture_by_year(df_individus_fiche)
|
| 179 |
state.plot_control_year_fiche = control_by_year(df_controls_fiche)
|
| 180 |
state.plot_frequencies_fiche = detection_frequencies(df_controls_fiche)
|
|
|
|
| 181 |
state.plot_pie_controled_fiche = pie_controled(df_controls_fiche)
|
| 182 |
state.plot_pie_marked_fiche = pie_marked(df_individus_fiche)
|
| 183 |
state.map_fiche = generate_map(df_distances_fiche, df_sites)
|
|
@@ -194,8 +222,8 @@ with open("pages/page5.md", "r", encoding = "utf-8") as file:
|
|
| 194 |
# DEMARRAGE DE L'APPLICATION
|
| 195 |
pages = {
|
| 196 |
"/": root_md,
|
| 197 |
-
"presentation": page1,
|
| 198 |
-
"
|
| 199 |
"phenologie": page3,
|
| 200 |
"statistiques": page4,
|
| 201 |
"fiche_site": page5
|
|
|
|
| 3 |
import numpy as np
|
| 4 |
import plotly.express as px
|
| 5 |
import plotly.graph_objects as go
|
| 6 |
+
import plotly.io as pio
|
| 7 |
import matplotlib.pyplot as plt
|
| 8 |
import matplotlib.colors as mcolors
|
| 9 |
import matplotlib.cm as cm
|
|
|
|
| 11 |
from functions import *
|
| 12 |
from dashboard import *
|
| 13 |
|
| 14 |
+
pio.templates.default = "simple_white"
|
| 15 |
+
|
| 16 |
# CHARGEMENT DES DONNEES
|
| 17 |
df_controls, df_individus, df_sites, df_distances, df_mapping = load_data_antenna()
|
| 18 |
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",
|
|
|
|
| 25 |
selected_dpt_gant = []
|
| 26 |
selected_sp = []
|
| 27 |
selected_gender = []
|
| 28 |
+
selected_age = []
|
| 29 |
selected_sites = []
|
| 30 |
selected_communes = []
|
| 31 |
selected_dates = [df_controls['DATE'].min(), df_controls['DATE'].max()]
|
| 32 |
+
selected_period = ['Transit', 'Parturition', 'Hivernale']
|
| 33 |
dates_gant = [df_controls['DATE'].min(), df_controls['DATE'].max()]
|
| 34 |
df_empty = pd.DataFrame()
|
| 35 |
|
|
|
|
| 51 |
departements = sorted(df_controls['DEPARTEMENT'].unique().tolist())
|
| 52 |
species = sorted(df_distances['CODE_ESP'].unique().tolist())
|
| 53 |
genders = sorted(df_individus['SEXE'].dropna().unique().tolist())
|
| 54 |
+
age = sorted(df_individus['AGE'].dropna().unique().tolist())
|
| 55 |
sites = sorted(df_controls['LIEU_DIT'].dropna().unique().tolist())
|
| 56 |
dates = [df_controls['DATE'].min(), df_controls['DATE'].max()]
|
| 57 |
+
periods = ['Transit', 'Parturition', 'Hivernale']
|
| 58 |
+
transit_months = [3, 4, 5, 9, 10, 11] # Printemps et Automne
|
| 59 |
+
parturition_months = [6, 7, 8] # Été
|
| 60 |
+
hivernale_months = [12, 1, 2] # Hiver
|
| 61 |
|
| 62 |
# Callback du sélécteur de sites
|
| 63 |
def refresh_sites(state):
|
|
|
|
| 78 |
# Callback de la carte
|
| 79 |
def refresh_map_button(state):
|
| 80 |
df_filtered = df_distances.copy()
|
| 81 |
+
df_filtered['DATE_ARRIVEE'] = pd.to_datetime(df_filtered['DATE_ARRIVEE'])
|
| 82 |
|
| 83 |
# Filtrer par département d'origine
|
| 84 |
if state.selected_dpt:
|
|
|
|
| 93 |
if state.selected_gender:
|
| 94 |
df_filtered = df_filtered[df_filtered['SEXE'].isin(state.selected_gender)]
|
| 95 |
|
| 96 |
+
# Filtrer par âge
|
| 97 |
+
if state.selected_age:
|
| 98 |
+
df_filtered = df_filtered[df_filtered['AGE'].isin(state.selected_age)]
|
| 99 |
+
|
| 100 |
# Filtrer par site d'origine
|
| 101 |
if state.selected_sites:
|
| 102 |
site_pit = df_filtered[(df_filtered['SITE_DEPART'].isin(state.selected_sites)) | (df_filtered['SITE_ARRIVEE'].isin(state.selected_sites))]['NUM_PIT'].unique()
|
|
|
|
| 106 |
if state.selected_dates and len(state.selected_dates) == 2:
|
| 107 |
start_date = pd.Timestamp(state.selected_dates[0])
|
| 108 |
end_date = pd.Timestamp(state.selected_dates[1])
|
| 109 |
+
df_filtered = df_filtered[(df_filtered['DATE_DEPART'] >= start_date) & (df_filtered['DATE_ARRIVEE'] <= end_date)]
|
| 110 |
|
| 111 |
+
# Filtrage en fonction des périodes
|
| 112 |
+
mask = pd.Series([False] * len(df_filtered), index = df_filtered.index)
|
| 113 |
+
if "Transit" in state.selected_period:
|
| 114 |
+
mask |= df_filtered['DATE_ARRIVEE'].dt.month.isin(transit_months)
|
| 115 |
+
if "Parturition" in state.selected_period:
|
| 116 |
+
mask |= df_filtered['DATE_ARRIVEE'].dt.month.isin(parturition_months)
|
| 117 |
+
if "Hivernale" in state.selected_period:
|
| 118 |
+
mask |= df_filtered['DATE_ARRIVEE'].dt.month.isin(hivernale_months)
|
| 119 |
+
df_filtered = df_filtered[mask]
|
| 120 |
+
|
| 121 |
# Rafraichir la carte
|
| 122 |
state.m = generate_map(df_filtered, df_sites)
|
| 123 |
|
|
|
|
| 154 |
plot_capture_year = capture_by_year(df_individus_valide) # Barplot du nombre de captures par an et par espèces
|
| 155 |
plot_control_year = control_by_year(df_controls_valide) # Barplot du nombre de contrôles par an et par espèces
|
| 156 |
plot_frequencies = detection_frequencies(df_controls_valide) # Courbes de fréquences de détections par jour de l'année et par site
|
| 157 |
+
plot_frequencies_global = detection_frequencies_global(df_controls_valide) # Courbes de fréquences de détections totales par jour de l'année
|
| 158 |
plot_pie_controled = pie_controled(df_controls_valide) # Pieplot des individus contrôlés
|
| 159 |
plot_pie_marked = pie_marked(df_individus_valide) # Pieplot des individus marqués
|
| 160 |
plot_top_detection = top_detection(df_controls_valide) # Barplot horizontal des 10 individus les plus détectés
|
|
|
|
| 162 |
|
| 163 |
# Initialisation des variables à plot
|
| 164 |
total_recaptured = df_controls.query('ACTION == "C"')['NUM_PIT'].nunique() # Individus contrôlés
|
| 165 |
+
total_marked = df_individus['NUM_PIT'].nunique() # Individus marqués
|
| 166 |
+
sites_capture = df_individus['LIEU_DIT'].nunique() # Sites capturés au moins une fois
|
| 167 |
+
sites_antennes = df_sites['LIEU_DIT'].nunique() # Sites contrôlés au moins une fois
|
| 168 |
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)
|
| 169 |
transition_table_plot['DIST_KM'] = transition_table_plot['DIST_KM'].round(2)
|
| 170 |
|
|
|
|
| 182 |
plot_capture_year_fiche = capture_by_year(df_individus_fiche) # Barplot du nombre de captures par an et par espèces
|
| 183 |
plot_control_year_fiche = control_by_year(df_controls_fiche) # Barplot du nombre de contrôles par an et par espèces
|
| 184 |
plot_frequencies_fiche = detection_frequencies(df_controls_fiche) # Courbes de fréquences de détections par jour de l'année et par site
|
| 185 |
+
plot_frequencies_global_fiche = detection_frequencies_global(df_controls_fiche) # Courbes de fréquences de détections totales par jour de l'année
|
| 186 |
plot_pie_controled_fiche = pie_controled(df_controls_fiche) # Pieplot des individus contrôlés
|
| 187 |
plot_pie_marked_fiche = pie_marked(df_individus_fiche) # Pieplot des individus marqués
|
| 188 |
|
|
|
|
| 205 |
state.plot_capture_year_fiche = capture_by_year(df_individus_fiche)
|
| 206 |
state.plot_control_year_fiche = control_by_year(df_controls_fiche)
|
| 207 |
state.plot_frequencies_fiche = detection_frequencies(df_controls_fiche)
|
| 208 |
+
state.plot_frequencies_global_fiche = detection_frequencies_global(df_controls_fiche)
|
| 209 |
state.plot_pie_controled_fiche = pie_controled(df_controls_fiche)
|
| 210 |
state.plot_pie_marked_fiche = pie_marked(df_individus_fiche)
|
| 211 |
state.map_fiche = generate_map(df_distances_fiche, df_sites)
|
|
|
|
| 222 |
# DEMARRAGE DE L'APPLICATION
|
| 223 |
pages = {
|
| 224 |
"/": root_md,
|
| 225 |
+
# "presentation": page1,
|
| 226 |
+
"carto_cmr": page2,
|
| 227 |
"phenologie": page3,
|
| 228 |
"statistiques": page4,
|
| 229 |
"fiche_site": page5
|