Beispiel #1
0
    def calibrar(símismo,
                 líms_paráms,
                 datos,
                 método='epm',
                 n_iter=300,
                 vars_obs=None):
        """
        Efectuar la calibración.

        Parameters
        ----------
        líms_paráms: dict
            Diccionario de cada parámetro con sus límites teoréticos.
        datos: xr.Dataset or xr.DataArray or str or pd.DataFrame or dict or Fuente or list or BD
            Los datos para la calibración.
        método
        n_iter
        vars_obs

        Returns
        -------

        """
        # Para hacer: limpiar comunicación de datos entre calibrador y CalibradorGeog, y también con validadores
        if isinstance(datos, xr.Dataset):
            obs = datos
        else:
            datos = datos if isinstance(datos, BD) else BD(datos)
            obs = datos.obt_vals(vars_obs)

        return símismo._efec_calib(líms_paráms=líms_paráms,
                                   método=método,
                                   n_iter=n_iter,
                                   obs=obs)
Beispiel #2
0
    def setUpClass(cls):

        n_obs = 50
        datos_x = np.random.rand(n_obs)

        ec = 'y = a*x + b'
        cls.paráms = {'a': 2.4, 'b': -5}

        cls.clbrds = {ll: v(ec=ec, paráms=list(cls.paráms)) for ll, v in calibradores.items()}

        datos_y = cls.paráms['a'] * datos_x + cls.paráms['b'] + np.random.normal(0, 0.1, n_obs)
        cls.bd_datos = BD(
            fuentes=FuenteDic({'y': datos_y, 'x': datos_x, 'f': np.arange(n_obs)}, 'Datos generados', fechas='f')
        )
Beispiel #3
0
    def setUpClass(cls):
        cls.paráms = {
            '708': {
                'taza de contacto': 81.25,
                'taza de infección': 0.007,
                'número inicial infectado': 22.5,
                'taza de recuperación': 0.0375
            },
            '1010': {
                'taza de contacto': 50,
                'taza de infección': 0.005,
                'número inicial infectado': 40,
                'taza de recuperación': 0.050
            }
        }
        cls.mod = gen_mds(arch_mds)
        simul = SimuladorGeog(cls.mod).simular(t=100,
                                               vals_geog=cls.paráms,
                                               vars_interés=[
                                                   'Individuos Suceptibles',
                                                   'Individuos Infectados',
                                                   'Individuos Resistentes'
                                               ])

        # Para hacer: dimensiones múltiples,
        datos = {
            lg: {ll: v[:, 0]
                 for ll, v in simul[lg].a_dic().items()}
            for lg in cls.paráms
        }

        cls.datos = BD([
            FuenteDic(datos[lg],
                      'Datos geográficos',
                      lugares=lg,
                      fechas=np.arange(101)) for lg in cls.paráms
        ])
Beispiel #4
0
    def setUpClass(cls):
        cls.paráms = prms = {
            'a': {'701': 3.4, '708': 3, '1001': 10},
            'b': {'701': -1.5, '708': -1.1, '1001': -3}
        }  # Nota: ¡a en (0, +inf) y b en (-inf, +inf) según los límites en el modelo externo!
        cls.ec = 'y = a*x + b'
        n_obs = {'701': 500, '708': 50, '1001': 500}
        datos_x = {lg: np.random.rand(n) for lg, n in n_obs.items()}
        datos_y = {
            lg: datos_x[lg] * prms['a'][lg] + prms['b'][lg] + np.random.normal(0, 0.1, n_obs[lg])
            for lg in n_obs
        }  # y = a*x + b
        lugares = [x for ll, v in datos_x.items() for x in [ll] * v.size]
        x = [i for v in datos_x.values() for i in v]
        y = [i for v in datos_y.values() for i in v]

        cls.clbrds = {ll: v(ec=cls.ec, paráms=['a', 'b']) for ll, v in calibradores.items()}

        fchs = pd.date_range(0, periods=len(x))
        cls.bd = BD(FuenteDic(
            {'lugar': lugares, 'x': x, 'y': y, 'f': fchs}, 'Datos geográficos', lugares='lugar', fechas='f'
        ))

        cls.lugar = gen_lugares(arch_csv_geog, nivel_base='País', nombre='Iximulew')
