import numpy as np
import pandas as pd
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
from math import exp, log
# Definir la función de Gompertz
def gompertz(x, b, c):
return np.exp((b/log(c+0.1))*(1-c**(x-15)))
# Definir los puntos de datos
x_data = np.array([15, 70, 77.5, 109])
y_data = np.array([1, 0.6, 0.4, 0.01])
# Ajustar la función de Gompertz a los datos
popt, pcov = curve_fit(gompertz, x_data, y_data)
ages = np.arange(15, 111, 1)
# Imprimir los parámetros optimizados
print(f' b = {popt[0]}, c = {popt[1]+0.1}')
# Generar puntos x para la gráfica
x = np.linspace(15, 110, 110)
# Calcular los valores y correspondientes
y = gompertz(x, *popt)
# Crear la gráfica
plt.figure(figsize=(10, 6))
plt.plot(x_data, y_data, 'ro', label='Datos')
plt.plot(x, y, label='Ajuste de Gompertz')
plt.title('Ajuste de la función de Gompertz')
plt.xlabel('x')
plt.ylabel('y')
plt.xticks(np.arange(min(ages), max(ages)+1, 5))
plt.legend()
plt.grid(True)
plt.show()
# Crear un rango de edades para la tabla de mortalidad
ii = 0.1 # tasa de interes
ages = np.arange(15, 111, 1)
# Calcular los valores de la función para cada edad
values = [np.round(gompertz(x, *popt)*1000000, 0) for x in ages]
Lx = [(1/2)*(values[i] + values[i+1]) if i < len(values) - 1 else (1/2)*(values[i]+0) for i in range(len(values))]
Tx = [np.sum(Lx[i:]) for i in range(len(values))]
dx_values = [values[i] - values[i + 1] if i < len(values) - 1 else values[i] - 0 for i in range(len(values))]
qx_values = [(dx_values[i]/values[i])*1000 for i in range(len(values))]
px_values = [(values[i+1] / values[i]) if i < len(values) - 1 else 0/values[i] for i in range(len(values))]
#ex = [np.sum(px_values[i:]) + 1/2 for i in range(len(values))]
#ex = [np.sum(values[i+1:])/values[i] + 1/2 for i in range(len(values))]
ex = [ Tx[i]/values[i] for i in range(len(values))]
Dx = [(((1/(1+ii))**ages[i])*values[i]) for i in range(len(values))]
Cx = [((1/(1+ii))**(ages[i]+1))* dx_values[i] for i in range(len(values))]
Nx = [np.sum(Dx[i:]) for i in range(len(values))]
Mx = [np.sum(Cx[i:]) for i in range(len(values))]
Ax = [Mx[i]/Dx[i] for i in range(len(values))]
#[px + qx for px, qx in zip(px_values, qx_values)]
# Crear la tabla de mortalidad como un DataFrame
mortality_table = pd.DataFrame({
'x': ages,
'lx': values,
'Lx': Lx,
'Tx': Tx,
'dx': dx_values,
'qx*1000': qx_values,
'px': px_values,
'ex': ex,
'Dx': Dx,
'Cx': Cx,
'Nx': Nx,
'Mx': Mx,
'Ax': Ax
})
# Calcular la diferencia entre el valor actual en 'lx' y el siguiente valor en 'lx'
#mortality_table['dx'] = mortality_table['lx'].shift(0) - mortality_table['lx'].shift(-1)
#mortality_table['dx'].iloc[-1] = mortality_table['lx'].iloc[-1] - 0
mortality_table