def main():
    # Log status
    logger.info("Loading local data files")
    test_results = read_json_from_file(TEST_RESULTS_PATH)

    # Get data for each chart
    logger.info("Calculating data for charts")
    infections_by_county = get_infection_count_by_county(
        test_results, COUNTY_MAPPING)
    infections_by_county_10000 = get_infections_data_by_count_10000(
        infections_by_county, COUNTY_POPULATION)
    tests_pop_ratio = get_test_data_pop_ratio(infections_by_county_10000)

    # Create dictionary for final JSON
    logger.info("Compiling final JSON")
    final_json = {
        "updatedOn": TODAY_DMYHM,
        "dataTestsPopRatio": tests_pop_ratio,
    }

    # Dump JSON output
    save_as_json(TESTS_POP_RATIO_PATH, final_json)

    # Log finish time
    logger.info("Finished update process")
示例#2
0
def main():
    # Log status
    logger.info("Loading local data files")
    test_results = read_json_from_file(TEST_RESULTS_PATH)

    logger.info("Calculating data for charts")
    positive_test_by_age_chart_data = get_positive_tests_by_age_chart_data(
        test_results)

    # Create dictionary for final JSON
    logger.info("Compiling final JSON")
    final_json = {
        "updatedOn": TODAY_DMYHM,
        "maleTotal": positive_test_by_age_chart_data["maleTotal"],
        "femaleTotal": positive_test_by_age_chart_data["femaleTotal"],
        "maleNegative": positive_test_by_age_chart_data["maleNegative"],
        "malePositive": positive_test_by_age_chart_data["malePositive"],
        "femaleNegative": positive_test_by_age_chart_data["femaleNegative"],
        "femalePositive": positive_test_by_age_chart_data["femalePositive"],
    }

    # Dump JSON output
    save_as_json(GENDER_PATH, final_json)

    # Log finish time
    logger.info("Finished update process")
def main():
    # Log status
    logger.info("Loading local data files")
    test_results = read_json_from_file(TEST_RESULTS_PATH)

    # Log status
    logger.info("Calculating main statistics")

    # Create date ranges for charts
    case_dates = pd.date_range(start=DATE_SETTINGS["firstCaseDate"],
                               end=YESTERDAY_YMD)

    # Set recovered, deceased, hospitalized and ICU time-series
    cumulative_tests_chart_data = get_cumulative_tests_chart_data(
        test_results, case_dates)

    # Create dictionary for final JSON
    logger.info("Compiling final JSON")
    final_json = {
        "updatedOn": TODAY_DMYHM,
        "caseDates": [str(x.date()) for x in case_dates],
        "testsAdministered": cumulative_tests_chart_data["testsAdministered"],
    }

    # Dump JSON output
    save_as_json(CUMULATIVE_TESTS_PATH, final_json)

    # Log finish time
    logger.info("Finished update process")
def main():
    # Log status
    logger.info("Loading local data files")
    test_results = read_json_from_file(TEST_RESULTS_PATH)

    logger.info("Calculating main statistics")
    # Create date ranges for charts
    case_dates = pd.date_range(start=DATE_SETTINGS["firstCaseDate"],
                               end=YESTERDAY_YMD)

    logger.info("Calculating data for charts")
    tests_per_day_chart_data = get_tests_per_day_chart_data(
        test_results, case_dates)

    # Create dictionary for final JSON
    logger.info("Compiling final JSON")
    final_json = {
        "updatedOn": TODAY_DMYHM,
        "caseDates": [str(x.date()) for x in case_dates],
        "dataTestsPerDayChart": tests_per_day_chart_data,
    }

    # Dump JSON output
    save_as_json(TESTS_PER_DAY_PATH, final_json)

    # Log finish time
    logger.info("Finished update process")
