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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +80 -140
app.py CHANGED
@@ -1,23 +1,12 @@
1
  import pandas as pd
2
- import matplotlib.pyplot as plt
3
  import gradio as gr
4
- from io import BytesIO
5
-
6
- def load_dataset():
7
- """
8
- Carica il dataset dal file CSV.
9
- """
10
- df = pd.read_csv("sa-dataset.csv")
11
- return df
12
 
13
  def genera_grafici():
14
- """
15
- Elabora il dataset e genera una serie di grafici secondo le specifiche richieste.
16
- Viene restituita una lista di immagini in formato bytes.
17
- """
18
- df = load_dataset()
19
-
20
- # Verifica e conversione dei dati in formato stringa per le colonne testuali
21
  df["articolo"] = df["articolo"].astype(str)
22
  df["keyword"] = df["keyword"].astype(str)
23
  df["luoghi"] = df["luoghi"].astype(str)
@@ -25,157 +14,108 @@ def genera_grafici():
25
  # Calcolo del numero di parole per articolo
26
  df["parole"] = df["articolo"].apply(lambda x: len(x.split()))
27
 
28
- immagini = [] # Lista per salvare le immagini dei grafici
29
 
30
  # 1. Lunghezza media di articoli per anno
31
- df_media = df.groupby("anno")["parole"].mean().sort_index()
32
- plt.figure()
33
- df_media.plot(kind="bar")
34
- plt.title("Lunghezza media di articoli per anno")
35
- plt.xlabel("Anno")
36
- plt.ylabel("Numero medio di parole")
37
- buf = BytesIO()
38
- plt.tight_layout()
39
- plt.savefig(buf, format='png')
40
- buf.seek(0)
41
- immagini.append(buf.getvalue())
42
- plt.close()
43
 
44
  # 2. Trend delle keyword per anno
45
- # Suddivide la colonna 'keyword' in una lista di parole chiave
46
  df["keyword_list"] = df["keyword"].apply(lambda x: [k.strip() for k in x.split(",") if k.strip() != ""])
47
  df_keywords = df.explode("keyword_list")
48
- # Calcola la frequenza delle keyword per anno
49
  keyword_year = df_keywords.groupby(["anno", "keyword_list"]).size().reset_index(name="count")
50
- # Seleziona le 5 keyword più frequenti complessivamente
51
  top_keywords = df_keywords["keyword_list"].value_counts().head(5).index.tolist()
52
  keyword_year_top = keyword_year[keyword_year["keyword_list"].isin(top_keywords)]
53
- pivot = keyword_year_top.pivot(index="anno", columns="keyword_list", values="count").fillna(0).sort_index()
54
- plt.figure()
55
- for kw in pivot.columns:
56
- plt.plot(pivot.index, pivot[kw], marker="o", label=kw)
57
- plt.title("Trend delle keyword per anno")
58
- plt.xlabel("Anno")
59
- plt.ylabel("Frequenza")
60
- plt.legend(title="Keyword")
61
- plt.tight_layout()
62
- buf = BytesIO()
63
- plt.savefig(buf, format='png')
64
- buf.seek(0)
65
- immagini.append(buf.getvalue())
66
- plt.close()
67
 
68
  # 3. Produttività degli autori (15 autori più prolifici)
69
- top15_autori = df["autore"].value_counts().head(15)
70
- plt.figure()
71
- top15_autori.plot(kind="bar")
72
- plt.title("Produttività degli autori (15 autori più prolifici)")
73
- plt.xlabel("Autore")
74
- plt.ylabel("Numero di articoli")
75
- plt.xticks(rotation=45, ha="right")
76
- plt.tight_layout()
77
- buf = BytesIO()
78
- plt.savefig(buf, format='png')
79
- buf.seek(0)
80
- immagini.append(buf.getvalue())
81
- plt.close()
82
 
83
  # 4. Numero complessivo di articoli per ciascun autore
84
- articoli_per_autore = df["autore"].value_counts().sort_index()
85
- plt.figure()
86
- articoli_per_autore.plot(kind="bar")
87
- plt.title("Numero complessivo di articoli per ciascun autore")
88
- plt.xlabel("Autore")
89
- plt.ylabel("Numero di articoli")
90
- plt.xticks(rotation=90)
91
- plt.tight_layout()
92
- buf = BytesIO()
93
- plt.savefig(buf, format='png')
94
- buf.seek(0)
95
- immagini.append(buf.getvalue())
96
- plt.close()
97
 
98
  # 5. Autori che hanno pubblicato più di 5 articoli
99
- autori_oltre5 = df["autore"].value_counts()[df["autore"].value_counts() > 5]
100
- plt.figure()
101
- autori_oltre5.plot(kind="bar")
102
- plt.title("Autori che hanno pubblicato più di 5 articoli")
103
- plt.xlabel("Autore")
104
- plt.ylabel("Numero di articoli")
105
- plt.xticks(rotation=45, ha="right")
106
- plt.tight_layout()
107
- buf = BytesIO()
108
- plt.savefig(buf, format='png')
109
- buf.seek(0)
110
- immagini.append(buf.getvalue())
111
- plt.close()
112
 
