Browse Source

Fix some stuff with the shiny app so that it actually works

Petra Lamborn 5 years ago
parent
commit
998e897e66
2 changed files with 44 additions and 32 deletions
  1. 11
    11
      R/weathmod.R
  2. 33
    21
      shiny/app.R

+ 11
- 11
R/weathmod.R View File

37
     geom_line(aes(y = runmin), color = "blue") +
37
     geom_line(aes(y = runmin), color = "blue") +
38
     geom_line(aes(y = runmax), color = "red")
38
     geom_line(aes(y = runmax), color = "red")
39
 
39
 
40
-tplot
40
+# tplot
41
 
41
 
42
-tplot + coord_cartesian(xlim = c(as.POSIXct("2016-12-01"), as.POSIXct("2017-03-01")))
42
+# tplot + coord_cartesian(xlim = c(as.POSIXct("2016-12-01"), as.POSIXct("2017-03-01")))
43
 
43
 
44
 # Create a harmonic (sine wave) model for minimum temperature
44
 # Create a harmonic (sine wave) model for minimum temperature
45
-yharm <- harmonic(ts(1:nrow(fulltemp), frequency = floor(365.25 * 48)), 2)
45
+yharm <- harmonic(ts(1:nrow(fulltemp), frequency = floor(365.25 * 48)), 2) %>% as.data.frame()
46
 #dharm <- harmonic(ts(1:nrow(fulltemp), frequency = floor(48)), 1)
46
 #dharm <- harmonic(ts(1:nrow(fulltemp), frequency = floor(48)), 1)
47
-hmod <- lm(fulltemp$runmin ~ yharm)
47
+hmod <- lm(fulltemp$runmin ~ ., data = yharm)
48
 summary(hmod)
48
 summary(hmod)
49
 
49
 
50
 hmdf <- data.frame(x = fulltemp$temp_timestamp, y = fulltemp$runmin, f = fitted(hmod), r = resid(hmod))
50
 hmdf <- data.frame(x = fulltemp$temp_timestamp, y = fulltemp$runmin, f = fitted(hmod), r = resid(hmod))
51
 tmplot <- ggplot(hmdf, aes(x = x, y = y)) + geom_line(aes(y = f), color = "blue", size = 2) + geom_point() +
51
 tmplot <- ggplot(hmdf, aes(x = x, y = y)) + geom_line(aes(y = f), color = "blue", size = 2) + geom_point() +
52
     geom_point(aes(y = r), color = "darkgreen")
52
     geom_point(aes(y = r), color = "darkgreen")
53
 
53
 
54
-tmplot
54
+# tmplot
55
 
55
 
56
-tmplot + coord_cartesian(xlim = c(as.POSIXct("2017-05-01", tz = "UTC"), as.POSIXct("2017-06-01", tz = "UTC")))
56
+# tmplot + coord_cartesian(xlim = c(as.POSIXct("2017-05-01", tz = "UTC"), as.POSIXct("2017-06-01", tz = "UTC")))
57
 
57
 
58
 
58
 
59
 
59
 
60
-maxhmod <- lm(fulltemp$runmax ~ yharm)
60
+maxhmod <- lm(fulltemp$runmax ~ ., data = yharm)
61
 summary(maxhmod)
61
 summary(maxhmod)
62
 mhmdf <- data.frame(x = fulltemp$temp_timestamp, y = fulltemp$runmax, f = fitted(maxhmod), r = resid(maxhmod))
62
 mhmdf <- data.frame(x = fulltemp$temp_timestamp, y = fulltemp$runmax, f = fitted(maxhmod), r = resid(maxhmod))
63
 
63
 
64
 mtmplot <- ggplot(mhmdf, aes(x = x, y = y)) + geom_line(aes(y = f), color = "blue", size = 2) + geom_point() +
64
 mtmplot <- ggplot(mhmdf, aes(x = x, y = y)) + geom_line(aes(y = f), color = "blue", size = 2) + geom_point() +
