chiark / gitweb /
bugzilla-show: use HTTPS; drop warthogs and ubuntu
[bin.git] / weekly-covid-average
1 #! /usr/bin/python3
2
3 from argparse import ArgumentParser
4 from email.message import EmailMessage
5 import io
6 import json
7 from smtplib import SMTP
8 import statistics
9
10 import requests
11 import toml
12
13
14 def fetch_data():
15     # Fetch new case counts for Cambridgeshire.
16     data = requests.get(
17         "https://api.coronavirus.data.gov.uk/v1/data",
18         params={
19             "filters": "areaType=utla;areaName=Cambridgeshire",
20             "structure": json.dumps(
21                 ["date", "newCasesBySpecimenDate"], separators=(",", ":")
22             ),
23         },
24     ).json()["data"]
25
26     # Skip the first three days of the response.  This seems to be what the
27     # website does, presumably because recent dates don't have reliable
28     # enough numbers yet.
29     data = data[3:]
30
31     last_week = data[:7]
32     mean = statistics.mean([new_cases for _, new_cases in last_week])
33     return last_week, mean
34
35
36 def main():
37     parser = ArgumentParser()
38     parser.add_argument(
39         "--config", type=toml.load, default={},
40         help="Configuration file (TOML format)")
41     parser.add_argument("--email", action="store_true")
42     args = parser.parse_args()
43
44     last_week, mean = fetch_data()
45     formatted = io.StringIO()
46     print(
47         "Most recent week's worth of new cases in Cambridgeshire, "
48         "by specimen date:",
49         file=formatted)
50     print(file=formatted)
51     print(f"Mean: {mean:.1f}", file=formatted)
52     for date, new_cases in last_week:
53         print(f"{date}: {new_cases}", file=formatted)
54     if args.email and "email" in args.config:
55         new_cases_message = EmailMessage()
56         new_cases_message["From"] = args.config["email"]["from"]
57         new_cases_message["To"] = ", ".join(args.config["email"]["to_always"])
58         new_cases_message["Subject"] = f"Cambridgeshire case count: {mean:.1f}"
59         new_cases_message.set_content(formatted.getvalue())
60         with SMTP("localhost") as smtp:
61             smtp.send_message(new_cases_message)
62     else:
63         print(formatted.getvalue(), end="")
64
65
66 if __name__ == "__main__":
67     main()