Beispiel #5
0
    def validar(símismo,
                t,
                datos,
                paráms=None,
                funcs=None,
                vars_extern=None,
                corresp_vars=None):
        """
        Efectua la validación.

        Parameters
        ----------
        t: int or EspecTiempo
            La especificación de tiempo para la validación.
        datos: xr.Dataset or xr.DataArray or str or pd.DataFrame or dict or Fuente or list
            La base de datos para la validación.
        paráms: dict
            Diccionario de los parámetros calibrados para cada lugar.
        funcs: list
            Funciones de validación para aplicar a los resultados.
        vars_extern: str or list or Variable
            Variable(s) exógenos cuyos valores se tomarán de la base de datos para alimentar la simulación y con
            los cuales por supuesto no se validará el modelo.
        corresp_vars:
            Diccionario de correspondencia entre nombres de valores en el modelo y en la base de datos.

        Returns
        -------
        dict
            Validación por variable.

        """

        t = t if isinstance(t, EspecTiempo) else EspecTiempo(t)
        if not isinstance(datos, xr.Dataset):
            datos = datos if isinstance(datos, BD) else BD(datos)
            datos = datos.obt_vals(
                buscar_vars_interés(símismo.mod, datos, corresp_vars))

        funcs = funcs or list(eval_funcs)
        vars_extern = vars_extern or []
        if not isinstance(vars_extern, list):
            vars_extern = [vars_extern]

        vars_interés = buscar_vars_interés(símismo.mod, datos, corresp_vars)
        vars_valid = [v for v in vars_interés if v not in vars_extern]

        vals_extern = datos[list(
            {_resolver_var(v, corresp_vars)
             for v in vars_extern})]
        extern = {
            vr: vals_extern[_resolver_var(vr, corresp_vars)].dropna('n')
            for vr in vars_extern
        }
        extern = {ll: v for ll, v in extern.items() if v.sizes['n']}

        res = símismo.mod.simular(t=t,
                                  extern={
                                      **paráms,
                                      **extern
                                  },
                                  vars_interés=vars_valid)

        vals_calib = datos[list(
            {_resolver_var(v, corresp_vars)
             for v in vars_valid})]
        # Para hacer: si implementamos Dataset en ResultadosSimul este se puede combinar en una línea
        valid = {}
        for r in res:
            vr_datos = _resolver_var(str(r), corresp_vars)
            vals_calib_vr = vals_calib[vr_datos].dropna('n')
            if vals_calib_vr.sizes['n']:
                eje = r.vals[_('fecha')].values
                eje_obs = pd.to_datetime(vals_calib_vr[_('fecha')].values)
                eje_res = relativizar_eje(eje, eje_obs)
                buenas_fechas = xr.DataArray(np.logical_and(
                    eje_res[0] <= eje_obs, eje_obs <= eje_res[-1]),
                                             dims='n')
                datos_r = vals_calib_vr.where(buenas_fechas,
                                              drop=True).dropna('n')
                if datos_r.sizes['n'] > 1:
                    fechas_obs = datos_r[_('fecha')]
                    interpoladas = r.interpolar(fechas=fechas_obs)
                    valid[str(r)] = _valid_res(
                        datos_r.values, interpoladas.values,
                        pd.to_datetime(datos_r[_('fecha')].values), funcs)
        return valid
