annotate trafficintelligence/pavement.py @ 1249:2aa56b101041

added mask functionality for dltrack
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Thu, 15 Feb 2024 14:09:52 -0500
parents 956a66096e91
children 785c86013d2c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
431
0bcfa49d179a began module for pavement marking data processing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
1 #! /usr/bin/env python
0bcfa49d179a began module for pavement marking data processing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
2 '''Tools for processing and analyzing pavement marking data'''
0bcfa49d179a began module for pavement marking data processing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
3
1029
c6cf75a2ed08 reorganization of imports
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1028
diff changeset
4 import datetime
458
28ff95845c65 update to include speed limit
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 457
diff changeset
5
437
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
6 import numpy as np
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
7
1029
c6cf75a2ed08 reorganization of imports
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1028
diff changeset
8 from trafficintelligence import utils
431
0bcfa49d179a began module for pavement marking data processing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
9
465
16fe64136506 added dictionary
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 458
diff changeset
10 paintTypes = {0: "Non-existant",
16fe64136506 added dictionary
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 458
diff changeset
11 1: "Eau",
16fe64136506 added dictionary
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 458
diff changeset
12 2: "Epoxy",
16fe64136506 added dictionary
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 458
diff changeset
13 3: "Alkyde",
16fe64136506 added dictionary
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 458
diff changeset
14 4: "Autre"}
16fe64136506 added dictionary
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 458
diff changeset
15
450
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
16 durabilities = {1: 98, #96 to 100
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
17 2: 85, #75 to 96
497
6ebdd90ce3ee bug in pavement durability
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 475
diff changeset
18 3: 62, #50 to 75
450
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
19 4: 32, #15 to 50
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
20 5: 7 #0 to 15
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
21 }
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
22
456
825e5d49325d slight update
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 453
diff changeset
23 roadFunctionalClasses = {40: "Collectrice",
825e5d49325d slight update
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 453
diff changeset
24 20: "Nationale",
825e5d49325d slight update
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 453
diff changeset
25 30: "Regionale",
825e5d49325d slight update
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 453
diff changeset
26 10: "Autoroute",
825e5d49325d slight update
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 453
diff changeset
27 60: "Acces ressources",
825e5d49325d slight update
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 453
diff changeset
28 51: "Local 1",
825e5d49325d slight update
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 453
diff changeset
29 52: "Local 2",
458
28ff95845c65 update to include speed limit
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 457
diff changeset
30 53: "Local 3",
456
825e5d49325d slight update
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 453
diff changeset
31 15: "Aut (PRN)",
825e5d49325d slight update
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 453
diff changeset
32 25: "Nat (PRN)",
825e5d49325d slight update
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 453
diff changeset
33 70: "Acces isolees",
465
16fe64136506 added dictionary
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 458
diff changeset
34 99: "Autres"}
456
825e5d49325d slight update
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 453
diff changeset
35
437
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
36 def caracteristiques(rtss, maintenanceLevel, rtssWeatherStation, fmr, paintType):
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
37 '''Computes characteristic data for the RTSS (class rtss)
998
933670761a57 updated code to python 3 (tests pass and scripts run, but non-executed parts of code are probably still not correct)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
38 maintenanceLevel = pylab.csv2rec('C:\\Users\Alexandre\Desktop\Projet_maitrise_recherche\BDD_access\\analyse_donnees_deneigement\\exigence_circuits.txt', delimiter = ';')
933670761a57 updated code to python 3 (tests pass and scripts run, but non-executed parts of code are probably still not correct)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
39 rtssWeatherStation = pylab.csv2rec('C:\\Users\Alexandre\Desktop\Projet_maitrise_recherche\stations_environnement_canada\\rtssWeatherStation\juste_pour_rtss_avec_donnees_entretien_hiv\\rtssWeatherStation_EC3.txt', delimiter = ',')
933670761a57 updated code to python 3 (tests pass and scripts run, but non-executed parts of code are probably still not correct)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
40 fmr = pylab.csv2rec('C:\\Users\Alexandre\Desktop\Projet_maitrise_recherche\BDD_access\\analyse_donnees_deneigement\\fmr.txt', delimiter = ';')
933670761a57 updated code to python 3 (tests pass and scripts run, but non-executed parts of code are probably still not correct)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
41 paintType = pylab.csv2rec('C:\\Users\Alexandre\Desktop\Projet_maitrise_recherche\BDD_access\\analyse_donnees_deneigement\\type_peinture.txt', delimiter = ';')
437
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
42 '''
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
43 # determination exigence deneigement
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
44 if rtss.id in maintenanceLevel['rtss_debut']:
439
ad61d21d3d1b corrected bug with last array position lookup
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 438
diff changeset
45 for i in range(len(maintenanceLevel)):
437
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
46 if maintenanceLevel['rtss_debut'][i] == rtss.id:
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
47 exigence = maintenanceLevel['exigence'][i]
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
48 else:
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
49 exigence = ''
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
50
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
51 # determination x/y
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
52 if rtss.id in rtssWeatherStation['rtss']:
439
ad61d21d3d1b corrected bug with last array position lookup
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 438
diff changeset
53 for i in range(len(rtssWeatherStation)):
437
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
54 if rtssWeatherStation['rtss'][i] == rtss.id:
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
55 x_moy = rtssWeatherStation['x_moy'][i]
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
56 y_moy = rtssWeatherStation['y_moy'][i]
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
57 else:
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
58 x_moy, y_moy = '',''
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
59
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
60 # determination info fmr
458
28ff95845c65 update to include speed limit
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 457
diff changeset
61 age_revtm, classe_fonct, type_revtm, milieu, djma, pourc_camions, vit_max = [], [], [], [], [], [], []
437
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
62 if rtss.id in fmr['rtss_debut']:
439
ad61d21d3d1b corrected bug with last array position lookup
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 438
diff changeset
63 for i in range(len(fmr)):
437
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
64 if fmr['rtss_debut'][i] == rtss.id:
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
65 age_revtm.append(fmr['age_revtm'][i])
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
66 classe_fonct.append(fmr['des_clasf_fonct'][i])
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
67 type_revtm.append(fmr['des_type_revtm'][i])
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
68 milieu.append(fmr['des_cod_mil'][i])
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
69 djma.append(fmr['val_djma'][i])
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
70 pourc_camions.append(fmr['val_pourc_camns'][i])
458
28ff95845c65 update to include speed limit
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 457
diff changeset
71 vit_max.append(fmr['val_limt_vitss'][i])
28ff95845c65 update to include speed limit
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 457
diff changeset
72 age_revtm = utils.mostCommon(age_revtm)
28ff95845c65 update to include speed limit
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 457
diff changeset
73 classe_fonct = utils.mostCommon(classe_fonct)
28ff95845c65 update to include speed limit
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 457
diff changeset
74 type_revtm = utils.mostCommon(type_revtm)
28ff95845c65 update to include speed limit
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 457
diff changeset
75 milieu = utils.mostCommon(milieu)
28ff95845c65 update to include speed limit
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 457
diff changeset
76 djma = utils.mostCommon(djma)
28ff95845c65 update to include speed limit
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 457
diff changeset
77 vit_max = utils.mostCommon(vit_max)
28ff95845c65 update to include speed limit
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 457
diff changeset
78 if vit_max < 0:
28ff95845c65 update to include speed limit
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 457
diff changeset
79 vit_max = ''
28ff95845c65 update to include speed limit
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 457
diff changeset
80 pourc_camions = utils.mostCommon(pourc_camions)
437
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
81 if pourc_camions == "" or pourc_camions < 0:
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
82 djma_camions = ""
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
83 else:
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
84 djma_camions = pourc_camions*djma/100
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
85 else:
458
28ff95845c65 update to include speed limit
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 457
diff changeset
86 age_revtm, classe_fonct, type_revtm, milieu, djma, djma_camions, vit_max = '','','','','','',''
437
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
87
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
88 # determination type peinture
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
89 peinture_rd, peinture_rg, peinture_cl = [], [], []
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
90 peinture_lrd, peinture_lrg, peinture_lc = 0,0,0
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
91 if rtss.id in paintType['rtss_debut_orig']:
439
ad61d21d3d1b corrected bug with last array position lookup
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 438
diff changeset
92 for i in range(len(paintType)):
437
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
93 if paintType['rtss_debut_orig'][i] == rtss.id:
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
94 peinture_rd.append((paintType['peinture_rd'][i]))
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
95 peinture_rg.append((paintType['peinture_rg'][i]))
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
96 peinture_cl.append((paintType['peinture_cl'][i]))
458
28ff95845c65 update to include speed limit
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 457
diff changeset
97 peinture_lrd = utils.mostCommon(peinture_rd)
28ff95845c65 update to include speed limit
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 457
diff changeset
98 peinture_lrg = utils.mostCommon(peinture_rg)
28ff95845c65 update to include speed limit
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 457
diff changeset
99 peinture_lc = utils.mostCommon(peinture_cl)
437
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
100 else:
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
101 peinture_lrd, peinture_lrg, peinture_lc = '','',''
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
102
458
28ff95845c65 update to include speed limit
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 457
diff changeset
103 return (exigence, x_moy, y_moy, age_revtm, classe_fonct, type_revtm, milieu, djma, djma_camions, vit_max, peinture_lrd, peinture_lrg, peinture_lc)
437
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
104
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
105 def winterMaintenanceIndicators(data, startDate, endDate, circuitReference, snowThreshold):
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
106 '''Computes several winter maintenance indicators
998
933670761a57 updated code to python 3 (tests pass and scripts run, but non-executed parts of code are probably still not correct)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
107 data = entretien_hivernal = pylab.csv2rec('C:\\Users\Alexandre\Documents\Cours\Poly\Projet\mesures_entretien_hivernal\mesures_deneigement.txt', delimiter = ',')'''
502
33574b94f09e corrected a bug and improved code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 497
diff changeset
108 somme_eau, somme_neige, somme_abrasif, somme_sel, somme_lc, somme_lrg, somme_lrd, compteur_premiere_neige, compteur_somme_abrasif = 0,0,0,0,0,0,0,0,0
437
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
109
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
110 if circuitReference in data['ref_circuit']:
439
ad61d21d3d1b corrected bug with last array position lookup
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 438
diff changeset
111 for i in range(len(data)):
437
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
112 if data['ref_circuit'][i] == circuitReference and (data['date'][i] + datetime.timedelta(days = 6)) <= endDate and (data['date'][i] + datetime.timedelta(days = 6)) > startDate:
502
33574b94f09e corrected a bug and improved code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 497
diff changeset
113 compteur_premiere_neige += float(data['premiere_neige'][i])
437
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
114 somme_neige += float(data['neige'][i])
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
115 somme_eau += float(data['eau'][i])
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
116 somme_abrasif += float(data['abrasif'][i])
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
117 somme_sel += float(data['sel'][i])
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
118 somme_lc += float(data['lc'][i])
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
119 somme_lrg += float(data['lrg'][i])
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
120 somme_lrd += float(data['lrd'][i])
502
33574b94f09e corrected a bug and improved code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 497
diff changeset
121 compteur_somme_abrasif += float(data['autre_abrasif_binaire'][i])
33574b94f09e corrected a bug and improved code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 497
diff changeset
122 if compteur_premiere_neige >= 1:
33574b94f09e corrected a bug and improved code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 497
diff changeset
123 premiere_neige = 1
33574b94f09e corrected a bug and improved code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 497
diff changeset
124 else:
33574b94f09e corrected a bug and improved code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 497
diff changeset
125 premiere_neige = 0
437
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
126 if compteur_somme_abrasif >= 1:
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
127 autres_abrasifs = 1
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
128 else:
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
129 autres_abrasifs = 0
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
130 if somme_neige < snowThreshold:
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
131 neigeMTQ_sup_seuil = 0
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
132 else:
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
133 neigeMTQ_sup_seuil = 1
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
134 else:
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
135 somme_eau, somme_neige, somme_abrasif, somme_sel, somme_lc, somme_lrg, somme_lrd, premiere_neige, autres_abrasifs, neigeMTQ_sup_seuil = '','','','','','','','','',''
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
136
440
b5cc6b001ae6 correction for tmax and returns as tuples
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 439
diff changeset
137 return (somme_eau, somme_neige, neigeMTQ_sup_seuil, somme_abrasif, somme_sel, somme_lc, somme_lrg, somme_lrd, premiere_neige, autres_abrasifs)
437
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
138
502
33574b94f09e corrected a bug and improved code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 497
diff changeset
139 def weatherIndicators(data, startDate, endDate, snowThreshold, weatherDatatype, minProportionMeasures = 0.):
437
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
140 '''Computes the indicators from Environment Canada files
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
141 (loaded as a recarray using csv2rec in data),
447
7ef40014236c updated weather indicator calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 446
diff changeset
142 between start and end dates (datetime.datetime objects)
7ef40014236c updated weather indicator calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 446
diff changeset
143
475
819eef979d3f clarified argument name and made it available in a calling function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 465
diff changeset
144 weatherDataType is to indicate Environnement Canada data ('ec') or else MTQ
447
7ef40014236c updated weather indicator calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 446
diff changeset
145 minProportionMeasures is proportion of measures necessary to consider the indicators'''
437
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
146 nbre_jours_T_negatif,nbre_jours_gel_degel,pluie_tot,neige_tot,ecart_type_T = 0,0,0,0,0
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
147 compteur,nbre_jours_gel_consecutifs=0,0
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
148 tmoys = []
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
149 seuils_T = [20,15,10,5]
830136bc0e18 integrating Alexandre functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 434
diff changeset
150 deltas_T = [0,0,0,0]
1112
956a66096e91 removed code now available in simulation project, and issue with deprecated find function in matplotlib
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1029
diff changeset
151 startIndex = np.nonzero(data['date'] == startDate)
502
33574b94f09e corrected a bug and improved code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 497
diff changeset
152 nDays = int((endDate - startDate).days)+1
33574b94f09e corrected a bug and improved code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 497
diff changeset
153 if len(startIndex) > 0 and startIndex+nDays <= len(data):
33574b94f09e corrected a bug and improved code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 497
diff changeset
154 startIndex = startIndex[0]
33574b94f09e corrected a bug and improved code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 497
diff changeset
155 for i in range(startIndex, startIndex+nDays):
457
95a8eb38d9a2 update to weather function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 456
diff changeset
156 if not np.isnan(data['tmax'][i]):
502
33574b94f09e corrected a bug and improved code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 497
diff changeset
157 tmax = data['tmax'][i]
453
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
158 else:
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
159 tmax = None
457
95a8eb38d9a2 update to weather function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 456
diff changeset
160 if not np.isnan(data['tmin'][i]):
95a8eb38d9a2 update to weather function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 456
diff changeset
161 tmin = data['tmin'][i]
95a8eb38d9a2 update to weather function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 456
diff changeset
162 else:
95a8eb38d9a2 update to weather function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 456
diff changeset
163 tmin = None
475
819eef979d3f clarified argument name and made it available in a calling function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 465
diff changeset
164 if weatherDatatype == 'ec':
636
3058e00887bc removed all issues because of tests with None, using is instead of == or !=
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 503
diff changeset
165 if data['pluie_tot'][i] is not None and not np.isnan(data['pluie_tot'][i]):
457
95a8eb38d9a2 update to weather function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 456
diff changeset
166 pluie_tot += data['pluie_tot'][i]
636
3058e00887bc removed all issues because of tests with None, using is instead of == or !=
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 503
diff changeset
167 if data['neige_tot'][i] is not None and not np.isnan(data['neige_tot'][i]):
457
95a8eb38d9a2 update to weather function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 456
diff changeset
168 neige_tot += data['neige_tot'][i]
636
3058e00887bc removed all issues because of tests with None, using is instead of == or !=
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 503
diff changeset
169 if tmax is not None:
453
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
170 if tmax < 0:
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
171 nbre_jours_T_negatif += 1
636
3058e00887bc removed all issues because of tests with None, using is instead of == or !=
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 503
diff changeset
172 if tmax is not None and tmin is not None:
453
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
173 if tmax > 0 and tmin < 0:
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
174 nbre_jours_gel_degel += 1
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
175 for l in range(len(seuils_T)):
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
176 if tmax - tmin >=seuils_T[l]:
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
177 deltas_T[l] += 1
457
95a8eb38d9a2 update to weather function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 456
diff changeset
178 if not np.isnan(data['tmoy'][i]):
95a8eb38d9a2 update to weather function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 456
diff changeset
179 tmoys.append(data['tmoy'][i])
636
3058e00887bc removed all issues because of tests with None, using is instead of == or !=
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 503
diff changeset
180 if tmax is not None:
453
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
181 if tmax < 0:
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
182 compteur += 1
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
183 elif tmax >= 0 and compteur >= nbre_jours_gel_consecutifs:
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
184 nbre_jours_gel_consecutifs = compteur
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
185 compteur = 0
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
186 else:
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
187 compteur = 0
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
188 nbre_jours_gel_consecutifs = max(nbre_jours_gel_consecutifs,compteur)
457
95a8eb38d9a2 update to weather function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 456
diff changeset
189 if len(tmoys) > 0 and float(len(tmoys))/nDays >= minProportionMeasures:
453
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
190 if tmoys != []:
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
191 ecart_type_T = np.std(tmoys)
440
b5cc6b001ae6 correction for tmax and returns as tuples
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 439
diff changeset
192 else:
453
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
193 ecart_type = None
447
7ef40014236c updated weather indicator calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 446
diff changeset
194 if neige_tot < snowThreshold:
7ef40014236c updated weather indicator calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 446
diff changeset
195 neigeEC_sup_seuil = 0
7ef40014236c updated weather indicator calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 446
diff changeset
196 else:
7ef40014236c updated weather indicator calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 446
diff changeset
197 neigeEC_sup_seuil = 1
7ef40014236c updated weather indicator calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 446
diff changeset
198 return (nbre_jours_T_negatif,nbre_jours_gel_degel, deltas_T, nbre_jours_gel_consecutifs, pluie_tot, neige_tot, neigeEC_sup_seuil, ecart_type_T)
440
b5cc6b001ae6 correction for tmax and returns as tuples
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 439
diff changeset
199 else:
447
7ef40014236c updated weather indicator calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 446
diff changeset
200 return [None]*2+[[None]*len(seuils_T)]+[None]*5
446
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
201
453
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
202 def mtqWeatherIndicators(data, startDate, endDate,tmax,tmin,tmoy):
502
33574b94f09e corrected a bug and improved code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 497
diff changeset
203 print("Deprecated, use weatherIndicators")
453
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
204 nbre_jours_T_negatif,nbre_jours_gel_degel,ecart_type_T = 0,0,0
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
205 compteur,nbre_jours_gel_consecutifs=0,0
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
206 tmoys = []
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
207 seuils_T = [20,15,10,5]
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
208 deltas_T = [0,0,0,0]
1112
956a66096e91 removed code now available in simulation project, and issue with deprecated find function in matplotlib
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1029
diff changeset
209 startIndex = np.nonzero(data['date'] == startDate)
453
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
210 nDays = (endDate - startDate).days+1
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
211 for i in range(startIndex, startIndex+nDays):
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
212 if tmax[i] < 0:
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
213 nbre_jours_T_negatif += 1
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
214 if tmax[i] > 0 and tmin[i] < 0:
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
215 nbre_jours_gel_degel += 1
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
216 for l in range(len(seuils_T)):
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
217 if tmax[i] - tmin[i] >=seuils_T[l]:
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
218 deltas_T[l] += 1
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
219 tmoys.append(tmoy[i])
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
220 if tmax[i] < 0:
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
221 compteur += 1
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
222 elif tmax[i] >= 0 and compteur >= nbre_jours_gel_consecutifs:
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
223 nbre_jours_gel_consecutifs = compteur
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
224 compteur = 0
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
225 else:
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
226 compteur = 0
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
227 nbre_jours_gel_consecutifs = max(nbre_jours_gel_consecutifs,compteur)
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
228 if tmoys != []:
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
229 ecart_type_T = np.std(tmoys)
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
230 else:
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
231 ecart_type = None
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
232
15c6f1bc30a2 added function for MTQ weather indicators (use generic EC function preferrably)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 450
diff changeset
233 return (nbre_jours_T_negatif,nbre_jours_gel_degel, deltas_T, nbre_jours_gel_consecutifs, ecart_type_T)
450
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
234
665
15e244d2a1b5 corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 636
diff changeset
235 class RTSS(object):
450
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
236 '''class for data related to a RTSS:
449
1e4c1b6b0e0b added comments
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 448
diff changeset
237 - agregating pavement marking measurements
1e4c1b6b0e0b added comments
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 448
diff changeset
238 - RTSS characteristics from FMR: pavement type, age, AADT, truck AADT
450
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
239 - winter maintenance level from V155
446
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
240
450
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
241 If divided highway, the RTSS ends with G or D and are distinct: there is no ambiguity
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
242 - retroreflectivity types: there are CB, RJ and RB
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
243 If undivided, ending with C
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
244 - durability is fine: ETAT_MARQG_RG ETAT_MARQG_CL ETAT_MARQG_RD (+SG/SD, but recent)
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
245 - retroreflectivity: CJ is center line, RB and SB are left/right if DEBUT-FIN>0 or <0
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
246 '''
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
247
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
248 def __init__(self, _id, name, data):
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
249 self.id = _id
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
250 self.name = name
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
251 self.data = data
446
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
252
665
15e244d2a1b5 corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 636
diff changeset
253 class MarkingTest(object):
446
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
254 '''class for a test site for a given product
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
255
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
256 including the series of measurements over the years'''
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
257
450
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
258 def __init__(self, _id, paintingDate, paintingType, color, data):
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
259 self.id = _id
446
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
260 self.paintingDate = paintingDate
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
261 self.paintingType = paintingType
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
262 self.color = color
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
263 self.data = data
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
264 self.nMeasures = len(data)
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
265
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
266 def getSite(self):
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
267 return int(self.id[:2])
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
268
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
269 def getTestAttributes(self):
447
7ef40014236c updated weather indicator calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 446
diff changeset
270 return [self.paintingType, self.color, self.paintingDate.year]
446
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
271
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
272 def plot(self, measure, options = 'o', dayRatio = 1., **kwargs):
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
273 from matplotlib.pyplot import plot
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
274 plot(self.data['jours']/float(dayRatio),
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
275 self.data[measure], options, **kwargs)
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
276
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
277 def getMarkingMeasures(self, dataLabel):
447
7ef40014236c updated weather indicator calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 446
diff changeset
278 nonZeroIndices = ~np.isnan(self.data[dataLabel])
446
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
279 return self.data[nonZeroIndices]['jours'], self.data[nonZeroIndices][dataLabel]
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
280
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
281 def plotMarkingMeasures(self, measure, options = 'o', dayRatio = 1., **kwargs):
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
282 for i in range(1,7):
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
283 self.plot('{}_{}'.format(measure, i), options, dayRatio, **kwargs)
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
284
475
819eef979d3f clarified argument name and made it available in a calling function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 465
diff changeset
285 def computeMarkingMeasureVariations(self, dataLabel, lanePositions, weatherData, snowThreshold, weatherDataType = 'ec', minProportionMeasures = 0.):
446
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
286 '''Computes for each successive measurement
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
287 lanePositions = None
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
288 measure variation, initial measure, time duration, weather indicators
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
289
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
290 TODO if measurements per lane, add a variable for lane position (position1 to 6)
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
291 lanePositions = list of integers (range(1,7))
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
292 measure variation, initial measure, time duration, lane position1, weather indicators
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
293 measure variation, initial measure, time duration, lane position2, weather indicators
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
294 ...'''
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
295 variationData = []
636
3058e00887bc removed all issues because of tests with None, using is instead of == or !=
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 503
diff changeset
296 if lanePositions is None:
447
7ef40014236c updated weather indicator calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 446
diff changeset
297 nonZeroIndices = ~np.isnan(self.data[dataLabel])
446
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
298 days = self.data[nonZeroIndices]['jours']
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
299 dates = self.data[nonZeroIndices]['date_mesure']
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
300 measures = self.data[nonZeroIndices][dataLabel]
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
301 for i in range(1, len(dates)):
503
7978b286fcfa corrected call to new weather indicator function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 502
diff changeset
302 nDaysTNegative, nDaysThawFreeze, deltaTemp, nConsecutiveFrozenDays, totalRain, totalSnow, snowAboveThreshold, stdevTemp = weatherIndicators(weatherData, dates[i-1], dates[i], snowThreshold, weatherDataType, minProportionMeasures)
450
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
303 if dates[i-1].year+1 == dates[i].year:
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
304 winter = 1
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
305 if days[i-1]<365:
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
306 firstWinter = 1
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
307 else:
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
308 winter = 0
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
309 firstWinter = 0
c0786fe4ad94 small additions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 449
diff changeset
310 variationData.append([measures[i-1]-measures[i], measures[i-1], days[i]-days[i-1], days[i-1], winter, firstWinter, nDaysTNegative, nDaysThawFreeze] + deltaTemp + [nConsecutiveFrozenDays, totalRain, totalSnow, snowAboveThreshold, stdevTemp])
446
a65a14c90834 adding weather info to pavement data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 440
diff changeset
311 return variationData