Pour dimensionner correctement le stockage, il convient d'abord d'avoir des informations sur les précipitations "moyennes" des années précédentes.<br /><br />Pour cela, on fournit le bout de code python suivant (valable avec les données météo france mais adaptable à d'autres données météos ailleurs, le synop étant un encodage de données utilisé par l'OMM): <br /><br /><pre><br />import math<br />import os<br />import pandas as pd<br /><br /># Attention si vous utilisez ce bout de code dans d'autres pays que la france, il faut ajouter<br /># les stations météos adhoc<br /><br /># Processing des data<br />print("\nprocessing des data\n")<br />files=os.listdir('.')<br />csv=[a for a in files if a[-3:]=='csv']<br />combined_df = pd.concat((pd.read_csv(f,sep=';') for f in csv), ignore_index=True)<br />#07510 bordeaux<br />#07535 gourdon<br /><br />#stations météos "hard coded"<br />stations=[{'ID': '07005', 'Nom': 'ABBEVILLE', 'Latitude': '50.136000', 'Longitude': '1.834000', 'Altitude': '69'}, {'ID': '07015', 'Nom': 'LILLE-LESQUIN', 'Latitude': '50.570000', 'Longitude': '3.097500', 'Altitude': '47'}, {'ID': '07020', 'Nom': 'PTE DE LA HAGUE', 'Latitude': '49.725167', 'Longitude': '-1.939833', 'Altitude': '6'}, {'ID': '07027', 'Nom': 'CAEN-CARPIQUET', 'Latitude': '49.180000', 'Longitude': '-0.456167', 'Altitude': '67'}, {'ID': '07037', 'Nom': 'ROUEN-BOOS', 'Latitude': '49.383000', 'Longitude': '1.181667', 'Altitude': '151'}, {'ID': '07072', 'Nom': 'REIMS-PRUNAY', 'Latitude': '49.209667', 'Longitude': '4.155333', 'Altitude': '95'}, {'ID': '07110', 'Nom': 'BREST-GUIPAVAS', 'Latitude': '48.444167', 'Longitude': '-4.412000', 'Altitude': '94'}, {'ID': '07117', 'Nom': "PLOUMANAC'H", 'Latitude': '48.825833', 'Longitude': '-3.473167', 'Altitude': '55'}, {'ID': '07130', 'Nom': 'RENNES-ST JACQUES', 'Latitude': '48.068833', 'Longitude': '-1.734000', 'Altitude': '36'}, {'ID': '07139', 'Nom': 'ALENCON', 'Latitude': '48.445500', 'Longitude': '0.110167', 'Altitude': '143'}, {'ID': '07149', 'Nom': 'ORLY', 'Latitude': '48.716833', 'Longitude': '2.384333', 'Altitude': '89'}, {'ID': '07168', 'Nom': 'TROYES-BARBEREY', 'Latitude': '48.324667', 'Longitude': '4.020000', 'Altitude': '112'}, {'ID': '07181', 'Nom': 'NANCY-OCHEY', 'Latitude': '48.581000', 'Longitude': '5.959833', 'Altitude': '336'}, {'ID': '07190', 'Nom': 'STRASBOURG-ENTZHEIM', 'Latitude': '48.549500', 'Longitude': '7.640333', 'Altitude': '150'}, {'ID': '07207', 'Nom': 'BELLE ILE-LE TALUT', 'Latitude': '47.294333', 'Longitude': '-3.218333', 'Altitude': '34'}, {'ID': '07222', 'Nom': 'NANTES-BOUGUENAIS', 'Latitude': '47.150000', 'Longitude': '-1.608833', 'Altitude': '26'}, {'ID': '07240', 'Nom': 'TOURS', 'Latitude': '47.444500', 'Longitude': '0.727333', 'Altitude': '108'}, {'ID': '07255', 'Nom': 'BOURGES', 'Latitude': '47.059167', 'Longitude': '2.359833', 'Altitude': '161'}, {'ID': '07280', 'Nom': 'DIJON-LONGVIC', 'Latitude': '47.267833', 'Longitude': '5.088333', 'Altitude': '219'}, {'ID': '07299', 'Nom': 'BALE-MULHOUSE', 'Latitude': '47.614333', 'Longitude': '7.510000', 'Altitude': '263'}, {'ID': '07314', 'Nom': 'PTE DE CHASSIRON', 'Latitude': '46.046833', 'Longitude': '-1.411500', 'Altitude': '11'}, {'ID': '07335', 'Nom': 'POITIERS-BIARD', 'Latitude': '46.593833', 'Longitude': '0.314333', 'Altitude': '123'}, {'ID': '07434', 'Nom': 'LIMOGES-BELLEGARDE', 'Latitude': '45.861167', 'Longitude': '1.175000', 'Altitude': '402'}, {'ID': '07460', 'Nom': 'CLERMONT-FD', 'Latitude': '45.786833', 'Longitude': '3.149333', 'Altitude': '331'}, {'ID': '07471', 'Nom': 'LE PUY-LOUDES', 'Latitude': '45.074500', 'Longitude': '3.764000', 'Altitude': '833'}, {'ID': '07481', 'Nom': 'LYON-ST EXUPERY', 'Latitude': '45.726500', 'Longitude': '5.077833', 'Altitude': '235'}, {'ID': '07510', 'Nom': 'BORDEAUX-MERIGNAC', 'Latitude': '44.830667', 'Longitude': '-0.691333', 'Altitude': '47'}, {'ID': '07535', 'Nom': 'GOURDON', 'Latitude': '44.745000', 'Longitude': '1.396667', 'Altitude': '260'}, {'ID': '07558', 'Nom': 'MILLAU', 'Latitude': '44.118500', 'Longitude': '3.019500', 'Altitude': '712'}, {'ID': '07577', 'Nom': 'MONTELIMAR', 'Latitude': '44.581167', 'Longitude': '4.733000', 'Altitude': '73'}, {'ID': '07591', 'Nom': 'EMBRUN', 'Latitude': '44.565667', 'Longitude': '6.502333', 'Altitude': '871'}, {'ID': '07607', 'Nom': 'MONT-DE-MARSAN', 'Latitude': '43.909833', 'Longitude': '-0.500167', 'Altitude': '59'}, {'ID': '07621', 'Nom': 'TARBES-OSSUN', 'Latitude': '43.188000', 'Longitude': '0.000000', 'Altitude': '360'}, {'ID': '07627', 'Nom': 'ST GIRONS', 'Latitude': '43.005333', 'Longitude': '1.106833', 'Altitude': '414'}, {'ID': '07630', 'Nom': 'TOULOUSE-BLAGNAC', 'Latitude': '43.621000', 'Longitude': '1.378833', 'Altitude': '151'}, {'ID': '07643', 'Nom': 'MONTPELLIER', 'Latitude': '43.577000', 'Longitude': '3.963167', 'Altitude': '2'}, {'ID': '07650', 'Nom': 'MARIGNANE', 'Latitude': '43.437667', 'Longitude': '5.216000', 'Altitude': '9'}, {'ID': '07661', 'Nom': 'CAP CEPET', 'Latitude': '43.079333', 'Longitude': '5.940833', 'Altitude': '115'}, {'ID': '07690', 'Nom': 'NICE', 'Latitude': '43.648833', 'Longitude': '7.209000', 'Altitude': '2'}, {'ID': '07747', 'Nom': 'PERPIGNAN', 'Latitude': '42.737167', 'Longitude': '2.872833', 'Altitude': '42'}, {'ID': '07761', 'Nom': 'AJACCIO', 'Latitude': '41.918000', 'Longitude': '8.792667', 'Altitude': '5'}, {'ID': '07790', 'Nom': 'BASTIA', 'Latitude': '42.540667', 'Longitude': '9.485167', 'Altitude': '10'}, {'ID': '61968', 'Nom': 'GLORIEUSES', 'Latitude': '-11.582667', 'Longitude': '47.289667', 'Altitude': '3'}, {'ID': '61970', 'Nom': 'JUAN DE NOVA', 'Latitude': '-17.054667', 'Longitude': '42.712000', 'Altitude': '9'}, {'ID': '61972', 'Nom': 'EUROPA', 'Latitude': '-22.344167', 'Longitude': '40.340667', 'Altitude': '6'}, {'ID': '61976', 'Nom': 'TROMELIN', 'Latitude': '-15.887667', 'Longitude': '54.520667', 'Altitude': '7'}, {'ID': '61980', 'Nom': 'GILLOT-AEROPORT', 'Latitude': '-20.892500', 'Longitude': '55.528667', 'Altitude': '8'}, {'ID': '61996', 'Nom': 'NOUVELLE AMSTERDAM', 'Latitude': '-37.795167', 'Longitude': '77.569167', 'Altitude': '27'}, {'ID': '61997', 'Nom': 'CROZET', 'Latitude': '-46.432500', 'Longitude': '51.856667', 'Altitude': '146'}, {'ID': '61998', 'Nom': 'KERGUELEN', 'Latitude': '-49.352333', 'Longitude': '70.243333', 'Altitude': '29'}, {'ID': '67005', 'Nom': 'PAMANDZI', 'Latitude': '-12.805500', 'Longitude': '45.282833', 'Altitude': '7'}, {'ID': '71805', 'Nom': 'ST-PIERRE', 'Latitude': '46.766333', 'Longitude': '-56.179167', 'Altitude': '21'}, {'ID': '78890', 'Nom': 'LA DESIRADE METEO', 'Latitude': '16.335000', 'Longitude': '-61.004000', 'Altitude': '27'}, {'ID': '78894', 'Nom': 'ST-BARTHELEMY METEO', 'Latitude': '17.901500', 'Longitude': '-62.852167', 'Altitude': '44'}, {'ID': '78897', 'Nom': 'LE RAIZET AERO', 'Latitude': '16.264000', 'Longitude': '-61.516333', 'Altitude': '11'}, {'ID': '78922', 'Nom': 'TRINITE-CARAVEL', 'Latitude': '14.774500', 'Longitude': '-60.875333', 'Altitude': '26'}, {'ID': '78925', 'Nom': 'LAMENTIN-AERO', 'Latitude': '14.595333', 'Longitude': '-60.995667', 'Altitude': '3'}, {'ID': '81401', 'Nom': 'SAINT LAURENT', 'Latitude': '5.485500', 'Longitude': '-54.031667', 'Altitude': '5'}, {'ID': '81405', 'Nom': 'CAYENNE-MATOURY', 'Latitude': '4.822333', 'Longitude': '-52.365333', 'Altitude': '4'}, {'ID': '81408', 'Nom': 'SAINT GEORGES', 'Latitude': '3.890667', 'Longitude': '-51.804667', 'Altitude': '6'}, {'ID': '81415', 'Nom': 'MARIPASOULA', 'Latitude': '3.640167', 'Longitude': '-54.028333', 'Altitude': '106'}, {'ID': '89642', 'Nom': "DUMONT D'URVILLE", 'Latitude': '-66.663167', 'Longitude': '140.001000', 'Altitude': '43'}]<br /><br /><br />def distance(lat1, lon1, lat2, lon2):<br /> """<br /> Calcule la distance entre deux points géographiques en utilisant la formule de la distance euclidienne.<br /> """<br /> return math.sqrt((lat2 - lat1)**2 + (lon2 - lon1)**2)<br /><br />def station_la_plus_proche(x, y, stations):<br /> """<br /> Trouve la station météo la plus proche en utilisant les coordonnées x et y (latitude et longitude).<br /> """<br /> distance_min = float('inf')<br /> station_proche = None<br /> <br /> for station in stations:<br /> lat_station = float(station['Latitude'])<br /> lon_station = float(station['Longitude'])<br /> d = distance(x, y, lat_station, lon_station)<br /> if d < distance_min:<br /> distance_min = d<br /> station_proche = station<br /> <br /> return station_proche<br /><br /># Demander à l'utilisateur d'entrer la latitude et la longitude<br />x_input = input("Entrez la latitude de votre lieux: ")<br />y_input = input("Entrez la longitude de votre lieux: ")<br /><br /># Remplacer les virgules par des points<br />x_input = float(x_input.replace(',', '.'))<br />y_input = float(y_input.replace(',', '.'))<br /><br /># Utilisez les valeurs entrées par l'utilisateur comme variables x et y pour trouver la station météo la plus proche<br />station_proche = station_la_plus_proche(x_input, y_input, stations)<br />print("La station météo la plus proche est:", station_proche['Nom']) <br /><br />result=combined_df[combined_df['numer_sta']==int(station_proche['ID'])]<br /><br /># Convertir la colonne 'date_column' dans un format datetime et la mettre en index trié<br />result['datetime'] = pd.to_datetime(result['date'], format='%Y%m%d%H%M%S')<br />result.set_index('datetime', inplace=True)<br />result = result.sort_index()<br /><br /># remplacer les données manquantes par 0<br />result['rr3']=result['rr3'].replace('mq','0')<br />result['rr3']=result['rr3'].astype('float')<br /><br /># Ne garder que la colonne des précipitations des 3 dernieres heures<br />result=result['rr3']<br /><br /># Calculer les sommes de précipitations par jour<br />resultday=result.resample('D').sum()<br />print("\nMoyenne par jour (mm):\n", resultday.mean())<br />print("Minimum par jour (mm):\n", resultday.min())<br />print("Maximum par jour (mm):\n", resultday.max())<br /><br /><br /># Calculer les sommes de précipitations par semaine<br />resultweek=result.resample('W').sum()<br /><br /># Calculer les sommes de précipitations par mois<br />resultmonth=result.resample('ME').sum()<br /><br /># Calculer les sommes de précipitations par trimestre<br />resulttrim=result.resample('QE').sum()<br />resulttrim=resulttrim.rename_axis('trimestre')<br />print(resulttrim)<br /><br /># Calculer les sommes de précipitations par an<br />resultyear=result.resample('YE').sum()<br />print("\nPrécipitations annuelles moyennes (mm):\n",resultyear.mean())<br /><br /># Calculer le nombre de jours consécutifs maximum sans pluie<br />max_streak = 0<br />current_streak = 0<br />for value in resultday:<br /> if value == 0:<br /> current_streak += 1<br /> max_streak = max(max_streak, current_streak)<br /> else:<br /> current_streak = 0 # Reset the streak if the value is not zero<br />print(f"\nNombre de jours consecutifs maximum sans pluie: {max_streak}")<br /><br /># Moyenne par trimestre pour chaque trimestre<br />moyenne_trimestrielle_par_trimestre = resulttrim.groupby(resulttrim.index.quarter).mean()<br /><br /># Minimum par trimestre pour chaque trimestre<br />min_trimestrielle_par_trimestre = resulttrim.groupby(resulttrim.index.quarter).min()<br /><br /># Maximum par trimestre pour chaque trimestre<br />max_trimestrielle_par_trimestre = resulttrim.groupby(resulttrim.index.quarter).max()<br /><br /># Imprimer les résultats<br />print("\nMoyenne par trimestre pour chaque trimestre (mm):\n", moyenne_trimestrielle_par_trimestre)<br />print("\nMinimum par trimestre pour chaque trimestre (mm):\n", min_trimestrielle_par_trimestre)<br />print("\nMaximum par trimestre pour chaque trimestre (mm):\n", max_trimestrielle_par_trimestre)<br /><br /># Minimum par jour pour chaque trimestre<br />min_par_jour_par_trimestre = resultday.groupby(resultday.index.quarter).min()<br />min_par_jour_par_trimestre=min_par_jour_par_trimestre.rename_axis('trimestre')<br /><br /># Maximum par jour pour chaque trimestre<br />max_par_jour_par_trimestre = resultday.groupby(resultday.index.quarter).max()<br />max_par_jour_par_trimestre=max_par_jour_par_trimestre.rename_axis('trimestre')<br /><br /># Moyenne par jour pour chaque trimestre<br />moyenne_par_jour_par_trimestre = resultday.groupby(resultday.index.quarter).mean()<br />moyenne_par_jour_par_trimestre=moyenne_par_jour_par_trimestre.rename_axis('trimestre')<br /><br /># Imprimer les résultats<br />print("\nMinimum par jour pour chaque trimestre (mm):\n", min_par_jour_par_trimestre)<br />print("\nMaximum par jour pour chaque trimestre (mm):\n", max_par_jour_par_trimestre)<br />print("\nMoyenne par jour pour chaque trimestre (mm):\n", moyenne_par_jour_par_trimestre)<br /><br /></pre><br /><br />Pour la latitude 44.2 et longitude 0.6 on obtient: <br /><br /><pre><br />processing des data<br /><br />Entrez la latitude de votre lieux: 44.2<br />Entrez la longitude de votre lieux: 0.6<br />La station météo la plus proche est: GOURDON<br /><br />Moyenne par jour (mm):<br /> 2.022896963663514<br />Minimum par jour (mm):<br /> -0.6000000000000001<br />Maximum par jour (mm):<br /> 55.0<br />trimestre<br />2010-03-31 202.0<br />2010-06-30 245.4<br />2010-09-30 132.2<br />2010-12-31 201.2<br />2011-03-31 126.7<br />2011-06-30 102.2<br />2011-09-30 164.6<br />2011-12-31 207.0<br />2012-03-31 99.8<br />2012-06-30 341.0<br />2012-09-30 100.0<br />2012-12-31 188.8<br />2013-03-31 248.4<br />2013-06-30 307.5<br />2013-09-30 136.6<br />2013-12-31 247.8<br />2014-03-31 253.8<br />2014-06-30 201.8<br />2014-09-30 192.8<br />2014-12-31 139.0<br />2015-03-31 176.4<br />2015-06-30 155.7<br />2015-09-30 184.6<br />2015-12-31 82.6<br />2016-03-31 322.1<br />2016-06-30 300.4<br />2016-09-30 29.0<br />2016-12-31 115.1<br />2017-03-31 213.0<br />2017-06-30 216.3<br />2017-09-30 133.2<br />2017-12-31 155.3<br />2018-03-31 252.8<br />2018-06-30 251.9<br />2018-09-30 103.7<br />2018-12-31 199.3<br />2019-03-31 100.1<br />2019-06-30 203.5<br />2019-09-30 138.8<br />2019-12-31 350.9<br />2020-03-31 149.5<br />2020-06-30 150.9<br />2020-09-30 66.9<br />2020-12-31 237.4<br />Freq: QE-DEC, Name: rr3, dtype: float64<br /><br />Précipitations annuelles moyennes (mm):<br /> 738.9090909090909<br /><br />Nombre de jours consecutifs maximum sans pluie: 44<br /><br />Moyenne par trimestre pour chaque trimestre (mm):<br /> trimestre<br />1 194.963636<br />2 225.145455<br />3 125.672727<br />4 193.127273<br />Name: rr3, dtype: float64<br /><br />Minimum par trimestre pour chaque trimestre (mm):<br /> trimestre<br />1 99.8<br />2 102.2<br />3 29.0<br />4 82.6<br />Name: rr3, dtype: float64<br /><br />Maximum par trimestre pour chaque trimestre (mm):<br /> trimestre<br />1 322.1<br />2 341.0<br />3 192.8<br />4 350.9<br />Name: rr3, dtype: float64<br /><br />Minimum par jour pour chaque trimestre (mm):<br /> trimestre<br />1 -0.6<br />2 -0.4<br />3 -0.3<br />4 -0.5<br />Name: rr3, dtype: float64<br /><br />Maximum par jour pour chaque trimestre (mm):<br /> trimestre<br />1 42.8<br />2 55.0<br />3 50.2<br />4 28.0<br />Name: rr3, dtype: float64<br /><br />Moyenne par jour pour chaque trimestre (mm):<br /> trimestre<br />1 2.159718<br />2 2.474126<br />3 1.366008<br />4 2.099209<br />Name: rr3, dtype: float64<br /></pre> , Le bout de code python amélioré est le suivant (les commentaires expliquent chaque etape).<br /><br />Pour expliquer un peu l’étape de l’itération :<br />On démarre aux volume0 de capacité et surface0 de surface précalculées dans l’étape précédente.<br />On fait des boucles d'itérations sur les données de précipitations et chaque jour on fait la soustraction <br />eau recupérée-consommation journalière+consommation estivale si en periode estivale<br />En cas de tarissement: <br />on a une première boucle d’iteration 6 fois de +33 % de la surface, et pour chaque itération de surface, on a une deuxième boucle d’iteration 40 fois de +50 % du volume. On s’arrete à chaque boucle d’iteration dès que le dimensionnement convient et on enregistre le resultat.<br />On affiche les résultats à la fin des itérations.<br /><br /><br /><pre><br />import math<br />import os<br />import pandas as pd<br />import time<br /># Attention si vous utilisez ce bout de code dans d'autres pays que la france, il faut ajouter<br /># les stations météos adhoc<br /><br /># Processing des data<br />print("\nprocessing des data\n")<br />files=os.listdir('.')<br />csv=[a for a in files if a[-3:]=='csv']<br />combined_df = pd.concat((pd.read_csv(f,sep=';') for f in csv), ignore_index=True)<br />#07510 bordeaux<br />#07535 gourdon<br /><br />#stations météos "hard coded"<br />stations=[{'ID': '07005', 'Nom': 'ABBEVILLE', 'Latitude': '50.136000', 'Longitude': '1.834000', 'Altitude': '69'}, {'ID': '07015', 'Nom': 'LILLE-LESQUIN', 'Latitude': '50.570000', 'Longitude': '3.097500', 'Altitude': '47'}, {'ID': '07020', 'Nom': 'PTE DE LA HAGUE', 'Latitude': '49.725167', 'Longitude': '-1.939833', 'Altitude': '6'}, {'ID': '07027', 'Nom': 'CAEN-CARPIQUET', 'Latitude': '49.180000', 'Longitude': '-0.456167', 'Altitude': '67'}, {'ID': '07037', 'Nom': 'ROUEN-BOOS', 'Latitude': '49.383000', 'Longitude': '1.181667', 'Altitude': '151'}, {'ID': '07072', 'Nom': 'REIMS-PRUNAY', 'Latitude': '49.209667', 'Longitude': '4.155333', 'Altitude': '95'}, {'ID': '07110', 'Nom': 'BREST-GUIPAVAS', 'Latitude': '48.444167', 'Longitude': '-4.412000', 'Altitude': '94'}, {'ID': '07117', 'Nom': "PLOUMANAC'H", 'Latitude': '48.825833', 'Longitude': '-3.473167', 'Altitude': '55'}, {'ID': '07130', 'Nom': 'RENNES-ST JACQUES', 'Latitude': '48.068833', 'Longitude': '-1.734000', 'Altitude': '36'}, {'ID': '07139', 'Nom': 'ALENCON', 'Latitude': '48.445500', 'Longitude': '0.110167', 'Altitude': '143'}, {'ID': '07149', 'Nom': 'ORLY', 'Latitude': '48.716833', 'Longitude': '2.384333', 'Altitude': '89'}, {'ID': '07168', 'Nom': 'TROYES-BARBEREY', 'Latitude': '48.324667', 'Longitude': '4.020000', 'Altitude': '112'}, {'ID': '07181', 'Nom': 'NANCY-OCHEY', 'Latitude': '48.581000', 'Longitude': '5.959833', 'Altitude': '336'}, {'ID': '07190', 'Nom': 'STRASBOURG-ENTZHEIM', 'Latitude': '48.549500', 'Longitude': '7.640333', 'Altitude': '150'}, {'ID': '07207', 'Nom': 'BELLE ILE-LE TALUT', 'Latitude': '47.294333', 'Longitude': '-3.218333', 'Altitude': '34'}, {'ID': '07222', 'Nom': 'NANTES-BOUGUENAIS', 'Latitude': '47.150000', 'Longitude': '-1.608833', 'Altitude': '26'}, {'ID': '07240', 'Nom': 'TOURS', 'Latitude': '47.444500', 'Longitude': '0.727333', 'Altitude': '108'}, {'ID': '07255', 'Nom': 'BOURGES', 'Latitude': '47.059167', 'Longitude': '2.359833', 'Altitude': '161'}, {'ID': '07280', 'Nom': 'DIJON-LONGVIC', 'Latitude': '47.267833', 'Longitude': '5.088333', 'Altitude': '219'}, {'ID': '07299', 'Nom': 'BALE-MULHOUSE', 'Latitude': '47.614333', 'Longitude': '7.510000', 'Altitude': '263'}, {'ID': '07314', 'Nom': 'PTE DE CHASSIRON', 'Latitude': '46.046833', 'Longitude': '-1.411500', 'Altitude': '11'}, {'ID': '07335', 'Nom': 'POITIERS-BIARD', 'Latitude': '46.593833', 'Longitude': '0.314333', 'Altitude': '123'}, {'ID': '07434', 'Nom': 'LIMOGES-BELLEGARDE', 'Latitude': '45.861167', 'Longitude': '1.175000', 'Altitude': '402'}, {'ID': '07460', 'Nom': 'CLERMONT-FD', 'Latitude': '45.786833', 'Longitude': '3.149333', 'Altitude': '331'}, {'ID': '07471', 'Nom': 'LE PUY-LOUDES', 'Latitude': '45.074500', 'Longitude': '3.764000', 'Altitude': '833'}, {'ID': '07481', 'Nom': 'LYON-ST EXUPERY', 'Latitude': '45.726500', 'Longitude': '5.077833', 'Altitude': '235'}, {'ID': '07510', 'Nom': 'BORDEAUX-MERIGNAC', 'Latitude': '44.830667', 'Longitude': '-0.691333', 'Altitude': '47'}, {'ID': '07535', 'Nom': 'GOURDON', 'Latitude': '44.745000', 'Longitude': '1.396667', 'Altitude': '260'}, {'ID': '07558', 'Nom': 'MILLAU', 'Latitude': '44.118500', 'Longitude': '3.019500', 'Altitude': '712'}, {'ID': '07577', 'Nom': 'MONTELIMAR', 'Latitude': '44.581167', 'Longitude': '4.733000', 'Altitude': '73'}, {'ID': '07591', 'Nom': 'EMBRUN', 'Latitude': '44.565667', 'Longitude': '6.502333', 'Altitude': '871'}, {'ID': '07607', 'Nom': 'MONT-DE-MARSAN', 'Latitude': '43.909833', 'Longitude': '-0.500167', 'Altitude': '59'}, {'ID': '07621', 'Nom': 'TARBES-OSSUN', 'Latitude': '43.188000', 'Longitude': '0.000000', 'Altitude': '360'}, {'ID': '07627', 'Nom': 'ST GIRONS', 'Latitude': '43.005333', 'Longitude': '1.106833', 'Altitude': '414'}, {'ID': '07630', 'Nom': 'TOULOUSE-BLAGNAC', 'Latitude': '43.621000', 'Longitude': '1.378833', 'Altitude': '151'}, {'ID': '07643', 'Nom': 'MONTPELLIER', 'Latitude': '43.577000', 'Longitude': '3.963167', 'Altitude': '2'}, {'ID': '07650', 'Nom': 'MARIGNANE', 'Latitude': '43.437667', 'Longitude': '5.216000', 'Altitude': '9'}, {'ID': '07661', 'Nom': 'CAP CEPET', 'Latitude': '43.079333', 'Longitude': '5.940833', 'Altitude': '115'}, {'ID': '07690', 'Nom': 'NICE', 'Latitude': '43.648833', 'Longitude': '7.209000', 'Altitude': '2'}, {'ID': '07747', 'Nom': 'PERPIGNAN', 'Latitude': '42.737167', 'Longitude': '2.872833', 'Altitude': '42'}, {'ID': '07761', 'Nom': 'AJACCIO', 'Latitude': '41.918000', 'Longitude': '8.792667', 'Altitude': '5'}, {'ID': '07790', 'Nom': 'BASTIA', 'Latitude': '42.540667', 'Longitude': '9.485167', 'Altitude': '10'}, {'ID': '61968', 'Nom': 'GLORIEUSES', 'Latitude': '-11.582667', 'Longitude': '47.289667', 'Altitude': '3'}, {'ID': '61970', 'Nom': 'JUAN DE NOVA', 'Latitude': '-17.054667', 'Longitude': '42.712000', 'Altitude': '9'}, {'ID': '61972', 'Nom': 'EUROPA', 'Latitude': '-22.344167', 'Longitude': '40.340667', 'Altitude': '6'}, {'ID': '61976', 'Nom': 'TROMELIN', 'Latitude': '-15.887667', 'Longitude': '54.520667', 'Altitude': '7'}, {'ID': '61980', 'Nom': 'GILLOT-AEROPORT', 'Latitude': '-20.892500', 'Longitude': '55.528667', 'Altitude': '8'}, {'ID': '61996', 'Nom': 'NOUVELLE AMSTERDAM', 'Latitude': '-37.795167', 'Longitude': '77.569167', 'Altitude': '27'}, {'ID': '61997', 'Nom': 'CROZET', 'Latitude': '-46.432500', 'Longitude': '51.856667', 'Altitude': '146'}, {'ID': '61998', 'Nom': 'KERGUELEN', 'Latitude': '-49.352333', 'Longitude': '70.243333', 'Altitude': '29'}, {'ID': '67005', 'Nom': 'PAMANDZI', 'Latitude': '-12.805500', 'Longitude': '45.282833', 'Altitude': '7'}, {'ID': '71805', 'Nom': 'ST-PIERRE', 'Latitude': '46.766333', 'Longitude': '-56.179167', 'Altitude': '21'}, {'ID': '78890', 'Nom': 'LA DESIRADE METEO', 'Latitude': '16.335000', 'Longitude': '-61.004000', 'Altitude': '27'}, {'ID': '78894', 'Nom': 'ST-BARTHELEMY METEO', 'Latitude': '17.901500', 'Longitude': '-62.852167', 'Altitude': '44'}, {'ID': '78897', 'Nom': 'LE RAIZET AERO', 'Latitude': '16.264000', 'Longitude': '-61.516333', 'Altitude': '11'}, {'ID': '78922', 'Nom': 'TRINITE-CARAVEL', 'Latitude': '14.774500', 'Longitude': '-60.875333', 'Altitude': '26'}, {'ID': '78925', 'Nom': 'LAMENTIN-AERO', 'Latitude': '14.595333', 'Longitude': '-60.995667', 'Altitude': '3'}, {'ID': '81401', 'Nom': 'SAINT LAURENT', 'Latitude': '5.485500', 'Longitude': '-54.031667', 'Altitude': '5'}, {'ID': '81405', 'Nom': 'CAYENNE-MATOURY', 'Latitude': '4.822333', 'Longitude': '-52.365333', 'Altitude': '4'}, {'ID': '81408', 'Nom': 'SAINT GEORGES', 'Latitude': '3.890667', 'Longitude': '-51.804667', 'Altitude': '6'}, {'ID': '81415', 'Nom': 'MARIPASOULA', 'Latitude': '3.640167', 'Longitude': '-54.028333', 'Altitude': '106'}, {'ID': '89642', 'Nom': "DUMONT D'URVILLE", 'Latitude': '-66.663167', 'Longitude': '140.001000', 'Altitude': '43'}]<br /><br /><br />def distance(lat1, lon1, lat2, lon2):<br /> """<br /> Calcule la distance entre deux points géographiques en utilisant la formule de la distance euclidienne.<br /> """<br /> return math.sqrt((lat2 - lat1)**2 + (lon2 - lon1)**2)<br /><br />def station_la_plus_proche(x, y, stations):<br /> """<br /> Trouve la station météo la plus proche en utilisant les coordonnées x et y (latitude et longitude).<br /> """<br /> distance_min = float('inf')<br /> station_proche = None<br /> <br /> for station in stations:<br /> lat_station = float(station['Latitude'])<br /> lon_station = float(station['Longitude'])<br /> d = distance(x, y, lat_station, lon_station)<br /> if d < distance_min:<br /> distance_min = d<br /> station_proche = station<br /> <br /> return station_proche<br /><br /># Demander à l'utilisateur d'entrer la latitude et la longitude<br />x_input = input("Entrez la latitude de votre lieux: ")<br />y_input = input("Entrez la longitude de votre lieux: ")<br /><br /># Remplacer les virgules par des points<br />x_input = float(x_input.replace(',', '.'))<br />y_input = float(y_input.replace(',', '.'))<br /><br /># Utilisez les valeurs entrées par l'utilisateur comme variables x et y pour trouver la station météo la plus proche<br />station_proche = station_la_plus_proche(x_input, y_input, stations)<br />print("\nLa station météo la plus proche est:", station_proche['Nom']) <br /><br /># Demander à l'utilisateur d'entrer sa consommation d'eau hebdomadaire<br />waterconsohebdo = input("Entrez la consommation d'eau hebdomadaire constante(L): ")<br /><br /># Remplacer les virgules par des points<br />waterconsohebdo = float(waterconsohebdo.replace(',', '.'))<br /><br /># Calcul consommation journaliere moyenne<br />waterconsojour = waterconsohebdo/7<br /><br /># Demander à l'utilisateur d'entrer le mois de debut de la periode estivale<br />moisdebutete = input("Entrez le mois de début pour la consommation d'eau hebdomadaire supplémentaire en periode estivale (1,2,3,4,5,6,7,8,9,10,11,12): ")<br />try:<br /> _=int(moisdebutete)<br /> moisdebutete=_<br />except Exception as err:<br /> moisdebutete=5<br /> print(f"\nerreur de type ou valeur utilisateur vide, poursuite avec utilisation de moisdebutete={moisdebutete}")<br /><br /># Demander à l'utilisateur d'entrer le mois de fin de la periode estivale<br />moisfinete = input("Entrez le mois de fin pour la consommation d'eau hebdomadaire supplémentaire en periode estivale (1,2,3,4,5,6,7,8,9,10,11,12): ")<br />try:<br /> _=int(moisfinete)<br /> moisfinete=_<br />except Exception as err:<br /> moisfinete=9<br /> print(f"\nerreur de type ou valeur utilisateur vide, poursuite avec utilisation de moisfinete={moisfinete}")<br /><br /># Demander à l'utilisateur d'entrer la consommation d'eau supplémentaire en periode estivale<br />waterconsohebdoete = input("Entrez la consommation d'eau hebdomadaire supplémentaire en periode estivale (L) - 0 L par defaut: ")<br />try:<br /> _=float(waterconsohebdoete.replace(',', '.')) # Remplacer les virgules par des points<br /><br /> waterconsohebdoete=_<br />except Exception as err:<br /> waterconsohebdoete=0<br /> print(f"\nerreur de type ou valeur utilisateur vide, poursuite avec utilisation de waterconsohebdoete={waterconsohebdoete}L")<br /><br /># Calcul consommation journaliere moyenne<br />waterconsojourete = waterconsohebdoete/7<br /><br />result=combined_df[combined_df['numer_sta']==int(station_proche['ID'])]<br /><br /># Convertir la colonne 'date_column' dans un format datetime et la mettre en index trié<br />result['datetime'] = pd.to_datetime(result['date'], format='%Y%m%d%H%M%S')<br />result.set_index('datetime', inplace=True)<br />result = result.sort_index()<br /><br /># remplacer les données manquantes par 0<br />result['rr3']=result['rr3'].replace('mq','0')<br />result['rr3']=result['rr3'].astype('float')<br /><br /># Ne garder que la colonne des précipitations des 3 dernieres heures<br />result=result['rr3']<br /><br /># Calculer les sommes de précipitations par jour<br />resultday=result.resample('D').sum()<br />resultdaymonthindex=resultday.copy()<br />resultdaymonthindex.index=resultdaymonthindex.index.month<br />print("\nMoyenne par jour (mm):\n", resultday.mean())<br />print("Minimum par jour (mm):\n", resultday.min())<br />print("Maximum par jour (mm):\n", resultday.max())<br /><br /><br /># Calculer les sommes de précipitations par semaine<br />resultweek=result.resample('W').sum()<br /><br /># Calculer les sommes de précipitations par mois<br />resultmonth=result.resample('ME').sum()<br /><br /># Calculer les sommes de précipitations par trimestre<br />resulttrim=result.resample('QE').sum()<br />resulttrim=resulttrim.rename_axis('trimestre')<br />print(resulttrim)<br /><br /># Calculer les sommes de précipitations par an<br />resultyear=result.resample('YE').sum()<br />print("\nPrécipitations annuelles moyennes (mm):\n",resultyear.mean())<br /><br /># Calculer le nombre de jours consécutifs maximum sans pluie<br />max_streak = 0<br />current_streak = 0<br />for value in resultday:<br /> if value == 0:<br /> current_streak += 1<br /> max_streak = max(max_streak, current_streak)<br /> else:<br /> current_streak = 0 # Reset the streak if the value is not zero<br />print(f"\nNombre de jours consecutifs maximum sans pluie: {max_streak}")<br /><br /># Moyenne par trimestre pour chaque trimestre<br />moyenne_trimestrielle_par_trimestre = resulttrim.groupby(resulttrim.index.quarter).mean()<br /><br /># Minimum par trimestre pour chaque trimestre<br />min_trimestrielle_par_trimestre = resulttrim.groupby(resulttrim.index.quarter).min()<br /><br /># Maximum par trimestre pour chaque trimestre<br />max_trimestrielle_par_trimestre = resulttrim.groupby(resulttrim.index.quarter).max()<br /><br /># Imprimer les résultats<br />print("\nMoyenne par trimestre pour chaque trimestre (mm):\n", moyenne_trimestrielle_par_trimestre)<br />print("\nMinimum par trimestre pour chaque trimestre (mm):\n", min_trimestrielle_par_trimestre)<br />print("\nMaximum par trimestre pour chaque trimestre (mm):\n", max_trimestrielle_par_trimestre)<br /><br /><br />#Prise en comptes changement climatiques (hypothèses conservatrices multimodeles drias precipitations):<br /># Definir les impacts sur les volumes de précipitations par saison<br />adjustments = {0: -15, 1: -10, 2: -50, 3: -15} # Adjust line 1 by -15%, line 2 by -10%, line 3 by -50%, line 4 by -15%<br /><br /># Appliquer les impacts sur les précipitations moyennes par trimestres:<br />cc_moyenne_trimestrielle_par_trimestre=moyenne_trimestrielle_par_trimestre.copy()<br />for line, adjustment in adjustments.items():<br /> cc_moyenne_trimestrielle_par_trimestre.iloc[line] = cc_moyenne_trimestrielle_par_trimestre.iloc[line]+cc_moyenne_trimestrielle_par_trimestre.iloc[line]*adjustment/100<br /><br />print("\nMoyenne par trimestre pour chaque trimestre avec prise en compte du changement climatique (mm):\n", cc_moyenne_trimestrielle_par_trimestre)<br /><br /><br /># Minimum par jour pour chaque trimestre<br />min_par_jour_par_trimestre = resultday.groupby(resultday.index.quarter).min()<br />min_par_jour_par_trimestre=min_par_jour_par_trimestre.rename_axis('trimestre')<br /><br /># Maximum par jour pour chaque trimestre<br />max_par_jour_par_trimestre = resultday.groupby(resultday.index.quarter).max()<br />max_par_jour_par_trimestre=max_par_jour_par_trimestre.rename_axis('trimestre')<br /><br /># Moyenne par jour pour chaque trimestre<br />moyenne_par_jour_par_trimestre = resultday.groupby(resultday.index.quarter).mean()<br />moyenne_par_jour_par_trimestre=moyenne_par_jour_par_trimestre.rename_axis('trimestre')<br /><br /># Imprimer les résultats<br />print("\nMinimum par jour pour chaque trimestre (mm):\n", min_par_jour_par_trimestre)<br />print("\nMaximum par jour pour chaque trimestre (mm):\n", max_par_jour_par_trimestre)<br />print("\nMoyenne par jour pour chaque trimestre (mm):\n", moyenne_par_jour_par_trimestre)<br /><br /><br />#Calcul seuil mini surface de recuperation:<br />surf0=(1/2)*math.ceil((13*waterconsohebdo)/min(moyenne_trimestrielle_par_trimestre))<br />print(f"""Seuil surface recuperation avec hypothèse entrée et données fournies par l'utilisateur (m2)<br />hypothese:(conso trimestre / precipitations moyenne min trimestre)<br />{int(math.ceil(surf0))} m2""")<br /><br />#Calcul seuil mini reservoir:<br />contraintejourmax=(resultday.max())*surf0<br />contraintejourszero=max_streak*waterconsojour<br />volume0=math.ceil(max(2.5*contraintejourmax,contraintejourszero))<br />print(f"""\nSeuil volume avec hypothèse entrée et données fournies par l'utilisateur (L)<br />hypothèse: max((2.5*précipitations journaliere maxi*Seuil surface recuperation),(44j consécutifs max sans pluie*conso journaliere))<br />{int(math.ceil(volume0))} L""")<br /><br />surf0_input = input("\n\nSi vous souhaitez corriger la valeur initiale de surface (m2) pour les itérations, entrer votre valeur, sinon appuyer sur entree")<br />try:<br /> _=float(surf0_input)<br /> surf0=_<br />except Exception as err:<br /> print(f"\nerreur de type ou valeur utilisateur vide, poursuite avec utilisation de surf0={surf0}m2")<br /><br /><br />volume0_input = input("\n\nSi vous souhaitez corriger la valeur initiale de volume (L) pour les itérations, entrer votre valeur, sinon appuyer sur entree")<br />try:<br /> _=float(volume0_input)<br /> volume0=_<br />except Exception as err:<br /> print(f"\nerreur de type ou valeur utilisateur vide, poursuite avec utilisation de volume0={volume0}L")<br /><br /># Itérations algorithmiques stockage&consommation<br /><br />#hypothèse récupérateur 2/3 plein à t0<br />water=(2/3)*volume0<br />resultsurfvolume=(volume0,surf0)<br />#boucle iteration<br />listsurf0=[surf0*(1+i*0.33) for i in range(0,999)]<br />listvolume0=[volume0*(1+i*0.5) for i in range(0,999)]<br />listeday=list(resultday)<br />listemonth=list(resultdaymonthindex.index)<br />listresult=[]<br />#fonction check surface volume<br />def iterv(data, v0,s0):<br /> "fonction check surface volume"<br /> water=(2/3)*v0<br /> for k in range(0,len(data)):<br /> recupday=data[k]*s0<br /> #print(f'recupday:{recupday}')<br /> if listemonth[k] in range(moisdebutete, moisfinete + 1):<br /> consoday = waterconsojour + waterconsojourete<br /> else:<br /> consoday = waterconsojour<br /> water=water+recupday-consoday<br /> #print(f'water:{water}')<br /> if water>v0:<br /> print("récupérateur plein")<br /> water=v0 #hypothese gestion du trop plein ok<br /> continue<br /> if water<0:<br /> print("récupérateur vide")<br /> #time.sleep(1)<br /> return (0,0)<br /> print("les surfaces et volumes permettent de subvenir à la consommation d'eau sur le dataset")<br /> return (v0,s0)<br /><br />for i in range(0,6): #boucle iteration surface<br /> for k in range(0,len(listeday)):<br /> recupday=listeday[k]*listsurf0[i]<br /> print(f'recupday:{recupday}')<br /> if listemonth[k] in range(moisdebutete,moisfinete+1):<br /> consoday=waterconsojour+waterconsojourete<br /> else:<br /> consoday = waterconsojour<br /> water=water+recupday-consoday<br /> print(f'water:{water}')<br /> if water>volume0:<br /> print("récupérateur plein")<br /> water=volume0 #hypothese gestion du trop plein ok<br /> continue<br /> if water<0:<br /> print("récupérateur vide, iteration avec hypothèse volume de récupération plus grand")<br /> #time.sleep(1)<br /> for j in range (1,i+40):<br /> resultsurfvolume=iterv(listeday,listvolume0[j],listsurf0[i])<br /> if resultsurfvolume!=(0,0):<br /> listresult.append(resultsurfvolume)<br /> break<br /> else:<br /> continue<br /> break<br /><br />for k in listresult:<br /> print(f"""avec les données fournies par l'utilisateur, et <br />un volume de {int(k[0])}L et <br />une surface de {int(k[1])}m2,<br />on satisfait aux besoins utilisateurs ({waterconsohebdo}L/semaine constant) <br />et {waterconsohebdoete}L/semaine en periode estivale (du mois {moisdebutete} au mois {moisfinete})<br />entrées en hypothèse\n""")<br /><br /><br /><br /><br /></pre><br /><br />On fait le test avec les hypothèses ci dessus (latitude 44.2, longitude 0.6, solo 276L semaine, duo 752L semaine)<br /><br />On obtient les résultats suivants:<br /><br />solo: <br /><pre><br />avec les données fournies par l'utilisateur, et <br />un volume de 7976L et <br />une surface de 19m2,<br />on satisfait aux besoins utilisateurs (276.0L/semaine constant) <br />et 0L/semaine supplémentaire en periode estivale (du mois 5 au mois 9)<br />entrées en hypothèse<br /><br />avec les données fournies par l'utilisateur, et <br />un volume de 5982L et <br />une surface de 24m2,<br />on satisfait aux besoins utilisateurs (276.0L/semaine constant) <br />et 0L/semaine supplémentaire en periode estivale (du mois 5 au mois 9)<br />entrées en hypothèse<br /><br />avec les données fournies par l'utilisateur, et <br />un volume de 4985L et <br />une surface de 28m2,<br />on satisfait aux besoins utilisateurs (276.0L/semaine constant) <br />et 0L/semaine supplémentaire en periode estivale (du mois 5 au mois 9)<br />entrées en hypothèse<br /><br />avec les données fournies par l'utilisateur, et <br />un volume de 3988L et <br />une surface de 33m2,<br />on satisfait aux besoins utilisateurs (276.0L/semaine constant) <br />et 0L/semaine supplémentaire en periode estivale (du mois 5 au mois 9)<br />entrées en hypothèse<br /><br />avec les données fournies par l'utilisateur, et <br />un volume de 3988L et <br />une surface de 38m2,<br />on satisfait aux besoins utilisateurs (276.0L/semaine constant) <br />et 0L/semaine supplémentaire en periode estivale (du mois 5 au mois 9)<br />entrées en hypothèse<br /><br /></pre><br /><br />solo avec 600L/semaine en periode estivale: <br /><pre><br />avec les données fournies par l'utilisateur, et <br />un volume de 15642L et <br />une surface de 45m2,<br />on satisfait aux besoins utilisateurs (276.0L/semaine constant) <br />et 600.0L/semaine supplémentaire en periode estivale (du mois 5 au mois 9)<br />entrées en hypothèse<br /><br />avec les données fournies par l'utilisateur, et <br />un volume de 15642L et <br />une surface de 60m2,<br />on satisfait aux besoins utilisateurs (276.0L/semaine constant) <br />et 600.0L/semaine supplémentaire en periode estivale (du mois 5 au mois 9)<br />entrées en hypothèse<br /><br />avec les données fournies par l'utilisateur, et <br />un volume de 12514L et <br />une surface de 75m2,<br />on satisfait aux besoins utilisateurs (276.0L/semaine constant) <br />et 600.0L/semaine supplémentaire en periode estivale (du mois 5 au mois 9)<br />entrées en hypothèse<br /><br />avec les données fournies par l'utilisateur, et <br />un volume de 12514L et <br />une surface de 90m2,<br />on satisfait aux besoins utilisateurs (276.0L/semaine constant) <br />et 600.0L/semaine en periode estivale (du mois 5 au mois 9)<br />entrées en hypothèse<br /><br />avec les données fournies par l'utilisateur, et <br />un volume de 12514L et <br />une surface de 105m2,<br />on satisfait aux besoins utilisateurs (276.0L/semaine constant) <br />et 600.0L/semaine supplémentaire en periode estivale (du mois 5 au mois 9)<br />entrées en hypothèse<br /><br />avec les données fournies par l'utilisateur, et <br />un volume de 12514L et <br />une surface de 120m2,<br />on satisfait aux besoins utilisateurs (276.0L/semaine constant) <br />et 600.0L/semaine supplémentaire en periode estivale (du mois 5 au mois 9)<br />entrées en hypothèse<br /></pre><br /><br />duo: <br /><pre><br />avec les données fournies par l'utilisateur, et <br />un volume de 24133L et <br />une surface de 51m2,<br />on satisfait aux besoins utilisateurs (752.0L/semaine constant) <br />et 0L/semaine supplémentaire en periode estivale (du mois 5 au mois 9)<br />entrées en hypothèse<br /><br />avec les données fournies par l'utilisateur, et <br />un volume de 16089L et <br />une surface de 64m2,<br />on satisfait aux besoins utilisateurs (752.0L/semaine constant) <br />et 0L/semaine supplémentaire en periode estivale (du mois 5 au mois 9)<br />entrées en hypothèse<br /><br />avec les données fournies par l'utilisateur, et <br />un volume de 13407L et <br />une surface de 77m2,<br />on satisfait aux besoins utilisateurs (752.0L/semaine constant) <br />et 0L/semaine supplémentaire en periode estivale (du mois 5 au mois 9)<br />entrées en hypothèse<br /><br />avec les données fournies par l'utilisateur, et <br />un volume de 10726L et <br />une surface de 90m2,<br />on satisfait aux besoins utilisateurs (752.0L/semaine constant) <br />et 0L/semaine supplémentaire en periode estivale (du mois 5 au mois 9)<br />entrées en hypothèse<br /><br />avec les données fournies par l'utilisateur, et <br />un volume de 10726L et <br />une surface de 103m2,<br />on satisfait aux besoins utilisateurs (752.0L/semaine constant) <br />et 0L/semaine supplémentaire en periode estivale (du mois 5 au mois 9)<br />entrées en hypothèse<br /><br /></pre><br /><br />duo avec 600L/semaine en periode estivale: : <br /><pre><br />avec les données fournies par l'utilisateur, et <br />un volume de 33687L et <br />une surface de 70m2,<br />on satisfait aux besoins utilisateurs (752.0L/semaine constant) <br />et 600.0L/semaine supplémentaire en periode estivale (du mois 5 au mois 9)<br />entrées en hypothèse<br /><br />avec les données fournies par l'utilisateur, et <br />un volume de 24062L et <br />une surface de 93m2,<br />on satisfait aux besoins utilisateurs (752.0L/semaine constant) <br />et 600.0L/semaine supplémentaire en periode estivale (du mois 5 au mois 9)<br />entrées en hypothèse<br /><br />avec les données fournies par l'utilisateur, et <br />un volume de 19250L et <br />une surface de 116m2,<br />on satisfait aux besoins utilisateurs (752.0L/semaine constant) <br />et 600.0L/semaine supplémentaire en periode estivale (du mois 5 au mois 9)<br />entrées en hypothèse<br /><br />avec les données fournies par l'utilisateur, et <br />un volume de 19250L et <br />une surface de 139m2,<br />on satisfait aux besoins utilisateurs (752.0L/semaine constant) <br />et 600.0L/semaine supplémentaire en periode estivale (du mois 5 au mois 9)<br />entrées en hypothèse<br /><br />avec les données fournies par l'utilisateur, et <br />un volume de 19250L et <br />une surface de 162m2,<br />on satisfait aux besoins utilisateurs (752.0L/semaine constant) <br />et 600.0L/semaine supplémentaire en periode estivale (du mois 5 au mois 9)<br />entrées en hypothèse<br /><br />avec les données fournies par l'utilisateur, et <br />un volume de 19250L et <br />une surface de 185m2,<br />on satisfait aux besoins utilisateurs (752.0L/semaine constant) <br />et 600.0L/semaine supplémentaire en periode estivale (du mois 5 au mois 9)<br />entrées en hypothèse<br /><br /><br /></pre> , Dans ce tuto, on utilise des données météos synop disponibles ici : <br /><br />http://data.cquest.org/meteo-france/synop/ dont vous trouverez la description ici:<br /><br />http://data.cquest.org/meteo-france/synop/doc_parametres_synop_168.pdf<br /><br /><br />Vous pouvez également les télécharger sur le site de Meteo France: <br /><br />https://donneespubliques.meteofrance.fr/?fond=produit&id_produit=90&id_rubrique=32<br /><br /><br />Télécharger tous les fichiers csv des années et mois à partir desquels vous souhaitez que les calculs soient effectués, placer les dans un repertoire de votre choix et dezipper les (format archive gz). Placer également dans ce répertoire le fichier processing.py contenant le code partagé dans ce tutoriel.<br /><br /><br />Exemple en ligne de commande linux debian pour télécharger et dézipper tous les csv de l'année 2020 dans un repertoire ~/synop: <br /><br />(Dans la suite du tutoriel on utilise toutes les données des années 2010 à 2020)<br /><br /><br /><pre><br /><br />cd ~<br /><br />mkdir -p synop && cd synop<br /><br /><br />wget http://data.cquest.org/meteo-france/synop/synop.202001.csv.gz && gzip -d synop.202001.csv.gz<br /><br />wget http://data.cquest.org/meteo-france/synop/synop.202002.csv.gz && gzip -d synop.202002.csv.gz<br /><br />wget http://data.cquest.org/meteo-france/synop/synop.202003.csv.gz && gzip -d synop.202003.csv.gz<br /><br />wget http://data.cquest.org/meteo-france/synop/synop.202004.csv.gz && gzip -d synop.202004.csv.gz<br /><br />wget http://data.cquest.org/meteo-france/synop/synop.202005.csv.gz && gzip -d synop.202005.csv.gz<br /><br />wget http://data.cquest.org/meteo-france/synop/synop.202006.csv.gz && gzip -d synop.202006.csv.gz<br /><br />wget http://data.cquest.org/meteo-france/synop/synop.202007.csv.gz && gzip -d synop.202007.csv.gz<br /><br />wget http://data.cquest.org/meteo-france/synop/synop.202008.csv.gz && gzip -d synop.202008.csv.gz<br /><br />wget http://data.cquest.org/meteo-france/synop/synop.202009.csv.gz && gzip -d synop.202009.csv.gz<br /><br />wget http://data.cquest.org/meteo-france/synop/synop.202010.csv.gz && gzip -d synop.202010.csv.gz<br /><br />wget http://data.cquest.org/meteo-france/synop/synop.202011.csv.gz && gzip -d synop.202011.csv.gz<br /><br />wget http://data.cquest.org/meteo-france/synop/synop.202012.csv.gz && gzip -d synop.202012.csv.gz<br /><br /><br /><br /></pre><br /><br /><br />Pour utiliser python sous un autre os que linux, débrouillez vous avec vos daubes propriétaires intrusives.<br /><br /><br />Sous linux, python est généralement installé et pour utiliser le code partagé dans <br />ce tuto, il suffira de copier coller le code dans un fichier processing.py puis entrer<br /><br /><pre><br /><br />python processing.py<br /><br /></pre><br /><br /><br />Cependant, il faut installer la librairie pandas qui est très largement utilisé <br />dans le monde de la finance et dans le monde scientifique, notamment pour sa <br />gestion efficace des séries temporelles et sa capacité de vectorisation des données.<br /><br /><br />Pour cela voici les commandes à entrer dans linux debian avant de lancer le <br />script processing.py pour être tranquille:<br /><br /><br /><pre><br /><br />sudo apt install python3 python3-venv python3-pip python-is-python3<br /><br />cd ~ && python -m venv venv<br /><br />source venv/bin/activate<br /><br />pip install pandas<br /><br /></pre><br /><br /><br />Penser ensuite à activer l'environnement virtuel dans lequel est installé <br />pandas chaque fois que vous utilisez le script (apres un reboot ou si vous <br />fermez et reouvrez votre terminal) en lançant la commande: <br /><br /><br /><pre><br /><br />cd ~ && source venv/bin/activate<br /><br /></pre><br /><br /><br />Nous sommes en 2024 et si vous êtes cibles d'entraves anti éco-terroristes <br />de psychopathes comme moi, et en bon scientifique qui se respecte vous <br />inspectez vos instruments de mesures avant de les utiliser, vous pouvez <br />inspectez le code source de pandas qui est évidemment logiciel libre ici : <br />https://github.com/pandas-dev/pandas , ou vous pouvez faire l'hypothèse <br />discutable qu'on peut avoir confiance dans un logiciel aussi massivement <br />utilisé dans le monde de la finance et de la science.<br /><br />Python reposant sur des librairies C pour un certains nombres d'opérations <br />de base, le hack, y compris le hack scientifique, n'est jamais impossible <br />mais on laissera de coté ces considérations pro-lowtech qui n'entrent pas <br />dans le champ de réflexion de ce tutoriel. ,
…