library(rvest)
library(xml2)
library(tidyverse)
library(data.table)


res <- list()
for (j in 1:9) {
  for (i in 1:50) {
    p <-
      paste(
        "https://www.hemnet.se/salda/bostader?item_types%5B%5D=bostadsratt&living_area_max=60&living_area_min=45&location_ids%5B%5D=925963&location_ids%5B%5D=898472&location_ids%5B%5D=473482&location_ids%5B%5D=473440&location_ids%5B%5D=925959&location_ids%5B%5D=473376&location_ids%5B%5D=941046&page=",
        j,
        "&rooms_max=2.5&rooms_min=2&selling_price_max=3500000&selling_price_min=2500000",
        sep = ""
      )
    htmlfile <- read_html(p)
    links <- rvest::html_nodes(htmlfile, ".item-link-container") %>%
      rvest::html_attr("href")
    
    htmlfile <- read_html(links[i])
    
    
    try <-
      rvest::html_nodes(
        htmlfile,
        ".sold-property__metadata , .sold-property__price , .sold-property__attribute-value"
      ) %>%
      rvest::html_text() %>%
      gsub(pattern = "\n ", replacement = "") %>%
      gsub(pattern = "  ", replacement = "") %>%
      as.list()
    
    res[[(i + 50 * j)]]  <- try
    
  }
  
}

res <- lapply(res, `length<-`, max(lengths(res)))
df <-
  rbindlist(res) %>% `colnames<-`(
    c(
      "Lägenhet",
      "Slutpris",
      "Kvm-pris",
      "Pris",
      "Förändring",
      "Rum",
      "Kvm",
      "Avgift",
      "Driftskostnad",
      "Byggår",
      "Brf",
      "a"
    )
  )


df <- df %>%
  mutate(
    Slutpris = as.numeric(gsub("[^[:digit:].]", "",  Slutpris)),
    `Kvm-pris` = as.numeric(gsub("[^[:digit:].]", "",  `Kvm-pris`)),
    Pris = as.numeric(gsub("[^[:digit:].]", "",  Pris)),
    Rum = str_replace(Rum, ",", "."),
    Rum = as.numeric(gsub("[^[:digit:].]", "",  Rum)),
    Kvm = str_replace(Kvm, ",", "."),
    Kvm = as.numeric(gsub("[^[:digit:].]", "",  Kvm)),
    Avgift = as.numeric(gsub("[^[:digit:].]", "",  Avgift))
  ) %>%
  mutate(Byggår = ifelse(is.na(Byggår), Driftskostnad, Byggår)) %>%
  mutate(Driftskostnad = ifelse(str_detect(Driftskostnad, pattern = "kr/Ã¥r"), Driftskostnad, NA)) %>%
  mutate(Driftskostnad = as.numeric(gsub("[^[:digit:].]", "",  Driftskostnad))) %>%
  mutate(Förändring = str_match_all(Förändring, "(?<=\\().+?(?=\\))")) %>%
  mutate(Förändring = str_replace(Förändring, "%", ""),
         Förändring = as.numeric(Förändring)) %>%
  select(-c(Brf, a)) %>%
  mutate(Byggår = as.numeric(Byggår)) %>%
  mutate(Lägenhet = sub('.*-\\n', '', Lägenhet)) %>%
  mutate(Lägenhet = sub(', Stockholm.*', '', Lägenhet)) %>%
  mutate(Ålder = 2019 - Byggår) %>%
  filter(!str_detect(Lägenhet, "Stockholm")) %>%
  mutate(Lägenhet = ifelse(
    str_detect(Lägenhet, "Södermalm"),
    "Södermalm",
    ifelse(
      str_detect(Lägenhet, "Globen"),
      "Globen",
      ifelse(
        str_detect(Lägenhet, "Hammarbyhöjden"),
        "Hammarbyhöjden",
        ifelse(
          str_detect(Lägenhet, "Johanneshov"),
          "Johanneshov",
          ifelse(
            str_detect(Lägenhet, "Enskede"),
            "Enskede",
            ifelse(
              str_detect(Lägenhet, "Gullmarsplan"),
              "Gullmarsplan",
              ifelse(str_detect(
                Lägenhet, c("Hornstull", "Sofia", "Katarina", "Mosebacke")
              ), "Södermalm", Lägenhet)
            )
          )
        )
      )
    )
  )) %>%
  mutate(Område = trimws(Lägenhet)) %>%
  select(-Lägenhet)


df <- df %>% mutate(Område = trimws(Område))
områden <-
  df %>% group_by(Område) %>% summarise(
    mean = mean(Förändring, na.rm = T),
    sd = sd(Förändring, na.rm = T),
    n = n()
  ) %>% filter(n > 3) %>%  select(Område) %>% unlist()

df %>% group_by(Område) %>% summarise(
  Medel_förändring = mean(Förändring, na.rm = T),
  sd_Förändring = sd(Förändring, na.rm = T),
  antal_bostäder = n()
) %>% filter(antal_bostäder > 3)
## # A tibble: 13 x 4
##    Område         Medel_förändring sd_Förändring antal_bostäder
##    <chr>                     <dbl>         <dbl>          <int>
##  1 Ã…rsta                     12.1           7.09            125
##  2 Bagarmossen               21.1           5.77             20
##  3 Björkhagen                14.3           5.27             34
##  4 Blåsut                    11.6           8.94             13
##  5 Enskede                   14.4           8.85             34
##  6 Globen                    20             8.77             15
##  7 Gullmarsplan              14.1          11.8               9
##  8 Hammarbyhöjden            14.6           6.28             99
##  9 Johanneshov               16.8           8.62             26
## 10 Kärrtorp                  13.9           7.40             18
## 11 Skärmarbrink              12             3.46              4
## 12 Södermalm                  8.25          7.48             11
## 13 Svedmyra                   7.4           5.59              8
dfplot <- df %>%
  filter(Område %in% områden)
ordered_spec = with(dfplot, reorder(Område, Förändring, median))
dfplot$Område <- as.factor(dfplot$Område)
dfplot %>%
  ggplot(aes(
    y = Förändring,
    x = reorder(Område, desc(Förändring), FUN = median, na.rm = T),
    fill = Område
  )) +
  geom_boxplot(alpha = 0.5) +
  theme_minimal() +
  ylab("Förändring från utropspris till slutpris (%)") +
  xlab("") +
  theme(axis.text.x = element_text(angle = 45)) +
  theme(legend.position = "none") +
  ggtitle("Alla försäljningar på Hemnet senaste 12 månaderna i följande områden",
          subtitle = "Endast områden med fler än 3 bostäder är inkluderade")