def universo1(df, poblacionColumna, ruta, archivoResultado, hojaResultado):
    """
    primer analisis del universo: beneficiarios alcanzados por el programa degún población
    :param df: dataframe a analizar
    :param poblacionColumna: columna del dataframe que se utilizara para hacer los agrupamientos
    :param ruta: ruta donde se guardaran los resultados
    :param archivoResultado: archivo donde se guarda el resultado del analisis
    :param hojaResultado: nombre de la hoja donde se guarda el resultado del analisis
    :return: void
    """
    df1 = df.groupby(poblacionColumna).CLAVE_BENEFICIARIO.nunique()
    excel.salvarDataframe(ruta, archivoResultado, hojaResultado, df1)
def universo2(df, poblacionColumna, ruta, archivoResultado, hojaResultado):
    """
    segundo analisis del universo: cantidad promedio de prestaciones por beneficiario según población
    :param df: dataframe a analizar
    :param poblacionColumna: columna del dataframe que se utilizara para hacer agrupamientos
    :param ruta: ruta donde se guardaran los resultados
    :param archivoResultado: archivo donde se guarda el resultado del analisis
    :param hojaResultado: nombre de la hoja donde se guarda el resultado del analisis
    :return: void
    """
    df1 = df.groupby(poblacionColumna).CLAVE_BENEFICIARIO.nunique()
    df2 = df.groupby(poblacionColumna).CODIGO_PRESTACION.count()
    df3 = pd.concat([df1, df2], axis=1)
    df3["PROMEDIO"] = df3["CODIGO_PRESTACION"] / df3["CLAVE_BENEFICIARIO"]
    excel.salvarDataframe(ruta, archivoResultado, hojaResultado, df3)
def analisis(ruta, archivoConcatenadoNombre, periodoColumna, periodo, lugarColumna, lugar,
             poblacionColumna, poblacion, codigoPrestacion, archivoResultado, lNombreHojas=[]):
    """
    lee, prepara y analiza un archivo con los detalles
    :param ruta: ruta donde se trabaja
    :param archivoConcatenadoNombre:  archivo a analizar
    :param periodoColumna: nombre de la columna de periodo para el metodo de resumen
    :param periodo: condicion para el resumen por periodo
    :param lugarColumna: nombre de la columna de lugar para el metodo de resumen
    :param lugar: condicion para el resumen por lugar
    :param poblacionColumna: nombre de la columna de poblacion para el metodo de resumen
    :param poblacion: condicion para el resumen por poblacion
    :param codigoPrestacion: condicion para el resumen por codigo
    :param archivoResultado: nombre del archivo con los resultados
    :param lNombreHojas: listados de hojas que tendra el archivo de resultados
    :return: void
    """
    # leo el database
    df = metodos.leerDatabase(ruta, archivoConcatenadoNombre)

    # resumo el database
    # df = metodos.resumirDatabase(df, periodoColumna, periodo)
    # df = metodos.resumirDatabase(df, lugarColumna, lugar, "==")
    # df = metodos.resumirDatabase(df, poblacionColumna, poblacion, "==")

    # quito las claves de beneficiario incorrectas
    df = metodos.resumirDatabase(df, "CLAVE_BENEFICIARIO", "COMUNIDAD", "!=")
    df = metodos.resumirDatabase(df, "CLAVE_BENEFICIARIO", "0COMUNIDAD", "!=")
    df = metodos.resumirDatabase(df, "CLAVE_BENEFICIARIO", "10000000000000000", "!=")

    # creo el archivo que contendra los resultados
    excel.crearArchivo(ruta, archivoResultado, lNombreHojas)

    # # armo los analisis de universo
    universo1(df, poblacionColumna, ruta, archivoResultado, "Universo 1")
    universo2(df, poblacionColumna, ruta, archivoResultado, "Universo 2")
    universo3(df, poblacionColumna, ruta, archivoResultado, "Universo 3")
    universo4(df, poblacionColumna, ruta, archivoResultado, "Universo 4")
    #
    # # dejo solo el codigo de interes
    df = metodos.resumirDatabase(df, "CODIGO_PRESTACION", codigoPrestacion, "==")
    #
    # # armo los analisis por prestacion de interes
    interes1(df, poblacionColumna, ruta, archivoResultado, "Interes 1")
    # interes2(df, poblacionColumna, ruta, archivoResultado, "Interes 2")
    interes3(df, poblacionColumna, ruta, archivoResultado, "Interes 3")
def interes2(df, poblacionColumna, ruta, archivoResultado, hojaResultado):
    """
    segundo analisis por prestación de interes: tasa de uso según población por prestación de interés
    :param df: dataframe a analizar
    :param poblacionColumna: columna del dataframe que se utilizara para hacer agrupamientos
    :param ruta: ruta donde se guardan los resultados
    :param archivoResultado: archivo donde se guarda el resultado del analisis
    :param hojaResultado: nombre de la hoja donde se guarda el resultado del analisis
    :return: void
    """
    df1 = df.groupby(["CODIGO_PRESTACION", poblacionColumna]).CLAVE_BENEFICIARIO.count()
    df2 = df.groupby(["CODIGO_PRESTACION", poblacionColumna]).CODIGO_PRESTACION.count()
    df3 = pd.concat([df1, df2], axis=1)
    df3["PROMEDIO"] = df3["CODIGO_PRESTACION"] / df3["CLAVE_BENEFICIARIO"]
    df3.to_csv(ruta + "auxiliar1" + ".csv")
    df3 = pd.read_csv(ruta + "auxiliar1" + ".csv", encoding="ISO-8859-1",
                      dtype={"CLAVE_BENEFICIARIO": str})
    excel.salvarDataframe(ruta, archivoResultado, hojaResultado, df3)