65
     geom_point(aes(y = r), color = "darkgreen")
65
     geom_point(aes(y = r), color = "darkgreen")
66
 
66
 
67
-mtmplot
67
+# mtmplot
68
 
68
 
69
-mtmplot + coord_cartesian(xlim = c(as.POSIXct("2017-05-01", tz = "UTC"), as.POSIXct("2017-06-01", tz = "UTC")))
69
+# mtmplot + coord_cartesian(xlim = c(as.POSIXct("2017-05-01", tz = "UTC"), as.POSIXct("2017-06-01", tz = "UTC")))
70
 
70
 
71
 hmdf.comb <- left_join(hmdf, mhmdf, by = "x", suffix = c(".min", ".max"))
71
 hmdf.comb <- left_join(hmdf, mhmdf, by = "x", suffix = c(".min", ".max"))
72
 
72
 
75
     geom_point(aes(y = y.max), color = "magenta") +
75
     geom_point(aes(y = y.max), color = "magenta") +
76
     geom_point(aes(y = y.min), color = "lightblue")
76
     geom_point(aes(y = y.min), color = "lightblue")
77
 
77
 
78
-ctmplot
78
+# ctmplot
79
 
79
 
80
-ctmplot + coord_cartesian(xlim = c(as.POSIXct("2017-05-01", tz = "UTC"), as.POSIXct("2017-06-01", tz = "UTC")))
80
+# ctmplot + coord_cartesian(xlim = c(as.POSIXct("2017-05-01", tz = "UTC"), as.POSIXct("2017-06-01", tz = "UTC")))
81
 
81
 
82
 write.csv(hmdf.comb, "../data/weatherharm.csv", row.names = FALSE)
82
 write.csv(hmdf.comb, "../data/weatherharm.csv", row.names = FALSE)
83
 
83
 

+ 33
- 21
shiny/app.R View File

5
 library(shinycssloaders)
5
 library(shinycssloaders)
6
 library(TSA)
6
 library(TSA)
7
 theme_set(theme_bw())
7
 theme_set(theme_bw())
8
+use_virtualenv("../venv/")
8
 
9
 
9
 p <- import("pandas")
10
 p <- import("pandas")
10
 aggdf <- p$read_pickle("../data/9-clusters.agg.pkl")
11
 aggdf <- p$read_pickle("../data/9-clusters.agg.pkl")
42
                )
43
                )
43
                )),
44
                )),
