Emmatassone / GEN-Bots

1 stars 0 forks source link

Conceptos y métricas para el proyecto de estadísticas #16

Closed chao5monkey closed 1 year ago

chao5monkey commented 1 year ago

Conceptos y métricas para el proyecto de estadísticas

El objetivo de este PR es definir un mecanismo que nos sirva para estandarizar los conceptos con los que trabajamos durante el proceso de análisis tal que sea posible construir estructuras como dataframes de pandas y registros de numpy con nombres de columnas estándar. De esta forma distintos componentes pueden compartir información más fácilmente, y distintas personas pueden implementar componentes distintos que trabajan con los mismos conceptos.

Por ejemplo, en este PR se definen en un módulo concepts varios conceptos como los siguientes:

"""
NET_INCOME (np.float64), equivalent to the XBRL US GAAP taxonomy concept us-gaap:NetIncomeLoss, defined as the
"portion of profit or loss for the period, net of income taxes, which is attributable to the parent."
"""
NET_INCOME = 'net_income'

"""
RETURN_ON_EQUITY (np.float64) is net income divided by shareholder's equity. In terms of XBRL US GAAP taxonomy 
elements, it can be defined as the ratio us-gaap:NetIncomeLoss / us-gaap:StockholdersEquity.
"""
RETURN_ON_EQUITY = 'return_on_equity'

"""
STOCKHOLDER_EQUITY (np.float64), equivalent to the XBRL US GAAP taxonomy concept us-gaap:StockholdersEquity, defined
as the "amount of equity (deficit) attributable to parent. Excludes temporary equity and equity attributable  to
noncontrolling interest."
"""
STOCKHOLDER_EQUITY = 'stockholder_equity'

Luego, un desarrollador A escribir código que en base a alguna fuente de datos construye un dataframe como el siguiente:

import ge.finance.concept as concept
import pandas as pd

data = pd.DataFrame([
    {
        concept.TICKER_SYMBOL: 'XYZ',
        concept.PERIOD_START: np.datetime64('2021-01-01'),
        concept.NET_INCOME: 2000.0,
        concept.STOCKHOLDER_EQUITY: 2000.0,
    },
    {
        concept.TICKER_SYMBOL: 'XYZ',
        concept.PERIOD_START: np.datetime64('2022-01-01'),
        concept.NET_INCOME: 1000.0,
        concept.STOCKHOLDER_EQUITY: 2000.0,
    },
])

Por otro lado, un desarrollador B puede implementar una función como la siguiente, que trabaja sobre un dataframe con columnas estándar:

import ge.finance.concept as concept
import pandas as pd

def return_on_equity(df: pd.DataFrame) -> pd.Series:
    """
    Computes standard RETURN_ON_EQUITY given a dataframe with standard columns NET_INCOME and STOCKHOLDER_EQUITY.
    The result is returned as a pandas series.
    """
    return df[concept.NET_INCOME] / df[concept.STOCKHOLDER_EQUITY]

Otro desarrollador puede hacer uso de esta función, sabiendo por la documentación que calcula RETURN_ON_EQUITY, para extender el dataframe construido por el desarrollador A haciendo uso de la función definida por el desarrollador B:

import ge.finance.metrics as metrics

data[concept.RETURN_ON_EQUITY] = metrics.return_on_equity(data)