def universo4(df, poblacionColumna, ruta, archivoResultado, hojaResultado):
    """
    cuarto analisis del universo: distribucion de beneficiarios que consumieron prestaciones pro código de prestación y
    distribucion de veces que se consumió cada código de prestación
    :param df: dataframe a analizar
    :param poblacionColumna: columna del dataframe que se utilizara para hacer agrupamientos
    :param ruta: ruta donse se guardan los resultados
    :param archivoResultado: archivo donde se guarda el resultado del analisis
    :param hojaResultado: nombre de la hoja donde se guarda el resultado del analisis
    :return: void
    """
    df1 = df.groupby(poblacionColumna).CODIGO_PRESTACION.value_counts()
    df2 = df.groupby([poblacionColumna, "CODIGO_PRESTACION"]).CLAVE_BENEFICIARIO.nunique()
    df3 = pd.concat([df1, df2], axis=1)
    df3.to_csv(ruta + "auxiliar1" + ".csv")
    df3 = pd.read_csv(ruta + "auxiliar1" + ".csv", encoding="ISO-8859-1",
                      dtype={"CLAVE_BENEFICIARIO": str})
    excel.salvarDataframe(ruta, archivoResultado, hojaResultado, df3)
def interes1(df, poblacionColumna, ruta, archivoResultado, hojaResultado):
    """
    primer analisis por prestacion de interes: proporción de beneficiarios que hicieron uso de la prestación
    :param df: dataframe a analizar
    :param poblacionColumna: columna del dataframe que se utilizara para hacer agrupamientos
    :param ruta: ruta donde se guardan los resultados
    :param archivoResultado: archivo donde se guarda el resultado del analisis
    :param hojaResultado: nombre de la hoja donde se guarda el resultado del analisis
    :return: void
    """
    df2 = df.groupby(["CODIGO_PRESTACION", poblacionColumna]).CLAVE_BENEFICIARIO.nunique()
    df3 = df.groupby(["CODIGO_PRESTACION", poblacionColumna]).CODIGO_PRESTACION.count()
    df4 = pd.concat([df2, df3], axis=1)
    df4.columns = ["CANTIDAD_BENEFICIARIOS", "CANTIDAD_PRESTACIONES"]
    df4["POBLACION_TOTAL"] = df4["CANTIDAD_BENEFICIARIOS"] * df4["CANTIDAD_PRESTACIONES"]
    df4["PROPORCION"] = df4["CANTIDAD_PRESTACIONES"] / df4["CANTIDAD_BENEFICIARIOS"]
    df4["PROPORCION2"] = df4["CANTIDAD_PRESTACIONES"] / df4["POBLACION_TOTAL"]
    df4.to_csv(ruta + "auxiliar1" + ".csv")
    df4 = pd.read_csv(ruta + "auxiliar1" + ".csv", encoding="ISO-8859-1",
                      dtype={"CLAVE_BENEFICIARIO": str})
    excel.salvarDataframe(ruta, archivoResultado, hojaResultado, df4)
def interes3(df, poblacionColumna, ruta, archivoResultado, hojaResultado):
    """
    tercer analisis por prestación de interés: distribución del consumo de la prestación de interés
    :param df: dataframe a analizar
    :param ruta: ruta donde se guardan los resultados
    :param archivoResultado: archivo donde se guarda el resultado del analisis
    :param hojaResultado: nombre de la hoja donde se guarda el resultado del analisis
    :return: void
    """
    # agrupo por clave y cuento los codigos, guardo en un .csv y lo leo. Esto es para poder volver a agruparlo (puede que haya
    # una mejor manera de hacerlo)
    df1 = df.groupby([poblacionColumna, "CLAVE_BENEFICIARIO"]).CODIGO_PRESTACION.count()
    df1.to_csv(ruta + "auxiliar1" + ".csv")
    df1 = pd.read_csv(ruta + "auxiliar1" + ".csv", encoding="ISO-8859-1", names=["CATEGORIA_POBLACION", "CLAVE_BENEFICIARIO", "REPETICIONES"],
                      dtype={"CLAVE_BENEFICIARIO": str})

    # agrupo por cantidad de repeticiones y guardo el archivo
    df1 = df1.groupby([poblacionColumna, "REPETICIONES"]).CLAVE_BENEFICIARIO.count()
    df1.to_csv(ruta + "auxiliar1" + ".csv")
    df1 = pd.read_csv(ruta + "auxiliar1" + ".csv", encoding="ISO-8859-1", names=["REPETICIONES", "CUENTA_CLAVE"])
    df1["TOTAL_PRESTACIONES"] = df1["REPETICIONES"] * df1["CUENTA_CLAVE"]
    excel.salvarDataframe(ruta, archivoResultado, hojaResultado, df1)