show with app
  • app.R
#Konjunktuuriinstituudi indikaatorite veebi panek

library(shiny)
library(ggplot2)
library(plotly)
library(dplyr)
library(reshape2)
library(tidyr)
library(lubridate)


library(lettercase)
library(readxl)
library(XML)

#setwd("C:/Users/avork/Documents/CITIS/EMTA/Makroandmed/KIindikaatorid")

download.external.variables <- function() {
  ########################################
  # 1. Konjunktuuriinstituudi lehelt Exceli failid, NB! Exceli ridade nimed erinevad eri failides
  ########################################
  
  #leht kus failidele lingid
  url <- "http://www.ki.ee/baromeetrid/baromeetrid.htm"
  doc <- htmlParse(url)
  #otsime lehelt kõik lingid
  links <- xpathSApply(doc, "//a/@href")
  free(doc)
  rm(doc)
  
  # Otsime linkidest kõik xls lõpuga failid
  wanted <- links[grepl("*.xls", links)]
  
  # Jätame alles ainult need, mis meile huvi pakuvad
  failialgused <- c("industry","ehitus","kaubandus","teenind", "majandus")
  wanted <-  wanted[sapply(failialgused, function(x) grep(x, wanted))]
  
  # Vaatame, mis xls failid juba kaustas olemas on. Neid, mis olemas, enam uuesti ei tõmba
  failid_kaustas <- list.files(pattern = "xls")
  files_to_download = wanted[!(wanted %in% failid_kaustas)]
  GetMe = ""
  # Laeme alla need failid, mida veel ei ole
  if (length(files_to_download) > 0) {
    GetMe <- paste("http://www.ki.ee/baromeetrid/", files_to_download, sep = "")
    #Laeme alla
    lapply(seq_along(GetMe), 
           function(x) download.file(GetMe[x], files_to_download[x], mode = "wb"))
  }
  
  #Tarbijaküsitluse jaoks peab veel vaeva nägema
  # failialgused <-  c("industry","ehitus","kaubandus","teenind","majandus","tarbija")
  
  
  #Loeme sisse soovitud Exceli failid
  nimetused = data.frame(str_split_fixed(wanted, "_", n = 2), stringsAsFactors = F)
  nimetused$end_date = as.Date(paste0(readr::parse_number(wanted),"01"), format = "%y%m%d")
  
  for (x in seq(1:length(wanted))) {
    failinimi <-  wanted[x]
    nimetus = nimetused[x,1]
    if (!(nimetus %in% failialgused)) {stop("Viga andmete sisselugemisel")}
    temp_df <- read_excel(failinimi)
    assign(nimetus, temp_df)
  } 
  rm(temp_df)
  
  #Ükshaaval failide puhastamine
  #jäta alles vajalikud read ja veerud alates 2003. aastast.
  #NB! seda peab käsitsi kontrollima aeg-ajalt, et Konjunktuuriinstituut ei oleks muutnud veerge ega ridu
  
  #Ehituse fail
  ehitus <-  ehitus[c(2,4:15), c(1,44:ncol(ehitus))]
  
  #Tööstuse fail
  industry <-  industry[c(2:8,10:24), c(1,56:ncol(industry))]
  
  #Kaubanduse fail
  kaubandus <-  kaubandus[c(2:8), c(1,44:ncol(kaubandus))]
  
  #Teenindus
  teenind <-  teenind[c(2:7, 9:15), c(1,11:ncol(teenind))]
  
  #Majandus
  majandus <- majandus[c(2:7), c(1,48:ncol(majandus))]
  
  #Tarbija - seda pole praegu vast vaja, nõuab palju käsitööd
  # tarbija <- tarbija[c(2:7), c(1,48:ncol(tarbija))]
  
  # Tsükliga teisendame
  #Veergudele õigete kuude nimede panemine
  start = as.Date("2003-01-01")
  
  for (x in 1:nrow(nimetused)) {
    data = get(nimetused[x,1])
    end = nimetused$end_date[x]
    #paneme kuud veerunimedeks
    colnames(data) <- c("indicator", seq.Date(start,end,"month")[1:(ncol(data) - 1)])
    #Keerame teistpidi
    data = melt(data, id.vars = c("indicator"))
    #Teeme kuupäeva
    data$kpv <- as.Date(as.numeric(as.character(data$variable)))
    data$value <- as.numeric(data$value)
    data$variable <-  NULL
    #sektori nimi, kui on soov pärast kokku panna
    data$sektor <-  nimetused[x,1]
    #Puhastame ja täpsutame näitajate nimesid
    data$indicator <-  gsub("[\n]","", data$indicator)
    data$indicator <-  gsub("[*]","", data$indicator)
    data$indicator[is_lowercase(substr(data$indicator, 1,1))] <- paste0("Piirab praegu: ", data$indicator[is_lowercase(substr(data$indicator, 1,1))] )
    #Salvestame sama nime alla, mis on Konjunktuuriinstituudi failid
    assign(nimetused[x,1],data)
  } 
  
  # save(industry, file = "industry.Rda")
  # save(ehitus, file = "ehitus.Rda")
  # save(kaubandus, file = "kaubandus.Rda")
  # save(teenind, file = "teenind.Rda")
  # save(majandus, file = "majandus.Rda")
  #save(tarbija, file="tarbija.Rda")
  
  #kustutame üleliigsed asjad
  rm(data, wanted, url, links, GetMe, failinimi, failid_kaustas)
  
  
  # Osade tunnuste kohta koondfailide tegemine
  # ehitus$indicator[ehitus$indicator      =="Töötajate arv järgneva 3 kuu jooksul"]<-"emp3" 
  # industry$indicator[industry$indicator  =="Töötajate arv järgneva 3 kuu jooksul"]<-"emp3" 
  # teenind$indicator[teenind$indicator    =="Töötajate arv järgneva 3 kuu jooksul"]<-"emp3" 
  # kaubandus$indicator[kaubandus$indicator=="Töötajate arv 3 kuu pärast"]<-"emp3" 
  # 
  # ehitus$indicator[ehitus$indicator      =="Ehitustööde hinnad järgneva 3 kuu jooksul"]<-"prices3" 
  # industry$indicator[industry$indicator  =="Toodangu müügihinnad järgneva 3 kuu jooksul"]<-"prices3" 
  # teenind$indicator[teenind$indicator    =="Teenuste hinnad järgneva 3 kuu jooksul"]<-"prices3" 
  # kaubandus$indicator[kaubandus$indicator=="Kaupade hinnad järgneva 3 kuu jooksul"]<-"prices3" 
  # 
  
  ki <-  rbind(ehitus, industry, kaubandus, teenind)
  ki$indicator[ki$sektor=="ehitus"] <- paste0("Ehitus - ", ki$indicator[ki$sektor=="ehitus"])
  ki$indicator[ki$sektor=="teenind"] <- paste0("Teenindus - ", ki$indicator[ki$sektor=="teenind"])
  #ki$indicator[ki$sektor=="majandus"] <- paste0("Kogu majandus - ", ki$indicator[ki$sektor=="majandus"])
  ki$indicator[ki$sektor=="kaubandus"] <- paste0("Kaubandus - ", ki$indicator[ki$sektor=="kaubandus"])
  ki$indicator[ki$sektor=="industry"] <- paste0("Tööstus - ", ki$indicator[ki$sektor=="industry"])
  
  save(ki,file = "ki.Rda")
  
  # ########################################################
  # # 2. Eurostatist Eesti ja EU majanduse usaldusindikaatorite toomine; 
  # # Kommentaar: Eesti andmed saaks ka konjunktuuriinstituudi andmetest
  # # Tulevikus võiks tõmmata enam andmeid, sh ka teiste riikide omasid
  # # Praegu olemas EU28 ja EA19
  # ########################################################
  # 
  # euconfind <- get_eurostat("ei_bssi_m_r2", filters = list(geo = c("EE", "EU28")), stringsAsFactors = FALSE)
  # #Year and month for merge
  # euconfind$kpv <- euconfind$time
  # #kustuta puuduvad väärtused
  # euconfind <- euconfind[!is.na(euconfind$values),] 
  # #Sobivamad nimed
  # euconfind$indica <- NA
  # euconfind$indica[euconfind$indic == "BS-CCI-BAL"] <- "Construction"
  # euconfind$indica[euconfind$indic == "BS-CSMCI-BAL"] <- "Consumer"
  # euconfind$indica[euconfind$indic == "BS-ICI-BAL"] <- "Industry"
  # euconfind$indica[euconfind$indic == "BS-RCI-BAL"] <- "Retail"
  # euconfind$indica[euconfind$indic == "BS-SCI-BAL"] <- "Service"
  # euconfind$indica[euconfind$indic == "BS-ESI-I"] <- "Economy"
  # euconfind$indicator <- paste0(euconfind$indica,"_", euconfind$s_adj) 
  # 
  # #Jätame alles vaatlused alates 2003
  # euconfind <- euconfind %>% dplyr::filter(year(kpv)>=2003)
  # 
  # #Final table for merge, miks <
  # euconfind <-  dcast(euconfind, kpv  ~ indicator+geo , value.var = "values")
  # save(euconfind, file = "euconfind.Rda")
  # 
  # #Võib kaaluda veel teiste riikide - Soome, Rootsi, Läti ja Leedu indikaatorite sissetoomist
  # 
  # ########################################################
  # # 3. Eurostatist Eesti ja EU harmoniseeritud hinnaindeks
  # # 
  # ########################################################
  # # Indeces for Estonia and EU28, 2005=100, COICOP=CP00 or all-items HICP
  # euprices <- get_eurostat("prc_hicp_midx", filters = list(geo = c("EE", "EU"), coicop=c("CP00"), unit=c("I05")), stringsAsFactors = FALSE)
  # #Year and month for merge
  # euprices$kpv <- euprices$time
  # #kustuta puuduvad väärtused
  # euprices <- euprices[!is.na(euprices$values),] 
  # #Sobivamad nimed
  # #Jätame alles vaatlused alates 2003
  # euprices$hicp <-  euprices$values
  # euprices <- euprices %>% dplyr::filter(year(kpv)>=2003) %>% dplyr::select(geo, hicp, kpv)
  # 
  # #Final table for merge, miks <
  # euprices <-  dcast(euprices, kpv  ~ geo , value.var = "hicp")
  # colnames(euprices) <-  c("kpv", "hicp_EE", "hicp_EU")
  # save(euprices, file = "euprices.Rda")
  # 
  # 
  # #################################
  # #Tulevikus võib kaaluda Google trendsi andmete sisse toomist
  # #################################
  # 
  # 
  # # Andmete ühendamine ------------------------------------------------------
  # external_data <- merge(ki, euconfind, by="kpv", all=TRUE)
  # external_data <- merge(external_data, euprices, by="kpv", all=TRUE)
  # save(external_data, file = "external_data.Rda")
  # return(external_data)
}

