Skip to content

Commit

Permalink
Resolve issue #15
Browse files Browse the repository at this point in the history
Add ability to generate forecast training file from nwac api
  • Loading branch information
scottcha committed Jun 1, 2018
1 parent f3d74c1 commit 5b6afb2
Show file tree
Hide file tree
Showing 7 changed files with 868 additions and 0 deletions.
104 changes: 104 additions & 0 deletions GetTrainingData/GetNWACData/AvalancheProblem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
using System;
using System.Text;
using System.Text.RegularExpressions;

namespace GetNWACData
{
public class AvalancheProblem
{
public string ProblemName{get;set;}
public string Likelihood{get;set;}
public string MaximumSize{get;set;}
public string MinimumSize{get;set;}
public bool OctagonAboveTreelineEast {get;set;}
public bool OctagonAboveTreelineNorth {get;set;}
public bool OctagonAboveTreelineNorthEast {get;set;}
public bool OctagonAboveTreelineNorthWest {get;set;}
public bool OctagonAboveTreelineSouth {get;set;}
public bool OctagonAboveTreelineSouthEast {get;set;}
public bool OctagonAboveTreelineSouthWest {get;set;}
public bool OctagonAboveTreelineWest {get;set;}
public bool OctagonBelowTreelineEast {get;set;}
public bool OctagonBelowTreelineNorth {get;set;}
public bool OctagonBelowTreelineNorthEast {get;set;}
public bool OctagonBelowTreelineNorthWest {get;set;}
public bool OctagonBelowTreelineSouth {get;set;}
public bool OctagonBelowTreelineSouthEast {get;set;}
public bool OctagonBelowTreelineSouthWest {get;set;}
public bool OctagonBelowTreelineWest {get;set;}
public bool OctagonNearTreelineEast {get;set;}
public bool OctagonNearTreelineNorth {get;set;}
public bool OctagonNearTreelineNorthEast {get;set;}
public bool OctagonNearTreelineNorthWest {get;set;}
public bool OctagonNearTreelineSouth {get;set;}
public bool OctagonNearTreelineSouthEast {get;set;}
public bool OctagonNearTreelineSouthWest {get;set;}
public bool OctagonNearTreelineWest {get;set;}
public string Header()
{
var sb = new StringBuilder();
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_Likelihood,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_MaximumSize,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_MinimumSize,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonAboveTreelineEast,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonAboveTreelineNorth,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonAboveTreelineNorthEast,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonAboveTreelineNorthWest,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonAboveTreelineSouth,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonAboveTreelineSouthEast,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonAboveTreelineSouthWest,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonAboveTreelineWest,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonNearTreelineEast,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonNearTreelineNorth,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonNearTreelineNorthEast,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonNearTreelineNorthWest,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonNearTreelineSouth,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonNearTreelineSouthEast,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonNearTreelineSouthWest,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonNearTreelineWest,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonBelowTreelineEast,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonBelowTreelineNorth,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonBelowTreelineNorthEast,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonBelowTreelineNorthWest,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonBelowTreelineSouth,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonBelowTreelineSouthEast,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonBelowTreelineSouthWest,");
sb.Append(Regex.Replace(ProblemName, @"\s+", "") + "_OctagonBelowTreelineWest,");
return sb.ToString();
}

public override string ToString()
{
var sb = new StringBuilder();

sb.Append(Likelihood + ",");
sb.Append(MaximumSize + ",");
sb.Append(MinimumSize+ ",");
sb.Append(Convert.ToInt32(OctagonAboveTreelineEast)+ ",");
sb.Append(Convert.ToInt32(OctagonAboveTreelineNorth)+ ",");
sb.Append(Convert.ToInt32(OctagonAboveTreelineNorthEast)+ ",");
sb.Append(Convert.ToInt32(OctagonAboveTreelineNorthWest)+ ",");
sb.Append(Convert.ToInt32(OctagonAboveTreelineSouth)+ ",");
sb.Append(Convert.ToInt32(OctagonAboveTreelineSouthEast)+ ",");
sb.Append(Convert.ToInt32(OctagonAboveTreelineSouthWest)+ ",");
sb.Append(Convert.ToInt32(OctagonAboveTreelineWest)+ ",");
sb.Append(Convert.ToInt32(OctagonNearTreelineEast)+ ",");
sb.Append(Convert.ToInt32(OctagonNearTreelineNorth)+ ",");
sb.Append(Convert.ToInt32(OctagonNearTreelineNorthEast)+ ",");
sb.Append(Convert.ToInt32(OctagonNearTreelineNorthWest)+ ",");
sb.Append(Convert.ToInt32(OctagonNearTreelineSouth)+ ",");
sb.Append(Convert.ToInt32(OctagonNearTreelineSouthEast)+ ",");
sb.Append(Convert.ToInt32(OctagonNearTreelineSouthWest)+ ",");
sb.Append(Convert.ToInt32(OctagonNearTreelineWest)+ ",");
sb.Append(Convert.ToInt32(OctagonBelowTreelineEast)+ ",");
sb.Append(Convert.ToInt32(OctagonBelowTreelineNorth)+ ",");
sb.Append(Convert.ToInt32(OctagonBelowTreelineNorthEast)+ ",");
sb.Append(Convert.ToInt32(OctagonBelowTreelineNorthWest)+ ",");
sb.Append(Convert.ToInt32(OctagonBelowTreelineSouth)+ ",");
sb.Append(Convert.ToInt32(OctagonBelowTreelineSouthEast)+ ",");
sb.Append(Convert.ToInt32(OctagonBelowTreelineSouthWest)+ ",");
sb.Append(Convert.ToInt32(OctagonBelowTreelineWest)+ ",");
return sb.ToString();
}
}
}
99 changes: 99 additions & 0 deletions GetTrainingData/GetNWACData/AvalancheRegionForecast.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
using System;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Text;
using System.Linq;