Beispiel #6
0
    def validar(símismo,
                t,
                datos,
                paráms=None,
                funcs=None,
                vars_extern=None,
                corresp_vars=None,
                clima=None):
        """
        Efectua la validación.

        Parameters
        ----------
        t: int or EspecTiempo
            La especificación de tiempo para la validación.
        datos: xr.Dataset or xr.DataArray or str or pd.DataFrame or dict or Fuente or list
            La base de datos para la validación.
        paráms: dict
            Diccionario de los parámetros calibrados para cada lugar.
        funcs: list
            Funciones de validación para aplicar a los resultados.
        vars_extern: str or list or Variable
            Variable(s) exógenos cuyos valores se tomarán de la base de datos para alimentar la simulación y con
            los cuales por supuesto no se validará el modelo.
        corresp_vars:
            Diccionario de correspondencia entre nombres de valores en el modelo y en la base de datos.

        Returns
        -------
        dict
            Validación por variable.

        """

        t = t if isinstance(t, EspecTiempo) else EspecTiempo(t)
        if not isinstance(datos, pd.DataFrame):
            datos = datos if isinstance(datos, BD) else BD(datos)
            datos = datos.obt_vals(
                buscar_vars_interés(símismo.mod, datos, corresp_vars))

        funcs = funcs or list(eval_funcs)
        vars_extern = vars_extern or []
        if not isinstance(vars_extern, list):
            vars_extern = [vars_extern]

        vars_interés = buscar_vars_interés(símismo.mod, datos, corresp_vars)
        vars_valid = [v for v in vars_interés if v not in vars_extern]

        vals_extern = datos[
            list({_resolver_var(v, corresp_vars)
                  for v in vars_extern}) + [_('fecha')]]

        # Para hacer: inter y extrapolación como opción en todas simulaciones, y extrapolación con función según líms
        if not np.datetime64(t.f_inic) in vals_extern[_('fecha')].values:
            vals_extern = vals_extern.append(
                {_('fecha'): pd.to_datetime(t.f_inic)}, ignore_index=True)
        vals_extern = vals_extern.sort_values(_('fecha'))
        vals_extern = vals_extern.interpolate(limit_area='inside').bfill()

        vals_extern = vals_extern.set_index(_('fecha'))
        extern = {
            vr: vals_extern[_resolver_var(vr, corresp_vars)].dropna()
            for vr in vars_extern
        }
        extern = {ll: v for ll, v in extern.items() if len(v)}

        res = símismo.mod.simular(t=t,
                                  extern={
                                      **paráms,
                                      **extern
                                  },
                                  vars_interés=vars_valid,
                                  clima=clima)

        vals_calib = datos[
            list({_resolver_var(v, corresp_vars)
                  for v in vars_valid}) + [_('fecha')]]
        # Para hacer: inter y extrapolación como opción en todas simulaciones, y extrapolación con función según líms
        if not np.datetime64(t.f_inic) in vals_calib[_('fecha')].values:
            vals_calib = vals_calib.append(
                {_('fecha'): pd.to_datetime(t.f_inic)}, ignore_index=True)
        vals_calib = vals_calib.sort_values(_('fecha'))
        vals_calib_interp = vals_calib.interpolate(
            limit_area='inside').set_index(_('fecha'))
        vals_calib = vals_calib.set_index(_('fecha'))
        vals_calib.loc[t.f_inic] = vals_calib_interp.loc[t.f_inic]

        # Para hacer: si implementamos Dataset en ResultadosSimul este se puede combinar en una línea
        valid = {}
        for r in res:
            vr_datos = _resolver_var(str(r), corresp_vars)
            vals_calib_vr = vals_calib[vr_datos].dropna()
            if len(vals_calib_vr):
                eje = r.vals[_('fecha')].values
                eje_obs = pd.to_datetime(vals_calib_vr.index.values)
                eje_res = relativizar_eje(eje, eje_obs)
                buenas_fechas = np.logical_and(eje_res[0] <= eje_obs,
                                               eje_obs <= eje_res[-1])
                datos_r = vals_calib_vr[buenas_fechas]
                if len(datos_r) > 1:
                    fechas_obs = datos_r.index
                    interpoladas = r.interpolar(fechas=fechas_obs)
                    buenas = np.isfinite(
                        r.interpolar(fechas=fechas_obs)).values[:, 0]
                    valid[str(r)] = _valid_res(datos_r.values[buenas],
                                               interpoladas.values[buenas],
                                               datos_r.index[buenas], funcs)
        return valid
Beispiel #7
0
 def setUpClass(cls):
     fnt1 = fnt.FuenteCSV(arch_datos1, nombre='prueba 1', fechas='fecha', lugares='lugar')
     fnt2 = fnt.FuenteCSV(arch_datos2, nombre='prueba 1', fechas='fecha', lugares='lugar')
     cls.bd = BD(fuentes=[fnt1, fnt2])