Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Quebec/Ontario covid stats over the last X days

covid_cases.livemd

Quebec/Ontario covid stats over the last X days

Mix.install([:httpoison, :jason, :kino, :kino_vega_lite])

Inputs

Province selection

provinces = [qc: "Quebec", on: "Ontario"]
province_input = Kino.Input.select("Please Select Province", provinces)

Number of days selection

day_input = Kino.Input.number("How many days should we look at?")
defmodule CovidCases do
  def endpoint(province), do: "https://api.covid19tracker.ca/reports/province/#{province}"

  def case_counts(province, num_days) do
    url = endpoint(province)
    {:ok, %{body: body}} = HTTPoison.get(url)
    data = Jason.decode!(body)["data"]

    data
    |> Enum.reverse()
    |> Enum.take(num_days)
  end

  alias VegaLite, as: Vl

  def graph_setup(graph_title, y_axis_title) do
    Vl.new(
      title: graph_title,
      width: 800,
      height: 400
    )
    |> Vl.mark(:line)
    |> Vl.encode_field(:x, "date", type: :temporal)
    |> Vl.encode_field(:y, y_axis_title, type: :quantitative)
    |> Kino.VegaLite.new()
    |> Kino.render()
  end
end
province = Kino.Input.read(province_input)
province_name = Keyword.get(provinces, province)
day_count = Kino.Input.read(day_input)

Get the Covid Case Data

case_counts = CovidCases.case_counts(province, day_count)

Displaying Case Data

case_graph =
  CovidCases.graph_setup(
    "New Covid-19 cases in #{province_name} over the last #{day_count} days",
    "change_cases"
  )

Enum.each(case_counts, &Kino.VegaLite.push(case_graph, &1))
Kino.DataTable.new(case_counts, keys: ["date", "change_cases"])

Displaying Hospitalization Data

hospitalizations_graph =
  CovidCases.graph_setup(
    "Total number of Covid-19 hospitalizations in #{province_name} over the last #{day_count} days",
    "total_hospitalizations"
  )

Enum.each(case_counts, &Kino.VegaLite.push(hospitalizations_graph, &1))
Kino.DataTable.new(case_counts, keys: ["date", "total_hospitalizations"])

Displaying Fatalities Data

fatalities_graph =
  CovidCases.graph_setup(
    "Total number of daily Covid-19 fatalities in #{province_name} over the last #{day_count} days",
    "change_fatalities"
  )

Enum.each(case_counts, &Kino.VegaLite.push(fatalities_graph, &1))
Kino.DataTable.new(case_counts, keys: ["date", "change_fatalities"])