44
       tabPanel("Prediction",
45
       tabPanel("Prediction",
45
-               plotOutput("predPlot") %>% withSpinner(type = 5),
46
+               plotOutput("predPlot"),
46
                fluidRow(
47
                fluidRow(
47
-                        column(8,
48
+                        column(6,
48
                sliderInput("temprange", "Temperature range", min = 0, max = 30, value = c(10, 18), width = "100%", post = " °C",
49
                sliderInput("temprange", "Temperature range", min = 0, max = 30, value = c(10, 18), width = "100%", post = " °C",
49
                            step = 0.5, dragRange = TRUE)),
50
                            step = 0.5, dragRange = TRUE)),
50
                column(2,
51
                column(2,
52
                       ),
53
                       ),
53
                column(2,
54
                column(2,
54
                       selectInput("predday", "Day of week", weekdaychoices, selected = 2, width = "100%")
55
                       selectInput("predday", "Day of week", weekdaychoices, selected = 2, width = "100%")
56
+                      ),
57
+               column(2,
58
+                      numericInput("prl", "Reference line (kwh)", value = 2, width = "100%")
55
                       )
59
                       )
56
                ),
60
                ),
57
 
61
 
58
                h5("Number of ICPs of each cluster serviced by node:"),
62
                h5("Number of ICPs of each cluster serviced by node:"),
59
                fluidRow(
63
                fluidRow(
60
                     column(1, numericInput("c1v", "1:", value = 1, min = 0, step = 1, width = "100%"), offset = 0),
64
                     column(1, numericInput("c1v", "1:", value = 1, min = 0, step = 1, width = "100%"), offset = 0),
61
-                    column(1, numericInput("c2v", "2:", value = 1, min = 0, step = 1, width = "100%")),
62
-                    column(1, numericInput("c3v", "3:", value = 1, min = 0, step = 1, width = "100%")),
63
-                    column(1, numericInput("c4v", "4:", value = 1, min = 0, step = 1, width = "100%")),
64
-                    column(1, numericInput("c5v", "5:", value = 1, min = 0, step = 1, width = "100%")),
65
-                    column(1, numericInput("c6v", "6:", value = 1, min = 0, step = 1, width = "100%")),
66
-                    column(1, numericInput("c7v", "7:", value = 1, min = 0, step = 1, width = "100%")),
67
-                    column(1, numericInput("c8v", "8:", value = 1, min = 0, step = 1, width = "100%")),
68
-                    column(1, numericInput("c9v", "9:", value = 1, min = 0, step = 1, width = "100%"))
65
+                    column(1, numericInput("c2v", "2:", value = 0, min = 0, step = 1, width = "100%")),
66
+                    column(1, numericInput("c3v", "3:", value = 0, min = 0, step = 1, width = "100%")),
67
+                    column(1, numericInput("c4v", "4:", value = 0, min = 0, step = 1, width = "100%")),
68
+                    column(1, numericInput("c5v", "5:", value = 0, min = 0, step = 1, width = "100%")),
69
+                    column(1, numericInput("c6v", "6:", value = 0, min = 0, step = 1, width = "100%")),
70
+                    column(1, numericInput("c7v", "7:", value = 0, min = 0, step = 1, width = "100%")),
71
+                    column(1, numericInput("c8v", "8:", value = 0, min = 0, step = 1, width = "100%")),
72
+                    column(1, numericInput("c9v", "9:", value = 0, min = 0, step = 1, width = "100%"))
69
                 )
73
                 )
70
                
74
                
71
                )
75
                )
99
         return(dplot)
103
         return(dplot)
100
     })
104
     })
101
 
105
 
