diff --git a/Dashboards/demo_streamlit.py b/Dashboards/demo_streamlit.py
index 6a99117..bc14de5 100644
--- a/Dashboards/demo_streamlit.py
+++ b/Dashboards/demo_streamlit.py
@@ -7,29 +7,74 @@
# Source : https://discuss.streamlit.io/t/develop-a-dashboard-app-with-streamlit-using-plotly/37148/4
# run with : streamlit run Dashboards/demo_streamlit.py
+# Finalement > prendre les données issue de la vue
lichen_ecology = df.get_lichen_ecology()
+lichen_frequency = df.get_lichen_frequency()
-# Debug data
-# st.dataframe(df)
+# Calcul somme des fréquences
+def calc_frequences(df):
+ df_agg = df.groupby("main_lichenspecies").agg({
+ "id": "first",
+ "frequency": "sum"
+ }).reset_index()
-# Calculer les proportions des espèces selon leur tolérance à l'anthropisation
-artificialisation_proportions = lichen_ecology['poleotolerance'].value_counts(normalize=True) * 100
+ return df_agg
+
+calc_freq = calc_frequences(lichen_frequency)
+calc_freq = calc_freq[["main_lichenspecies", "frequency"]]
+
+def deg_artif(id_site: int, species_name : str):
+ # Calcul filtrable
+ freq = lichen_frequency[lichen_frequency["id"] == id_site]["frequency"].values[0]
+ freq_g = calc_freq[calc_freq["main_lichenspecies"] == species_name]["frequency"].values[0]
+
+ return round(freq / freq_g * 100, 2)
+
+
+# Sélection du site
+id_site = st.selectbox(
+ "Sur quel site voulez-vous ?",
+ lichen_frequency["id"],
+ index=None,
+ placeholder="site n°",
+)
+
+# Sélection des espèces
+species_name = st.selectbox(
+ "Sur quel espèce voulez-vous ?",
+ calc_freq["main_lichenspecies"],
+ index=None,
+ placeholder="Je sélectionne l'espèce...",
+)
+
+# Affichage des éléments
+if id_site and species_name != None:
+ pass
+else:
+ id_site = 460
+ species_name = "Physcia aipolia/stellaris"
+# le calcul
+artificialisation_proportions = deg_artif(id_site, species_name)
# # Dataviz charts
fig1 = go.Figure(go.Indicator(
domain = {'x': [0, 1], 'y': [0, 1]},
- value = artificialisation_proportions["intermediate"],
+ value = artificialisation_proportions,
mode = "gauge+number",
title = {'text': "Degré d'artificialisation"},
gauge = {'axis': {'range': [0, 100], 'dtick': 25},
'bar': {'color': "#000000"},
'steps' : [
- {'range': [0, 25], 'color': "#E3D7FF"},
- {'range': [25, 50], 'color': "#AFA2FF"},
- {'range': [50, 75], 'color': "#7A89C2"},
- {'range': [75, 100], 'color': "#72788D"}
+ # {'range': [0, 25], 'color': "#E3D7FF"},
+ # {'range': [25, 50], 'color': "#AFA2FF"},
+ # {'range': [50, 75], 'color': "#7A89C2"},
+ # {'range': [75, 100], 'color': "#72788D"}
+ {'range': [0, 25], 'color': "green"},
+ {'range': [25, 50], 'color': "yellow"},
+ {'range': [50, 75], 'color': "orange"},
+ {'range': [75, 100], 'color': "red"}
],
- 'threshold' : {'line': {'color': "#000000", 'width': 4}, 'thickness': 0.75, 'value': artificialisation_proportions["intermediate"]}
+ 'threshold' : {'line': {'color': "#000000", 'width': 4}, 'thickness': 0.75, 'value': artificialisation_proportions}
}))
x_values = [10, 8, 6, 5, 4, 3, 2, 1]
@@ -60,61 +105,16 @@
hand_length = np.sqrt(2) / 4
hand_angle = np.pi * (1 - (max(min_value, min(max_value, current_value)) - min_value) / (max_value - min_value))
-## Version 3 non retenue du code python
-# fig3 = go.Figure(
-# data=[
-# go.Pie(
-# values=[0.5] + (np.ones(n_quadrants) / 2 / n_quadrants).tolist(),
-# rotation=90,
-# hole=0.5,
-# marker_colors=quadrant_colors,
-# textinfo="text",
-# hoverinfo="skip",
-# ),
-# ],
-# layout=go.Layout(
-# showlegend=False,
-# margin=dict(b=0,t=10,l=10,r=10),
-# width=450,
-# height=450,
-# paper_bgcolor=plot_bgcolor,
-# annotations=[
-# go.layout.Annotation(
-# text=f"Degrés d'artificialisation:
{current_value} %",
-# x=0.5, xanchor="center", xref="paper",
-# y=0.25, yanchor="bottom", yref="paper",
-# showarrow=False,
-# )
-# ],
-# shapes=[
-# go.layout.Shape(
-# type="circle",
-# x0=0.48, x1=0.52,
-# y0=0.48, y1=0.52,
-# fillcolor="#333",
-# line_color="#333",
-# ),
-# go.layout.Shape(
-# type="line",
-# x0=0.5, x1=0.5 + hand_length * np.cos(hand_angle),
-# y0=0.5, y1=0.5 + hand_length * np.sin(hand_angle),
-# line=dict(color="#333", width=4)
-# )
-# ]
-# )
-# )
-
# Display streamlit
st.title("Dataviz POC")
-tab1, tab2, tab3= st.tabs(["Gauge", "Histogram", "df debug"])
+tab1, tab2, tab3= st.tabs(["Gauge", "Histogram", "df Fréquences"])
with tab1:
- st.write("**Mode de calcul**`df['poleotolerance'].value_counts(normalize=True) * 100`")
+ st.write(f"Degrés d'artificialisation sur le site n°**{id_site}** pour l'espèce **{species_name}**")
st.plotly_chart(fig1)
with tab2:
st.plotly_chart(fig2)
with tab3:
- st.write("Debug du dataset")
- # st.dataframe(df)
-
\ No newline at end of file
+ st.write("les données de fréquences")
+ st.write(calc_freq)
diff --git a/Dashboards/my_data/datasets.py b/Dashboards/my_data/datasets.py
index 4b138bd..cd92990 100644
--- a/Dashboards/my_data/datasets.py
+++ b/Dashboards/my_data/datasets.py
@@ -1,6 +1,7 @@
import pandas as pd
+from sqlalchemy import text
from my_data.db_connect import get_session
-from my_data.model import Tree, TreeSpecies, Observation, Lichen, LichenSpecies, Environment, Table, LichenEcology
+from my_data.model import Tree, TreeSpecies, Observation, Lichen, LichenSpecies, Environment, Table, LichenEcology, LichenFrequency
session = get_session()
@@ -100,7 +101,6 @@ def get_tree_species():
})
return pd.DataFrame(tree_species_data)
-# Nouvelles données
def get_lichen_ecology():
data = session.query(LichenEcology).all()
lichen_ecology_data = []
@@ -111,6 +111,17 @@ def get_lichen_ecology():
"pH": lichen_ecology.pH,
"aridity": lichen_ecology.aridity,
"eutrophication": lichen_ecology.eutrophication,
- "poleotolerance" : lichen_ecology.poleotolerance
+ "poleotolerance": lichen_ecology.poleotolerance
})
- return pd.DataFrame(lichen_ecology_data)
\ No newline at end of file
+ return pd.DataFrame(lichen_ecology_data)
+
+def get_lichen_frequency():
+ data = session.query(LichenFrequency).all()
+ lichen_frequency_data = []
+ for lichen_frequency in data:
+ lichen_frequency_data.append({
+ "id": lichen_frequency.id_site,
+ "main_lichenspecies": lichen_frequency.main_lichenspecies,
+ "frequency": lichen_frequency.frequency
+ })
+ return pd.DataFrame(lichen_frequency_data)
diff --git a/Dashboards/my_data/model.py b/Dashboards/my_data/model.py
index d7e13ff..7d72c4e 100644
--- a/Dashboards/my_data/model.py
+++ b/Dashboards/my_data/model.py
@@ -1,5 +1,6 @@
-from sqlalchemy import Column, BigInteger, Integer, String, ForeignKey, ARRAY, Boolean, Date, Text, Float
+from sqlalchemy import Column, BigInteger, Integer, String, ForeignKey, ARRAY, Boolean, Date, Text, Float, text
from sqlalchemy.orm import declarative_base, relationship
+from my_data.db_connect import engine
Base = declarative_base()
@@ -97,4 +98,13 @@ class LichenEcology(Base):
aridity = Column(String(255))
eutrophication = Column(String(255))
poleotolerance = Column(String(255))
-
\ No newline at end of file
+
+# Table pour les fréquences
+class LichenFrequency(Base):
+ __tablename__ = 'lichen_frequency'
+ __table_args__ = {'autoload_with': engine}
+
+ id = Column(BigInteger, primary_key=True, autoincrement=True)
+ id_site = Column(BigInteger)
+ main_lichenspecies = Column(String(255))
+ frequency = Column(BigInteger)
\ No newline at end of file
diff --git a/Dashboards/my_data/sql_stuff.sql b/Dashboards/my_data/sql_stuff.sql
new file mode 100644
index 0000000..75a5c95
--- /dev/null
+++ b/Dashboards/my_data/sql_stuff.sql
@@ -0,0 +1,58 @@
+-- Listing des modifications faites sur la base de données
+-- POC requête pour afficher les fréquences 17/07/2024
+SELECT
+ o.id AS id_site,
+ ls.name AS main_lichenspecies,
+ COUNT(l.id) AS frequency
+FROM
+ main_observation o
+ JOIN main_tree t ON o.id = t.observation_id
+ JOIN main_lichen l ON o.id = l.observation_id
+ JOIN main_lichenspecies ls ON l.species_id = ls.id
+
+GROUP BY
+ o.id, ls.name
+
+ORDER BY o.id, frequency DESC;
+
+-- Pour la commandline PSQL
+SELECT o.id AS id_site, ls.name AS main_lichenspecies, COUNT(l.id) AS frequency FROM main_observation o JOIN main_tree t ON o.id = t.observation_id JOIN main_lichen l ON o.id = l.observation_id JOIN main_lichenspecies ls ON l.species_id = ls.id GROUP BY o.id, ls.name ORDER BY o.id, frequency DESC;
+
+-- Créer une table view récupérable dans le modèle intégrée dans la base de données le 17/07/2024
+CREATE VIEW lichen_frequency AS
+SELECT
+ o.id AS id_site,
+ ls.name AS main_lichenspecies,
+ COUNT(l.id) AS frequency
+FROM
+ main_observation o
+ JOIN main_tree t ON o.id = t.observation_id
+ JOIN main_lichen l ON o.id = l.observation_id
+ JOIN main_lichenspecies ls ON l.species_id = ls.id
+GROUP BY
+ o.id, ls.name
+ORDER BY
+ o.id, frequency DESC;
+
+-- Pour la commandline PSQL
+CREATE VIEW lichen_frequency AS SELECT o.id AS id_site, ls.name AS main_lichenspecies, COUNT(l.id) AS frequency FROM main_observation o JOIN main_tree t ON o.id = t.observation_id JOIN main_lichen l ON o.id = l.observation_id JOIN main_lichenspecies ls ON l.species_id = ls.id GROUP BY o.id, ls.name ORDER BY o.id, frequency DESC;
+
+
+-- Update SQL command
+CREATE VIEW lichen_frequency AS
+SELECT
+ ROW_NUMBER() OVER (ORDER BY o.id, ls.name) AS id,
+ o.id AS id_site,
+ ls.name AS main_lichenspecies,
+ COUNT(l.id) AS frequency
+FROM
+ main_observation o
+ JOIN main_tree t ON o.id = t.observation_id
+ JOIN main_lichen l ON o.id = l.observation_id
+ JOIN main_lichenspecies ls ON l.species_id = ls.id
+GROUP BY
+ o.id, ls.name
+ORDER BY
+ o.id, frequency DESC;
+
+CREATE VIEW lichen_frequency AS SELECT ROW_NUMBER() OVER (ORDER BY o.id, ls.name) AS id, o.id AS id_site, ls.name AS main_lichenspecies, COUNT(l.id) AS frequency FROM main_observation o JOIN main_tree t ON o.id = t.observation_id JOIN main_lichen l ON o.id = l.observation_id JOIN main_lichenspecies ls ON l.species_id = ls.id GROUP BY o.id, ls.name ORDER BY o.id, frequency DESC;
diff --git a/Dashboards/tests/test.py b/Dashboards/tests/test.py
index c709ec3..ab0c0b6 100644
--- a/Dashboards/tests/test.py
+++ b/Dashboards/tests/test.py
@@ -6,7 +6,7 @@
chemin_dossier_parent = Path(__file__).parent.parent
sys.path.append(str(chemin_dossier_parent))
from my_data.db_connect import get_session
-from my_data.datasets import get_environment_data, get_lichen_data, get_lichen_species_data, get_observation_data, get_table_data, get_tree_data, get_tree_species, get_lichen_ecology
+from my_data.datasets import get_environment_data, get_lichen_data, get_lichen_species_data, get_observation_data, get_table_data, get_tree_data, get_tree_species, get_lichen_ecology, get_lichen_frequency
session = get_session()
@@ -19,28 +19,31 @@
tree_df = get_tree_data()
tree_species_df = get_tree_species()
lichen_ecology_df = get_lichen_ecology()
+lichen_frequency_df = get_lichen_frequency()
# Affichage des datasets > test dataset
-print("\nEnvironment Data")
-print(environment_df.head())
+# print("\nEnvironment Data")
+# print(environment_df.head())
-print("\nLichen Data")
-print(lichen_df.head())
+# print("\nLichen Data")
+# print(lichen_df.head())
-print("\nLichen Species Data")
-print(lichen_species_df.head())
+# print("\nLichen Species Data")
+# print(lichen_species_df.head())
-print("\nObservation Data")
-print(observation_df.head())
+# print("\nObservation Data")
+# print(observation_df.head())
-print("\nTable Data")
-print(table_df.head())
+# print("\nTable Data")
+# print(table_df.head())
-print("\nTree Data")
-print(tree_df.head())
+# print("\nTree Data")
+# print(tree_df.head())
-print("\nTree Species Data")
-print(tree_species_df.head())
+# print("\nTree Species Data")
+# print(tree_species_df.head())
-print("\nLichen Ecology Data")
-print(lichen_ecology_df)
+# print("\nLichen Ecology Data")
+# print(lichen_ecology_df)
+
+# Correction de l'appel de méthode