public async Task <string> GetAsync(double timeSpentInBacklog, string type, string devTeam, string createdBy)
        {
            var helper = new MultipleLinearRegressionAnalysisHelper();
            var developerRepository = new DeveloperRepository();
            var taskItemType        = GetTaskItemType(type);

            var taskItem = new MultipleLinearRegressionTaskItem
            {
                TimeSpentInBacklog = timeSpentInBacklog,

                TypeIsProduct       = taskItemType == TaskItemType.Product,
                TypeIsEngineering   = taskItemType == TaskItemType.Engineering,
                TypeIsUnanticipated = taskItemType == TaskItemType.Unanticipated,

                DevTeamIsAssessments = devTeam == "Assessments",
                DevTeamIsEnterprise  = devTeam == "Enterprise",

                CreatedBy = await developerRepository.GetDeveloperByNameAsync(createdBy)
            };

            return(await helper.GetEstimation(taskItem));
        }
예제 #2
0
        public async Task <string> GetEstimation(MultipleLinearRegressionTaskItem item)
        {
            var multipleLinearRegressionAnalysisData = await GetMultipleLinearRegressionAnalysisData(item);

            var ols = new OrdinaryLeastSquares()
            {
                UseIntercept = true,
                IsRobust     = true
            };

            var regression = ols.Learn(multipleLinearRegressionAnalysisData.Inputs,
                                       multipleLinearRegressionAnalysisData.Outputs);

            multipleLinearRegressionAnalysisData.Predicted = regression.Transform(multipleLinearRegressionAnalysisData.Inputs);

            multipleLinearRegressionAnalysisData.Error =
                new SquareLoss(multipleLinearRegressionAnalysisData.Outputs).Loss(
                    multipleLinearRegressionAnalysisData.Predicted);

            multipleLinearRegressionAnalysisData.R2 = regression.CoefficientOfDetermination(
                multipleLinearRegressionAnalysisData.Inputs, multipleLinearRegressionAnalysisData.Outputs, adjust: false);

            return((multipleLinearRegressionAnalysisData.Predicted.Last() * 8).ToString("F2"));
        }
        public async Task When_getting_multiple_linear_regression_data()
        {
            var taskItems = new List <TaskItem>
            {
                new TaskItem
                {
                    CreatedBy = new Developer
                    {
                        Id   = 1014,
                        Name = "Charles"
                    },
                    DevelopmentTeam = new DevelopmentTeam
                    {
                        Id   = 4,
                        Name = "Enterprise"
                    },
                    Type          = TaskItemType.Unanticipated,
                    CreatedOn     = new DateTimeOffset(new DateTime(2021, 1, 11)),
                    StartTime     = new DateTimeOffset(new DateTime(2021, 1, 15)),
                    FinishTime    = new DateTimeOffset(new DateTime(2021, 1, 19)),
                    LastChangedOn = new DateTimeOffset(new DateTime(2021, 1, 21)),
                    NumRevisions  = 1
                },
                new TaskItem
                {
                    CreatedBy = new Developer
                    {
                        Id   = 1014,
                        Name = "Charles"
                    },
                    DevelopmentTeam = new DevelopmentTeam
                    {
                        Id   = 4,
                        Name = "Enterprise"
                    },
                    Type          = TaskItemType.Product,
                    CreatedOn     = new DateTimeOffset(new DateTime(2021, 1, 11)),
                    StartTime     = new DateTimeOffset(new DateTime(2021, 1, 13)),
                    FinishTime    = new DateTimeOffset(new DateTime(2021, 1, 16)),
                    LastChangedOn = new DateTimeOffset(new DateTime(2021, 1, 17)),
                    NumRevisions  = 2
                },
                new TaskItem
                {
                    CreatedBy = new Developer
                    {
                        Id   = 1015,
                        Name = "Dave"
                    },
                    DevelopmentTeam = new DevelopmentTeam
                    {
                        Id   = 4,
                        Name = "Enterprise"
                    },
                    Type          = TaskItemType.Product,
                    CreatedOn     = new DateTimeOffset(new DateTime(2021, 1, 11)),
                    StartTime     = new DateTimeOffset(new DateTime(2021, 1, 12)),
                    FinishTime    = new DateTimeOffset(new DateTime(2021, 1, 17)),
                    LastChangedOn = new DateTimeOffset(new DateTime(2021, 1, 18)),
                    NumRevisions  = 3
                },
                new TaskItem
                {
                    CreatedBy = new Developer
                    {
                        Id   = 1014,
                        Name = "Charles"
                    },
                    DevelopmentTeam = new DevelopmentTeam
                    {
                        Id   = 4,
                        Name = "Enterprise"
                    },
                    Type          = TaskItemType.Engineering,
                    CreatedOn     = new DateTimeOffset(new DateTime(2021, 1, 11)),
                    StartTime     = new DateTimeOffset(new DateTime(2021, 1, 15)),
                    FinishTime    = new DateTimeOffset(new DateTime(2021, 1, 18)),
                    LastChangedOn = new DateTimeOffset(new DateTime(2021, 1, 19)),
                    NumRevisions  = 4
                },
                new TaskItem
                {
                    CreatedBy = new Developer
                    {
                        Id   = 1015,
                        Name = "Dave"
                    },
                    DevelopmentTeam = new DevelopmentTeam
                    {
                        Id   = 4,
                        Name = "Enterprise"
                    },
                    Type          = TaskItemType.Engineering,
                    CreatedOn     = new DateTimeOffset(new DateTime(2021, 1, 11)),
                    StartTime     = new DateTimeOffset(new DateTime(2021, 1, 16)),
                    FinishTime    = new DateTimeOffset(new DateTime(2021, 1, 19)),
                    LastChangedOn = new DateTimeOffset(new DateTime(2021, 1, 20)),
                    NumRevisions  = 3
                },
                new TaskItem
                {
                    CreatedBy = new Developer
                    {
                        Id   = 1014,
                        Name = "Charles"
                    },
                    DevelopmentTeam = new DevelopmentTeam
                    {
                        Id   = 4,
                        Name = "Enterprise"
                    },
                    Type          = TaskItemType.Engineering,
                    CreatedOn     = new DateTimeOffset(new DateTime(2021, 1, 13)),
                    StartTime     = new DateTimeOffset(new DateTime(2021, 1, 15)),
                    FinishTime    = new DateTimeOffset(new DateTime(2021, 1, 18)),
                    LastChangedOn = new DateTimeOffset(new DateTime(2021, 1, 19)),
                    NumRevisions  = 4
                }
            };

            var taskItem = new MultipleLinearRegressionTaskItem
            {
                CreatedBy = new Developer
                {
                    Id   = 1014,
                    Name = "Charles"
                },
                DevTeamIsAssessments = true,
                DevTeamIsEnterprise  = false,
                TimeSpentInBacklog   = 5.23,
                TypeIsProduct        = true,
                TypeIsEngineering    = false,
                TypeIsUnanticipated  = false
            };

            var mockTaskItemRepository = new Mock <TaskItemRepository>();

            mockTaskItemRepository
            .Setup(x => x.GetTaskItemListAsync(It.IsAny <DateTimeOffset?>(), It.IsAny <DateTimeOffset?>()))
            .ReturnsAsync(taskItems);
            var multipleLinearRegressionAnalysisHelper =
                new MultipleLinearRegressionAnalysisHelper(mockTaskItemRepository.Object);

            var result2 = await multipleLinearRegressionAnalysisHelper.GetEstimation(taskItem);

            Assert.That(result2, Is.EqualTo("-8.00"));
        }
