Skip to content

Commit

Permalink
Merge pull request #12 from jalezi/refactor_by_region_by_day
Browse files Browse the repository at this point in the history
feat(vaccinations_by_region_by_day):  +Region enum
  • Loading branch information
stefanb authored May 1, 2021
2 parents 5e4e066 + b2de8dc commit fab9fa1
Show file tree
Hide file tree
Showing 6 changed files with 131 additions and 225 deletions.
85 changes: 36 additions & 49 deletions cepimose/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,7 @@
_vaccinations_by_region_req,
_vaccines_supplied_by_manufacturer_req,
_vaccines_supplied_by_manufacturer_cum_req,
_vaccinations_by_age_range_90_dose1_req,
_vaccinations_by_age_range_90_dose2_req,
_vaccination_by_age_range_requests,
_vaccinations_pomurska_by_day_req,
_vaccination_by_age_group_requests,
_vaccinations_by_region_by_day_requests,
_vaccinations_municipalities_share_req,
_vaccinations_timestamp_req,
Expand All @@ -23,7 +20,7 @@
_parse_vaccinations_by_region,
_parse_vaccines_supplied_by_manufacturer,
_parse_vaccines_supplied_by_manufacturer_cum,
_parse_vaccinations_by_age_range,
_parse_vaccinations_by_age_group,
_parse_vaccinations_by_region_by_day,
_parse_vaccinations_by_municipalities_share,
_parse_vaccinations_timestamp,
Expand All @@ -36,9 +33,11 @@
VaccinationByRegionRow,
VaccinationByManufacturerRow,
VaccinationDose,
VaccinationByAgeRange,
VaccinationByAgeGroup,
)

from .enums import Region, AgeGroup


def _get_data(req, parse_response):
resp = requests.post(_source, headers=_headers, json=req)
Expand Down Expand Up @@ -79,54 +78,42 @@ def vaccines_supplied_by_manufacturer_cumulative() -> "list[VaccinationByManufac
)


# by age range
def vaccinations_by_age_range_90() -> "VaccinationByAgeRange":
def vaccinations_by_age_range_90_dose1() -> "list[VaccinationDose]":
return _get_data(
_vaccinations_by_age_range_90_dose1_req, _parse_vaccinations_by_age_range
)

def vaccinations_by_age_range_90_dose2() -> "list[VaccinationDose]":
return _get_data(
_vaccinations_by_age_range_90_dose2_req, _parse_vaccinations_by_age_range
)

dose1 = vaccinations_by_age_range_90_dose1()
dose2 = vaccinations_by_age_range_90_dose2()
return VaccinationByAgeRange(dose1=dose1, dose2=dose2)


def vaccinations_by_age_range():
key_value = _vaccination_by_age_range_requests.items()
# by age group
def vaccinations_by_age_group(group: AgeGroup = None):
obj = {}
for el in key_value:
key = el[0]
dose1_req = el[1][0]
dose2_req = el[1][1]

dose1 = _get_data(dose1_req, _parse_vaccinations_by_age_range)
dose2 = _get_data(dose2_req, _parse_vaccinations_by_age_range)
obj[key] = VaccinationByAgeRange(dose1=dose1, dose2=dose2)

if group == None:

key_value = _vaccination_by_age_group_requests.items()
for key, req_list in key_value:
dose1_req = req_list[0]
dose2_req = req_list[1]
dose1 = _get_data(dose1_req, _parse_vaccinations_by_age_group)
dose2 = _get_data(dose2_req, _parse_vaccinations_by_age_group)
obj[key] = VaccinationByAgeGroup(dose1=dose1, dose2=dose2)

return obj

dose1_req = _vaccination_by_age_group_requests[group][0]
dose2_req = _vaccination_by_age_group_requests[group][1]
dose1 = _get_data(dose1_req, _parse_vaccinations_by_age_group)
dose2 = _get_data(dose2_req, _parse_vaccinations_by_age_group)
obj[group] = VaccinationByAgeGroup(dose1=dose1, dose2=dose2)
return obj


# by individual region
def vaccinations_pomurska_by_day() -> "list[VaccinationByDayRow]":
return _get_data(
_vaccinations_pomurska_by_day_req, _parse_vaccinations_by_region_by_day
)


def vaccinations_by_region_by_day():
key_value = _vaccinations_by_region_by_day_requests.items()
def vaccinations_by_region_by_day(region: Region = None):
obj = {}
for el in key_value:
key = el[0]
doses_req = el[1][0]

doses = _get_data(doses_req, _parse_vaccinations_by_region_by_day)
obj[key] = doses
if region == None:
key_value = _vaccinations_by_region_by_day_requests.items()
for key, req_list in key_value:
req = req_list[0]
doses = _get_data(req, _parse_vaccinations_by_region_by_day)
obj[key] = doses
return obj

