Spaces:
Sleeping
Sleeping
File size: 7,204 Bytes
58043e3 dbab432 c65b27b dad07c8 c65b27b dbab432 dad07c8 c65b27b dad07c8 c65b27b dbab432 c65b27b dad07c8 dbab432 dad07c8 dbab432 c65b27b dad07c8 c65b27b dad07c8 c65b27b dad07c8 dbab432 dad07c8 dbab432 c65b27b dad07c8 dbab432 c65b27b dad07c8 dbab432 c65b27b dad07c8 dbab432 c65b27b dbab432 dad07c8 dbab432 c65b27b dad07c8 dbab432 dad07c8 dbab432 c65b27b dbab432 dad07c8 c65b27b dbab432 c65b27b dad07c8 dbab432 dad07c8 dbab432 c65b27b dbab432 c65b27b dbab432 c65b27b dbab432 dad07c8 c65b27b 58043e3 c65b27b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
import pandas as pd
import plotly.express as px
import gradio as gr
# Configurazione: nomi delle colonne presenti nel dataset
COL_TITOLO = "titolo_articolo"
COL_AUTORE1 = "primo_autore"
COL_AUTORE2 = "secondo_autore"
COL_AUTORE3 = "terzo_autore"
COL_ANNO = "anno_pubblicazione"
COL_LINGUA = "lingua"
COL_KEYWORD = "keyword"
COL_TESTO = "testo_txt" # Colonna contenente il testo dell'articolo (se necessaria)
COL_NUM_PAROLE = "num_parole" # Colonna con il numero di parole per articolo
COL_LUOGHI = "luoghi_citati"
def genera_grafici():
# Caricamento del dataset
df = pd.read_csv("sa-dataset.csv")
# Verifica colonne fondamentali
colonne_necessarie = [COL_ANNO, COL_LINGUA, COL_KEYWORD, COL_NUM_PAROLE, COL_LUOGHI, COL_AUTORE1, COL_AUTORE2, COL_AUTORE3]
for col in colonne_necessarie:
if col not in df.columns:
raise KeyError(f"Il dataset non contiene la colonna '{col}'. Verificare il file.")
# Assicurarsi che COL_NUM_PAROLE sia numerico
df[COL_NUM_PAROLE] = pd.to_numeric(df[COL_NUM_PAROLE], errors="coerce")
# Creazione di una colonna 'lista_autori' combinando i tre autori (filtrando eventuali valori nulli o vuoti)
df["lista_autori"] = df[[COL_AUTORE1, COL_AUTORE2, COL_AUTORE3]].apply(
lambda row: [a for a in row if pd.notnull(a) and str(a).strip() != ""], axis=1)
# Creazione della serie degli autori (esplosione della lista)
autori_explosi = df.explode("lista_autori")
figures = []
# 1. Lunghezza media di articoli per anno
df_media = df.groupby(COL_ANNO)[COL_NUM_PAROLE].mean().reset_index()
fig1 = px.bar(df_media, x=COL_ANNO, y=COL_NUM_PAROLE,
title="Lunghezza media di articoli per anno",
labels={COL_ANNO: "Anno", COL_NUM_PAROLE: "Numero medio di parole"})
figures.append(fig1)
# 2. Trend delle keyword per anno
# Suddivide le keyword in lista (assumendo che siano separate da virgola)
df["keyword_list"] = df[COL_KEYWORD].apply(lambda x: [k.strip() for k in str(x).split(",") if k.strip() != ""])
df_keywords = df.explode("keyword_list")
# Calcola la frequenza delle keyword per anno
keyword_year = df_keywords.groupby([COL_ANNO, "keyword_list"]).size().reset_index(name="count")
# Seleziona le 5 keyword più frequenti complessivamente
top_keywords = df_keywords["keyword_list"].value_counts().head(5).index.tolist()
keyword_year_top = keyword_year[keyword_year["keyword_list"].isin(top_keywords)]
fig2 = px.line(keyword_year_top, x=COL_ANNO, y="count", color="keyword_list", markers=True,
title="Trend delle keyword per anno",
labels={COL_ANNO: "Anno", "count": "Frequenza", "keyword_list": "Keyword"})
figures.append(fig2)
# 3. Produttività degli autori (15 autori più prolifici)
top15_autori = autori_explosi["lista_autori"].value_counts().head(15).reset_index()
top15_autori.columns = ["autore", "count"]
fig3 = px.bar(top15_autori, x="autore", y="count",
title="Produttività degli autori (15 autori più prolifici)",
labels={"autore": "Autore", "count": "Numero di articoli"})
fig3.update_layout(xaxis_tickangle=-45)
figures.append(fig3)
# 4. Numero complessivo di articoli per ciascun autore (tutti gli autori)
articoli_per_autore = autori_explosi["lista_autori"].value_counts().reset_index()
articoli_per_autore.columns = ["autore", "count"]
fig4 = px.bar(articoli_per_autore, x="autore", y="count",
title="Numero complessivo di articoli per ciascun autore",
labels={"autore": "Autore", "count": "Numero di articoli"})
fig4.update_layout(xaxis_tickangle=-45)
figures.append(fig4)
# 5. Autori che hanno pubblicato più di 5 articoli
autori_oltre5 = articoli_per_autore[articoli_per_autore["count"] > 5]
fig5 = px.bar(autori_oltre5, x="autore", y="count",
title="Autori che hanno pubblicato più di 5 articoli",
labels={"autore": "Autore", "count": "Numero di articoli"})
fig5.update_layout(xaxis_tickangle=-45)
figures.append(fig5)
# 6. Distribuzione per Lingua (grafico a torta)
distribuzione_lingua = df[COL_LINGUA].value_counts().reset_index()
distribuzione_lingua.columns = [COL_LINGUA, "count"]
fig6 = px.pie(distribuzione_lingua, names=COL_LINGUA, values="count",
title="Distribuzione per Lingua", hole=0.3)
figures.append(fig6)
# 7. Numero di articoli per ciascun anno
articoli_per_anno = df[COL_ANNO].value_counts().reset_index()
articoli_per_anno.columns = [COL_ANNO, "count"]
articoli_per_anno = articoli_per_anno.sort_values(COL_ANNO)
fig7 = px.bar(articoli_per_anno, x=COL_ANNO, y="count",
title="Numero di articoli per ciascun anno",
labels={COL_ANNO: "Anno", "count": "Numero di articoli"})
figures.append(fig7)
# 8. Frequenza dei luoghi citati (top 10)
df["luoghi_list"] = df[COL_LUOGHI].apply(lambda x: [l.strip() for l in str(x).split(",") if l.strip() != ""])
df_luoghi = df.explode("luoghi_list")
frequenza_luoghi = df_luoghi["luoghi_list"].value_counts().head(10).reset_index()
frequenza_luoghi.columns = ["luogo", "count"]
fig8 = px.bar(frequenza_luoghi, x="count", y="luogo", orientation="h",
title="Frequenza dei luoghi citati (top 10)",
labels={"luogo": "Luogo", "count": "Frequenza"})
figures.append(fig8)
# 9. Distribuzione del numero di parole per articolo (istogramma)
fig9 = px.histogram(df, x=COL_NUM_PAROLE, nbins=20,
title="Distribuzione del numero di parole per articolo",
labels={COL_NUM_PAROLE: "Numero di parole", "count": "Frequenza"})
figures.append(fig9)
return figures
# Creazione dell'interfaccia Gradio con nove output interattivi
demo = gr.Interface(
fn=genera_grafici,
inputs=[],
outputs=[
gr.Plot(label="Grafico 1: Lunghezza media di articoli per anno"),
gr.Plot(label="Grafico 2: Trend delle keyword per anno"),
gr.Plot(label="Grafico 3: Produttività degli autori (15 autori più prolifici)"),
gr.Plot(label="Grafico 4: Numero complessivo di articoli per ciascun autore"),
gr.Plot(label="Grafico 5: Autori che hanno pubblicato più di 5 articoli"),
gr.Plot(label="Grafico 6: Distribuzione per Lingua"),
gr.Plot(label="Grafico 7: Numero di articoli per ciascun anno"),
gr.Plot(label="Grafico 8: Frequenza dei luoghi citati (top 10)"),
gr.Plot(label="Grafico 9: Distribuzione del numero di parole per articolo")
],
title="Visualizzazione Grafici Interattivi del Dataset",
description=("Questo spazio visualizza una serie di grafici interattivi derivati dal dataset. "
"I grafici mostrano, tra gli altri, la lunghezza media degli articoli per anno, il trend delle keyword, "
"la produttività degli autori e la distribuzione per lingua.")
)
if __name__ == "__main__":
demo.launch()
|