def main():
    # Log status
    logger.info("Loading local data files")
    vaccination = read_json_from_file(VACCINATIONS_PATH)

    logger.info("Calculating main statistics")
    vaccination_dates = pd.date_range(
        start=DATE_SETTINGS["vaccinationStartDate"], end=YESTERDAY_YMD)

    logger.info("Calculating data for charts")
    vaccinated_people_chart_data = get_vaccinated_people_chart_data(
        vaccination, vaccination_dates)

    # Create dictionary for final JSON
    logger.info("Compiling final JSON")
    final_json = {
        "updatedOn": TODAY_DMYHM,
        "vaccinationDates": [str(x.date()) for x in vaccination_dates],
        "dataVaccinatedPeopleChart": vaccinated_people_chart_data,
    }

    # Dump JSON output
    save_as_json(VACCINATED_PEOPLE_PATH, final_json)

    # Log finish time
    logger.info("Finished update process")
def main():
    # Log status
    logger.info("Loading local data files")
    test_results = read_json_from_file(TEST_RESULTS_PATH)

    # Log status
    logger.info("Calculating main statistics")

    # Create date ranges for charts
    case_dates = pd.date_range(start=DATE_SETTINGS["firstCaseDate"],
                               end=YESTERDAY_YMD)

    # Get data for each chart
    logger.info("Calculating data for charts")
    county_by_day = get_county_by_day(test_results, case_dates, COUNTY_MAPPING,
                                      COUNTY_POPULATION)
    confirmed_cases_by_county = get_confirmed_cases_by_county(
        test_results, COUNTY_MAPPING)

    del county_by_day["mapPlayback"]
    del county_by_day["mapPlayback10k"]

    # Create dictionary for final JSON
    logger.info("Compiling final JSON")
    final_json = {
        "updatedOn": TODAY_DMYHM,
        "dataConfirmedCasesByCounties": confirmed_cases_by_county,
        "countyByDay": county_by_day,
    }

    # Dump JSON output
    save_as_json(CONFIRMED_CASES_BY_COUNTIES_PATH, final_json)

    # Log finish time
    logger.info("Finished update process")
def main():
    # Log status
    logger.info("Loading local data files")
    test_results = read_json_from_file(TEST_RESULTS_PATH)

    # Log status
    logger.info("Calculating main statistics")

    # Create date ranges for charts
    case_dates = pd.date_range(start=DATE_SETTINGS["firstCaseDate"],
                               end=YESTERDAY_YMD)
    county_by_day = get_county_by_day(test_results, case_dates, COUNTY_MAPPING,
                                      COUNTY_POPULATION)

    # Create dictionary for final JSON
    logger.info("Compiling final JSON")
    final_json = {
        "updatedOn": TODAY_DMYHM,
        "caseDates": [str(x.date()) for x in case_dates],
        "newCountyByDay": county_by_day["newCountyByDay"],
    }

    # Dump JSON output
    save_as_json(DAILY_COUNTY_NEW_CASES_PATH, final_json)

    # Log finish time
    logger.info("Finished update process")
def main():
    # Log status
    logger.info("Loading local data files")
    test_results = read_json_from_file(TEST_RESULTS_PATH)
    hospitalization = read_json_from_file(HOSPITALIZATION_PATH)
    deaths = read_json_from_file(DEATHS_PATH)
    manual_data = read_json_from_file(MANUAL_DATA_PATH)

    # Log status
    logger.info("Calculating main statistics")

    # Create date ranges for charts
    case_dates = pd.date_range(start=DATE_SETTINGS["firstCaseDate"],
                               end=YESTERDAY_YMD)

    # Set recovered, deceased, hospitalized and ICU time-series
    hospital = get_hospital_data(hospitalization,
                                 DATE_SETTINGS["firstCaseDate"])
    recovered = hospital["discharged"]
    manual_data["deceased"].update(deaths)
    deceased = list(manual_data["deceased"].values())
    hospitalized = hospital["activeHospitalizations"]
    # TODO: Based on cross-checking with the hospitalization data publishedby TEHIK, the data listed
    #       in the manual_data.json file with the field name "intensive" appears to show the number
    #       of patients on ventilation. We should fix the terminology and make sure that the intensive
    #       and on ventilation statistics are being calculated correctly.
    intensive = list(
        get_in_intensive_data(hospitalization,
                              manual_data["intensive"]).values())
    on_ventilation = list(get_on_ventilation_data(hospitalization).values())

    # Get data for each chart
    logger.info("Calculating data for charts")
    cumulative_cases_chart_data = get_cumulative_cases_chart_data(
        test_results,
        recovered,
        deceased,
        hospitalized,
        intensive,
        on_ventilation,
        case_dates,
    )

    del cumulative_cases_chart_data["active100k"]

    # Create dictionary for final JSON
    logger.info("Compiling final JSON")
    final_json = {
        "updatedOn": TODAY_DMYHM,
        "caseDates": [str(x.date()) for x in case_dates],
        "dataCumulativeCasesChart": cumulative_cases_chart_data,
    }

    # Dump JSON output
    save_as_json(CUMULATIVE_CASES_PATH, final_json)

    # Log finish time
    logger.info("Finished update process")