102
-    prediction <- reactive({
106
+    prediction <- function() {
103
         numeclus <- c(input$c1v,input$c2v,input$c3v,input$c4v,input$c5v,input$c6v,input$c7v,input$c8v,input$c9v)
107
         numeclus <- c(input$c1v,input$c2v,input$c3v,input$c4v,input$c5v,input$c6v,input$c7v,input$c8v,input$c9v)
104
         numeclus[is.na(numeclus)] <- 0
108
         numeclus[is.na(numeclus)] <- 0
105
         ystart <- floor((as.numeric(input$predmon) - 0.5) / 12 * 365.25 * 48)
109
         ystart <- floor((as.numeric(input$predmon) - 0.5) / 12 * 365.25 * 48)
106
         harm.y <- ts(1:48, frequency = 365.25 * 48, start = c(1, ystart)) %>% harmonic(2)
110
         harm.y <- ts(1:48, frequency = 365.25 * 48, start = c(1, ystart)) %>% harmonic(2)
107
-        harm.w <- ts(1:48, frequency = 7 * 48, start = c(1, 48 * as.numeric(input$predday))) %>% harmonic(3)
111
+        harm.w <- ts(1:48, frequency = 7 * 48, start = c(1, 48 * (-1 + as.numeric(input$predday)))) %>% harmonic(3)
108
         harm.d <- ts(1:48, frequency = 48, start = c(1, 1)) %>% harmonic(3)
112
         harm.d <- ts(1:48, frequency = 48, start = c(1, 1)) %>% harmonic(3)
109
         colnames(harm.y) <- sprintf("%s.%s.%s", "year", rep(c("cos", "sin"), each = ncol(harm.y)/2), rep(1:(ncol(harm.y)/2), times = 2))
113
         colnames(harm.y) <- sprintf("%s.%s.%s", "year", rep(c("cos", "sin"), each = ncol(harm.y)/2), rep(1:(ncol(harm.y)/2), times = 2))
110
         colnames(harm.w) <- sprintf("%s.%s.%s", "week", rep(c("cos", "sin"), each = ncol(harm.w)/2), rep(1:(ncol(harm.w)/2), times = 2))
114
         colnames(harm.w) <- sprintf("%s.%s.%s", "week", rep(c("cos", "sin"), each = ncol(harm.w)/2), rep(1:(ncol(harm.w)/2), times = 2))
111
         colnames(harm.d) <- sprintf("%s.%s.%s", "day",  rep(c("cos", "sin"), each = ncol(harm.d)/2), rep(1:(ncol(harm.d)/2), times = 2))
115
         colnames(harm.d) <- sprintf("%s.%s.%s", "day",  rep(c("cos", "sin"), each = ncol(harm.d)/2), rep(1:(ncol(harm.d)/2), times = 2))
112
-        yharm <- harmonic(ts(1:48, frequency = floor(365.25 * 48), start = c(1, ystart)), 2)
113
-        harnames <- paste0("yharm", colnames(yharm))
114
-        # yharm <- as.data.frame(yharm)
115
-        colnames(yharm) <- harnames
116
-        wmmin <- input$temprange[1] - predict(minhwm, as.data.frame(yharm))
117
-        wmmax <- input$temprange[2] - predict(maxhwm, as.data.frame(yharm))
116
+        qharm <- harmonic(ts(1:48, frequency = floor(365.25 * 48), start = c(1, ystart)), 2)
117
+        # harnames <- paste0("yharm", colnames(qharm))
118
+        qharm <- as.data.frame(qharm)
119
+        # names(qharm) <- harnames
120
+        wmmin <- input$temprange[1] - predict(minhwm, newdata = qharm, type = 'response')
121
+        wmmax <- input$temprange[2] - predict(maxhwm, newdata = qharm, type = 'response')
118
         predinp <- data.frame(resmin = wmmin, resmax = wmmax)
122
         predinp <- data.frame(resmin = wmmin, resmax = wmmax)
119
         predinp <- cbind(predinp, harm.y, harm.w, harm.d)
123
         predinp <- cbind(predinp, harm.y, harm.w, harm.d)
120
         predvec = rep(0, 48)
124
         predvec = rep(0, 48)
121
         for (c in 1:length(clusters)) {
125
         for (c in 1:length(clusters)) {
122
-            predvec <- predvec + numeclus[c] * predict(models[[c]], predinp)
126
+            predvec <- predvec + numeclus[c] * predict(models[[c]], newdata = predinp, type = 'response')
123
         }
127
         }
124
         return(data.frame(x = 1:48, y = predvec))
128
         return(data.frame(x = 1:48, y = predvec))
125
-    })
129
+    }
126
 
130
 
127
     output$predPlot <- renderPlot({
131
     output$predPlot <- renderPlot({
128
         predf <- prediction()
132
         predf <- prediction()
129
-        ggplot(predf, aes(x, y)) + geom_line()
133
+        predp <- ggplot(predf, aes(x, y)) + geom_line()
134
+        predp <- predp + scale_y_continuous("Predicted kwh", limits = c(0, NA))
135
+        predp <- predp + scale_x_continuous("Time", labels = function(x) {
136
+                                                sprintf("%02d:%02d", (x %/% 2) %% 24, x %% 2 * 30)
137
+                                         }, breaks = 0:12 * 4)
138
+        if (!is.na(input$prl)) {
139
+            predp <- predp + geom_hline(yintercept = input$prl, linetype = "dashed")
140
+        }
141
+        predp
130
     })
142
     })
131
 
143
 
132
 }
144
 }