a-langlais commited on
Commit
f513c11
·
verified ·
1 Parent(s): df36417

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +34 -6
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['DATE_DEPART'] <= end_date)]
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() # Individus marqués
140
- sites_capture = df_individus['LIEU_DIT'].nunique() # Sites capturés au moins une fois
141
- sites_antennes = df_sites['LIEU_DIT'].nunique() # Sites contrôlés au moins une fois
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
- "antennes": page2,
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