Skip to content

Commit

Permalink
-
Browse files Browse the repository at this point in the history
  • Loading branch information
Sanaxen committed Oct 31, 2022
1 parent 8da6a7b commit ca37c20
Show file tree
Hide file tree
Showing 11 changed files with 660 additions and 416 deletions.
26 changes: 25 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,25 @@
# tft
# tft

This is a C# application for time series forecasting using tft's R implementation.
Through the C# UI, you can easily perform time series forecasting with the
[Temporal Fusion Transformer model](https://arxiv.org/pdf/1912.09363.pdf)


At the core of this application, tft is ![](./images/554068490.png) https://github.com/mlverse.
It relies heavily on https://github.com/mlverse/tft, a wonderful library implemented in R developed at

<img src="./images/image01.gif" width=60%>
<img src="./images/image02.gif" width=60%>
# Requirements
[webview2](https://developer.microsoft.com/ja-jp/microsoft-edge/webview2/)
R-4.1.2

slider
ggplot2
tidymodels
plotly
htmlwidgets

[tft](https://github.com/mlverse/tft)
[torch](https://github.com/mlverse/torch )
[luz](https://github.com/mlverse/luz)
Binary file added images/554068490.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/image00.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/image01.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/image02.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/image03.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
107 changes: 87 additions & 20 deletions script/tft_util.r
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@
# use_date_am = T
# use_date_pm = T

# window_size = 7
# use_date_lag = TRUE
# use_date_mean = TRUE
# use_date_sd = TRUE
# use_date_quantile = TRUE

line_color_bule ="#00AFC5"
line_color_red ="#FF7042"

Expand Down Expand Up @@ -123,15 +129,26 @@ tft_data_compact <- function(input_df, step_unit="week")
}


tft_data_split <- function(input_df, unit, lookback, pred_len, validation=F)
library(slider)
quantile25 <- function(x)
{
return (as.numeric(quantile(x)[2]))
}
quantile75 <- function(x)
{
return (as.numeric(quantile(x)[4]))
}
tft_data_split <- function(input_df, unit, lookback, pred_len, future_test_len, validation=F)
{
#print(pred_len)
train <- NULL
valid <- NULL
test <- NULL

tidx <- input_df %>% group_by(key) %>% mutate(tidx = row_number())
tidx <- tidx$tidx


data_tbl <- input_df
if ( unit == "hour" )
{
Expand Down Expand Up @@ -253,28 +270,78 @@ tft_data_split <- function(input_df, unit, lookback, pred_len, validation=F)
data_tbl$self_adding_date_year = as.factor(lubridate::year(input_df$date))
data_tbl$self_adding_date_quarter = as.factor(lubridate::quarter(input_df$date))
}
if (!use_date_year && !("self_adding_date_year" %in% names(data_tbl))) data_tbl$self_adding_date_year <- NULL
if (!use_date_month && !("self_adding_date_month" %in% names(data_tbl))) data_tbl$self_adding_date_month <- NULL
if (!use_date_week && !("self_adding_date_week" %in% names(data_tbl))) data_tbl$self_adding_date_week <- NULL
if (!use_date_wday && !("self_adding_date_wday" %in% names(data_tbl))) data_tbl$self_adding_date_wday <- NULL
if (!use_date_day && !("self_adding_date_day" %in% names(data_tbl))) data_tbl$self_adding_date_day <- NULL
if (!use_date_yday && !("self_adding_date_yday" %in% names(data_tbl))) data_tbl$self_adding_date_yday <- NULL
if (!use_date_hour && !("self_adding_date_hour" %in% names(data_tbl))) data_tbl$self_adding_date_hour <- NULL
if (!use_date_am && !("self_adding_date_am" %in% names(data_tbl))) data_tbl$self_adding_date_am <- NULL
if (!use_date_pm && !("self_adding_date_pm" %in% names(data_tbl))) data_tbl$self_adding_date_pm <- NULL
if (!use_date_quarter && !("self_adding_date_quarter" %in% names(data_tbl))) data_tbl$self_adding_date_quarter <- NULL
if (!use_date_year && ("self_adding_date_year" %in% names(data_tbl))) data_tbl$self_adding_date_year <- NULL
if (!use_date_month && ("self_adding_date_month" %in% names(data_tbl))) data_tbl$self_adding_date_month <- NULL
if (!use_date_week && ("self_adding_date_week" %in% names(data_tbl))) data_tbl$self_adding_date_week <- NULL
if (!use_date_wday && ("self_adding_date_wday" %in% names(data_tbl))) data_tbl$self_adding_date_wday <- NULL
if (!use_date_day && ("self_adding_date_day" %in% names(data_tbl))) data_tbl$self_adding_date_day <- NULL
if (!use_date_yday && ("self_adding_date_yday" %in% names(data_tbl))) data_tbl$self_adding_date_yday <- NULL
if (!use_date_hour && ("self_adding_date_hour" %in% names(data_tbl))) data_tbl$self_adding_date_hour <- NULL
if (!use_date_am && ("self_adding_date_am" %in% names(data_tbl))) data_tbl$self_adding_date_am <- NULL
if (!use_date_pm && ("self_adding_date_pm" %in% names(data_tbl))) data_tbl$self_adding_date_pm <- NULL
if (!use_date_quarter && ("self_adding_date_quarter" %in% names(data_tbl))) data_tbl$self_adding_date_quarter <- NULL

if (!use_date_sincosY && !("self_adding_date_sin_Y" %in% names(data_tbl))) data_tbl$self_adding_date_sin_Y <- NULL
if (!use_date_sincosY && !("self_adding_date_cos_Y" %in% names(data_tbl))) data_tbl$self_adding_date_cos_Y <- NULL
if (!use_date_sincosM && !("self_adding_date_sin_M" %in% names(data_tbl))) data_tbl$self_adding_date_sin_M <- NULL
if (!use_date_sincosM && !("self_adding_date_cos_M" %in% names(data_tbl))) data_tbl$self_adding_date_cos_M <- NULL
if (!use_date_sincosW && !("self_adding_date_sin_W" %in% names(data_tbl))) data_tbl$self_adding_date_sin_W <- NULL
if (!use_date_sincosW && !("self_adding_date_cos_W" %in% names(data_tbl))) data_tbl$self_adding_date_cos_W <- NULL
if (!use_date_sincosD && !("self_adding_date_sin_D" %in% names(data_tbl))) data_tbl$self_adding_date_sin_D <- NULL
if (!use_date_sincosD && !("self_adding_date_cos_D" %in% names(data_tbl))) data_tbl$self_adding_date_cos_D <- NULL
if (!use_date_sincosY && ("self_adding_date_sin_Y" %in% names(data_tbl))) data_tbl$self_adding_date_sin_Y <- NULL
if (!use_date_sincosY && ("self_adding_date_cos_Y" %in% names(data_tbl))) data_tbl$self_adding_date_cos_Y <- NULL
if (!use_date_sincosM && ("self_adding_date_sin_M" %in% names(data_tbl))) data_tbl$self_adding_date_sin_M <- NULL
if (!use_date_sincosM && ("self_adding_date_cos_M" %in% names(data_tbl))) data_tbl$self_adding_date_cos_M <- NULL
if (!use_date_sincosW && ("self_adding_date_sin_W" %in% names(data_tbl))) data_tbl$self_adding_date_sin_W <- NULL
if (!use_date_sincosW && ("self_adding_date_cos_W" %in% names(data_tbl))) data_tbl$self_adding_date_cos_W <- NULL
if (!use_date_sincosD && ("self_adding_date_sin_D" %in% names(data_tbl))) data_tbl$self_adding_date_sin_D <- NULL
if (!use_date_sincosD && ("self_adding_date_cos_D" %in% names(data_tbl))) data_tbl$self_adding_date_cos_D <- NULL

#print(window_size)
#print(pred_len)
if ( window_size > pred_len )
{
if ( use_date_lag )
{
data_tbl<-data_tbl %>% group_by(key) %>% mutate(self_adding_date_lag = lag(target, n=window_size ))
data_tbl$origin__ <- NULL
}
if ( use_date_mean )
{
data_tbl<-data_tbl %>% group_by(key) %>% mutate(self_adding_date_mean = slide_vec(.x = target, .f = mean, .before = window_size))
}
if ( use_date_sd )
{
data_tbl<-data_tbl %>% group_by(key) %>% mutate(self_adding_date_sd = slide_vec(.x = target, .f = sd, .before = window_size))
}
data_tbl <- data_tbl %>% group_by(key) %>%
mutate(across(where(is.numeric), ~ replace_na(.x, mean(.x,na.rm = TRUE))))

if ( use_date_quantile )
{
data_tbl<-data_tbl %>% group_by(key) %>% mutate(self_adding_date_quantile25 = slide_vec(.x = target, .f = quantile25, .before = window_size))
data_tbl<-data_tbl %>% group_by(key) %>% mutate(self_adding_date_quantile75 = slide_vec(.x = target, .f = quantile75, .before = window_size))
}
}else
{
if ( use_date_lag )
{
data_tbl<-data_tbl %>% group_by(key) %>% mutate(self_adding_statistics_lag = lag(target, n=window_size ))
data_tbl$origin__ <- NULL
}
if ( use_date_mean )
{
data_tbl<-data_tbl %>% group_by(key) %>% mutate(self_adding_statistics_mean = slide_vec(.x = target, .f = mean, .before = window_size))
}
if ( use_date_sd )
{
data_tbl<-data_tbl %>% group_by(key) %>% mutate(self_adding_statistics_sd = slide_vec(.x = target, .f = sd, .before = window_size))
}
data_tbl <- data_tbl %>% group_by(key) %>%
mutate(across(where(is.numeric), ~ replace_na(.x, mean(.x,na.rm = TRUE))))

if ( use_date_quantile )
{
data_tbl<-data_tbl %>% group_by(key) %>% mutate(self_adding_statistics_quantile25 = slide_vec(.x = target, .f = quantile25, .before = window_size))
data_tbl<-data_tbl %>% group_by(key) %>% mutate(self_adding_statistics_quantile75 = slide_vec(.x = target, .f = quantile75, .before = window_size))
}
}


head(data_tbl)
str(data_tbl)
out.file <- file("tmp_tft_data_split.r", open = "w")

last_date <- max(data_tbl$date)
Expand Down
25 changes: 25 additions & 0 deletions tft.sln
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.32901.82
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "tft", "tft\tft.csproj", "{C6572F7B-B844-4541-B185-C251B5209345}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C6572F7B-B844-4541-B185-C251B5209345}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C6572F7B-B844-4541-B185-C251B5209345}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C6572F7B-B844-4541-B185-C251B5209345}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C6572F7B-B844-4541-B185-C251B5209345}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {88295169-C32B-4ED9-AC1E-916929638F04}
EndGlobalSection
EndGlobal
Loading

0 comments on commit ca37c20

Please sign in to comment.