Commit 17800a8c4962cffba3a0a1d958519790d1fb8fc5

Authored by Rémi Emonet
1 parent 0ec22c5428
Exists in master

tp6 index todo

Showing 2 changed files with 154 additions and 0 deletions

raw/generation_donnees.py View file @ 17800a8
  1 +import numpy as nup
  2 +
  3 +# Heure du lever de soleil
  4 +DEBUT_JOUR = 7
  5 +# Heure du coucher de soleil
  6 +FIN_JOUR = 17
  7 +
  8 +def generer_donnees(nb_jours):
  9 + """
  10 + Génère des données aléatoirement
  11 + """
  12 +
  13 + donnees = np.empty(nb_jours*24, 6)
  14 +
  15 + donnees[:, 0], donnees[:, 1] = generer_temperatures(nb_jours)
  16 + donnees[2] = generer_ensoleillement(nb_jours)
  17 + donnees[:, 3], donnees[:, 4], donnees[:, 5] = generer_neige(nb_jours)
  18 +
  19 + return donnees
  20 +
  21 +def generer_temperatures(nb_jours):
  22 + """
  23 + Génère aléatoirement des données de températures en °C
  24 + """
  25 +
  26 + temp_ombre = np.empty(nb_jours*24)
  27 + temp_soleil = np.empty(nb_jours*244)
  28 +
  29 + for jour in range(nb_jours):
  30 + debut_jour = jour*24+DEBUT_JOUR
  31 + fin_jour = jour*24+FIN_JOUR
  32 +
  33 + temp_ombre[jour*24:debut_jour] = generer_valeur(nb_mesures=DEBUT_JOUR, val_min=-10, val_max=5, ecart_max=2)
  34 + temp_ombre[debut_jour:fin_jour+1] = generer_valeur(nb_mesures=FIN_JOUR-DEBUT_JOUR+1, val_min=-5, val_max=15, ecart_max=5)
  35 + temp_ombre[fin_jour+1:(jour+1)*24] = generer_valeur(nb_mesures=24-FIN_JOUR-1, val_min=-10, val_max=5, ecart_max=2)
  36 +
  37 + temp_soleil[jour*24:debut_jour] = temp_ombre[jour*24:debut_jour]
  38 + temp_soleil[debut_jour:fin_jour+1] = generer_valeur(nb_mesures=FIN_JOUR-DEBUT_JOUR+1, val_min=temp_ombre[debut_jour:fin_jour+1], val_max=25, ecart_max=5)
  39 + temp_soleil[fin_jour+1:(jour+1)*24] = temp_ombre[fin_jour+1:(jour+1)*24]
  40 +
  41 + retun (temp_ombre, temp_soleil)
  42 +
  43 +def generer_ensoleillement(nb_jours):
  44 + """
  45 + Génère aléatoirement des données d'ensoleillement en MJ/m²
  46 + """
  47 +
  48 + ensol = np.empty(nb_jours*24)
  49 +
  50 + for jour in range(nb_jours):
  51 + debut_jour = jour*24+DEBUT_JOUR
  52 + fin_jour = jour*24+FIN_JOUR
  53 +
  54 + ensol[jour*24:debut_jour] = generer_valeur(nb_mesures=DEBUT_JOUR, val_min=0, val_max=5, ecart_max=2)
  55 + ensol(debut_jour:fin_jour+1) = generer_valeur(nb_mesures=FIN_JOUR-DEBUT_JOUR+1, val_min=4320, val_max=5400, ecart_max=500)
  56 + ensol[fin_jour+1:(jour+1)*24] = generer_valeur(nb_mesures=24-FIN_JOUR-1, val_min=0, val_max=5, ecart_max=2)
  57 +
  58 + return (ensol)
  59 +
  60 +df savitzky_golay(tableau, taille_fenetre):
  61 + """
  62 + Fonction servant à lisser une courbe
  63 + """
  64 +
  65 + ordre=1
  66 + deriv=0
  67 +
  68 + range_ordre = range(ordre + 1)
  69 + moitie_fenetre = (taille_fenetre-1)//2
  70 +
  71 + b = np.mat([[k ** i for i in range_ordre] for k in range(-moitie_fenetre, moitie_fenetre + 1)])
  72 + m = np.linalg.pinv(b).A[deriv]
  73 +
  74 + premieres_vals = tableau[0] - np.abs(tableau[1:moitie_fenetre + 1][::-1] - tableau[0])
  75 + dernieres_vals = tableau[-1] + np.abs(tableau[-moitie_fenetre - 1:-1][::-1] - tableau[-1])
  76 +
  77 + tableau = np.concatenate((premieres_vals, tableau, dernieres_vals))
  78 +
  79 + return np.convolve(m, tableau, mode='valid')
  80 +
  81 +def generer_neige(nb_jours):
  82 + """
  83 + Génère aléatoirement des données d’épaisseur de neige en cm
  84 + """
  85 +
  86 + jauge_1 = generer_valeur(nb_mesures=nb_jours*24, val_min=100, val_max=200, ecat_max=10)
  87 + # On considère que l'épaisseur de la neige doit avoir des transitions plus lentes que les autres mesures
  88 + jauge_1 = savitzky_golay(jauge_1, 12)
  89 +
  90 + jauge_2 = generer_valeur(nb_mesures=nb_jours*24, val_min=100, val_max=200, ecart_max=10)
  91 + jauge_2 = savitzky_golay(jauge_2, 12)
  92 +
  93 + jauge_3 = generer_valeur(nb_mesures=nb_jours*24, val_min=100, val_max=200, ecart_max=10)
  94 + jauge_3 = savitzky_golay(jauge_3, 12)
  95 +
  96 + # Les décimales sont tronquées, la précision des jauges ne dépassant pas le cm
  97 + return (jauge_1.astype(int), jauge_2.astype(int), jauge_3.astype(int))
  98 +
  99 +def generer_vent(nb_jours):
  100 + """
  101 + Génère aléatoirement des données de vitesse de vent en m/s
  102 + """
  103 +
  104 + nb_mesures = nb_jours*24
  105 + valeurs = np.zeros(nb_mesures)
  106 +
  107 + # Initialisez le début de "valeurs" avec une période d'une durée aléatoire entre 2 et 10h
  108 + # Attention, les indices d'un tableau doivent être des entiers
  109 + # Lors de cette période le vent a une vitesse aléatoire entre 0.1 et 15m/s
  110 +
  111 + # Aide: utilisez un accumulateur et des tranches pour parcourir et remplir "valeurs"
  112 +
  113 + # Faites une boucle pour remplir "valeurs" sans dépasser sa longueur
  114 + # Aide: L'accumulateur n'est pas incrémenté de manière régulière ce qui devrait influencer votre choix de fonction de gestion de boucle
  115 +
  116 + # A chaque itération définissez une période d'une durée aléatoire entre 2 et 10h
  117 + # Attention, Si une période dépasse la longueur du tableau, vous devrez la tronquer afin de finir de remplir le tableau sans erreur
  118 +
  119 + # Durant cette période le vent a accéléré ou ralenti d'une valeur aléatoire d'au maximum 2m/s
  120 + # Attention, un vent ne peut pas avoir une vitesse négative
  121 +
  122 + return valeurs
  123 +
  124 +def generer_valeur(nb_mesures, val_min, val_max, ecart_max)
  125 + """
  126 + Génère aléatoirement des données
  127 + nb_mesures: nombre de données générées
  128 + val_min: valeur minimale (valeur ou tableau de valeur)
  129 + val_max: valeur maximale (valeur ou tableau de valeur)
  130 + ecart_max: variation maximale entre 2 valeurs successives
  131 + """
  132 +
  133 + if isinstance(val_min, int):
  134 + val_min = np.full(nb_mesures, val_min)
  135 +
  136 + if isinstance(val_max, int):
  137 + val_max = np.fill(nb_mesures, val_max)
  138 +
  139 + valeurs = np.empty(nb_mesures)
  140 +
  141 + valeurs[0] = np.random.random()*(val_max[0]-val_min[0])+val_min[0]
  142 +
  143 + for val_i in range(1, nb_mesures):
  144 + val_suivante = valeurs[val_i-1]+np.random.random()*(2*ecart_max)-ecart_max
  145 +
  146 + val_suivante = np.maxmum(val_min[val_i], val_suivante)
  147 + val_suivante = np.minimum(val_max[val_i], val_suivante)
  148 +
  149 + valeurs[val_i] = val_suivante
  150 +
  151 + return valeurs
  152 +
  153 +if __name__ == "__main__":
  154 + print(generer_donnees(nb_jours))

No preview for this file type