X-Git-Url: https://plomlompom.com/repos/?p=berlin-corona-table;a=blobdiff_plain;f=enhance_table.py;h=28c472eeeda95650488700c8b4384c3cae7e4d44;hp=bdf91e1654a28be8d6c33445362f2cd0aadf7a3f;hb=6bc3d0cd7fb6e4872e47951dc66aa72f4014b0aa;hpb=76d923286b2178d07972ac6b4da6c8877362b479 diff --git a/enhance_table.py b/enhance_table.py index bdf91e1..28c472e 100755 --- a/enhance_table.py +++ b/enhance_table.py @@ -32,9 +32,10 @@ translate = { 'TS': 'Tempelhof-Schöneberg', 'TK': 'Treptow-Köpenick', 'sum': 'all of Berlin', - 'wsum': 'sum for last 7 days', - 'wavg': 'per-day average of new infections for last 7 days', - 'winc': 'incidence (x per 100k inhabitants) of new infections for last 7 days', + '+': 'new infections counted that day', + 'Σ': 'sum of new infections for last 7 days', + 'Ø': 'per-day average of new infections for last 7 days', + 'i': 'incidence (x per 100k inhabitants) of new infections for last 7 days', } # Read infections table path and output type. @@ -95,17 +96,20 @@ for line in lines[1:]: sorted_dates.sort() # In LaGeSo's data, the last "district" is actually the sum of all districts / -# the whole of Berlin. -# +# the whole of Berlin. For our district order, move it in front of the other +# districts, as its numbers are the most interesting, so in the table views +# we want to see it first. +sum_district = sorted_districts.pop() +sorted_districts.insert(0, sum_district) + # 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. for date in sorted_dates: - sum_district = sorted_districts[-1] day_sum = 0 - for district in sorted_districts[:-1]: + for district in [d for d in sorted_districts if not d==sum_district]: day_sum += db[district][date]['new_infections'] if day_sum != db[sum_district][date]['new_infections']: raise Exception('Questionable district infection sum in %s' % date) @@ -130,29 +134,54 @@ for i in range(len(sorted_dates)): db[district][date]['week_incidence'] = (week_sum / district_pop) * 100000 # Optimized for web browser viewing. +import calendar if output_type == 'html': - print('') - print('') - print('') - print('') - print('') + print(""" + + + +Berlin's Corona infection numbers, development by districts + +home · contact · privacy +

Berlin's Corona infection numbers, development by districts

+

Updated daily at 7pm based on data from the "Senatsverwaltung für Gesundheit, Pflege und Gleichstellung". Source code. Plain text view (optimized for terminal curl).

