library(readr)
library(fpp3)
library(zoo)
library(dplyr)
library(lubridate)
library(purrr)
library(rugarch)
library(tictoc)
library(stringr)

library(broom)
library(knitr)

dataItalia <- read_csv("C:\Users\Matteo\OneDrive\Desktop\Tesi2\dataset\dfItalia.csv")
dataFrancia <- read_csv("C:\Users\Matteo\OneDrive\Desktop\Tesi2\dataset\dfFrancia.csv")
dataGermania <- read_csv("C:\Users\Matteo\OneDrive\Desktop\Tesi2\dataset\dfGermania.csv")
dataDanimarca <- read_csv("C:\Users\Matteo\OneDrive\Desktop\Tesi2\dataset\dfDanimarca.csv")

dfItalia <- dataItalia %>%
  as_tsibble(index = Data)
dfFrancia <- dataFrancia %>%
  as_tsibble(index = Data)
dfGermania <- dataGermania %>%
  as_tsibble(index = Data)
dfDanimarca <- dataDanimarca %>%
  as_tsibble(index = Data)

has_gaps(dfItalia)
has_gaps(dfFrancia)
has_gaps(dfGermania)
has_gaps(dfDanimarca)

date_duplicate <- dfItalia %>%
  count(Data) %>%
  filter(n > 1)
print(date_duplicate)
date_duplicate <- dfFrancia %>%
  count(Data) %>%
  filter(n > 1)
print(date_duplicate)
date_duplicate <- dfGermania %>%
  count(Data) %>%
  filter(n > 1)
print(date_duplicate)
date_duplicate <- dfDanimarca %>%
  count(Data) %>%
  filter(n > 1)
print(date_duplicate)

dataPUN <- read.csv("C:\Users\Matteo\OneDrive\Desktop\Tesi\Dati\PUN.csv")

dataPUN$DateTime <- as.POSIXct(
  paste(dataPUN$Data, sprintf("%02d:00:00", dataPUN$Ora - 1)),
  format = "%d/%m/%Y %H:%M:%S",
  tz = "UTC"
)

dataPUN <- dataPUN[, !names(dataPUN) %in% c("Data", "Ora")]

sum(is.na(dataPUN$DateTime))

date_parsed <- as.POSIXct(
  dataPUN$DateTime,
  format = "%Y-%m-%d %H:%M:%S",
  tz = "UTC"
)
date_errate <- dataPUN$DateTime[is.na(date_parsed)]
print(date_errate)

dataPUN$X..MWh <- as.numeric(gsub(",", ".", dataPUN$X..MWh))

sum(duplicated(dataPUN$DateTime))

dataPUN <- dataPUN %>%
  group_by(DateTime) %>%
  summarise(
    X..MWh = mean(X..MWh, na.rm = TRUE),
    .groups = "drop"
  )

dataPUN <- dataPUN |> rename(Price = X..MWh)

dfPun <- as_tsibble(dataPUN, index = DateTime)

tsibble::scan_gaps(dfPun)

dfPun <- dfPun |>
  fill_gaps() |>
  mutate(
    Price = zoo::na.approx(Price)
  )

dfItalia <- dfItalia %>%
  left_join(dfPun %>% select(DateTime, Price), by = c("Data" = "DateTime")) %>%
  rename(PUN = Price)

dfItalia <- dfItalia %>%
  rename(Prezzo=PUN)

dfFrancia <- dfFrancia %>%
  rename(Prezzo=Giorno_prezzo_spot_avanti_FR)

dfGermania <- dfGermania %>%
  rename(Prezzo=`Giorno_prezzo_spot_avanti_DE-LU`)

dfDanimarca <- dfDanimarca %>%
  rename(Prezzo=Giorno_prezzo_spot_avanti_DK1)

colSums(is.na(dataItalia))
colSums(is.na(dataFrancia))
colSums(is.na(dataGermania))
colSums(is.na(dataDanimarca))

dfItalia <- dfItalia %>%
  mutate(across(where(is.numeric), ~ na.approx(., na.rm = FALSE, rule = 2)))
dfFrancia <- dfFrancia %>%
  mutate(across(where(is.numeric), ~ na.approx(., na.rm = FALSE, rule = 2)))
dfGermania <- dfGermania %>%
  mutate(across(where(is.numeric), ~ na.approx(., na.rm = FALSE, rule = 2)))
dfDanimarca <- dfDanimarca %>%
  mutate(across(where(is.numeric), ~ na.approx(., na.rm = FALSE, rule = 2)))

sum(is.na(dfItalia))
sum(is.na(dfFrancia))
sum(is.na(dfGermania))
sum(is.na(dfDanimarca))

dfItalia <- dfItalia %>%
  mutate(
    Giorno = date(Data),
    Ora_ = hour(Data)
  )
dfItalia <- dfItalia %>%
  mutate(
    Ora_ = factor(Ora_),
    Giorno_settimana = factor(
      wday(Data, label = TRUE, week_start = 1),
      ordered = FALSE
    )
  )

dfFrancia <- dfFrancia %>%
  mutate(
    Giorno = date(Data),
    Ora_ = hour(Data)
  )
