@@ -18,22 +18,21 @@ export function addSpeedToMapGeometry (tiles, date, segment, geometry) {
18
18
const state = store . getState ( )
19
19
const days = state . date . dayFilter || [ 0 , 7 ]
20
20
const hours = state . date . hourFilter || [ 0 , 24 ]
21
-
22
- const refspeed = tiles . reference [ segment . level ] [ segment . tileIdx ] . referenceSpeeds80 [ segment . segmentIdx ]
21
+ const refSpeed = tiles . reference [ segment . level ] [ segment . tileIdx ] . referenceSpeeds80 [ segment . segmentIdx ]
23
22
const subtiles = tiles . historic [ date . year ] [ date . week ] [ segment . level ] [ segment . tileIdx ]
24
23
25
24
const subtile = getSubtileForSegmentIdx ( segment . segmentIdx , subtiles )
26
- if ( subtile ) {
27
- // Append the speed to the geometry to render later
25
+ if ( subtile ) { // Append the speed to the geometry to render later
28
26
const speeds = getValuesFromSubtile ( segment . segmentIdx , subtile , days , hours , 'speeds' )
29
27
geometry . speedByHour = addSpeedByHour ( speeds , days , hours )
30
28
geometry . speed = getMeanSpeed ( segment . segmentIdx , subtile , days , hours )
31
29
// calculate percentage difference between weekly/historical speed and reference speed
32
30
if ( geometry . speed === null || geometry . speed === 0 || typeof geometry . speed === 'undefined' ) {
33
- geometry . percentDiff = null
31
+ geometry . percentDiff = 0
34
32
} else {
35
- geometry . percentDiff = ( ( refspeed - geometry . speed ) / mathjs . mean ( refspeed , geometry . speed ) ) * 100
33
+ geometry . percentDiff = ( ( refSpeed - geometry . speed ) / mathjs . mean ( refSpeed , geometry . speed ) ) * 100
36
34
}
35
+ subtile . percentDiffs . push ( geometry . percentDiff )
37
36
}
38
37
} catch ( e ) { }
39
38
}
@@ -60,37 +59,76 @@ function addSpeedByHour (speedArray, days, hours) {
60
59
}
61
60
62
61
/**
63
- * Collect speeds from the entire week for use in bar chart
62
+ * Collect speeds and percent differences from the entire week for use in bar chart
64
63
* @param {* } tiles
65
64
* @param {* } date
66
65
* @param {* } segment
67
66
*/
68
- export function prepareSpeedsForBarChart ( tiles , date , segment ) {
67
+ export function prepareDataForBarChart ( tiles , date , segment ) {
69
68
// not all levels and tiles are available yet, so try()
70
69
// skips it if it doesn't work
71
70
try {
71
+ const refSpeed = tiles . reference [ segment . level ] [ segment . tileIdx ] . referenceSpeeds80 [ segment . segmentIdx ]
72
72
const subtiles = tiles . historic [ date . year ] [ date . week ] [ segment . level ] [ segment . tileIdx ]
73
73
const subtile = getSubtileForSegmentIdx ( segment . segmentIdx , subtiles )
74
74
if ( subtile ) {
75
+ var percentDiffsByDayAndHourArray = mathjs . zeros ( 7 , 24 )
75
76
var speedsByDayAndHourArray = mathjs . zeros ( 7 , 24 )
76
77
var nonZeroSpeedCountByDayAndHourArray = mathjs . zeros ( 7 , 24 )
77
78
var speeds = getValuesFromSubtile ( segment . segmentIdx , subtile , [ 0 , 7 ] , [ 0 , 24 ] , 'speeds' )
78
79
chunk ( speeds , 24 ) . forEach ( ( speedsForThisDay , dayIndex ) => {
79
80
speedsForThisDay . forEach ( ( speedForThisHour , hourIndex ) => {
80
81
if ( speedForThisHour > 0 ) {
82
+ const percentDiffForThisHour = ( ( refSpeed - speedForThisHour ) / mathjs . mean ( refSpeed , speedForThisHour ) ) * 100
83
+ percentDiffsByDayAndHourArray . set ( [ dayIndex , hourIndex ] , Number ( percentDiffForThisHour . toFixed ( 2 ) ) )
81
84
speedsByDayAndHourArray . set ( [ dayIndex , hourIndex ] , speedForThisHour )
82
85
nonZeroSpeedCountByDayAndHourArray . set ( [ dayIndex , hourIndex ] , 1 )
83
86
}
84
87
} )
85
88
} )
86
89
return {
87
90
speeds : speedsByDayAndHourArray ,
91
+ percentDiff : percentDiffsByDayAndHourArray ,
88
92
counts : nonZeroSpeedCountByDayAndHourArray
89
93
}
90
94
}
91
95
} catch ( e ) { }
92
96
}
93
97
98
+ /**
99
+ * Collect percentDiffs from the entire week for use in bar chart
100
+ * @param {* } tiles
101
+ * @param {* } date
102
+ * @param {* } segment
103
+ */
104
+ export function preparePercentDiffsForBarChart ( tiles , date , segment ) {
105
+ // not all levels and tiles are available yet, so try()
106
+ // skips it if it doesn't work
107
+ try {
108
+ const refSpeed = tiles . reference [ segment . level ] [ segment . tileIdx ] . referenceSpeeds80 [ segment . segmentIdx ]
109
+ const subtiles = tiles . historic [ date . year ] [ date . week ] [ segment . level ] [ segment . tileIdx ]
110
+ const subtile = getSubtileForSegmentIdx ( segment . segmentIdx , subtiles )
111
+ if ( subtile ) {
112
+ var percentDiffsByDayAndHourArray = mathjs . zeros ( 7 , 24 )
113
+ var nonZeroDiffCountByDayAndHourArray = mathjs . zeros ( 7 , 24 )
114
+ var speeds = getValuesFromSubtile ( segment . segmentIdx , subtile , [ 0 , 7 ] , [ 0 , 24 ] , 'speeds' )
115
+ chunk ( speeds , 24 ) . forEach ( ( speedsForThisDay , dayIndex ) => {
116
+ speedsForThisDay . forEach ( ( speedForThisHour , hourIndex ) => {
117
+ if ( speedForThisHour > 0 ) {
118
+ const percDiff = ( ( refSpeed - speedForThisHour ) / mathjs . mean ( refSpeed , speedForThisHour ) ) * 100
119
+ percentDiffsByDayAndHourArray . set ( [ dayIndex , hourIndex ] , percDiff )
120
+ nonZeroDiffCountByDayAndHourArray . set ( [ dayIndex , hourIndex ] , 1 )
121
+ }
122
+ } )
123
+ } )
124
+ return {
125
+ percentDiffs : percentDiffsByDayAndHourArray ,
126
+ diffCounts : nonZeroDiffCountByDayAndHourArray
127
+ }
128
+ }
129
+ } catch ( e ) { }
130
+ }
131
+
94
132
/**
95
133
* Given a segment index, its historic data subtile, and the range of days
96
134
* and hours selected, calculate the mean traffic speed on that segment.
@@ -143,7 +181,7 @@ export function getValuesFromSubtile (segmentIdx, subtile, days, hours, prop) {
143
181
// filter down to the requested range of days
144
182
x => x . slice ( ...days ) ,
145
183
// filter down to the requested range of hours
146
- x => x . map ( speedsForGivenDay => speedsForGivenDay . slice ( ...hours ) ) ,
184
+ x => x . map ( forGivenDay => forGivenDay . slice ( ...hours ) ) ,
147
185
// back to just an array of hours
148
186
flatten
149
187
] ) ( subtile [ prop ] )
@@ -167,6 +205,8 @@ export function getSubtileForSegmentIdx (segmentIdx, subtiles) {
167
205
168
206
for ( let i = 0 , j = indices . length ; i < j ; i ++ ) {
169
207
const subtile = subtiles [ indices [ i ] ]
208
+ // need to initialize the percentDiffs for the barcharts here
209
+ subtile . percentDiffs = [ ]
170
210
171
211
const lowerBounds = subtile . startSegmentIndex
172
212
const upperBounds = subtile . startSegmentIndex + subtile . subtileSegments
0 commit comments