req = _vaccinations_by_region_by_day_requests[region][0]
doses = _get_data(req, _parse_vaccinations_by_region_by_day)
obj[region] = doses

return obj

Expand Down
92 changes: 20 additions & 72 deletions cepimose/data.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import json
from .enums import Region, AgeGroup

_source = "https://wabi-west-europe-e-primary-api.analysis.windows.net/public/reports/querydata?synchronous=true"

Expand Down Expand Up @@ -82,7 +83,7 @@ def _create_req(commands, cache_key=False):


# AGE RANGE (AGE GROUP)
def _get_default_by_age_range_command():
def _get_default_by_age_group_command():
return {
"SemanticQueryDataShapeCommand": {
"Query": {
Expand Down Expand Up @@ -201,61 +202,40 @@ def _get_default_by_age_range_command():
}


def _get_by_age_range_first_condition_values(range="'90+'", dose="1L"):
def _get_by_age_group_first_condition_values(group="'90+'", dose="1L"):
return [
{"Literal": {"Value": range}},
{"Literal": {"Value": group}},
{"Literal": {"Value": dose}},
]


def _create_by_age_range_command(range="'90+'", dose="1L"):
values = _get_by_age_range_first_condition_values(range, dose)
command = _get_default_by_age_range_command()
def _create_by_age_group_command(group="'90+'", dose="1L"):
values = _get_by_age_group_first_condition_values(group, dose)
command = _get_default_by_age_group_command()
command["SemanticQueryDataShapeCommand"]["Query"]["Where"][0]["Condition"]["In"][
"Values"
].append(values)
return command


age_ranges = [
"'0-17'",
"'18-24'",
"'25-29'",
"'30-34'",
"'35-39'",
"'40-44'",
"'45-49'",
"'50-54'",
"'55-59'",
"'60-64'",
"'65-69'",
"'70-74'",
"'75-79'",
"'80-84'",
"'85-90'",
"'90+'",
]


def _create_by_age_range_commands():
def _create_by_age_group_commands():
obj = {}
for el in age_ranges:
dose1_command = _create_by_age_range_command(el, "1L")
dose2_command = _create_by_age_range_command(el, "2L")
key = el.replace("'", "")
obj[key] = [dose1_command, dose2_command]
for el in AgeGroup:
dose1_command = _create_by_age_group_command(el.value, "1L")
dose2_command = _create_by_age_group_command(el.value, "2L")
obj[el] = [dose1_command, dose2_command]

return obj


def _create_by_age_range_requests():
commands = _create_by_age_range_commands()
def _create_by_age_group_requests():
commands = _create_by_age_group_commands()
key_value = commands.items()
obj = {}
for el in key_value:
key = el[0]
_commands = el[1]
range_requests = []
group_requests = []
dose1_req = _create_req([_commands[0]])
dose2_req = _create_req([_commands[1]])
obj[key] = [dose1_req, dose2_req]
Expand Down Expand Up @@ -367,28 +347,11 @@ def _create_by_region_by_day_command(region):
return command


regions = [
"'Goriška'",
"'Zasavska'",
"'Koroška'",
"'Gorenjska'",
"'Osrednjeslovenska'",
"'Posavska'",
"'Podravska'",
"'Pomurska'",
"'Savinjska'",
"'Jugovzhodna Slovenija'",
"'Primorsko-notranjska'",
"'Obalno-kraška'",
]


def _create_by_region_by_day_commands():
obj = {}
for el in regions:
doses_command = _create_by_region_by_day_command(el)
key = el.replace("'", "")
obj[key] = [doses_command]
for el in Region:
doses_command = _create_by_region_by_day_command(el.value)
obj[el] = [doses_command]

return obj

Expand All @@ -400,7 +363,7 @@ def _create_by_region_by_day_requests():
for el in key_value:
key = el[0]
_commands = el[1]
range_requests = []
group_requests = []
doses_req = _create_req([_commands[0]])
obj[key] = [doses_req]

Expand Down Expand Up @@ -1097,12 +1060,6 @@ def _create_by_region_by_day_requests():
}
}


_vaccinations_by_age_90_dose1_command = _create_by_age_range_command("'90+'", "1L")
_vaccinations_by_age_90_dose2_command = _create_by_age_range_command("'90+'", "2L")

_vaccinations_pomurska_by_day_command = _create_by_region_by_day_command("'Pomurska'")

