Exemplo n.º 1
0
        private TimeSeriesByDay GroupByContinents(TimeSeriesByDay countiesTimeSeriesByDay)
        {
            var continentTimeSeries = new TimeSeriesByDay();

            foreach (var countryDay in countiesTimeSeriesByDay.DaysWithLocationData)
            {
                var continentsData = countryDay.LocationsData.GroupBy(countryData => countryData.Continent).Select(
                    continentData => new LocationData
                {
                    Continent  = continentData.Key,
                    TotalCases = continentData.Sum(countryData => countryData.TotalCases)
                }).ToList();

                var continentDay = new DayWithLocationsData
                {
                    DayNumber     = countryDay.DayNumber,
                    Date          = countryDay.Date,
                    LocationsData = continentsData.Where(continentData => !string.IsNullOrEmpty(continentData.Continent)).ToList()
                };

                continentTimeSeries.DaysWithLocationData.Add(continentDay);
            }

            this.AdjustRealDaysData(continentTimeSeries);

            return(continentTimeSeries);
        }
Exemplo n.º 2
0
        private TimeSeriesByDay GroupByCountries(TimeSeriesByDay readTimeSeriesByDay)
        {
            var countryTimeSeries = new TimeSeriesByDay();

            foreach (var countryDay in readTimeSeriesByDay.DaysWithLocationData)
            {
                var countriesData = countryDay.LocationsData.GroupBy(readData => readData.Country)
                                    .Select(
                    countryData => new LocationData
                {
                    Country    = countryData.Key,
                    TotalCases = countryData.Sum(readData => readData.TotalCases)
                }).ToList();

                var continentDay = new DayWithLocationsData
                {
                    DayNumber     = countryDay.DayNumber,
                    Date          = countryDay.Date,
                    LocationsData = countriesData
                };

                countryTimeSeries.DaysWithLocationData.Add(continentDay);
            }

            this.AdjustRealDaysData(countryTimeSeries);

            return(countryTimeSeries);
        }
Exemplo n.º 3
0
        private TimeSeriesByDay AggregateTimeSeries(TimeSeriesByDay countriesTimeSeriesByDay, PredictionSettings predictionSettings)
        {
            var aggregatedTimeSeries = new TimeSeriesByDay();

            foreach (var day in countriesTimeSeriesByDay.DaysWithLocationData)
            {
                var aggregatedTimeSeriesDay = new DayWithLocationsData
                {
                    DayNumber = day.DayNumber,
                    Date      = day.Date
                };

                foreach (var locationData in day.LocationsData)
                {
                    switch (predictionSettings.CountrySearchType)
                    {
                    case CountrySearchType.Inside when !string.IsNullOrEmpty(locationData.Country) && predictionSettings.Countries.Contains(locationData.Country):
                    case CountrySearchType.Outside when string.IsNullOrEmpty(locationData.Country) || !predictionSettings.Countries.Contains(locationData.Country):
                        aggregatedTimeSeriesDay.TotalCases += locationData.TotalCases;

                        break;
                    }
                }

                aggregatedTimeSeries.DaysWithLocationData.Add(aggregatedTimeSeriesDay);
            }

            this.AdjustRealDaysData(aggregatedTimeSeries);

            return(aggregatedTimeSeries);
        }
Exemplo n.º 4
0
        private Func <double, double> CalculateRegressionFunction(TimeSeriesByDay timeSeriesByDay)
        {
            var daysDataForPrediction = timeSeriesByDay.DaysWithLocationData
                                        .Skip(1).ToArray();

            var xData = daysDataForPrediction.Select(dayData => (double)dayData.DayNumber).ToArray();
            var yData = daysDataForPrediction.Select(dayData => (double)dayData.NewCases).ToArray();

            var regressionFunction = Fit.PolynomialFunc(xData, yData, 2);

            return(regressionFunction);
        }
Exemplo n.º 5
0
        private void AdjustRealDaysData(TimeSeriesByDay timeSeriesByDay)
        {
            foreach (var day in timeSeriesByDay.DaysWithLocationData)
            {
                var previousDay = timeSeriesByDay.DaysWithLocationData.GetPreviousElement(day, 1);

                day.NewCases = previousDay == null ? 0 : day.TotalCases - previousDay.TotalCases;

                var previousWeekDay = timeSeriesByDay.DaysWithLocationData.GetPreviousElement(day, 7);
                day.WeeklyNewCases = previousWeekDay == null ? 0 : (day.TotalCases - previousWeekDay.TotalCases) / 7;

                foreach (var locationData in day.LocationsData)
                {
                    locationData.NewCases       = previousDay == null ? 0 : locationData.TotalCases - previousDay.LocationsData.Single(previousDayLocation => previousDayLocation.Equals(locationData)).TotalCases;
                    locationData.WeeklyNewCases = previousWeekDay == null ? 0 : locationData.TotalCases - previousWeekDay.LocationsData.Single(previousWeekDayLocation => previousWeekDayLocation.Equals(locationData)).TotalCases;
                }
            }
        }
Exemplo n.º 6
0
        private PredictionTimeSeries CreatePredictionTimeSeries(TimeSeriesByDay timeSeriesByDay, Func <double, double> regressionFunction)
        {
            var firstDay = timeSeriesByDay.DaysWithLocationData.First();

            var predictionDaysData = new List <PredictionDayData>
            {
                new PredictionDayData
                {
                    DayNumber  = firstDay.DayNumber,
                    Date       = firstDay.Date,
                    TotalCases = firstDay.TotalCases,
                    NewCases   = firstDay.NewCases
                }
            };

            while (predictionDaysData.Count < (timeSeriesByDay.DaysWithLocationData.Count + 192))
            {
                var lastPredictionDay = predictionDaysData.Last();

                var realDay = timeSeriesByDay.DaysWithLocationData.FirstOrDefault(day => day.DayNumber == (lastPredictionDay.DayNumber + 1));

                var newPredictionDay = new PredictionDayData
                {
                    Date           = lastPredictionDay.Date.AddDays(1),
                    DayNumber      = lastPredictionDay.DayNumber + 1,
                    TotalCases     = realDay?.TotalCases,
                    NewCases       = realDay?.NewCases,
                    WeeklyNewCases = realDay?.WeeklyNewCases
                };

                newPredictionDay.PredictionNewCases   = (long)regressionFunction(newPredictionDay.DayNumber);
                newPredictionDay.PredictionTotalCases = lastPredictionDay.PredictionTotalCases + newPredictionDay.PredictionNewCases;

                predictionDaysData.Add(newPredictionDay);
            }

            predictionDaysData.Remove(predictionDaysData.Last());

            return(new PredictionTimeSeries
            {
                DaysData = predictionDaysData.Where(day => day.PredictionNewCases > 0).ToList()
            });
        }