+
date
+ +""") + sorted_dates.reverse() for district in sorted_districts: - long_form = translate[district] - print('' % long_form) + # Wrap in div because the vertical orientation otherwise fails + # in Chromium. + print('' % + translate[district]) print('') - sorted_dates.reverse() + weekday_count = 0 for date in sorted_dates: - print('') - print('' % date) - long_wsum = translate['wsum'] - long_wavg = translate['wavg'] - long_winc = translate['winc'] + if weekday_count == 0: + print('') + print('') + print('') + for district in sorted_districts: + print('' % + (translate[district], district)) + print('') + print('') + weekday = calendar.day_name[datetime.date.fromisoformat(date).weekday()] + print('' % (date, weekday)) + print('') for district in sorted_districts: district_data = db[district][date] - week_sum = week_avg = week_inc = '' + week_sum = week_avg = week_inc = '?' new_infections = district_data['new_infections'] if 'week_sum' in district_data: week_sum = '%s' % district_data['week_sum'] @@ -161,15 +190,24 @@ if output_type == 'html': if 'week_incidence' in district_data: week_inc = '%.1f' % district_data['week_incidence'] print('') print('') + weekday_count += 1 + if weekday_count != 7: + continue + weekday_count = 0 print('
%s
%s
%s
date?%s
%s
%s
') + for abbr in ['+', 'Σ', 'Ø', 'i']: + print('' % + (translate[abbr], abbr)) + print('
%s
') - print(new_infections) - print('
(more)') - print('' % (long_wsum, week_sum)) - print('' % (long_wavg, week_avg)) - print('' % (long_winc, week_inc)) - print('
%s%s
%s%s
%s%s
') + print('') + print('' % new_infections) + print('' % week_sum) + print('' % week_avg) + print('' % week_inc) + print('
%s
%s
%s
%s
') print('
') + print('

Symbols

') + print('
') + for abbr in ['+', 'Σ', 'Ø', 'i']: + print('
%s
%s
' % (abbr, translate[abbr])) + print('
') print('') # Optimized for in-terminal curl. @@ -178,7 +216,7 @@ elif output_type == 'txt': # Explain what this is. intro = \ """Table of Berlin's Corona infection number development by districts. -Updated daily around 9pm. +Updated daily at 7pm based on data from the "Senatsverwaltung für Gesundheit, Pflege und Gleichstellung". Abbrevations/explanations: """ @@ -186,56 +224,47 @@ Abbrevations/explanations: intro += "%s: %s\n" % (k, translate[k]) intro += """ Source code: https://plomlompom.com/repos/?p=berlin-corona-table -""" +HTML view: https://plomlompom.com/berlin_corona.html""" print(intro) # Output table of enhanced daily infection data, newest on top, # separated into 7-day units. sorted_dates.reverse() weekday_count = 0 - sum_district = sorted_districts[-1] for date in sorted_dates: # Week table header. if weekday_count == 0: - print(' '*11, ' '.join(sorted_districts[:-1]), - sorted_districts[-1], 'wsum', ' wavg', 'winc') - week_start_date = date + print() + print(' '*13, ' '.join(sorted_districts)) + print('-'*77) - # Day data line. + # Day table. + weekday = calendar.day_name[datetime.date.fromisoformat(date).weekday()] + print('%s (%s)' % (date, weekday)) new_infections = [] + weekly_sum_strings = [] + weekly_avg_strings = [] + weekly_inc_strings = [] for district in sorted_districts: - new_infections += [db[district][date]['new_infections']] - week_sum = week_avg = week_inc = '' - sum_district_data = db[sum_district][date] - if 'week_sum' in sum_district_data: - week_sum = '%4s' % sum_district_data['week_sum'] - if 'week_average' in sum_district_data: - week_avg = '%5.1f' % sum_district_data['week_average'] - if 'week_incidence' in sum_district_data: - week_inc = '%4.1f' % sum_district_data['week_incidence'] - print(date, ' '.join(['%3s' % infections - for infections in new_infections]), - week_sum, week_avg, week_inc) - - # Maintain 7-day cycle. + district_day_data = db[district][date] + new_infections += [district_day_data['new_infections']] + wsum_string = ' '*3 + '?' + wavg_string = winc_string = ' '*4 + '?' + if 'week_sum' in district_day_data: + wsum_string = '%4s' % district_day_data['week_sum'] + weekly_sum_strings += [wsum_string] + if 'week_average' in district_day_data: + wavg_string = '%5.1f' % district_day_data['week_average'] + weekly_avg_strings += [wavg_string] + if 'week_incidence' in district_day_data: + winc_string = '%5.1f' % district_day_data['week_incidence'] + weekly_inc_strings += [winc_string] + print('+', ' '*11, ' '.join(['%3s' % i for i in new_infections])) + print('Σ', ' '*10, ' '.join(weekly_sum_strings)) + print('Ø', ' '*9, ''.join(weekly_avg_strings)) + print('i', ' '*9, ''.join(weekly_inc_strings)) weekday_count += 1 if weekday_count != 7: continue weekday_count = 0 - - # After each 7 days, print summary for individual districts. - weekly_sums = [] - weekly_avgs = [] - weekly_incs = [] - for district in sorted_districts[:-1]: - weekly_sums += [db[district][week_start_date]['week_sum']] - weekly_avgs += [db[district][week_start_date]['week_average']] - weekly_incs += [db[district][week_start_date]['week_incidence']] - print() - print('district stats for week from %s to %s:' % (date, week_start_date)) - print(' '*7, ' '.join(sorted_districts[:-1])) - print('wsum', ' '.join(['%5.1f' % wsum for wsum in weekly_sums])) - print('wavg', ' '.join(['%5.1f' % wavg for wavg in weekly_avgs])) - print('winc', ' '.join(['%5.1f' % winc for winc in weekly_incs])) - print()