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"])