113
- # 6. Distribuzione per Lingua
114
- distribuzione_lingua = df["lingua"].value_counts()
115
- plt.figure()
116
- distribuzione_lingua.plot(kind="pie", autopct='%1.1f%%', startangle=90)
117
- plt.title("Distribuzione per Lingua")
118
- plt.ylabel("")
119
- plt.tight_layout()
120
- buf = BytesIO()
121
- plt.savefig(buf, format='png')
122
- buf.seek(0)
123
- immagini.append(buf.getvalue())
124
- plt.close()
125
 
126
  # 7. Numero di articoli per ciascun anno
127
- articoli_per_anno = df["anno"].value_counts().sort_index()
128
- plt.figure()
129
- articoli_per_anno.plot(kind="bar")
130
- plt.title("Numero di articoli per ciascun anno")
131
- plt.xlabel("Anno")
132
- plt.ylabel("Numero di articoli")
133
- plt.tight_layout()
134
- buf = BytesIO()
135
- plt.savefig(buf, format='png')
136
- buf.seek(0)
137
- immagini.append(buf.getvalue())
138
- plt.close()
139
 
140
- # 8. Frequenza dei luoghi citati
141
  df["luoghi_list"] = df["luoghi"].apply(lambda x: [l.strip() for l in x.split(",") if l.strip() != ""])
142
  df_luoghi = df.explode("luoghi_list")
143
- frequenza_luoghi = df_luoghi["luoghi_list"].value_counts().head(10)
144
- plt.figure()
145
- frequenza_luoghi.plot(kind="barh")
146
- plt.title("Frequenza dei luoghi citati (top 10)")
147
- plt.xlabel("Frequenza")
148
- plt.ylabel("Luogo")
149
- plt.tight_layout()
150
- buf = BytesIO()
151
- plt.savefig(buf, format='png')
152
- buf.seek(0)
153
- immagini.append(buf.getvalue())
154
- plt.close()
155
 
156
- # 9. Numero di Parole per Articolo (distribuzione)
157
- plt.figure()
158
- df["parole"].hist(bins=20)
159
- plt.title("Distribuzione del numero di parole per articolo")
160
- plt.xlabel("Numero di parole")
161
- plt.ylabel("Frequenza")
162
- plt.tight_layout()
163
- buf = BytesIO()
164
- plt.savefig(buf, format='png')
165
- buf.seek(0)
166
- immagini.append(buf.getvalue())
167
- plt.close()
168
 
169
- return immagini
170
 
171
- # Creazione dell'interfaccia Gradio
172
  demo = gr.Interface(
173
  fn=genera_grafici,
174
  inputs=[],
175
- outputs=gr.outputs.Gallery(label="Grafici dell'analisi del dataset"),
176
- title="Visualizzazione Grafici del Dataset",
177
- description=("Questo spazio visualizza una serie di grafici derivati dal dataset. "
178
- "Vengono mostrati, tra gli altri, la lunghezza media degli articoli per anno, il trend delle keyword, "
 
 
 
 
 
 
 
 
 
 
179
  "la produttività degli autori e la distribuzione per lingua.")
180
  )
181
 
 
1
  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)
 
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)",
45
+ labels={"autore": "Autore", "count": "Numero di articoli"})
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",
54
+ labels={"autore": "Autore", "count": "Numero di articoli"})
55
+ fig4.update_layout(xaxis_tickangle=-45)
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"})
64
+ fig5.update_layout(xaxis_tickangle=-45)
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"]
88
+ fig8 = px.bar(frequenza_luoghi, x="count", y="luogo", orientation="h",
89
+ title="Frequenza dei luoghi citati (top 10)",
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
100
 
101
+ # Creazione dell'interfaccia Gradio con nove output interattivi
102
  demo = gr.Interface(
103
  fn=genera_grafici,
104
  inputs=[],
105
+ outputs=[
106
+ gr.Plot(label="Grafico 1: Lunghezza media di articoli per anno"),
107
+ gr.Plot(label="Grafico 2: Trend delle keyword per anno"),
108
+ gr.Plot(label="Grafico 3: Produttività degli autori (15 autori più prolifici)"),
109
+ gr.Plot(label="Grafico 4: Numero complessivo di articoli per ciascun autore"),
110
+ gr.Plot(label="Grafico 5: Autori che hanno pubblicato più di 5 articoli"),
111
+ gr.Plot(label="Grafico 6: Distribuzione per Lingua"),
112
+ gr.Plot(label="Grafico 7: Numero di articoli per ciascun anno"),
113
+ gr.Plot(label="Grafico 8: Frequenza dei luoghi citati (top 10)"),
114
+ gr.Plot(label="Grafico 9: Distribuzione del numero di parole per articolo")
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