示例#9
0
def main():
    ap = ArgumentParser()
    ap.add_argument("--parallel", type=int, default=1)
    opts = ap.parse_args()

    script_name = Path(__file__).name
    scripts = []
    for f in sorted(Path("build").glob("generate_*.py")):
        if f.name == script_name:
            continue
        scripts.append(f)
    total = len(scripts)

    logger.info("Found {total} generators", total=total)

    if opts.parallel == 1:
        for idx, path in enumerate(scripts):
            run(path, idx + 1, total)
    else:
        # Parallelism in Python can sometimes be a bit funky
        # This takes care of sharing a sane logger, and handling Ctrl+C, sometimes
        logger.remove()
        logger.add(sys.stderr, enqueue=True)

        original_sigint_handler = signal.signal(signal.SIGINT, signal.SIG_IGN)
        with Pool(opts.parallel, initializer=set_logger,
                  initargs=(logger, )) as pool:
            signal.signal(signal.SIGINT, original_sigint_handler)
            args = [(path, idx + 1, total, True)
                    for idx, path in enumerate(scripts)]

            try:
                res = pool.starmap_async(run, args)
                while True:
                    try:
                        res.get(
                            3
                        )  # Without the timeout this blocking call ignores all signals.
                        pool.close()
                        break
                    except multiprocessing.context.TimeoutError:
                        continue
            except KeyboardInterrupt:
                logger.error("Caught KeyboardInterrupt, terminating workers")
                pool.terminate()
                raise

    logger.info("Writing NavBar JSON package")
    final_json = {
        "updatedOn": TODAY_DMYHM,
    }

    # Dump JSON output
    save_as_json(NAVBAR_PATH, final_json)
示例#10
0
def main():
    # Log status
    logger.info("Loading local data files")
    test_results = read_json_from_file(TEST_RESULTS_PATH)
    test_locations = read_json_from_file(TEST_LOCATIONS_PATH)

    # Log status
    logger.info("Calculating main statistics")
    case_dates = pd.date_range(start=DATE_SETTINGS["firstCaseDate"],
                               end=YESTERDAY_YMD)

    # Get data for each chart
    logger.info("Calculating data for charts")
    infections_by_county = get_infection_count_by_county(
        test_results, COUNTY_MAPPING)
    infections_by_county_10000 = get_infections_data_by_count_10000(
        infections_by_county, COUNTY_POPULATION)
    county_by_day = get_county_by_day(test_results, case_dates, COUNTY_MAPPING,
                                      COUNTY_POPULATION)
    county_daily_active = get_county_daily_active(test_results, case_dates,
                                                  COUNTY_MAPPING,
                                                  COUNTY_POPULATION)
    active_infections_by_county = [{
        "MNIMI": k,
        "sequence": v,
        "drilldown": k
    } for k, v in county_daily_active["countyByDayActive"].items()]
    municipalities_data = get_municipality_data(test_locations, COUNTY_MAPPING)

    # Create dictionary for final JSON
    logger.info("Compiling final JSON")
    final_json = {
        "updatedOn": TODAY_DMYHM,
        "caseDates": [str(x.date()) for x in case_dates],
        "dataMunicipalities": municipalities_data,
        "mapPlayback": county_by_day["mapPlayback"],
        "mapPlayback10k": county_by_day["mapPlayback10k"],
        "dataActiveInfectionsByCounty": active_infections_by_county,
        "dataCountyDailyActive": county_daily_active,
        "dataInfectionsByCounty": infections_by_county,
        "dataInfectionsByCounty10000": infections_by_county_10000,
    }

    # Dump JSON output
    save_as_json(MAP_PATH, final_json)

    # Log finish time
    logger.info("Finished update process")
