Source code for arcovid19.core

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Copyright (c) 2020, Bruno Sanchez, Mauricio Koraj, Vanessa Daza,
#                     Juan B Cabral, Mariano Dominguez, Marcelo Lares,
#                     Nadia Luczywo, Dante Paz, Rodrigo Quiroga,
#                     Martín de los Ríos, Federico Stasyszyn
#                     Cristian Giuppone.
# License: BSD-3-Clause
#   Full Text: https://raw.githubusercontent.com/ivco19/libs/master/LICENSE


# =============================================================================
# DOCS
# =============================================================================

"""Core functionalities for arcovid19

"""

__all__ = ["Frame", "Plotter"]


# =============================================================================
# IMPORTS
# =============================================================================

import abc
import logging

import attr


# =============================================================================
# CONSTANTS
# =============================================================================

logger = logging.getLogger("arcovid19.core")


# =============================================================================
# CASES
# =============================================================================

[docs]@attr.s(repr=False) class Plotter(metaclass=abc.ABCMeta): frame = attr.ib() @abc.abstractproperty def default_plot_name_method(self): pass def __repr__(self): return f"CasesPlot({hex(id(self.frame))})" def __call__(self, plot_name=None, ax=None, **kwargs): """x.__call__() == x()""" plot_name = plot_name or self.default_plot_name_method if plot_name.startswith("_"): raise ValueError(f"Invalid plot_name '{plot_name}'") plot = getattr(self, plot_name) ax = plot(ax=ax, **kwargs) return ax
[docs]@attr.s(repr=False) class Frame(metaclass=abc.ABCMeta): df = attr.ib() extra = attr.ib(factory=dict) plot = attr.ib(init=False) @abc.abstractproperty def plot_cls(self): pass @plot.default def _plot_default(self): plot_cls = self.plot_cls return plot_cls(frame=self) def __dir__(self): """x.__dir__() <==> dir(x)""" return super().__dir__() + dir(self.df) def __repr__(self): """x.__repr__() <==> repr(x)""" return repr(self.df) def __getattr__(self, a): """x.__getattr__(y) <==> x.y Redirect all te missing calls first to extra and then to the internal dataframe. """ if a in self.extra: return self.extra[a] return getattr(self.df, a) def __getitem__(self, k): """x.__getitem__(y) <==> x[y]""" return self.df.__getitem__(k)