GT

GT output

Code
from great_tables import GT, md, html
import duckdb
from IPython.display import Markdown
import pandas as pd

query= """
  WITH TotaleFinanziamento AS (
      SELECT SUM(finanziamento_pnrr_loc) AS Totale
      FROM report.parquet
  )
  SELECT
    descrizione_missione AS Missione,
    COUNT(DISTINCT CONCAT(cup, '-', codice_locale_progetto)) as "Numero Progetti",
    ROUND(SUM(finanziamento_pnrr_loc)) as "Valore PNRR (€)",
    ROUND(SUM(finanziamento_pnrr_loc) / (SELECT Totale FROM TotaleFinanziamento) * 100, 2) as "% sul totale"
  FROM
      report.parquet
  GROUP BY ALL
  ORDER BY descrizione_missione;
  """

numero_progetti = duckdb.query(query).df()

GT(numero_progetti,locale="it-IT",rowname_col="Missione")\
  .fmt_number(columns="% sul totale", decimals=2)\
  .fmt_number(columns="Valore PNRR (€)", decimals=0)
Numero Progetti Valore PNRR (€) % sul totale
Digitalizzazione, innovazione, competitività e cultura 530 103.916.756 7,59
Inclusione e coesione 255 32.300.216 2,36
Rivoluzione verde e transizione ecologica 40 258.665.422 18,89
Salute 599 974.261.190 71,16

Simply print the dataframe

numero_progetti
Missione Numero Progetti Valore PNRR (€) % sul totale
0 Digitalizzazione, innovazione, competitività e... 530 103916756.0 7.59
1 Inclusione e coesione 255 32300216.0 2.36
2 Rivoluzione verde e transizione ecologica 40 258665422.0 18.89
3 Salute 599 974261190.0 71.16