Пример #1
0
def columnasCambiadasParaEstadistica(counterName,
                                     dfCambiadoOld,
                                     dfCambiadoNew,
                                     columnasObj=None):
    if len(dfCambiadoOld) != len(dfCambiadoNew):
        raise ValueError(
            f"cuentaFilas: longitudes difieren Old:{len(dfCambiadoOld)} != New:{len(dfCambiadoNew)}"
        )
    if len(dfCambiadoOld) == 0:
        return 0

    auxColsObj = listize(columnasObj)
    counterCols = dfCambiadoNew.columns.difference(COLSADDEDMERGED)

    if columnasObj:
        missingColsNew = set(auxColsObj).difference(dfCambiadoNew.columns)

        if missingColsNew:
            print(
                f"columnasCambiadasParaEstadistica: {counterName}: columnas desconocidas: {sorted(missingColsNew)}. ",
                f"Columnas existentes: {sorted(list(dfCambiadoOld.columns))}. Ignorando contador."
            )
            return None
        counterCols = auxColsObj

    NAfiller = DF2maxValues(dfCambiadoOld, counterCols)
    areRowsDifferent = (dfCambiadoOld.fillna(value=NAfiller)[counterCols] !=
                        dfCambiadoNew.fillna(value=NAfiller)[counterCols]).any(
                            axis=1)
    return areRowsDifferent
def leeFicheroHistEntrada(fname, colzona, create=False):
    try:
        colsIndex = sorted(set(COLIDX + listize(colzona)))
        result = leeDatosHistoricos(fname, extraCols=COLSADDEDMERGED, colsIndex=colsIndex, colsDate=COLDATES,
                                    changeCounters=ESTADSCAMBIO)

    except FileNotFoundError as exc:
        if create:
            return None
        else:
            print(f"Archivo no encontrado '{fname}' y parámetro de creación (-c) no indicado. Adios")
            exit(1)
    except pd.errors.EmptyDataError as exc:
        print(
            f"Archivo '{fname}' vacío:{exc}. Borrar y volver a ejecutar programa con parámetro de creación (-c). Adios")
        exit(1)
    except UnicodeError as exc:
        print(
            f"Archivo '{fname}' con problemas:{exc}. Borrar y volver a ejecutar programa con parámetro de creación (-c). Adios")
        exit(1)
    except ValueError as exc:
        print(
            f"Archivo '{fname}' con problemas:{exc}. Borrar y volver a ejecutar programa con parámetro de creación (-c). Adios")
        exit(1)

    return result
Пример #3
0
def estadisticaCategoricals(counterName,
                            dfCambiadoOld,
                            dfCambiadoNew,
                            columnaIndiceObj,
                            columnasObj=None,
                            valoresAgrupacion=None,
                            valoresDescribe=None,
                            **kwargs):
    areRowsDifferent = columnasCambiadasParaEstadistica(
        counterName, dfCambiadoOld, dfCambiadoNew, columnasObj=columnasObj)

    if areRowsDifferent is None:
        print(
            "estadisticaCategoricals: {counterName}: problemas tras la invocacion a columnasCambiadasParaEstadistica"
        )
        return {}, None

    if (len(areRowsDifferent) == 0) or (areRowsDifferent.sum() == 0):
        colData = ("en columna(s) " +
                   ",".join(listize(columnasObj))) if columnasObj else ""
        print(
            f"estadisticaCategoricals: {counterName}: no ha habido cambios {colData}"
        )
        return {}, None

    columnasIndice = dfCambiadoOld.index.names
    if columnaIndiceObj not in columnasIndice:
        print(
            f"estadisticaCategoricals: {counterName}: columna indice desconocida: {columnaIndiceObj}. ",
            f"Columnas existentes: {sorted(list(columnasIndice))}. Ignorando contador."
        )
        return None

    IDXfilter = False
    if valoresAgrupacion:
        IDXfilter = dfCambiadoNew.reset_index()[columnasIndice].isin(
            valoresAgrupacion).any(axis=1)
        IDXfilter.index = dfCambiadoNew.index

    filasAContar = ~IDXfilter & areRowsDifferent

    registrosAContar = filasAContar.loc[filasAContar].reset_index(
    )[columnaIndiceObj].astype('category', copy=False)

    resultDesc = registrosAContar.describe()
    if valoresDescribe:
        resultDesc = resultDesc[valoresDescribe]

    result = resultDesc.to_dict()

    return result, None
