home · contact · privacy
Minor code re-arrangement.
[berlin-corona-table] / enhance_table.py
index 3d3ec779d0a6d77ebcae2d6ea0d90ef3bda493b4..774b333a77cf96951609c4363f219f96d158244a 100755 (executable)
@@ -17,11 +17,42 @@ district_pops = {
   'sum': 3754418,
 }
 
-f = open('daily_infections_table.txt', 'r')
+# Read infections table file lines.
+import sys
+if len(sys.argv) != 2:
+    print('Expecting infections table file path as only argument.')
+    exit(1)
+infections_table = sys.argv[1]
+f = open(infections_table, 'r')
 lines = f.readlines()
 f.close()
 
-# Parse first table file line for the names and order of districts. 
+# Basic input validation.
+import datetime
+header_elements = lines[0].split()
+if set(header_elements) != district_pops.keys() or \
+       len(header_elements) != len(district_pops.keys()):
+    raise Exception('infections table: invalid header')
+line_count = 0
+for line in lines[1:]:
+    line_count += 1
+    fields = line.split()
+    if len(header_elements) != len(fields) - 1:
+        raise Exception('infections table: too many elements on line %s',
+                        line_count)
+    try:
+        datetime.date.fromisoformat(fields[0])
+    except ValueError:
+        raise Exception('infections table: bad ISO date on line %s',
+                        line_count)
+    for field in fields[1:]:
+        try:
+            int(field)
+        except ValueError:
+            raise Exception('infections table: bad value on line %s',
+                            line_count)
+
+# Parse first table file line for the names and order of districts.
 db = {}
 sorted_districts = []
 for header in lines[0].split():
@@ -40,11 +71,14 @@ for line in lines[1:]:
         db[district][date] = {'new_infections': int(district_data)}
 sorted_dates.sort()
 
+# In LaGeSo's data, the last "district" is actually the sum of all districts /
+# the whole of Berlin.
+#
 # Fail on any day where the "sum" district's new infections are not the proper
 # sum of the individual districts new infections.  Yes, sometimes Lageso sends
 # data that is troubled in this way.  It will then have to be fixed manually in
 # the table file, since we should have a human look at what mistake was
-# probably made. 
+# probably made.
 for date in sorted_dates:
     sum_district = sorted_districts[-1]
     day_sum = 0