private GraphData GroupDaily(GraphData data)
        {
            var newData = new GraphData {
                EndDate    = data.EndDate,
                StartDate  = data.StartDate,
                Padding    = 10,
                XAxisLabel = data.XAxisLabel,
                YAxisLabel = data.YAxisLabel,
                Name       = "Grouped daily",
            };

            foreach (var(key, value) in data.Data)
            {
                var   x     = new float[value.x.Length];
                var   y     = new float[value.x.Length];
                float count = 0;
                for (int i = 0; i < y.Length; i++)
                {
                    x[i]   = i;
                    count += value.y[i];
                    y[i]   = count;
                }
                CubicSpline.FitParametric(x, y, value.x.Length * 5, out var xS, out var yS);
                newData.Data.Add(key, (xS, RemoveSmallerValues(yS)));
            }
            return(newData);
        }
        private GraphData GenerateHourly()
        {
            var data = new GraphData();

            data.StartDate = null;
            data.Name      = "Activity";
            var hours = new float[24];

            for (int i = 0; i < 24; i++)
            {
                hours[i] = i;
            }
            foreach (var item in Messages)
            {
                var hourlyCount = new float[24];
                var hourly      = item.Value.GroupBy(x => x.Time.Hour).OrderBy(x => x.Key).ToList();
                //var max = hourly.Max(x => x.Count());
                foreach (var x in hourly)
                {
                    //hourlyCount[x.Key] = x.Count() * 100.0f / max;
                    hourlyCount[x.Key] = x.Count();
                }
                CubicSpline.FitParametric(hours, hourlyCount, 24 * 10, out var xs, out var yS);
                data.Data.Add(item.Key, (xs, RemoveNegativeValues(yS)));
            }
            return(data);
        }
        private static GraphData GenerateOverallHourly(ref List <Message> data)
        {
            //var daily = orderedData.GroupBy(x => x.Time.Date).ToList();
            var hourly      = data.GroupBy(x => x.Time.Hour).OrderBy(x => x.Key).ToList();
            var hours       = new float[24];
            var hourlyCount = new float[24];

            for (int i = 0; i < 24; i++)
            {
                hourlyCount[i] = (hourly[i].Count());
                hours[i]       = i;
            }
            var dataHourly = new GraphData();

            CubicSpline.FitParametric(hours, hourlyCount, 24 * 10, out var xS, out var yS);
            dataHourly.Data.Add("Hourly", (xS, yS));
            dataHourly.Padding    = 10;
            dataHourly.Name       = "Hourly data";
            dataHourly.YAxisLabel = "Value";
            dataHourly.XAxisLabel = "Hours";
            return(dataHourly);
        }