phalanx80 commited on
Commit
dad07c8
·
verified ·
1 Parent(s): dbab432

Update app.py

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