dfFrancia <- dfFrancia %>%
  mutate(
    Ora_ = factor(Ora_),
    Giorno_settimana = factor(
      wday(Data, label = TRUE, week_start = 1),
      ordered = FALSE
    )
  )

dfGermania <- dfGermania %>%
  mutate(
    Giorno = date(Data),
    Ora_ = hour(Data)
  )
dfGermania <- dfGermania %>%
  mutate(
    Ora_ = factor(Ora_),
    Giorno_settimana = factor(
      wday(Data, label = TRUE, week_start = 1),
      ordered = FALSE
    )
  )

dfDanimarca <- dfDanimarca %>%
  mutate(
    Giorno = date(Data),
    Ora_ = hour(Data)
  )
dfDanimarca <- dfDanimarca %>%
  mutate(
    Ora_ = factor(Ora_),
    Giorno_settimana = factor(
      wday(Data, label = TRUE, week_start = 1),
      ordered = FALSE
    )
  )

names(dfItalia)
names(dfFrancia)
names(dfGermania)
names(dfDanimarca)

media_italia <- mean(dfItalia$Prezzo, na.rm = TRUE)
media_francia <- mean(dfFrancia$Prezzo, na.rm = TRUE)
media_germania <- mean(dfGermania$Prezzo, na.rm = TRUE)
media_danimarca <- mean(dfDanimarca$Prezzo, na.rm = TRUE)

tabella_prezzi_medi <- data.frame(
  Nazione = c("Italia", "Francia", "Germania", "Danimarca"),
  Prezzo_Medio = c(media_italia, media_francia, media_germania, media_danimarca)
)

print(tabella_prezzi_medi)

mod_italia <- lm(
  scale(Prezzo) ~
    scale(Carico) +
    scale(Rinnovabile) +
    scale(Non_Rinnovabile) +
    scale(Commercio_transfrontaliero_di_energia_elettrica) +
    scale(`Idroelettrico_ad_accumulazione_con pompaggio_consumo`) +
    scale(Quote_di_emissioni_europee_di_CO2_Auction_EU) +
    Ora_ +
    Giorno_settimana,
  data = dfItalia
)

tab_italia <- tidy(mod_italia) %>%
  mutate(
    Paese = "Italia",
    estimate = round(estimate, 4),
    std.error = round(std.error, 4),
    statistic = round(statistic, 3),
    p.value = round(p.value, 5)
  ) %>%
  select(Paese, term, estimate, std.error, statistic, p.value)

kable(tab_italia)

mod_francia <- lm(
  scale(Prezzo) ~
    scale(Carico) +
    scale(Rinnovabile) +
    scale(Non_Rinnovabile) +
    scale(Nucleare) +
    scale(Commercio_transfrontaliero_di_energia_elettrica) +
    scale(Idroelettrico_ad_accumulazione_con_pompaggio_consumo) +
    scale(Quote_di_emissioni_europee_di_CO2_Auction_EU) +
    Ora_ +
    Giorno_settimana,
  data = dfFrancia
)

tab_francia <- tidy(mod_francia) %>%
  mutate(
    Paese = "Francia",
    estimate = round(estimate, 4),
    std.error = round(std.error, 4),
    statistic = round(statistic, 3),
    p.value = round(p.value, 5)
  ) %>%
  select(Paese, term, estimate, std.error, statistic, p.value)

kable(tab_francia)

mod_germania <- lm(
  scale(Prezzo) ~
    scale(Carico) +
    scale(Rinnovabile) +
    scale(Non_Rinnovabile) +
    scale(Commercio_transfrontaliero_di_energia_elettrica) +
    scale(Idroelettrico_ad_accumulazione_con_pompaggio_consumo) +
    scale(Quote_di_emissioni_europee_di_CO2_Auction_EU) +
    Ora_ +
    Giorno_settimana,
  data = dfGermania
)

tab_germania <- tidy(mod_germania) %>%
  mutate(
    Paese = "Germania",
    estimate = round(estimate, 4),
    std.error = round(std.error, 4),
    statistic = round(statistic, 3),
    p.value = round(p.value, 5)
  ) %>%
  select(Paese, term, estimate, std.error, statistic, p.value)

kable(tab_germania)

mod_danimarca <- lm(
  scale(Prezzo) ~
    scale(Carico) +
    scale(Rinnovabile) +
    scale(Non_Rinnovabile) +
    scale(Commercio_transfrontaliero_di_energia_elettrica) +
    scale(Quote_di_emissioni_europee_di_CO2_Auction_EU) +
    Ora_ +
    Giorno_settimana,
  data = dfDanimarca
)

tab_danimarca <- tidy(mod_danimarca) %>%
  mutate(
    Paese = "Danimarca",
    estimate = round(estimate, 4),
    std.error = round(std.error, 4),
    statistic = round(statistic, 3),
    p.value = round(p.value, 5)
  ) %>%
  select(Paese, term, estimate, std.error, statistic, p.value)

kable(tab_danimarca)

tab_finale <- bind_rows(
  tab_italia,
  tab_francia,
  tab_germania,
  tab_danimarca
) %>%
  arrange(Paese, desc(abs(estimate)))

kable(tab_finale)

library(car)

vif(mod_italia)
vif(mod_francia)
vif(mod_germania)
vif(mod_danimarca)
