public ForecastingData CreateTimeFeatures(ForecastingData forecastData) { // Note: These properties could be set at the model level but to better illustrate the // concepts of time series it was more clear to put them in a method with the other // data time processing steps. forecastData.Year = forecastData.Time.Year; forecastData.Month = forecastData.Time.Month; forecastData.WeekOfMonth = Convert.ToInt32(Math.Ceiling(forecastData.Time.Day / 7.0)); forecastData.WeekOfYear = Convert.ToInt32(Math.Ceiling(forecastData.Time.DayOfYear / 7.0)); // 4th Friday in November forecastData.IsBlackFriday = forecastData.DatesInWeek.Any(date => date.Month == 11 && date.DayOfWeek == DayOfWeek.Friday && date.Day > 22 && date.Day < 29); // 1st Monday in September forecastData.IsUsLaborDay = forecastData.DatesInWeek.Any(date => date.Month == 9 && date.DayOfWeek == DayOfWeek.Monday && date.Day < 8); // 25th of December forecastData.IsChristmasDay = forecastData.DatesInWeek.Any(date => date.Month == 12 && date.Day == 25); // 1st of January forecastData.IsUsNewYearsDay = forecastData.DatesInWeek.Any(date => date.Month == 1 && date.Day == 1); return(forecastData); }
public List <ForecastingData> AddWeeksToPredict(List <ForecastingData> forecastData, int weeksToPredict, int storeID1, int itemID2) { var latestData = forecastData.OrderByDescending(data => data.Time).First(); var latestDate = latestData.Time; var latestRdpi = latestData.RDPI; for (int i = 0; i < weeksToPredict; i++) { latestDate = latestDate.AddDays(7); var forcastingDataItem = new ForecastingData { ID1 = storeID1, ID2 = itemID2, Time = latestDate, Value = 0, RDPI = latestRdpi, DatesInWeek = new List <DateTime>() }; // Populate dates in week for new items. for (var dt = forcastingDataItem.Time; dt <= forcastingDataItem.Time.AddDays(6); dt = dt.AddDays(1)) { forcastingDataItem.DatesInWeek.Add(dt); } // Create Time Features for new week. forcastingDataItem = CreateTimeFeatures(forcastingDataItem); // Create Fourier Features for new week. forcastingDataItem = CreateFourierFeatures(forcastingDataItem); forecastData.Add(forcastingDataItem); } return(forecastData); }
public static List <ForecastingData> GetForecastingDataFromLocal(string fileName) { string sourceFile = $"{Environment.CurrentDirectory}\\Datasets\\{fileName}.csv"; return(File.ReadAllLines(sourceFile) .Skip(1) .Select(line => ForecastingData.FromCsv(line)) .ToList()); }
public static List <ForecastingData> GetForecastingDataFromLocal(string fileName) { //set path based on OS string sourceFile = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? $"{Environment.CurrentDirectory}\\Datasets\\{fileName}.csv" : sourceFile = $"{Environment.CurrentDirectory}//Datasets//{fileName}.csv"; return(File.ReadAllLines(sourceFile) .Skip(1) .Select(line => ForecastingData.FromCsv(line)) .ToList()); }
public ForecastingData CreateFourierFeatures(ForecastingData forecastData) { // Set seasonality to 52 which is the number of weeks in a year. var seasonality = 52; forecastData.FreqCos1 = Math.Cos(forecastData.WeekOfYear * 2 * Math.PI * 1 / seasonality); forecastData.FreqSin1 = Math.Sin(forecastData.WeekOfYear * 2 * Math.PI * 1 / seasonality); forecastData.FreqCos2 = Math.Cos(forecastData.WeekOfYear * 2 * Math.PI * 2 / seasonality); forecastData.FreqSin2 = Math.Sin(forecastData.WeekOfYear * 2 * Math.PI * 2 / seasonality); forecastData.FreqCos3 = Math.Cos(forecastData.WeekOfYear * 2 * Math.PI * 3 / seasonality); forecastData.FreqSin3 = Math.Sin(forecastData.WeekOfYear * 2 * Math.PI * 3 / seasonality); forecastData.FreqCos4 = Math.Cos(forecastData.WeekOfYear * 2 * Math.PI * 4 / seasonality); forecastData.FreqSin4 = Math.Sin(forecastData.WeekOfYear * 2 * Math.PI * 4 / seasonality); return(forecastData); }