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)); }
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")); }
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); }