Rim BACCOUR commited on
Commit
a8dd5f5
·
unverified ·
1 Parent(s): 4daea17

first summary for meterological data

Browse files
Files changed (3) hide show
  1. prompts/summary_prompt.py +25 -0
  2. summary_test.py +66 -0
  3. utils/summary.py +46 -0
prompts/summary_prompt.py ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """ This file contains prompts for the different LLM """
2
+
3
+ metrological_data_summary_prompt = """
4
+ Tu es un expert en météorologie et en analyse climatique.
5
+ Ta mission est de fournir une synthèse détaillée de l’évolution des conditions météorologiques d’une région donnée.
6
+ Tu exploites trois indicateurs clés : la température, les précipitations et l’irradiance solaire.
7
+ Ces indicateurs sont fournis selon le scénario {scenario} parmi les 3 scénarii possibles (optimiste, modéré et pessimiste).
8
+
9
+ Voilà les données historiques + forecast:
10
+ - de la température,
11
+ - des précipications,
12
+ - de l'irradiance solaire
13
+
14
+ Chaque dataframe contient une partie historique jusqu'à la date {today} et un forecast selon le scénario métérologique {scenario}.
15
+
16
+ En te basant sur ces données disponibles, produis une synthèse claire et concise qui met en évidence:
17
+
18
+ - Le scénario du changement climatique donné en input.
19
+ - L’évolution passée et future des températures.
20
+ - L'évolution de la tendances des précipitations.
21
+ - Les variations de l’irradiance solaire.
22
+ avec des pourcentage de variation du futur par rapport aux années passées et en spécifiant les dates
23
+ Présente ta réponse sous un format structuré avec un résumé des tendances observées et des perspectives climatiques selon le scénario choisi."
24
+
25
+ """
summary_test.py ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+ import pandas as pd
3
+ import numpy as np
4
+
5
+ from utils.summary import get_summary
6
+ # Générer des dates sur 5 ans (historique) + 5 ans (prévision)
7
+ dates_past = pd.date_range(start="2023-01-01", periods=36, freq='ME') # 3 ans d'historique
8
+ dates_future = pd.date_range(start="2023-01-01", periods=60, freq='ME') # 5 ans de prévisions
9
+
10
+ # Température: Tendance à la hausse selon le scénario
11
+ def generate_temperature_trend(scenario):
12
+ base_temp = 10 + 10 * np.sin(np.linspace(0, 2 * np.pi, len(dates_past) + len(dates_future)))
13
+ if scenario == "optimiste":
14
+ trend = base_temp + np.linspace(0, 1, len(base_temp)) # Faible réchauffement
15
+ elif scenario == "modéré":
16
+ trend = base_temp + np.linspace(0, 2, len(base_temp)) # Réchauffement moyen
17
+ else: # pessimiste
18
+ trend = base_temp + np.linspace(0, 3, len(base_temp)) # Fort réchauffement
19
+ return trend
20
+
21
+ # Précipitations: Variation selon le scénario
22
+ def generate_precipitation_trend(scenario):
23
+ base_rain = 50 + 20 * np.cos(np.linspace(0, 2 * np.pi, len(dates_past) + len(dates_future)))
24
+ if scenario == "optimiste":
25
+ trend = base_rain - np.linspace(0, 5, len(base_rain)) # Légère baisse
26
+ elif scenario == "modéré":
27
+ trend = base_rain - np.linspace(0, 10, len(base_rain)) # Baisse moyenne
28
+ else: # pessimiste
29
+ trend = base_rain - np.linspace(0, 15, len(base_rain)) # Forte baisse
30
+ return trend
31
+
32
+ # Irradiance: Augmentation progressive
33
+ def generate_irradiance_trend(scenario):
34
+ base_irradiance = 200 + 50 * np.sin(np.linspace(0, 2 * np.pi, len(dates_past) + len(dates_future)))
35
+ if scenario == "optimiste":
36
+ trend = base_irradiance + np.linspace(0, 5, len(base_irradiance)) # Faible augmentation
37
+ elif scenario == "modéré":
38
+ trend = base_irradiance + np.linspace(0, 10, len(base_irradiance)) # Augmentation modérée
39
+ else: # pessimiste
40
+ trend = base_irradiance + np.linspace(0, 20, len(base_irradiance)) # Forte augmentation
41
+ return trend
42
+
43
+ # Choix du scénario
44
+ scenario = "modéré" # Changer entre "optimiste", "modéré" et "pessimiste"
45
+
46
+ # Créer les DataFrames
47
+ temperature_df = pd.DataFrame({"Date": dates_past.tolist() + dates_future.tolist(),
48
+ "Température (°C)": generate_temperature_trend(scenario)})
49
+
50
+ rain_df = pd.DataFrame({"Date": dates_past.tolist() + dates_future.tolist(),
51
+ "Précipitations (mm)": generate_precipitation_trend(scenario)})
52
+
53
+ irradiation_df = pd.DataFrame({"Date": dates_past.tolist() + dates_future.tolist(),
54
+ "Irradiance (W/m²)": generate_irradiance_trend(scenario)})
55
+
56
+ # Afficher un extrait
57
+ print("Température (extrait) :")
58
+ print(temperature_df.head(3))
59
+ print("\nPrécipitations (extrait) :")
60
+ print(rain_df.head(3))
61
+ print("\nIrradiance (extrait) :")
62
+ print(irradiation_df.head(3))
63
+
64
+
65
+ summary = get_summary(scenario, temperature_df, rain_df, irradiation_df)
66
+ print(summary)
utils/summary.py ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import pandas as pd
3
+ from datetime import datetime
4
+ from dotenv import load_dotenv
5
+ from langchain_core.output_parsers import StrOutputParser
6
+ from langchain.prompts import ChatPromptTemplate
7
+ from langchain.chat_models import ChatOpenAI
8
+ from prompts.summary_prompt import metrological_data_summary_prompt
9
+
10
+ load_dotenv()
11
+
12
+
13
+ def get_summary(scenario: str, temperature_df: pd.DataFrame, rain_df: pd.DataFrame, irradiance_df: pd.DataFrame) -> str:
14
+
15
+ today = datetime.today().strftime("%Y/%m/%d")
16
+
17
+ temp_data = temperature_df.head(len(temperature_df)).to_string(index=False)
18
+ rain_data = rain_df.head(len(rain_df)).to_string(index=False)
19
+ irradiance_data = irradiance_df.head(len(irradiance_df)).to_string(index=False)
20
+
21
+ llm = ChatOpenAI(
22
+ model="gpt-4o",
23
+ temperature=0,
24
+ max_tokens=None,
25
+ timeout=None,
26
+ max_retries=2,
27
+ api_key=os.environ.get("OPENAI_API_KEY")
28
+ )
29
+ output_parser = StrOutputParser()
30
+ prompt = ChatPromptTemplate.from_messages(
31
+ [
32
+ ("system", metrological_data_summary_prompt),
33
+ ("human", "Je veux un résumé de ces prévisions métérologique: les données de temperature {temp_data}, les données de précipitation {rain_data}, les données de radiance solaire {irradiance_data}")
34
+ ]
35
+ )
36
+ chain = prompt | llm | output_parser
37
+
38
+ response = chain.invoke({
39
+ "scenario": scenario,
40
+ "today": today,
41
+ "temp_data": temp_data,
42
+ "rain_data": rain_data,
43
+ "irradiance_data": irradiance_data
44
+ })
45
+
46
+ return output_parser.parse(response)