namespace GetNWACData
{
public class AvalancheRegionForecast
{
public string Zone{get;set;}
public DateTime PublishDate{get;set;}
public string ResourceUri{get;set;}
public string SpecialStatement{get;set;}
public DateTime Day1Date;
public string BottomLineSummary{get;set;}
public string Day1DangerElevationHigh{get;set;}
public string Day1DangerElevationMiddle{get;set;}
public string Day1DangerElevationLow{get;set;}
public string Day1DetailedForecast{get;set;}
public string Day1Trend{get;set;}
public string Day1Warning{get;set;}
public DateTime? Day1WarningEnd{get;set;}
public string Day1WarningText{get;set;}
public string Day2DangerElevationHigh{get;set;}
public string Day2DangerElevationMiddle{get;set;}
public string Day2DangerElevationLow{get;set;}
public string Day2DetailedForecast{get;set;}
public string Day2Trend{get;set;}
public string Day2Warning{get;set;}
public DateTime? Day2WarningEnd{get;set;}
public string Day2WarningText{get;set;}

public List<AvalancheProblem> AvalancheProblems{get;set;}
public string ToString(out StringBuilder sbHeader)
{
sbHeader = new StringBuilder();
sbHeader.Append("Region, PublishedDateTime, Day1Date, SpecialStatement, BottomLineSummary, ForecastUrl, ");
sbHeader.Append("Day1DangerAboveTreeline, Day1DangerNearTreeline, Day1DangerBelowTreeline, Day1DetailedForecast, Day1Warning, Day1WarningEnd, Day1WarningText, ");
sbHeader.Append("Day2DangerAboveTreeline, Day2DangerNearTreeline, Day2DangerBelowTreeline, Day2DetailedForecast, Day2Warning, Day2WarningEnd, Day2WarningText, ");

var sbBody = new StringBuilder();
sbBody.Append(Zone + ",");
sbBody.Append(PublishDate.ToUniversalTime().ToString("yyyyMMdd HH:00" + ","));
sbBody.Append(Day1Date.ToUniversalTime().ToString("yyyyMMdd") + ",");
sbBody.Append(Utilities.CleanStringForCSVExport(SpecialStatement) + ","); //replace commas and quotes & \n since we are exporting to csv
sbBody.Append(Utilities.CleanStringForCSVExport(BottomLineSummary) + ",");
sbBody.Append(ResourceUri + ",");
sbBody.Append(Day1DangerElevationHigh + ",");
sbBody.Append(Day1DangerElevationMiddle + ",");
sbBody.Append(Day1DangerElevationLow + ",");
sbBody.Append(Utilities.CleanStringForCSVExport(Day1DetailedForecast) + ",");
sbBody.Append(Utilities.CleanStringForCSVExport(Day1Warning) + ",");
sbBody.Append((Day1WarningEnd.HasValue ? Day1WarningEnd.Value.ToUniversalTime().ToString("yyyyMMdd HH:00") + "," : DateTime.MinValue.ToString("yyyyMMdd HH:00") + ","));
sbBody.Append(Utilities.CleanStringForCSVExport(Day1WarningText) + ",");
sbBody.Append(Day2DangerElevationHigh + ",");
sbBody.Append(Day2DangerElevationMiddle + ",");
sbBody.Append(Day2DangerElevationLow + ",");
sbBody.Append(Utilities.CleanStringForCSVExport(Day2DetailedForecast) + ",");
sbBody.Append(Utilities.CleanStringForCSVExport(Day2Warning) + ",");
sbBody.Append((Day2WarningEnd.HasValue ? Day2WarningEnd.Value.ToUniversalTime().ToString("yyyyMMdd HH:00") + "," : DateTime.MinValue.ToString("yyyyMMdd HH:00") + ","));
sbBody.Append(Utilities.CleanStringForCSVExport(Day2WarningText) + ",");

ExtractAvalancheProblem("Cornices", sbHeader, sbBody);
ExtractAvalancheProblem("Glide", sbHeader, sbBody);
ExtractAvalancheProblem("Loose Dry", sbHeader, sbBody);
ExtractAvalancheProblem("Loose Wet", sbHeader, sbBody);
ExtractAvalancheProblem("Persistent Slab", sbHeader, sbBody);
ExtractAvalancheProblem("Deep Persistent Slab", sbHeader, sbBody); //TODO: need to check this is actually what NWAC uses
ExtractAvalancheProblem("Storm Slabs", sbHeader, sbBody);
ExtractAvalancheProblem("Wet Slabs", sbHeader, sbBody);
ExtractAvalancheProblem("Wind Slab", sbHeader, sbBody);

return sbBody.ToString();
}

private void ExtractAvalancheProblem(string problemName, StringBuilder sbHeader, StringBuilder sbBody)
{
var problem = AvalancheProblems.Where(p => p.ProblemName == problemName);
if (problem .Count() == 1)
{
sbHeader.Append(problem .First().Header());
sbBody.Append(problem .First().ToString());
}
else
{
var p = new AvalancheProblem()
{
ProblemName = problemName,
Likelihood = "no-data",
MaximumSize = "no-data",
MinimumSize = "no-data"
};
sbHeader.Append(p.Header());
sbBody.Append(p.ToString());
}
}
}
}
22 changes: 22 additions & 0 deletions GetTrainingData/GetNWACData/GetNWACData.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
<UserSecretsId>
20458A4D-46E0-469C-9D6C-763F01F134BE
</UserSecretsId>
</PropertyGroup>

<ItemGroup>
<None Remove="nwacforecasts.csv" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
<PackageReference Include="System.Linq.Dynamic.Core" Version="1.0.8.9" />

<DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.2" />
</ItemGroup>

</Project>
Loading

0 comments on commit 5b6afb2

Please sign in to comment.