#start=as.Date("2003-01-01", origin)
#end=as.Date("2017-12-31", origin)

load("data/ki.Rda")


ui <- fluidPage(
  
  #head(Eesti Konjuktuuriinstituuti andmed)
  
  sidebarLayout(
    sidebarPanel(
      selectInput("kifail", "Vali tunnused",  unique(ki$indicator), selected ="",multiple = T),
      #selectInput("kifail", "Vali tunnused",  unique(ki$indicator), selected = c(unique(ki$indicator)[1]),multiple = T),
      #actionButton("puhasta", "Puhasta joonis"),
      actionButton("valised_tunnused", "Uuenda KI andmed kodulehelt")
      ),
    
    mainPanel(
    
        #plotlyOutput("joonis1")
        plotOutput("joonis1")
        #plotOutput("kijoonis",height = "400px"),
        #plotOutput("targetjoonis",height = "400px"),
        #DT::dataTableOutput('mudeliandmetetabel')
      
        )
      
  )
)

# Define server
server <- function(input, output, session) {

  observeEvent(input$valised_tunnused, {
    downloadX <- download.external.variables()
  })
  
  
  jooniseandmed  = reactive({
    df <-  ki  %>% filter(indicator %in% input$kifail) %>% select(kpv, indicator, value)
    return(df)
  })
  
  # output$joonis1 = renderPlotly({
  # p <-  ggplot(jooniseandmed(), aes(x=kpv, y=value, color=indicator)) +
  #     geom_line() +
  #      labs(y="Indikaatori väärtused", x="",
  #           title="Konjunktuuriinstituudi andmed",
  #           subtitle="http://www.ki.ee/baromeetrid/baromeetrid.htm", caption=Sys.Date())
  # 
  # ggplotly(p)
  # })

  output$joonis1 = renderPlot({
    ggplot(jooniseandmed(), aes(x=kpv, y=value, color=indicator, group=indicator)) +
      geom_line(data=jooniseandmed()[!is.na(jooniseandmed()$value),]) +
      #geom_point() +
      scale_x_date(date_breaks = "1 year" ,date_labels = "%Y") +
      labs(y="Indikaatori väärtused", x="", color="Indikaator",
           title="Konjunktuuriinstituudi andmed",
           subtitle="http://www.ki.ee/baromeetrid/baromeetrid.htm", caption=Sys.Date())
    
  })

  observeEvent( input$puhasta, {
    
    updateSelectInput(session, "kifail",
                           label = "Vali tunnused",
                          choices= unique(ki$indicator), 
                        selected = ""
                         #selected = c(unique(ki$indicator)[1])
                         #multiple = T
                         )
    
    ggplot(ki[ki$indicator=="Ehitus- Ehitustööde maht viimase 3 kuu jooksul",], aes(x=kpv, y=value, color=indicator)) +
      geom_line() +
      scale_x_date(date_breaks = "1 year" ,date_labels = "%Y") +
      labs(y="Indikaatori väärtused", x="", color="Indikaator",
           title="Konjunktuuriinstituudi andmed",
           subtitle="http://www.ki.ee/baromeetrid/baromeetrid.htm", caption=Sys.Date())
    
      
    })
    
#end of server  
}



# Run the application 
shinyApp(ui = ui, server = server)