private void UpdateStatusDisplay(DelayPrediction prediction, ForecastResult forecast)
        {
            weatherForecast.ImageUrl = forecast.ForecastIconUrl;
            weatherForecast.ToolTip  = forecast.Condition;

            if (String.IsNullOrWhiteSpace(mlApiKey))
            {
                lblPrediction.Text = "(not configured)";
                lblConfidence.Text = "(not configured)";
                return;
            }

            if (prediction == null)
            {
                throw new Exception("Prediction did not succeed. Check the Settings for mlWorkspaceId, mlServiceId, and mlApiKey.");
            }

            if (prediction.ExpectDelays)
            {
                lblPrediction.Text = "expect delays";
            }
            else
            {
                lblPrediction.Text = "no delays expected";
            }

            lblConfidence.Text = string.Format("{0:N2}", (prediction.Confidence * 100.0));
        }
        private async Task PredictDelays(DepartureQuery query, ForecastResult forecast)
        {
            if (String.IsNullOrEmpty(mlApiKey))
            {
                return;
            }

            string fullMLUri     = string.Format(BASE_ML_URI, !String.IsNullOrWhiteSpace(mlServiceLocation) ? mlServiceLocation : DEFAULT_ML_SERVICE_LOCATION, mlWorkspaceId, mlServiceId);
            var    departureDate = DateTime.Parse(txtDepartureDate.Text);

            prediction = new DelayPrediction();

            try
            {
                using (var client = new HttpClient())
                {
                    var scoreRequest = new
                    {
                        Inputs = new Dictionary <string, StringTable>()
                        {
                            {
                                "input1",
                                new StringTable()
                                {
                                    ColumnNames = new string[]
                                    {
                                        "OriginAirportCode",
                                        "Month",
                                        "DayofMonth",
                                        "CRSDepHour",
                                        "DayOfWeek",
                                        "Carrier",
                                        "DestAirportCode",
                                        "WindSpeed",
                                        "SeaLevelPressure",
                                        "HourlyPrecip"
                                    },
                                    Values = new string[, ]
                                    {
                                        {
                                            query.OriginAirportCode,
                                            query.DepartureDate.Month.ToString(),
                                            query.DepartureDate.Day.ToString(),
                                            query.DepartureDate.Hour.ToString(),
                                            query.DepartureDayOfWeek.ToString(),
                                            query.Carrier,
                                            query.DestAirportCode,
                                            forecast.WindSpeed.ToString(),
                                            forecast.Pressure.ToString(),
                                            forecast.Precipitation.ToString()
                                        }
                                    }
                                }
                            },
                        },
                        GlobalParameters = new Dictionary <string, string>()
                        {
                        }
                    };

                    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", mlApiKey);
                    client.BaseAddress = new Uri(fullMLUri);
                    HttpResponseMessage response = await client.PostAsJsonAsync("", scoreRequest).ConfigureAwait(false);

                    if (response.IsSuccessStatusCode)
                    {
                        string result = await response.Content.ReadAsStringAsync();

                        JObject jsonObj = JObject.Parse(result);

                        string prediction = jsonObj["Results"]["output1"]["value"]["Values"][0][10].ToString();
                        string confidence = jsonObj["Results"]["output1"]["value"]["Values"][0][11].ToString();

                        if (prediction.Equals("1"))
                        {
                            this.prediction.ExpectDelays = true;
                            this.prediction.Confidence   = double.Parse(confidence);
                        }
                        else if (prediction.Equals("0"))
                        {
                            this.prediction.ExpectDelays = false;
                            this.prediction.Confidence   = double.Parse(confidence);
                        }
                        else
                        {
                            this.prediction = null;
                        }
                    }
                    else
                    {
                        prediction = null;

                        Trace.Write(string.Format("The request failed with status code: {0}", response.StatusCode));

                        // Print the headers - they include the request ID and the timestamp, which are useful for debugging the failure
                        Trace.Write(response.Headers.ToString());

                        string responseContent = await response.Content.ReadAsStringAsync();

                        Trace.Write(responseContent);
                    }
                }
            }
            catch (Exception ex)
            {
                prediction = null;
                System.Diagnostics.Trace.TraceError("Failed retrieving delay prediction: " + ex.ToString());
                throw;
            }
        }
        private async Task PredictDelays(DepartureQuery query, ForecastResult forecast)
        {
            if (string.IsNullOrEmpty(mlUrl))
            {
                return;
            }

            var departureDate = DateTime.Parse(txtDepartureDate.Text);

            prediction = new DelayPrediction();

            try
            {
                using (var client = new HttpClient())
                {
                    var predictionRequest = new PredictionRequest
                    {
                        OriginAirportCode = query.OriginAirportCode,
                        Month             = query.DepartureDate.Month,
                        DayofMonth        = query.DepartureDate.Day,
                        CRSDepHour        = query.DepartureDate.Hour,
                        DayOfWeek         = query.DepartureDayOfWeek,
                        Carrier           = query.Carrier,
                        DestAirportCode   = query.DestAirportCode,
                        WindSpeed         = forecast.WindSpeed,
                        SeaLevelPressure  = forecast.Pressure,
                        HourlyPrecip      = forecast.Precipitation
                    };

                    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", mlApiKey);
                    client.BaseAddress = new Uri(mlUrl);
                    var response = await client.PostAsJsonAsync("", predictionRequest).ConfigureAwait(false);

                    if (response.IsSuccessStatusCode)
                    {
                        var result = await response.Content.ReadAsStringAsync();

                        var token        = JToken.Parse(result);
                        var parsedResult = JsonConvert.DeserializeObject <PredictionResult>((string)token);

                        if (parsedResult.prediction == 1)
                        {
                            this.prediction.ExpectDelays = true;
                            this.prediction.Confidence   = parsedResult.probability;
                        }
                        else if (parsedResult.prediction == 0)
                        {
                            this.prediction.ExpectDelays = false;
                            this.prediction.Confidence   = parsedResult.probability;
                        }
                        else
                        {
                            this.prediction = null;
                        }
                    }
                    else
                    {
                        prediction = null;

                        Trace.Write($"The request failed with status code: {response.StatusCode}");

                        // Print the headers - they include the request ID and the timestamp, which are useful for debugging the failure
                        Trace.Write(response.Headers.ToString());

                        var responseContent = await response.Content.ReadAsStringAsync();

                        Trace.Write(responseContent);
                    }
                }
            }
            catch (Exception ex)
            {
                prediction = null;
                System.Diagnostics.Trace.TraceError("Failed retrieving delay prediction: " + ex.ToString());
                throw;
            }
        }