mirror of
https://github.com/NecroticBamboo/DeepTrace.git
synced 2025-12-21 11:21:51 +00:00
DEEP-30 Export to CSV added
This commit is contained in:
parent
791bf04047
commit
50fe5b03ca
62
DeepTrace/Controllers/DownloadController.cs
Normal file
62
DeepTrace/Controllers/DownloadController.cs
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
using DeepTrace.Services;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace DeepTrace.Controllers
|
||||||
|
{
|
||||||
|
[ApiController]
|
||||||
|
[Route("api/[controller]")]
|
||||||
|
public class DownloadController : Controller
|
||||||
|
{
|
||||||
|
private readonly IModelStorageService _modelService;
|
||||||
|
|
||||||
|
public DownloadController(IModelStorageService modelService)
|
||||||
|
{
|
||||||
|
_modelService = modelService;
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet("mldata/{modelName}")]
|
||||||
|
public async Task<FileContentResult> GetMLDataCsv([FromRoute] string modelName)
|
||||||
|
{
|
||||||
|
var modelStorage = await _modelService.Load();
|
||||||
|
var model = modelStorage.FirstOrDefault(x=>x.Name==modelName) ?? throw new ApplicationException($"Model {modelName} not found");
|
||||||
|
var previousIntervals = model.IntervalDefinitionList;
|
||||||
|
|
||||||
|
var current = previousIntervals.First();
|
||||||
|
var headers = string.Join(",", current.Data.Select((x, i) => $"Q{i + 1}min,Q{i + 1}max,Q{i + 1}avg,Q{i + 1}mean"));
|
||||||
|
|
||||||
|
|
||||||
|
var writer = new StringBuilder();
|
||||||
|
writer.AppendLine(headers);
|
||||||
|
|
||||||
|
foreach (var currentInterval in previousIntervals)
|
||||||
|
{
|
||||||
|
var data = "";
|
||||||
|
for (var i = 0; i < currentInterval.Data.Count; i++)
|
||||||
|
{
|
||||||
|
|
||||||
|
var queryData = currentInterval.Data[i];
|
||||||
|
var min = queryData.Data.Min(x => x.Value);
|
||||||
|
var max = queryData.Data.Max(x => x.Value);
|
||||||
|
var avg = queryData.Data.Average(x => x.Value);
|
||||||
|
var mean = queryData.Data.Sum(x => x.Value) / queryData.Data.Count;
|
||||||
|
|
||||||
|
if (i == currentInterval.Data.Count - 1)
|
||||||
|
{
|
||||||
|
data += min + "," + max + "," + avg + "," + mean;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
data += min + "," + max + "," + avg + "," + mean + ",";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
writer.AppendLine(data);
|
||||||
|
}
|
||||||
|
return new(Encoding.UTF8.GetBytes(writer.ToString()),"text/csv")
|
||||||
|
{
|
||||||
|
FileDownloadName = modelName+".csv"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -18,4 +18,8 @@
|
|||||||
<ProjectReference Include="..\PrometheusAPI\PrometheusAPI.csproj" />
|
<ProjectReference Include="..\PrometheusAPI\PrometheusAPI.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="Data\ExportedData\" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
24
DeepTrace/ML/MLHelpers.cs
Normal file
24
DeepTrace/ML/MLHelpers.cs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
using Microsoft.ML;
|
||||||
|
|
||||||
|
namespace DeepTrace.ML;
|
||||||
|
|
||||||
|
public record ModelRecord(MLContext Context, DataViewSchema Schema, ITransformer Transformer);
|
||||||
|
|
||||||
|
public static class MLHelpers
|
||||||
|
{
|
||||||
|
public static byte[] ExportSingleModel( ModelRecord model)
|
||||||
|
{
|
||||||
|
using var mem = new MemoryStream();
|
||||||
|
model.Context.Model.Save(model.Transformer, model.Schema, mem);
|
||||||
|
return mem.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ModelRecord ImportSingleModel(byte[] data)
|
||||||
|
{
|
||||||
|
var mem = new MemoryStream(data);
|
||||||
|
var mlContext = new MLContext();
|
||||||
|
var transformer = mlContext.Model.Load(mem, out var schema);
|
||||||
|
|
||||||
|
return new (mlContext, schema, transformer);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -4,12 +4,13 @@ using Microsoft.ML.Data;
|
|||||||
using PrometheusAPI;
|
using PrometheusAPI;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Xml.Linq;
|
||||||
|
|
||||||
namespace DeepTrace.ML
|
namespace DeepTrace.ML
|
||||||
{
|
{
|
||||||
public class SpikeDetector : IMLProcessor
|
public class SpikeDetector : IMLProcessor
|
||||||
{
|
{
|
||||||
private readonly Dictionary<string, (MLContext Context, DataViewSchema Schema, ITransformer Transformer)> _model = new();
|
private readonly Dictionary<string, ModelRecord> _model = new();
|
||||||
|
|
||||||
public void Fit(ModelDefinition modelDef, DataSourceDefinition dataSourceDef)
|
public void Fit(ModelDefinition modelDef, DataSourceDefinition dataSourceDef)
|
||||||
{
|
{
|
||||||
@ -44,7 +45,11 @@ namespace DeepTrace.ML
|
|||||||
foreach ( var (name, model) in _model)
|
foreach ( var (name, model) in _model)
|
||||||
{
|
{
|
||||||
mem.WriteString(name);
|
mem.WriteString(name);
|
||||||
model.Context.Model.Save(model.Transformer, model.Schema, mem);
|
|
||||||
|
var bytes = MLHelpers.ExportSingleModel(model);
|
||||||
|
|
||||||
|
mem.WriteInt(bytes.Length);
|
||||||
|
mem.Write(bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
return mem.ToArray();
|
return mem.ToArray();
|
||||||
@ -62,11 +67,14 @@ namespace DeepTrace.ML
|
|||||||
for ( var i = 0; i < count; i++ )
|
for ( var i = 0; i < count; i++ )
|
||||||
{
|
{
|
||||||
var name = mem.ReadString();
|
var name = mem.ReadString();
|
||||||
|
var size = mem.ReadInt();
|
||||||
|
var bytes = new byte[size];
|
||||||
|
|
||||||
var mlContext = new MLContext();
|
mem.Read(bytes, 0, bytes.Length);
|
||||||
var transformer = mlContext.Model.Load(mem, out var schema);
|
|
||||||
|
|
||||||
_model[name] = (mlContext, schema, transformer);
|
var model = MLHelpers.ImportSingleModel(bytes);
|
||||||
|
|
||||||
|
_model[name] = model;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,15 +85,13 @@ namespace DeepTrace.ML
|
|||||||
|
|
||||||
// -------------------------- internals
|
// -------------------------- internals
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SpikePrediction
|
class SpikePrediction
|
||||||
{
|
{
|
||||||
[VectorType(3)]
|
[VectorType(3)]
|
||||||
public double[] Prediction { get; set; } = new double[3];
|
public double[] Prediction { get; set; } = new double[3];
|
||||||
}
|
}
|
||||||
|
|
||||||
private static (MLContext Context, DataViewSchema Schema, ITransformer Transformer) FitOne(List<TimeSeries> dataSet)
|
private static ModelRecord FitOne(List<TimeSeries> dataSet)
|
||||||
{
|
{
|
||||||
var mlContext = new MLContext();
|
var mlContext = new MLContext();
|
||||||
var dataView = mlContext.Data.LoadFromEnumerable(dataSet);
|
var dataView = mlContext.Data.LoadFromEnumerable(dataSet);
|
||||||
@ -96,7 +102,7 @@ namespace DeepTrace.ML
|
|||||||
var iidSpikeEstimator = mlContext.Transforms.DetectIidSpike(outputColumnName,inputColumnName, 95.0d, dataSet.Count);
|
var iidSpikeEstimator = mlContext.Transforms.DetectIidSpike(outputColumnName,inputColumnName, 95.0d, dataSet.Count);
|
||||||
var transformer = iidSpikeEstimator.Fit(dataView);
|
var transformer = iidSpikeEstimator.Fit(dataView);
|
||||||
|
|
||||||
return (mlContext, dataView.Schema, transformer);
|
return new (mlContext, dataView.Schema, transformer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,6 +9,8 @@
|
|||||||
@inject IDialogService DialogService
|
@inject IDialogService DialogService
|
||||||
@inject IDataSourceStorageService StorageService
|
@inject IDataSourceStorageService StorageService
|
||||||
@inject IModelStorageService ModelService
|
@inject IModelStorageService ModelService
|
||||||
|
@inject NavigationManager NavManager
|
||||||
|
@inject IJSRuntime Js
|
||||||
|
|
||||||
|
|
||||||
<PageTitle>Training</PageTitle>
|
<PageTitle>Training</PageTitle>
|
||||||
@ -59,6 +61,7 @@
|
|||||||
<MudCardActions>
|
<MudCardActions>
|
||||||
<MudButton ButtonType="ButtonType.Submit" Variant="Variant.Filled" Color="MudBlazor.Color.Primary" Class="ml-3" OnClick="@HandleAddTableContent" Disabled="@IsAddDisabled">Add</MudButton>
|
<MudButton ButtonType="ButtonType.Submit" Variant="Variant.Filled" Color="MudBlazor.Color.Primary" Class="ml-3" OnClick="@HandleAddTableContent" Disabled="@IsAddDisabled">Add</MudButton>
|
||||||
<MudButton ButtonType="ButtonType.Submit" Variant="Variant.Filled" Color="MudBlazor.Color.Primary" Class="ml-3" OnClick="@HandleRefresh" Disabled="@IsAddDisabled">Refresh</MudButton>
|
<MudButton ButtonType="ButtonType.Submit" Variant="Variant.Filled" Color="MudBlazor.Color.Primary" Class="ml-3" OnClick="@HandleRefresh" Disabled="@IsAddDisabled">Refresh</MudButton>
|
||||||
|
<MudButton ButtonType="ButtonType.Submit" Variant="Variant.Filled" Color="MudBlazor.Color.Primary" Class="ml-3" OnClick="@HandleExport" Disabled="@IsAddDisabled">Export</MudButton>
|
||||||
<MudSpacer/>
|
<MudSpacer/>
|
||||||
|
|
||||||
<MudButton ButtonType="ButtonType.Submit" Variant="Variant.Filled" Color="MudBlazor.Color.Primary" Class="ml-3" OnClick="@HandleTrain">Train</MudButton>
|
<MudButton ButtonType="ButtonType.Submit" Variant="Variant.Filled" Color="MudBlazor.Color.Primary" Class="ml-3" OnClick="@HandleTrain">Train</MudButton>
|
||||||
@ -348,6 +351,12 @@
|
|||||||
// await InvokeAsync(StateHasChanged);
|
// await InvokeAsync(StateHasChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task HandleExport()
|
||||||
|
{
|
||||||
|
await Js.InvokeVoidAsync("open", $"{NavManager.BaseUri}api/download/mldata/{Uri.EscapeDataString(_modelForm.CurrentModel.Name)}", "_blank");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private async Task HandleDeleteTableContent(IntervalDefinition interval)
|
private async Task HandleDeleteTableContent(IntervalDefinition interval)
|
||||||
{
|
{
|
||||||
_modelForm!.CurrentModel.IntervalDefinitionList.Remove(interval);
|
_modelForm!.CurrentModel.IntervalDefinitionList.Remove(interval);
|
||||||
|
|||||||
@ -29,7 +29,7 @@ if (!app.Environment.IsDevelopment())
|
|||||||
app.UseStaticFiles();
|
app.UseStaticFiles();
|
||||||
|
|
||||||
app.UseRouting();
|
app.UseRouting();
|
||||||
|
app.MapControllerRoute("default","{controller}/{action}");
|
||||||
app.MapBlazorHub();
|
app.MapBlazorHub();
|
||||||
app.MapFallbackToPage("/_Host");
|
app.MapFallbackToPage("/_Host");
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user