76 lines
3.3 KiB
Python
76 lines
3.3 KiB
Python
from calculations import iterate
|
|
from calculations import steady_state_population
|
|
import pandas as pd
|
|
import numpy as np
|
|
import seaborn as sns
|
|
from matplotlib import pyplot as plt
|
|
|
|
|
|
def real_mortality_distribution(scaling_factor = 1.51) -> np.ndarray:
|
|
df = pd.read_excel("input/mortality.xlsx")
|
|
mortality = np.array(df.Mortality)
|
|
mortality[np.where(mortality>0)[0]] = 0
|
|
mortality=np.hstack((mortality, mortality[-1]))
|
|
return np.array(-1*mortality)*scaling_factor
|
|
|
|
|
|
def real_population_distribution(fraction_that_is_cars = 0.8413) -> np.ndarray:
|
|
df = pd.read_excel("input/age distribution.xlsx")
|
|
return np.array(df["Absolute Anzahl "])*fraction_that_is_cars
|
|
|
|
|
|
def population_distribution_deltas(fraction_that_is_cars = 0.8413) -> np.ndarray:
|
|
population_distribution = real_population_distribution()
|
|
mortality_distribution = real_mortality_distribution()
|
|
|
|
df = pd.read_excel("input/new registration numbers.xlsx")
|
|
years = np.arange(2020, 2031)
|
|
new_registrations = np.array(df["scenario without Covid"][1:])*fraction_that_is_cars
|
|
steady_state_registrationss = list()
|
|
correction_factors = list()
|
|
totals = list()
|
|
|
|
for i in range(len(years)):
|
|
steady_state_registrations = iterate(real_mortality_distribution(), population_distribution.copy())[0][0]
|
|
correction_factor = new_registrations[i]/steady_state_registrations
|
|
correction_factors.append(correction_factor)
|
|
population_distribution, _ = iterate(real_mortality_distribution(), population_distribution, fraction_of_new_cars=correction_factor)
|
|
totals.append(sum(population_distribution))
|
|
steady_state_registrationss.append(steady_state_registrations)
|
|
|
|
df = pd.DataFrame({"Year": years,
|
|
"Predicted Regsitrations": new_registrations,
|
|
"Steady State Registrations": steady_state_registrationss,
|
|
"Correction Factor": correction_factors,
|
|
"Total": totals})
|
|
|
|
return df
|
|
|
|
if __name__ == "__main__":
|
|
mortality_distribution = real_mortality_distribution()
|
|
population_distribution = real_population_distribution()
|
|
|
|
steady_state_population_distribution = steady_state_population(mortality_distribution,
|
|
total_population=sum(population_distribution))
|
|
# Plot Age dtribution
|
|
if True:
|
|
plt.figure()
|
|
df = pd.DataFrame({"Age": np.hstack((np.arange(len(mortality_distribution)),
|
|
np.arange(len(mortality_distribution)))),
|
|
"Data": np.hstack((population_distribution/1e6,
|
|
steady_state_population_distribution/1e6)),
|
|
"Scenario": np.hstack((["KBA Data"]*len(mortality_distribution),
|
|
["Simulated Steady State"]*len(mortality_distribution)))})
|
|
plot_ = sns.barplot(data=df, x="Age", y="Data", hue="Scenario")
|
|
plt.title("Population Distribution")
|
|
plt.ylabel("Vehicles (Millions)")
|
|
plt.xlabel("Age (years)")
|
|
for ind, label in enumerate(plot_.get_xticklabels()):
|
|
if ind % 10 == 0: # every 10th label is kept
|
|
label.set_visible(True)
|
|
else:
|
|
label.set_visible(False)
|
|
plt.show()
|
|
plt.close()
|
|
|