def main():
    # Log status
    logger.info("Loading local data files")
    test_results = read_json_from_file(TEST_RESULTS_PATH)

    logger.info("Calculating data for charts")
    positive_test_by_age_chart_data = get_positive_tests_by_age_chart_data(test_results)

    # Create dictionary for final JSON
    logger.info("Compiling final JSON")
    final_json = {
        "updatedOn": TODAY_DMYHM,
        "dataPositiveTestsByAgeChart": positive_test_by_age_chart_data,
    }

    # Dump JSON output
    save_as_json(TESTS_AGE_SEX_DISTRIBUTION_PATH, final_json)

    # Log finish time
    logger.info("Finished update process")
示例#12
0
def main():
    # Log status
    logger.info("Loading local data files")
    test_results = read_json_from_file(TEST_RESULTS_PATH)

    # Log status
    logger.info("Calculating data for charts")

    positive_negative_chart_data = get_positive_negative_chart_data(
        test_results, COUNTY_MAPPING)

    # Create dictionary for final JSON
    logger.info("Compiling final JSON")
    final_json = {
        "updatedOn": TODAY_DMYHM,
        "dataPositiveNegativeChart": positive_negative_chart_data,
    }

    # Dump JSON output
    save_as_json(POSITIVE_NEGATIVE_PATH, final_json)

    # Log finish time
    logger.info("Finished update process")
示例#13
0
def scrape_deaths():
    # Load content from Terviset's Covid dashboard and parse it
    logger.info("Scraping data on deaths from {url}",
                url=TERVISEAMET_COVID_DASHBOARD)
    html = requests.get(TERVISEAMET_COVID_DASHBOARD).text
    soup = BeautifulSoup(html, "html.parser")

    # Extract number of deaths from page content and update JSON data on deaths
    deaths_container = soup.select(DEATHS_SELECTOR)
    if len(deaths_container) > 0:
        # Get number of deaths and the current date
        deaths_count = int(deaths_container[0].text.strip())
        current_date = (datetime.now() -
                        timedelta(days=1)).strftime("%Y-%m-%d")

        # Load existing deaths data
        previous_deaths = read_json_from_file(DEATHS_PATH)

        # Add new entry to deaths data for current date
        deaths = {}
        if len(previous_deaths):
            deaths = previous_deaths
        deaths[current_date] = deaths_count

        # Save data on deaths
        save_as_json(DEATHS_PATH + ".tmp", deaths)

        # Log status
        logger.info("Successfully scraped deaths. Total deaths: {deaths}",
                    deaths=deaths_count)
    else:
        # Log error
        logger.debug("Couldn't find {selector}", selector=DEATHS_SELECTOR)
        raise Exception(
            "Couldn't scrape latest deaths data. Website structure probably changed."
        )