예제 #4
0
        public async Task <MultipleLinearRegressionAnalysisData> GetMultipleLinearRegressionAnalysisData(MultipleLinearRegressionTaskItem item)
        {
            var multipleLinearRegressionAnalysisData = new MultipleLinearRegressionAnalysisData();

            var taskItemList =
                await taskItemRepository.GetTaskItemListAsync(new DateTimeOffset(new DateTime(2020, 1, 1)), DateTimeOffset.Now);

            foreach (var taskItem in taskItemList.Where(taskItem =>
                                                        !multipleLinearRegressionAnalysisData.UserIds.Contains(taskItem.CreatedBy.Id)))
            {
                multipleLinearRegressionAnalysisData.UserIds.Add(taskItem.CreatedBy.Id);
            }

            var inputs     = new List <List <double> >();
            var outputList = new List <double>();

            foreach (var logisticRegressionTaskItem
                     in from taskItem in taskItemList
                     where taskItem.StartTime != null &&
                     taskItem.FinishTime != null
                     select GetRegressionAnalysisTaskItem(taskItem))
            {
                multipleLinearRegressionAnalysisData.Ids.Add(logisticRegressionTaskItem.Id);
                inputs.Add(new List <double>
                {
                    logisticRegressionTaskItem.TimeSpentInBacklog.TotalDays,
                    logisticRegressionTaskItem.TypeIsProduct ? 1.0 : 0.0,
                    logisticRegressionTaskItem.TypeIsEngineering ? 1.0 : 0.0,
                    logisticRegressionTaskItem.TypeIsUnanticipated ? 1.0 : 0.0,
                    (logisticRegressionTaskItem.DevTeamIsAssessments ? 1.0 : 0.0),
                    (logisticRegressionTaskItem.DevTeamIsEnterprise ? 1.0 : 0.0)
                });

                foreach (var userId in multipleLinearRegressionAnalysisData.UserIds)
                {
                    inputs.Last().Add(logisticRegressionTaskItem.CreatedById == userId ? 1.0 : 0.0);
                }

                outputList.Add(logisticRegressionTaskItem.LeadTime.TotalDays);
            }

            var itemInput = new List <double>
            {
                item.TimeSpentInBacklog,
                item.TypeIsProduct ? 1.0 : 0.0,
                item.TypeIsEngineering ? 1.0 : 0.0,
                item.TypeIsUnanticipated ? 1.0 : 0.0,
                item.DevTeamIsAssessments ? 1.0 : 0.0,
                item.DevTeamIsEnterprise ? 1.0 : 0.0
            };

            foreach (var userId in multipleLinearRegressionAnalysisData.UserIds)
            {
                itemInput.Add(item.CreatedBy.Id == userId ? 1.0 : 0.0);
            }

            inputs.Add(itemInput);
            outputList.Add(-1.0);
            multipleLinearRegressionAnalysisData.Ids.Add(0);

            multipleLinearRegressionAnalysisData.Inputs  = inputs.Select(input => input.ToArray()).ToArray();
            multipleLinearRegressionAnalysisData.Outputs = outputList.ToArray();
            return(multipleLinearRegressionAnalysisData);
        }