public bool Train([FromBody] List <Rfm> data) { if (data != null && data.Any()) { var segmentator = new CustomersSegmentator(); segmentator.Train(data); return(true); } return(false); }
public List <int> PredictList([FromBody] List <ClusteringData> data) { var segmentator = new CustomersSegmentator(); return(segmentator.Predict(data)); }
public async Task <IActionResult> OnPost(IFormFile file, string train, string predict, string download) { // var fileName = file.FileName; using (var stream = new MemoryStream()) { file.CopyTo(stream); var customers = new ExcelImportProcessor().GetImportData(stream); var rfmCalculateService = new RfmCalculateService(); var calculatedScores = rfmCalculateService.CalculateRfmScores(customers); var segmentator = new CustomersSegmentator(_hostingEnvironment.ContentRootPath); if (!string.IsNullOrEmpty(train)) { var businessData = calculatedScores.Select(x => new Rfm { R = x.R, F = x.F, M = x.M }).ToList(); _clusteringMetrics = segmentator.Train(businessData); ViewData["ClusteringMetrics"] = _clusteringMetrics.AvgMinScore.ToString(); } else if (!string.IsNullOrEmpty(predict)) { var businessData = calculatedScores.Select(x => new ClusteringData { R = x.R, F = x.F, M = x.M }).ToList(); var predictions = segmentator.Predict(businessData); var predictedCustomers = calculatedScores.Select((t, i) => new PredictionResult { CustomerId = t.CustomerId.ToString(), R = t.R, F = t.F, M = t.M, Cluster = predictions[i] }).ToList(); ViewData["PredictedCustomers"] = predictedCustomers; } else if (!string.IsNullOrEmpty(download)) { var businessData = calculatedScores.Select(x => new ClusteringData { R = x.R, F = x.F, M = x.M }).ToList(); var predictions = segmentator.Predict(businessData); var predictedCustomers = calculatedScores.Select((t, i) => new PredictionResult { CustomerId = t.CustomerId.ToString(), R = t.R, F = t.F, M = t.M, Cluster = predictions[i] }).ToList(); ViewData["PredictedCustomers"] = predictedCustomers; var groupedCustomers = predictedCustomers.GroupBy(x => x.Cluster); ExcelPackage excel = new ExcelPackage(); foreach (var group in groupedCustomers) { var workSheet = excel.Workbook.Worksheets.Add("Cluster" + group.Key.ToString()); workSheet.TabColor = System.Drawing.Color.Black; workSheet.DefaultRowHeight = 12; //Header of table // workSheet.Row(1).Height = 20; workSheet.Row(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; workSheet.Row(1).Style.Font.Bold = true; workSheet.Cells[1, 1].Value = "CustomerID"; workSheet.Cells[1, 2].Value = "R"; workSheet.Cells[1, 3].Value = "F"; workSheet.Cells[1, 4].Value = "M"; //Body of table // int recordIndex = 2; foreach (var customer in group) { workSheet.Cells[recordIndex, 1].Value = customer.CustomerId; workSheet.Cells[recordIndex, 2].Value = customer.R; workSheet.Cells[recordIndex, 3].Value = customer.F; workSheet.Cells[recordIndex, 4].Value = customer.M; recordIndex++; } workSheet.Column(1).AutoFit(); workSheet.Column(2).AutoFit(); workSheet.Column(3).AutoFit(); workSheet.Column(4).AutoFit(); } string excelName = "ClusteredData.xlsx"; using (var memoryStream = new MemoryStream()) { excel.SaveAs(memoryStream); var content = memoryStream.ToArray(); return(File( content, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", excelName)); } //using (var memoryStream = new MemoryStream()) //{ // Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; // Response.Headers.Add("content-disposition", "attachment; filename=" + excelName + ".xlsx"); // excel.SaveAs(memoryStream); // Response.OutputStream. memoryStream.WriteTo(); // Response.Flush(); // Response.End(); //} } } return(null); }