def main():
    # Log status
    logger.info("Starting data update process")

    test_results = read_json_from_file(TEST_RESULTS_PATH)
    test_locations = read_json_from_file(TEST_LOCATIONS_PATH)
    hospitalization = read_json_from_file(HOSPITALIZATION_PATH)
    vaccination = read_json_from_file(VACCINATIONS_PATH)

    # Load locally-stored data
    logger.info("Loading local data files")
    deaths = read_json_from_file(DEATHS_PATH)
    manual_data = read_json_from_file(MANUAL_DATA_PATH)

    # Log status
    logger.info("Calculating main statistics")

    # Statsbar
    # Find count of confirmed cases
    n_confirmed_cases = np.sum(
        [res["ResultValue"] == "P" for res in test_results])

    # Find total number of tests
    n_tests_administered = len(test_results)

    # Create date ranges for charts
    # dates1 = pd.date_range(start=DATE_SETTINGS["dates1_start"], end=yesterday)
    case_dates = pd.date_range(start=DATE_SETTINGS["firstCaseDate"],
                               end=YESTERDAY_YMD)
    vaccination_dates = pd.date_range(
        start=DATE_SETTINGS["vaccinationStartDate"], end=YESTERDAY_YMD)

    # Set recovered, deceased, hospitalized and ICU time-series
    hospital = get_hospital_data(hospitalization,
                                 DATE_SETTINGS["firstCaseDate"])
    recovered = hospital["discharged"]
    manual_data["deceased"].update(deaths)
    deceased = list(manual_data["deceased"].values())
    hospitalized = hospital["activehospitalizations"]
    # TODO: Based on cross-checking with the hospitalization data publishedby TEHIK, the data listed
    #       in the manual_data.json file with the field name "intensive" appears to show the number
    #       of patients on ventilation. We should fix the terminology and make sure that the intensive
    #       and on ventilation statistics are being calculated correctly.
    intensive = list(
        get_in_intensive_data(hospitalization,
                              manual_data["intensive"]).values())
    on_ventilation = list(get_on_ventilation_data(hospitalization).values())

    n_deaths = deceased[-1]
    n_deaths_change = int(deceased[-1]) - int(deceased[-2])

    # Get data for each chart
    logger.info("Calculating data for charts")
    infections_by_county = get_infection_count_by_county(
        test_results, COUNTY_MAPPING)
    infections_by_county_10000 = get_infections_data_by_count_10000(
        infections_by_county, COUNTY_POPULATION)
    tests_pop_ratio = get_test_data_pop_ratio(infections_by_county_10000)
    county_by_day = get_county_by_day(test_results, case_dates, COUNTY_MAPPING,
                                      COUNTY_POPULATION)
    confirmed_cases_by_county = get_confirmed_cases_by_county(
        test_results, COUNTY_MAPPING)
    cumulative_cases_chart_data = get_cumulative_cases_chart_data(
        test_results,
        recovered,
        deceased,
        hospitalized,
        intensive,
        on_ventilation,
        case_dates,
    )
    new_cases_per_day_chart_data = get_new_cases_per_day_chart_data(
        cumulative_cases_chart_data)
    cumulative_tests_chart_data = get_cumulative_tests_chart_data(
        test_results, case_dates)
    tests_per_day_chart_data = get_tests_per_day_chart_data(
        test_results, case_dates)
    positive_test_by_age_chart_data = get_positive_tests_by_age_chart_data(
        test_results)
    positive_negative_chart_data = get_positive_negative_chart_data(
        test_results, COUNTY_MAPPING)
    vaccinated_people_chart_data = get_vaccinated_people_chart_data(
        vaccination, vaccination_dates)
    county_daily_active = get_county_daily_active(test_results, case_dates,
                                                  COUNTY_MAPPING,
                                                  COUNTY_POPULATION)
    n_active_cases = cumulative_cases_chart_data["active"][-1]
    n_active_cases_change = (cumulative_cases_chart_data["active"][-1] -
                             cumulative_cases_chart_data["active"][-2])
    active_infections_by_county = [{
        "MNIMI": k,
        "sequence": v,
        "drilldown": k
    } for k, v in county_daily_active["countyByDayActive"].items()]
    active_infections_by_county_100k = [[
        k, round(v[-1] / COUNTY_POPULATION[k] * 100000, 2)
    ] for k, v in county_daily_active["countyByDayActive"].items()]
    municipalities_data = get_municipality_data(test_locations, COUNTY_MAPPING)
    per_100k = cumulative_cases_chart_data["active100k"][-1]

    # Calculate vaccination data
    logger.info("Calculating vaccination data")
    last_day_vaccination_data = [
        x for x in vaccination if x["MeasurementType"] == "Vaccinated"
    ][-1]
    last_day_completed_vaccination_data = [
        x for x in vaccination if x["MeasurementType"] == "FullyVaccinated"
    ][-1]
    # TODO: Doses administered
    # last_day_doses_administered_data = [x for x in json_vaccination if x['MeasurementType'] == 'DosesAdministered'][-1]
    completed_vaccination_number_total = last_day_completed_vaccination_data[
        "TotalCount"]
    completed_vaccination_number_last_day = last_day_completed_vaccination_data[
        "DailyCount"]
    all_vaccination_number_total = last_day_vaccination_data["TotalCount"]
    all_vaccination_number_last_day = last_day_vaccination_data["DailyCount"]
    vaccination_number_total = (all_vaccination_number_total -
                                completed_vaccination_number_total)
    vaccination_number_last_day = (all_vaccination_number_last_day -
                                   completed_vaccination_number_last_day)
    fully_vaccinated_from_total_vaccinated_percentage = round(
        completed_vaccination_number_total * 100 /
        (all_vaccination_number_total), 2)

    # Create dictionary for final JSON
    logger.info("Compiling final JSON")
    final_json = {
        "updatedOn":
        TODAY_DMYHM,
        "confirmedCasesNumber":
        str(n_confirmed_cases),
        # TODO: For consistency, we should include the change in the number of confirmed cases as well.
        "hospitalizedNumber":
        str(hospital["activehospitalizations"][-1]),
        "hospitalChanged":
        str(hospital["activehospitalizations"][-1] -
            hospital["activehospitalizations"][-2]),
        "deceasedNumber":
        str(n_deaths),
        "deceasedChanged":
        str(n_deaths_change),
        "recoveredNumber":
        str(hospital["discharged"][-1]),
        "recoveredChanged":
        str(hospital["discharged"][-1] - hospital["discharged"][-2]),
        "testsAdministeredNumber":
        str(n_tests_administered),
        # TODO: For consistency, we should include the change in the number of tests as well.
        "activeCasesNumber":
        str(n_active_cases),
        "activeChanged":
        str(n_active_cases_change),
        "perHundred":
        str(per_100k),  # TODO: This should be given a clearer name.
        # TODO: I can't find anywhere in the app where "dates1" is used. Is it needed? Commented out for now.
        # "dates1": [str(x.date()) for x in dates1],
        "caseDates": [str(x.date()) for x in case_dates],
        "vaccinationDates": [str(x.date()) for x in vaccination_dates],
        "counties":
        COUNTIES_INCL_UNKNOWN,
        "age_groups":
        AGE_GROUPS,
        "dataInfectionsByCounty":
        infections_by_county,
        "dataInfectionsByCounty10000":
        infections_by_county_10000,
        "dataActiveInfectionsByCounty100k":
        active_infections_by_county_100k,
        "dataActiveInfectionsByCounty":
        active_infections_by_county,
        "dataTestsPopRatio":
        tests_pop_ratio,
        "countyByDay":
        county_by_day,
        "dataCountyDailyActive":
        county_daily_active,
        "dataConfirmedCasesByCounties":
        confirmed_cases_by_county,
        "dataCumulativeCasesChart":
        cumulative_cases_chart_data,
        "dataNewCasesPerDayChart":
        new_cases_per_day_chart_data,
        "dataCumulativeTestsChart":
        cumulative_tests_chart_data,
        "dataTestsPerDayChart":
        tests_per_day_chart_data,
        "dataPositiveTestsByAgeChart":
        positive_test_by_age_chart_data,
        "dataPositiveNegativeChart":
        positive_negative_chart_data,
        "dataVaccinatedPeopleChart":
        vaccinated_people_chart_data,
        "dataMunicipalities":
        municipalities_data,
        "hospital":
        hospital,  # TODO: Rename this to make it clearer what data it contains.
        "vaccinationNumberTotal":
        vaccination_number_total,
        "vaccinationNumberLastDay":
        vaccination_number_last_day,
        "completedVaccinationNumberTotal":
        completed_vaccination_number_total,
        "completedVaccinationNumberLastDay":
        completed_vaccination_number_last_day,
        "allVaccinationNumberTotal":
        all_vaccination_number_total,
        "allVaccinationNumberLastDay":
        all_vaccination_number_last_day,
        "allVaccinationFromPopulationPercentage":
        last_day_vaccination_data["PopulationCoverage"],
        "completelyVaccinatedFromTotalVaccinatedPercentage":
        fully_vaccinated_from_total_vaccinated_percentage,
    }

    # Dump JSON output
    save_as_json(OUTPUT_PATH, final_json)

    # Log finish time
    logger.info("Finished update process")
