File size: 5,097 Bytes
a8dd5f5
 
 
 
9c23216
a8dd5f5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9c23216
 
 
a8dd5f5
9c23216
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import pandas as pd
import pandas as pd
import numpy as np

from utils.summary import get_meterological_summary, get_agricultural_yield_comparison
# Générer des dates sur 5 ans (historique) + 5 ans (prévision)
dates_past = pd.date_range(start="2023-01-01", periods=36, freq='ME')  # 3 ans d'historique
dates_future = pd.date_range(start="2023-01-01", periods=60, freq='ME')  # 5 ans de prévisions

# Température: Tendance à la hausse selon le scénario
def generate_temperature_trend(scenario):
    base_temp = 10 + 10 * np.sin(np.linspace(0, 2 * np.pi, len(dates_past) + len(dates_future)))
    if scenario == "optimiste":
        trend = base_temp + np.linspace(0, 1, len(base_temp))  # Faible réchauffement
    elif scenario == "modéré":
        trend = base_temp + np.linspace(0, 2, len(base_temp))  # Réchauffement moyen
    else:  # pessimiste
        trend = base_temp + np.linspace(0, 3, len(base_temp))  # Fort réchauffement
    return trend

# Précipitations: Variation selon le scénario
def generate_precipitation_trend(scenario):
    base_rain = 50 + 20 * np.cos(np.linspace(0, 2 * np.pi, len(dates_past) + len(dates_future)))
    if scenario == "optimiste":
        trend = base_rain - np.linspace(0, 5, len(base_rain))  # Légère baisse
    elif scenario == "modéré":
        trend = base_rain - np.linspace(0, 10, len(base_rain))  # Baisse moyenne
    else:  # pessimiste
        trend = base_rain - np.linspace(0, 15, len(base_rain))  # Forte baisse
    return trend

# Irradiance: Augmentation progressive
def generate_irradiance_trend(scenario):
    base_irradiance = 200 + 50 * np.sin(np.linspace(0, 2 * np.pi, len(dates_past) + len(dates_future)))
    if scenario == "optimiste":
        trend = base_irradiance + np.linspace(0, 5, len(base_irradiance))  # Faible augmentation
    elif scenario == "modéré":
        trend = base_irradiance + np.linspace(0, 10, len(base_irradiance))  # Augmentation modérée
    else:  # pessimiste
        trend = base_irradiance + np.linspace(0, 20, len(base_irradiance))  # Forte augmentation
    return trend

# Choix du scénario
scenario = "modéré"  # Changer entre "optimiste", "modéré" et "pessimiste"

# Créer les DataFrames
temperature_df = pd.DataFrame({"Date": dates_past.tolist() + dates_future.tolist(), 
                               "Température (°C)": generate_temperature_trend(scenario)})

rain_df = pd.DataFrame({"Date": dates_past.tolist() + dates_future.tolist(), 
                        "Précipitations (mm)": generate_precipitation_trend(scenario)})

irradiation_df = pd.DataFrame({"Date": dates_past.tolist() + dates_future.tolist(), 
                               "Irradiance (W/m²)": generate_irradiance_trend(scenario)})

# Afficher un extrait
print("Température (extrait) :")
print(temperature_df.head(3))
print("\nPrécipitations (extrait) :")
print(rain_df.head(3))
print("\nIrradiance (extrait) :")
print(irradiation_df.head(3))

if __name__ == "__main__":
    # summary = get_meterological_summary(scenario, temperature_df, rain_df, irradiation_df)
    # print(summary)

    # Example usage
    import pandas as pd
    import numpy as np

    from utils.soil_utils import find_nearest_point
    city = "Bourgogne Franche Comté"
    closest_soil_features = find_nearest_point(city)
    print(closest_soil_features)

    # Définir la période de 4 ans dans le passé + 15 ans dans le futur (19 ans)
    start_date = "2010-01"
    end_date = "2029-12"

    # Générer une série de dates mensuelles
    dates = pd.date_range(start=start_date, end=end_date, freq='M')

    # Générer des données fictives de rendement (en tonnes par hectare)
    np.random.seed(42)  # Pour reproductibilité

    # Tendance générale du rendement sans ombrage (augmentation progressive)
    trend = np.linspace(2.5, 3.2, len(dates))  # Augmente légèrement sur les années

    # Ajout de variations saisonnières et aléatoires
    seasonality = 0.3 * np.sin(np.linspace(0, 12 * np.pi, len(dates)))  # Effet saisonnier
    random_variation = np.random.normal(0, 0.1, len(dates))  # Bruit aléatoire

    # Calcul du rendement sans ombrage
    yield_no_shade = trend + seasonality + random_variation

    # Appliquer un effet d'ombrage (réduction de 10-20% du rendement)
    shade_factor = np.random.uniform(0.1, 0.2, len(dates))  # Entre 10% et 20% de réduction
    yield_with_shade = yield_no_shade * (1 - shade_factor)

    # Créer le DataFrame
    df = pd.DataFrame({
        "date": dates,
        "yield_no_shade": yield_no_shade,
        "yield_with_shade": yield_with_shade
    })
    water_deficit_data = pd.DataFrame()
    climate_data = pd.DataFrame()
    
    print(get_agricultural_yield_comparison(culture="orge", 
                                            region="bourgogne franche comté",
                                            water_df=water_deficit_data, 
                                            climate_df=climate_data,
                                            soil_df=closest_soil_features, 
                                            agri_yield_df=df))