Пример #4
0
def leeDatosMadDF(fname_or_handle, extraIndexes=None, **kwargs):
    """
    """

    colsIndex = COLIDX + (listize(extraIndexes) if extraIndexes else [])
    kwargs.update({'encoding': 'latin-1'})

    myDF = leeCSVdataset(fname_or_handle, colIndex=colsIndex, cols2drop=COLS2DROP, colDates=COLDATES,
                         decimal=',', dialect='IDA', **kwargs)

    requiredCols = set(colsIndex + COLDATES)
    availableCols = set(myDF.columns.tolist() + myDF.index.names)
    missingCols = requiredCols.difference(availableCols)
    if missingCols:
        raise ValueError(f"Faltan columnas: {sorted(missingCols)}. Disponibles: {sorted(availableCols)}")

    return myDF
Пример #5
0
def indiceDeTipo(dfIndex: pd.MultiIndex, prefijo):
    def getMatcher(prefijos):
        def coincideCadena(c: str) -> bool:
            return any([c.startswith(p) for p in prefijos])

        return coincideCadena

    nombresTipo = nombreTipoCamposIndice(dfIndex)

    listaPrefs = listize(prefijo)

    matcher = getMatcher(listaPrefs)

    resultSerie = nombresTipo.apply(matcher)

    result = resultSerie.loc[resultSerie].index.to_list()

    return result
Пример #6
0
def changeCounters2ReqColNames(changeCounters: dict = None):
    """
    Dado un diccionario con estadistacas de contador de cambios, extrae las columnas que aparecerían en el DF histórico
    (columnas que se buscan + las que se añaden)
    :param changeCounters:
    :return:
    """
    if changeCounters is None:
        return []

    result = []
    for counterName, counterConf in changeCounters.items():
        if isinstance(counterConf, dict):
            if counterConf.get('creaColumna', False):
                nombreColumna = counterConf.get('nombreColumna', counterName)
                result.append(nombreColumna)
            if 'columnasObj' in counterConf:
                columnasAmirar = listize(counterConf['columnasObj'])
                result.extend(columnasAmirar)
        elif isinstance(counterConf, list):
            result.append(counterName)
            result.extend(counterConf)

    return result
Пример #7
0
def estadisticaFechaCambios(counterName,
                            dfCambiadoOld,
                            dfCambiadoNew,
                            columnaIndiceObj,
                            fechaReferencia,
                            columnasObj=None,
                            valoresAgrupacion=None,
                            **kwargs):
    areRowsDifferent = columnasCambiadasParaEstadistica(
        counterName, dfCambiadoOld, dfCambiadoNew, columnasObj=columnasObj)

    if areRowsDifferent is None:
        print(
            "estadisticaFechaCambios: {counterName}: problemas tras la invocacion a columnasCambiadasParaEstadistica"
        )
        return {}, None

    if (len(areRowsDifferent) == 0) or (areRowsDifferent.sum() == 0):
        colData = ("en columna(s) " +
                   ",".join(listize(columnasObj))) if columnasObj else ""
        print(
            f"estadisticaFechaCambios: {counterName}: no ha habido cambios {colData}"
        )
        return {}, None

    columnasIndice = dfCambiadoOld.index.names
    if columnaIndiceObj not in columnasIndice:
        print(
            f"estadisticaFechaCambios: {counterName}: columna indice desconocida: {columnaIndiceObj}. ",
            f"Columnas existentes: {sorted(list(columnasIndice))}. Ignorando contador."
        )
        return None

    IDXfilter = False
    if valoresAgrupacion:
        IDXfilter = dfCambiadoNew.reset_index()[columnasIndice].isin(
            valoresAgrupacion).any(axis=1)
        IDXfilter.index = dfCambiadoNew.index

    filasAContar = ~IDXfilter & areRowsDifferent

    registrosAContar = filasAContar.loc[filasAContar].reset_index(
    )[columnaIndiceObj]

    descCateg = registrosAContar.astype('category',
                                        copy=False).describe().loc[['unique']]
    descFechas = pd.to_datetime(
        registrosAContar.describe(datetime_is_numeric=True).loc[[
            'min', 'max'
        ]]).dt.strftime("%Y-%m-%d")
    descFechas.index = pd.Index(['Fmin', 'Fmax'])
    descDiff = ((fechaReferencia.date() -
                 registrosAContar.dt.date).dt.days).describe().loc[[
                     'mean', 'std', '50%', 'min', 'max'
                 ]].map('{:,.2f}'.format)
    descDiff.index = pd.Index([
        'Dmean',
        'Dstd',
        'Dmedian',
        'Dmin',
        'Dmax',
    ])

    resultDesc = pd.concat([descCateg, descFechas, descDiff])
    result = resultDesc.to_dict()

    return result, None