示例#15
0
def main():
    # Log status
    logger.info("Loading local data files")
    test_results = read_json_from_file(TEST_RESULTS_PATH)
    hospitalization = read_json_from_file(HOSPITALIZATION_PATH)
    vaccination = read_json_from_file(VACCINATIONS_PATH)
    deaths = read_json_from_file(DEATHS_PATH)
    manual_data = read_json_from_file(MANUAL_DATA_PATH)

    # Log status
    logger.info("Calculating main statistics")

    # Statsbar
    # Find count of confirmed cases
    n_confirmed_cases = np.sum(
        [res["ResultValue"] == "P" for res in test_results])

    # Find total number of tests
    n_tests_administered = len(test_results)

    # Create date ranges for charts
    case_dates = pd.date_range(start=DATE_SETTINGS["firstCaseDate"],
                               end=YESTERDAY_YMD)

    # Set recovered, deceased, hospitalized and ICU time-series
    hospital = get_hospital_data(hospitalization,
                                 DATE_SETTINGS["firstCaseDate"])
    recovered = hospital["discharged"]
    manual_data["deceased"].update(deaths)
    deceased = list(manual_data["deceased"].values())
    hospitalized = hospital["activeHospitalizations"]
    # TODO: Based on cross-checking with the hospitalization data publishedby TEHIK, the data listed
    #       in the manual_data.json file with the field name "intensive" appears to show the number
    #       of patients on ventilation. We should fix the terminology and make sure that the intensive
    #       and on ventilation statistics are being calculated correctly.
    intensive = list(
        get_in_intensive_data(hospitalization,
                              manual_data["intensive"]).values())
    on_ventilation = list(get_on_ventilation_data(hospitalization).values())

    n_deaths = deceased[-1]
    n_deaths_change = int(deceased[-1]) - int(deceased[-2])

    # Get data for each chart
    logger.info("Calculating data for charts")
    tests_per_day_chart_data = get_tests_per_day_chart_data(
        test_results, case_dates)
    cumulative_cases_chart_data = get_cumulative_cases_chart_data(
        test_results,
        recovered,
        deceased,
        hospitalized,
        intensive,
        on_ventilation,
        case_dates,
        test_per_day_chart_data=tests_per_day_chart_data,
    )
    new_cases_per_day_chart_data = get_new_cases_per_day_chart_data(
        cumulative_cases_chart_data)
    cumulative_tests_chart_data = get_cumulative_tests_chart_data(
        test_results, case_dates)

    n_active_cases = cumulative_cases_chart_data["active"][-1]
    n_active_cases_change = (cumulative_cases_chart_data["active"][-1] -
                             cumulative_cases_chart_data["active"][-2])

    # Calculate vaccination data
    logger.info("Calculating vaccination data")
    last_day_vaccination_data = [
        x for x in vaccination if x["MeasurementType"] == "Vaccinated"
    ][-1]
    last_day_completed_vaccination_data = [
        x for x in vaccination if x["MeasurementType"] == "FullyVaccinated"
    ][-1]
    # TODO: Doses administered
    completed_vaccination_number_total = last_day_completed_vaccination_data[
        "TotalCount"]
    completed_vaccination_number_last_day = last_day_completed_vaccination_data[
        "DailyCount"]
    all_vaccination_number_total = last_day_vaccination_data["TotalCount"]
    all_vaccination_number_last_day = last_day_vaccination_data["DailyCount"]
    vaccination_number_total = (all_vaccination_number_total -
                                completed_vaccination_number_total)
    vaccination_number_last_day = (all_vaccination_number_last_day -
                                   completed_vaccination_number_last_day)
    fully_vaccinated_from_total_vaccinated_percentage = round(
        completed_vaccination_number_total * 100 /
        (all_vaccination_number_total), 2)
    raw_active_100k = (cumulative_cases_chart_data["active"][-1] -
                       cumulative_cases_chart_data["active"][-2])
    raw_confirmed_changed = new_cases_per_day_chart_data["confirmedCases"][-1]
    raw_per_hundred_changed = (cumulative_cases_chart_data["active100k"][-1] -
                               cumulative_cases_chart_data["active100k"][-2])
    confirmed_changed = new_cases_per_day_chart_data["confirmedCases"][-1]
    tests_changed = (cumulative_tests_chart_data["testsAdministered"][-1] -
                     cumulative_tests_chart_data["testsAdministered"][-2])

    partially_immunized_total = all_vaccination_number_total + n_confirmed_cases
    partially_immunized_pct = round(
        (float(partially_immunized_total) / float(POPULATION) * 100), 2)

    # Create dictionary for final JSON
    logger.info("Compiling final JSON")
    final_json = {
        "updatedOn":
        TODAY_DMYHM,
        "activeCasesNumber":
        str(n_active_cases),
        "activeChanged":
        str(n_active_cases_change),
        "allVaccinationFromPopulationPercentage":
        last_day_vaccination_data["PopulationCoverage"],
        "allVaccinationNumberLastDay":
        all_vaccination_number_last_day,
        "allVaccinationNumberTotal":
        all_vaccination_number_total,
        "completedVaccinationNumberLastDay":
        completed_vaccination_number_last_day,
        "completedVaccinationNumberTotal":
        completed_vaccination_number_total,
        "completelyVaccinatedFromTotalVaccinatedPercentage":
        fully_vaccinated_from_total_vaccinated_percentage,
        "confirmedCasesNumber":
        str(n_confirmed_cases),
        "confirmedChanged":
        confirmed_changed,
        "deceasedChanged":
        str(n_deaths_change),
        "deceasedNumber":
        str(n_deaths),
        "hospitalizedChanged":
        str(hospital["activeHospitalizations"][-1] -
            hospital["activeHospitalizations"][-2]),
        "hospitalizedNumber":
        hospital["activeHospitalizations"][-1],
        "partiallyImmunized":
        partially_immunized_total,
        "partiallyImmunizedPercentage":
        partially_immunized_pct,
        "perHundred":
        cumulative_cases_chart_data["active100k"][-1],
        "positiveTestAverage14Percent":
        tests_per_day_chart_data["positiveTestAverage14Percent"],
        "rawActiveChanged":
        raw_active_100k,
        "rawConfirmedChanged":
        raw_confirmed_changed,
        "rawPerHundredChanged":
        raw_per_hundred_changed,
        "recoveredChanged":
        str(hospital["discharged"][-1] - hospital["discharged"][-2]),
        "recoveredNumber":
        hospital["discharged"][-1],
        "testsAdministeredNumber":
        str(n_tests_administered),
        "testsChanged":
        tests_changed,
        "vaccinationNumberLastDay":
        vaccination_number_last_day,
        "vaccinationNumberTotal":
        vaccination_number_total,
    }

    # Dump JSON output
    save_as_json(STATS_BAR_PATH, final_json)

    # Log finish time
    logger.info("Finished update process")