Files
notifications-admin/app/broadcast_areas/populations.py
Chris Hill-Scott 6cb326f153 Update utils to do linear transformation of polygons
Brings in https://github.com/alphagov/notifications-utils/pull/889/files

At the moment, we are not doing any transformation of features before
applying geometric algorithms to them. This is, in effect, assuming that
the earth is flat.

This new version of utils implements the transformation of our polygons
to a Cartesian plane. In other words, it converts them from being
defined in spherical degrees to metres.

For the admin app this means we need to convert places where the code
expects things to be measured in degrees to work in metres instead.
2021-12-01 14:10:54 +00:00

64 lines
2.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import math
SMARTPHONE_OWNERSHIP_BY_AGE_RANGE = {
# If no children have a phone when theyre born but 100% of
# children have a phone by age 16 then 50% is a rough
# approximation of how many children have phones
(0, 15): 0.50,
# https://www.finder.com/uk/mobile-internet-statistics
(16, 24): 1.00,
(25, 34): 0.97,
(35, 44): 0.91,
(45, 54): 0.88,
(55, 64): 0.73,
(65, math.inf): 0.40,
}
MEDIAN_AGE_UK = 40
for min, max in SMARTPHONE_OWNERSHIP_BY_AGE_RANGE.keys():
if min <= MEDIAN_AGE_UK <= max:
MEDIAN_AGE_RANGE_UK = (min, max)
class CITY_OF_LONDON:
WARDS = (
'E05009288', 'E05009289', 'E05009290', 'E05009291', 'E05009292',
'E05009293', 'E05009294', 'E05009295', 'E05009296', 'E05009297',
'E05009298', 'E05009299', 'E05009300', 'E05009301', 'E05009302',
'E05009303', 'E05009304', 'E05009305', 'E05009306', 'E05009307',
'E05009308', 'E05009309', 'E05009310', 'E05009311', 'E05009312',
)
# https://data.london.gov.uk/blog/daytime-population-of-london-2014/
DAYTIME_POPULATION = 553_000
# Exact area of the polygons were storing, which matches the 2.9km²
# given by https://en.wikipedia.org/wiki/City_of_London
AREA_SQUARE_METRES = 2_885_598
class BRYHER:
WD20_CODE = 'E05011090'
POPULATION = 84
def estimate_number_of_smartphones_for_population(population):
smartphone_ownership_for_area_by_age_range = {}
for range, ownership in SMARTPHONE_OWNERSHIP_BY_AGE_RANGE.items():
min, max = range
smartphone_ownership_for_area_by_age_range[range] = sum(
people
for age, people in population
if min <= age <= max
) * ownership
total_population = sum(dict(population).values())
total_phones = sum(smartphone_ownership_for_area_by_age_range.values())
print( # noqa: T001
f' Population:{total_population: 11,.0f}'
f' Phones:{total_phones: 11,.0f}'
)
return total_phones