def company_distribution(df: pd.DataFrame, ax: mp.axes.Axes) -> ResultValue:
    log = logging.getLogger('company_distribution')
    log.info(" >>")
    try:

        def autopct_format(values):
            def my_format(pct):
                total = sum(values)
                val = int(round(pct * total / 100.0))
                str_val = f'{val:n}'
                return '{v:d}'.format(v=val)

            return my_format

        colors = [
            "#9aff33", "#34ff33", "#33ff98", "#33fffe", "#339aff", "#3371ff",
            "#5b33ff", "#c133ff", "#ff33d7"
        ]
        by_company = df.groupby(["fornitore"]).sum()
        by_company.reset_index(level=0, inplace=True)
        values = by_company["numero_dosi"]
        labels = by_company["fornitore"]
        ax.pie(values,
               labels=labels,
               colors=colors,
               autopct=autopct_format(values))
        ax.set_title("Vaccini consegnati", fontsize=18)

    except Exception as ex:
        log.error("Exception caught - {ex}".format(ex=ex))
        return ResultKo(ex)
    log.info(" <<")
    return ResultOk(True)
def age_distribution(df: pd.DataFrame,
                     ax: mp.axes.Axes,
                     gender: str = "F") -> ResultValue:
    log = logging.getLogger('age_distribution')
    log.info(" >>")
    try:
        if gender.upper() not in ["M", "F", "B"]:
            msg = "Geneder {v} value not known".format(v=gender)
            log.error(msg)
            return ResultKo(Exception(msg))

        by_age = df.groupby(["fascia_anagrafica"]).sum()
        by_age.reset_index(level=0, inplace=True)
        by_age["totals"] = by_age["sesso_femminile"] + by_age["sesso_maschile"]

        values = by_age["sesso_femminile" if gender == "F" else
                        ("sesso_maschile" if gender == "M" else "totals")]
        labels = by_age["fascia_anagrafica"]
        ax.pie(values, labels=labels, autopct='%1.1f%%', colors=colors)
        ax.set_title("Distribuzione per eta'", fontsize=18)

    except Exception as ex:
        log.error("Exception caught - {ex}".format(ex=ex))
        return ResultKo(ex)
    log.info(" <<")
    return ResultOk(True)
def chart_vaccinations_male_female(df: pd.DataFrame,
                                   ax: mp.axes.Axes) -> ResultValue:
    log = logging.getLogger('chart_vaccinations_male_female')
    log.info(" >>")
    try:
        num_male = df["sesso_maschile"].sum()
        num_female = df["sesso_femminile"].sum()
        parts = [num_female, num_male]
        labels = ["Donne", "Uomini"]

        female_color = "#f1a29b"
        male_color = "#9bd7f1"
        ax.pie(parts,
               labels=labels,
               colors=[female_color, male_color],
               autopct='%1.1f%%')
        ax.set_title("Distribuzione per genere", fontsize=18)

    except Exception as ex:
        log.error("Exception caught - {ex}".format(ex=ex))
        return ResultKo(ex)
    log.info(" <<")
    return ResultOk(True)
def chart_vaccinations_fornitore(df: pd.DataFrame,
                                 ax: mp.axes.Axes) -> ResultValue:
    log = logging.getLogger('chart_vaccinations_fornitore')
    log.info(" >>")
    try:
        by_company = df.groupby(["fornitore"]).sum()
        by_company["totals"] = by_company["sesso_maschile"] + by_company[
            "sesso_femminile"]
        by_company.reset_index(level=0, inplace=True)

        values = by_company["totals"]
        labels = by_company["fornitore"]
        ax.pie(values,
               labels=labels,
               colors=["#dfeef4", "#c2e7f6", "#7fd2f3"],
               autopct='%1.1f%%')
        ax.set_title("Distribuzione per fornitore", fontsize=18)

    except Exception as ex:
        log.error("Exception caught - {ex}".format(ex=ex))
        return ResultKo(ex)
    log.info(" <<")
    return ResultOk(True)