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

Update dashboard.py

Browse files
Files changed (1) hide show
  1. dashboard.py +225 -194
dashboard.py CHANGED
@@ -1,194 +1,225 @@
1
- import pandas as pd
2
- import plotly.express as px
3
- import plotly.graph_objects as go
4
-
5
- def detection_by_year(df_controls):
6
- df_controls['YEAR'] = df_controls['DATE'].dt.year
7
- grouped_data = df_controls.groupby(['YEAR', 'CODE_ESP']).size().reset_index(name = 'Detections')
8
-
9
- fig = px.bar(grouped_data, x = 'YEAR', y = 'Detections', color = 'CODE_ESP',
10
- labels = {'Detections': 'Nombre de détections', 'CODE_ESP': 'Espèce'},
11
- )
12
-
13
- fig.update_layout(
14
- height = 400,
15
- width = 400,
16
- yaxis_title = 'Nombre de détections',
17
- xaxis_title = None,
18
- xaxis = {'type': 'category', 'tickmode': 'linear'}, # Afficher toutes les années
19
- barmode = 'stack',
20
- legend = dict(
21
- bgcolor = 'rgba(0, 0, 0, 0)',
22
- orientation = 'h', # Légende horizontale
23
- x = 0.5, # Centrer la légende horizontalement
24
- y = -0.2, # Placer la légende en dessous de la figure
25
- xanchor = 'center', # Ancrer la légende au centre
26
- yanchor = 'top' # Ancrer la légende au-dessus de l'axe x
27
- ),
28
- margin = dict(b = 100)
29
- )
30
-
31
- return fig
32
-
33
- def capture_by_year(df_captures):
34
- df_filtre = df_captures.copy()
35
- df_filtre['YEAR'] = df_filtre['DATE'].dt.year
36
- df_grouped = df_filtre.groupby(['YEAR', 'CODE_ESP'])['NUM_PIT'].nunique().reset_index()
37
- df_grouped.rename(columns = {'NUM_PIT': 'Nombre d\'individus uniques'}, inplace = True)
38
-
39
- fig = px.bar(df_grouped, x = 'YEAR', y = 'Nombre d\'individus uniques', color = 'CODE_ESP',
40
- labels = {'Nombre d\'individus uniques': 'Nombre d\'individus uniques', 'CODE_ESP': 'Espèce'}
41
- )
42
-
43
- fig.update_layout(
44
- height = 400,
45
- width = 400,
46
- yaxis_title = 'Nombre d\'individus uniques',
47
- xaxis_title = None,
48
- xaxis = {'type': 'category', 'tickmode': 'linear'}, # Afficher toutes les années
49
- legend = dict(
50
- bgcolor ='rgba(0, 0, 0, 0)',
51
- orientation = 'h', # Légende horizontale
52
- x = 0.5, # Centrer la légende horizontalement
53
- y = -0.2, # Placer la légende en dessous de la figure
54
- xanchor = 'center', # Ancrer la légende au centre
55
- yanchor = 'top' # Ancrer la légende au-dessus de l'axe x
56
- ),
57
- margin = dict(b = 100)
58
- )
59
-
60
- return fig
61
-
62
- def control_by_year(df_controls):
63
- df_filtre = df_controls.copy()
64
- df_filtre['YEAR'] = df_filtre['DATE'].dt.year
65
- df_grouped = df_filtre.groupby(['YEAR', 'CODE_ESP'])['NUM_PIT'].nunique().reset_index()
66
- df_grouped.rename(columns = {'NUM_PIT': 'Nombre d\'individus'}, inplace = True)
67
-
68
- fig = px.bar(df_grouped, x = 'YEAR', y = 'Nombre d\'individus', color = 'CODE_ESP',
69
- labels = {'Nombre d\'individus': 'Nombre d\'individus', 'CODE_ESP': 'Espèce'},
70
- )
71
-
72
- fig.update_layout(
73
- height = 400,
74
- width = 400,
75
- yaxis_title = 'Nombre d\'individus',
76
- xaxis_title = None,
77
- xaxis = {'type': 'category', 'tickmode': 'linear'}, # Afficher toutes les années
78
- legend = dict(
79
- bgcolor = 'rgba(0, 0, 0, 0)',
80
- orientation = 'h', # Légende horizontale
81
- x = 0.5, # Centrer la légende horizontalement
82
- y = -0.2, # Placer la légende en dessous de la figure
83
- xanchor = 'center', # Ancrer la légende au centre
84
- yanchor = 'top' # Ancrer la légende au-dessus de l'axe x
85
- ),
86
- margin = dict(b = 100)
87
- )
88
-
89
- return fig
90
-
91
- def detection_frequencies(df_controls):
92
- df_controls['DATE'] = pd.to_datetime(df_controls['DATE'], errors='coerce')
93
- df_controls['MONTH_DAY'] = df_controls['DATE'].dt.strftime('%m-%d')
94
- global_freq = df_controls.groupby('MONTH_DAY').size().reset_index(name = 'Global Detections')
95
-
96
- # Calculer les fréquences par site
97
- site_freq = df_controls.groupby(['MONTH_DAY', 'LIEU_DIT']).size().reset_index(name = 'Detections')
98
- sites = site_freq['LIEU_DIT'].unique()
99
-
100
- # Préparer l'ordre chronologique
101
- months_days = pd.date_range('2021-01-01', '2021-12-31').strftime('%m-%d')
102
- global_freq['MONTH_DAY'] = pd.Categorical(global_freq['MONTH_DAY'], categories = months_days, ordered = True)
103
- global_freq = global_freq.sort_values('MONTH_DAY')
104
-
105
- # Création du graphique
106
- fig = go.Figure()
107
-
108
- if len(site_freq['LIEU_DIT'].unique()) > 1:
109
- # Ajouter la courbe globale
110
- fig.add_trace(go.Scatter(x = global_freq['MONTH_DAY'], y = global_freq['Global Detections'],
111
- mode = 'lines', name = 'Global'))
112
-
113
- # Ajouter une courbe pour chaque site
114
- for site in sites:
115
- site_data = site_freq[site_freq['LIEU_DIT'] == site]
116
- site_data['MONTH_DAY'] = pd.Categorical(site_data['MONTH_DAY'], categories = months_days, ordered = True)
117
- site_data = site_data.sort_values('MONTH_DAY')
118
- fig.add_trace(go.Scatter(x = site_data['MONTH_DAY'], y = site_data['Detections'],
119
- mode = 'lines', name = site))
120
-
121
- # Mise à jour du layout
122
- fig.update_layout(
123
- xaxis_title = 'Jour de l\'année',
124
- yaxis_title = 'Nombre de détections',
125
- xaxis = dict(type = 'category', categoryorder = 'array', categoryarray = [md for md in months_days]),
126
- legend = dict(bgcolor = 'rgba(0, 0, 0, 0)'),
127
- #yaxis = dict(range = [0, global_freq['Global Detections'].max() + 10])
128
- )
129
- return fig
130
-
131
- def pie_controled(df_controls):
132
- species_counts = df_controls['CODE_ESP'].value_counts().reset_index()
133
- species_counts.columns = ['Species', 'Count']
134
-
135
- # Créer un diagramme circulaire
136
- fig = px.pie(species_counts,
137
- values = 'Count', names = 'Species',
138
- color_discrete_sequence = px.colors.qualitative.Pastel,
139
- hole = 0.5,)
140
-
141
- # Personnalisation supplémentaire
142
- fig.update_layout(legend_title_text = 'Espèce',
143
- showlegend = True,
144
- legend = dict(bgcolor = 'rgba(0, 0, 0, 0)')
145
- )
146
- return fig
147
-
148
- def pie_marked(df_individus):
149
- marked_species = df_individus.copy()
150
- species_counts = marked_species['CODE_ESP'].value_counts().reset_index()
151
- species_counts.columns = ['Species', 'Count']
152
-
153
- # Créer un diagramme circulaire
154
- fig = px.pie(species_counts,
155
- values = 'Count', names = 'Species',
156
- color_discrete_sequence = px.colors.qualitative.Pastel,
157
- hole = 0.5)
158
-
159
- # Personnalisation supplémentaire
160
- fig.update_layout(legend_title_text = 'Espèce',
161
- showlegend = True,
162
- legend = dict(bgcolor = 'rgba(0, 0, 0, 0)')
163
- )
164
- return fig
165
-
166
- def top_detection(df_controls):
167
- df_controls['NUM_PIT'] = "n° " + df_controls['NUM_PIT'].astype(str)
168
-
169
- # Obtenir les dix catégories les plus fréquentes avec leurs occurrences
170
- top_categories = df_controls['NUM_PIT'].value_counts().head(10)
171
-
172
- # Créer un DataFrame à partir des dix premières catégories
173
- df_top_categories = pd.DataFrame({'NUM_PIT': top_categories.index, 'Occurrences': top_categories.values})
174
- df_top_categories = df_top_categories.sort_values(by = 'Occurrences', ascending = False)
175
-
176
- # Créer le diagramme en barres horizontales
177
- fig = px.bar(df_top_categories, x = 'Occurrences', y = 'NUM_PIT', orientation = 'h',
178
- labels = {'Occurrences': "Nombre d'occurrences", 'NUM_PIT': ''},
179
- color = 'NUM_PIT', color_discrete_sequence = px.colors.qualitative.Set3)
180
-
181
- # Ajuster la hauteur en fonction du nombre de catégories (avec une hauteur minimale de 400 pixels)
182
- bar_height = 50 # Hauteur de chaque barre
183
- min_height = 400 # Hauteur minimale du graphique
184
- calculated_height = max(min_height, len(df_top_categories) * bar_height)
185
-
186
- # Mettre à jour la mise en page avec des marges ajustées
187
- fig.update_layout(
188
- height = calculated_height, # Hauteur dynamique
189
- showlegend = False,
190
- margin = dict(l = 200), # Augmenter la marge gauche pour mieux lire les annotations
191
- legend = dict(bgcolor = 'rgba(0, 0, 0, 0)')
192
- )
193
-
194
- return fig
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+ import plotly.express as px
3
+ import plotly.graph_objects as go
4
+ import plotly.io as pio
5
+
6
+ def detection_by_year(df_controls):
7
+ df_controls['YEAR'] = df_controls['DATE'].dt.year
8
+ grouped_data = df_controls.groupby(['YEAR', 'CODE_ESP']).size().reset_index(name = 'Detections')
9
+
10
+ fig = px.bar(grouped_data, x = 'YEAR', y = 'Detections', color = 'CODE_ESP',
11
+ labels = {'Detections': 'Nombre de détections', 'CODE_ESP': 'Espèce'},
12
+ )
13
+
14
+ fig.update_layout(
15
+ height = 400,
16
+ width = 400,
17
+ yaxis_title = 'Nombre de détections',
18
+ xaxis_title = None,
19
+ xaxis = {'type': 'category', 'tickmode': 'linear'}, # Afficher toutes les années
20
+ barmode = 'stack',
21
+ legend = dict(
22
+ bgcolor = 'rgba(0, 0, 0, 0)',
23
+ orientation = 'h', # Légende horizontale
24
+ x = 0.5, # Centrer la légende horizontalement
25
+ y = -0.2, # Placer la légende en dessous de la figure
26
+ xanchor = 'center', # Ancrer la légende au centre
27
+ yanchor = 'top' # Ancrer la légende au-dessus de l'axe x
28
+ ),
29
+ margin = dict(b = 100)
30
+ )
31
+
32
+ return fig
33
+
34
+ def capture_by_year(df_captures):
35
+ df_filtre = df_captures.copy()
36
+ df_filtre['YEAR'] = df_filtre['DATE'].dt.year
37
+ df_grouped = df_filtre.groupby(['YEAR', 'CODE_ESP'])['NUM_PIT'].nunique().reset_index()
38
+ df_grouped.rename(columns = {'NUM_PIT': 'Nombre d\'individus uniques'}, inplace = True)
39
+
40
+ fig = px.bar(df_grouped, x = 'YEAR', y = 'Nombre d\'individus uniques', color = 'CODE_ESP',
41
+ labels = {'Nombre d\'individus uniques': 'Nombre d\'individus uniques', 'CODE_ESP': 'Espèce'}
42
+ )
43
+
44
+ fig.update_layout(
45
+ height = 400,
46
+ width = 400,
47
+ yaxis_title = 'Nombre d\'individus uniques',
48
+ xaxis_title = None,
49
+ xaxis = {'type': 'category', 'tickmode': 'linear'}, # Afficher toutes les années
50
+ legend = dict(
51
+ bgcolor ='rgba(0, 0, 0, 0)',
52
+ orientation = 'h', # Légende horizontale
53
+ x = 0.5, # Centrer la légende horizontalement
54
+ y = -0.2, # Placer la légende en dessous de la figure
55
+ xanchor = 'center', # Ancrer la légende au centre
56
+ yanchor = 'top' # Ancrer la légende au-dessus de l'axe x
57
+ ),
58
+ margin = dict(b = 100)
59
+ )
60
+
61
+ return fig
62
+
63
+ def control_by_year(df_controls):
64
+ df_filtre = df_controls.copy()
65
+ df_filtre['YEAR'] = df_filtre['DATE'].dt.year
66
+ df_grouped = df_filtre.groupby(['YEAR', 'CODE_ESP'])['NUM_PIT'].nunique().reset_index()
67
+ df_grouped.rename(columns = {'NUM_PIT': 'Nombre d\'individus'}, inplace = True)
68
+
69
+ fig = px.bar(df_grouped, x = 'YEAR', y = 'Nombre d\'individus', color = 'CODE_ESP',
70
+ labels = {'Nombre d\'individus': 'Nombre d\'individus', 'CODE_ESP': 'Espèce'},
71
+ )
72
+
73
+ fig.update_layout(
74
+ height = 400,
75
+ width = 400,
76
+ yaxis_title = 'Nombre d\'individus',
77
+ xaxis_title = None,
78
+ xaxis = {'type': 'category', 'tickmode': 'linear'}, # Afficher toutes les années
79
+ legend = dict(
80
+ bgcolor = 'rgba(0, 0, 0, 0)',
81
+ orientation = 'h', # Légende horizontale
82
+ x = 0.5, # Centrer la légende horizontalement
83
+ y = -0.2, # Placer la légende en dessous de la figure
84
+ xanchor = 'center', # Ancrer la légende au centre
85
+ yanchor = 'top' # Ancrer la légende au-dessus de l'axe x
86
+ ),
87
+ margin = dict(b = 100)
88
+ )
89
+
90
+ return fig
91
+
92
+ def detection_frequencies(df_controls):
93
+ df_controls['DATE'] = pd.to_datetime(df_controls['DATE'], errors='coerce')
94
+ df_controls['MONTH_DAY'] = df_controls['DATE'].dt.strftime('%m-%d')
95
+ global_freq = df_controls.groupby('MONTH_DAY').size().reset_index(name = 'Global Detections')
96
+
97
+ # Calculer les fréquences par site
98
+ site_freq = df_controls.groupby(['MONTH_DAY', 'LIEU_DIT']).size().reset_index(name = 'Detections')
99
+ sites = site_freq['LIEU_DIT'].unique()
100
+
101
+ # Préparer l'ordre chronologique
102
+ months_days = pd.date_range('2021-01-01', '2021-12-31').strftime('%m-%d')
103
+ global_freq['MONTH_DAY'] = pd.Categorical(global_freq['MONTH_DAY'], categories = months_days, ordered = True)
104
+ global_freq = global_freq.sort_values('MONTH_DAY')
105
+
106
+ # Création du graphique
107
+ fig = go.Figure()
108
+
109
+ if len(site_freq['LIEU_DIT'].unique()) > 1:
110
+ # Ajouter la courbe globale
111
+ fig.add_trace(go.Scatter(x = global_freq['MONTH_DAY'], y = global_freq['Global Detections'],
112
+ mode = 'lines', name = 'Global'))
113
+
114
+ # Ajouter une courbe pour chaque site
115
+ for site in sites:
116
+ site_data = site_freq[site_freq['LIEU_DIT'] == site]
117
+ site_data['MONTH_DAY'] = pd.Categorical(site_data['MONTH_DAY'], categories = months_days, ordered = True)
118
+ site_data = site_data.sort_values('MONTH_DAY')
119
+ fig.add_trace(go.Scatter(x = site_data['MONTH_DAY'], y = site_data['Detections'],
120
+ mode = 'lines', name = site))
121
+
122
+ # Mise à jour du layout
123
+ fig.update_layout(
124
+ xaxis_title = 'Jour de l\'année',
125
+ yaxis_title = 'Nombre de détections',
126
+ xaxis = dict(type = 'category', categoryorder = 'array', categoryarray = [md for md in months_days]),
127
+ legend = dict(bgcolor = 'rgba(0, 0, 0, 0)'),
128
+ #yaxis = dict(range = [0, global_freq['Global Detections'].max() + 10])
129
+ )
130
+ return fig
131
+
132
+ def detection_frequencies_global(df_controls):
133
+ df_controls['DATE'] = pd.to_datetime(df_controls['DATE'], errors='coerce')
134
+ df_controls['MONTH_DAY'] = df_controls['DATE'].dt.strftime('%m-%d')
135
+ global_freq = df_controls.groupby('MONTH_DAY').size().reset_index(name = 'Global Detections')
136
+
137
+ # Calculer les fréquences par site
138
+ site_freq = df_controls.groupby(['MONTH_DAY', 'LIEU_DIT']).size().reset_index(name = 'Detections')
139
+ sites = site_freq['LIEU_DIT'].unique()
140
+
141
+ # Préparer l'ordre chronologique
142
+ months_days = pd.date_range('2021-01-01', '2021-12-31').strftime('%m-%d')
143
+ global_freq['MONTH_DAY'] = pd.Categorical(global_freq['MONTH_DAY'], categories = months_days, ordered = True)
144
+ global_freq = global_freq.sort_values('MONTH_DAY')
145
+
146
+ # Création du graphique
147
+ fig = go.Figure()
148
+
149
+ # Ajouter la courbe globale
150
+ fig.add_trace(go.Scatter(x = global_freq['MONTH_DAY'], y = global_freq['Global Detections'], mode = 'lines', name = 'Global'))
151
+
152
+ # Mise à jour du layout
153
+ fig.update_layout(
154
+ xaxis_title = 'Jour de l\'année',
155
+ yaxis_title = 'Nombre de détections',
156
+ xaxis = dict(type = 'category', categoryorder = 'array', categoryarray = [md for md in months_days]),
157
+ legend = dict(bgcolor = 'rgba(0, 0, 0, 0)'),
158
+ #yaxis = dict(range = [0, global_freq['Global Detections'].max() + 10])
159
+ )
160
+ return fig
161
+
162
+ def pie_controled(df_controls):
163
+ species_counts = df_controls['CODE_ESP'].value_counts().reset_index()
164
+ species_counts.columns = ['Species', 'Count']
165
+
166
+ # Créer un diagramme circulaire
167
+ fig = px.pie(species_counts,
168
+ values = 'Count', names = 'Species',
169
+ color_discrete_sequence = px.colors.qualitative.Pastel,
170
+ hole = 0.5,)
171
+
172
+ # Personnalisation supplémentaire
173
+ fig.update_layout(legend_title_text = 'Espèce',
174
+ showlegend = True,
175
+ legend = dict(bgcolor = 'rgba(0, 0, 0, 0)')
176
+ )
177
+ return fig
178
+
179
+ def pie_marked(df_individus):
180
+ marked_species = df_individus.copy()
181
+ species_counts = marked_species['CODE_ESP'].value_counts().reset_index()
182
+ species_counts.columns = ['Species', 'Count']
183
+
184
+ # Créer un diagramme circulaire
185
+ fig = px.pie(species_counts,
186
+ values = 'Count', names = 'Species',
187
+ color_discrete_sequence = px.colors.qualitative.Pastel,
188
+ hole = 0.5)
189
+
190
+ # Personnalisation supplémentaire
191
+ fig.update_layout(legend_title_text = 'Espèce',
192
+ showlegend = True,
193
+ legend = dict(bgcolor = 'rgba(0, 0, 0, 0)')
194
+ )
195
+ return fig
196
+
197
+ def top_detection(df_controls):
198
+ df_controls['NUM_PIT'] = "n° " + df_controls['NUM_PIT'].astype(str)
199
+
200
+ # Obtenir les dix catégories les plus fréquentes avec leurs occurrences
201
+ top_categories = df_controls['NUM_PIT'].value_counts().head(10)
202
+
203
+ # Créer un DataFrame à partir des dix premières catégories
204
+ df_top_categories = pd.DataFrame({'NUM_PIT': top_categories.index, 'Occurrences': top_categories.values})
205
+ df_top_categories = df_top_categories.sort_values(by = 'Occurrences', ascending = False)
206
+
207
+ # Créer le diagramme en barres horizontales
208
+ fig = px.bar(df_top_categories, x = 'Occurrences', y = 'NUM_PIT', orientation = 'h',
209
+ labels = {'Occurrences': "Nombre d'occurrences", 'NUM_PIT': ''},
210
+ color = 'NUM_PIT', color_discrete_sequence = px.colors.qualitative.Set3)
211
+
212
+ # Ajuster la hauteur en fonction du nombre de catégories (avec une hauteur minimale de 400 pixels)
213
+ bar_height = 50 # Hauteur de chaque barre
214
+ min_height = 400 # Hauteur minimale du graphique
215
+ calculated_height = max(min_height, len(df_top_categories) * bar_height)
216
+
217
+ # Mettre à jour la mise en page avec des marges ajustées
218
+ fig.update_layout(
219
+ height = calculated_height, # Hauteur dynamique
220
+ showlegend = False,
221
+ margin = dict(l = 200), # Augmenter la marge gauche pour mieux lire les annotations
222
+ legend = dict(bgcolor = 'rgba(0, 0, 0, 0)')
223
+ )
224
+
225
+ return fig