_vaccinations_by_municipalities_share_command = {
"SemanticQueryDataShapeCommand": {
"Query": {
Expand Down Expand Up @@ -1235,16 +1192,7 @@ def _create_by_region_by_day_requests():
[_vaccination_supplied_by_manufacturer_cum_command]
)

_vaccinations_by_age_range_90_dose1_req = _create_req(
[_vaccinations_by_age_90_dose1_command]
)
_vaccinations_by_age_range_90_dose2_req = _create_req(
[_vaccinations_by_age_90_dose2_command]
)

_vaccination_by_age_range_requests = _create_by_age_range_requests()

_vaccinations_pomurska_by_day_req = _create_req([_vaccinations_pomurska_by_day_command])
_vaccination_by_age_group_requests = _create_by_age_group_requests()

_vaccinations_by_region_by_day_requests = _create_by_region_by_day_requests()

Expand Down
37 changes: 37 additions & 0 deletions cepimose/enums.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
from enum import Enum, unique


@unique
class Region(Enum):
GORISKA = "'Goriška'"
ZASAVSKA = "'Zasavska'"
KOROSKA = "'Koroška'"
GORENJSKA = "'Gorenjska'"
OSREDNJESLOVENSKA = "'Osrednjeslovenska'"
POSAVSKA = "'Posavska'"
PODRAVSKA = "'Podravska'"
SAVINJSKA = "'Savinjska'"
JUGOVZHODNASLOVENIJA = "'Jugovzhodna Slovenija'"
PRIMORSKONOTRANJSKA = "'Primorsko-notranjska'"
OBALNOKRASKA = "'Obalno-kraška'"
POMURSKA = "'Pomurska'"


@unique
class AgeGroup(Enum):
GROUP_0_17 = "'0-17'"
GROUP_18_24 = "'18-24'"
GROUP_25_29 = "'25-29'"
GROUP_30_34 = "'30-34'"
GROUP_35_39 = "'35-39'"
GROUP_40_44 = "'40-44'"
GROUP_45_49 = "'45-49'"
GROUP_50_54 = "'50-54'"
GROUP_55_59 = "'55-59'"
GROUP_60_64 = "'60-64'"
GROUP_65_69 = "'65-69'"
GROUP_70_74 = "'70-74'"
GROUP_75_79 = "'75-79'"
GROUP_80_84 = "'80-84'"
GROUP_85_89 = "'85-89'"
GROUP_90 = "'90+'"
33 changes: 2 additions & 31 deletions cepimose/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
VaccinationByRegionRow,
VaccinationByManufacturerRow,
VaccinationDose,
VaccinationByAgeRange,
VaccinationByAgeGroup,
VaccinationMunShare,
)

Expand Down Expand Up @@ -236,7 +236,7 @@ def _parse_vaccines_supplied_by_manufacturer_cum(
return parsed_data


def _parse_vaccinations_by_age_range(data) -> "list[VaccinationDose]":
def _parse_vaccinations_by_age_group(data) -> "list[VaccinationDose]":
resp = data["results"][0]["result"]["data"]["dsr"]["DS"][0]["PH"][0]["DM0"]
parsed_data = []

Expand All @@ -259,42 +259,13 @@ def _parse_vaccinations_by_age_range(data) -> "list[VaccinationDose]":
return parsed_data


# resp error example
_resp_error = {
"DataShapes": [
{
"odata.error": {
"code": "InvalidOrMalformedSemanticQueryDefinition",
"source": "PowerBI",
"message": {
"lang": "en-US",
"value": "Encountered invalid QueryYearConstantExpression. Failed to parse type encoded string",
},
"azure:values": [
{"timestamp": "2021-04-11T12:13:03.0228291Z"},
{
"additionalMessages": [
{
"Code": "InvalidOrMalformedSemanticQueryDefinition",
"Severity": "Error",
"Message": "Encountered invalid QueryYearConstantExpression. Failed to parse type encoded string",
}
]
},
],
}
}
]
}

# ? most likely we can refactor _parse_vaccinations_by_day
def _parse_vaccinations_by_region_by_day(data):

if "DS" not in data["results"][0]["result"]["data"]["dsr"]:
error = data["results"][0]["result"]["data"]["dsr"]["DataShapes"][0][
"odata.error"
]
# it happens when region name passed to _get_default_by_region_by_day_condition_values func is misspelled or not wrapped in single quotes
# ? raise exception or return error obj
return error

Expand Down
2 changes: 1 addition & 1 deletion cepimose/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ class VaccinationDose:


@dataclass
class VaccinationByAgeRange:
class VaccinationByAgeGroup:
dose1: "list[VaccinationDose]"
dose2: "list[VaccinationDose]"

Expand Down
Loading

0 comments on commit fab9fa1

Please sign in to comment.