phalanx80 commited on
Commit
c65b27b
·
verified ·
1 Parent(s): 58043e3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +180 -130
app.py CHANGED
@@ -1,133 +1,183 @@
1
- import gradio as gr
2
  import pandas as pd
3
- import numpy as np
4
- import plotly.express as px
5
- from itertools import combinations
6
- from collections import Counter
7
-
8
- # Caricamento del dataset
9
- file_path = 'sa-dataset.csv' # Assumiamo che il dataset sia nella stessa cartella
10
- df = pd.read_csv(file_path)
11
- df['anno_pubblicazione'] = pd.to_numeric(df['anno_pubblicazione'], errors='coerce')
12
- df['num_parole'] = pd.to_numeric(df['num_parole'], errors='coerce')
13
-
14
- # Funzione per calcolare la co-occorrenza delle parole chiave
15
- def calcola_cooccorrenza_keywords(top_n=30):
16
- keywords_list = df['keyword'].dropna().str.split(', ')
17
- all_keywords = [kw for sublist in keywords_list for kw in sublist]
18
- common_keywords = Counter(all_keywords).most_common(top_n)
19
- common_keywords = [kw[0] for kw in common_keywords]
20
-
21
- cooccurrence = Counter()
22
- for keywords in keywords_list:
23
- filtered_keywords = [kw for kw in keywords if kw in common_keywords]
24
- cooccurrence.update(combinations(sorted(filtered_keywords), 2))
25
-
26
- co_matrix = pd.DataFrame(np.zeros((len(common_keywords), len(common_keywords))),
27
- index=common_keywords, columns=common_keywords)
28
- for (kw1, kw2), count in cooccurrence.items():
29
- co_matrix.loc[kw1, kw2] = count
30
- co_matrix.loc[kw2, kw1] = count
31
-
32
- return px.imshow(co_matrix, x=co_matrix.columns, y=co_matrix.index,
33
- color_continuous_scale='Blues', labels=dict(color="Co-occorrenza"),
34
- title="Mappa di Co-occorrenza delle Parole Chiave")
35
-
36
- # Funzione per calcolare il trend delle keyword
37
- def calcola_trend_keyword(top_n=10):
38
- trend_df = df[['anno_pubblicazione', 'keyword']].dropna()
39
- trend_df['keyword'] = trend_df['keyword'].str.split(', ')
40
- trend_df = trend_df.explode('keyword')
41
- keyword_counts = trend_df['keyword'].value_counts().head(top_n).index
42
- trend_df = trend_df[trend_df['keyword'].isin(keyword_counts)]
43
- trend_df = trend_df.groupby(['anno_pubblicazione', 'keyword']).size().reset_index(name='count')
44
-
45
- return px.line(trend_df, x='anno_pubblicazione', y='count', color='keyword',
46
- title='Trend Temporale delle Keyword',
47
- labels={'anno_pubblicazione': 'Anno', 'count': 'Frequenza'})
48
-
49
- # Funzione per calcolare la produttività degli autori
50
- def produttivita_autori_mod(top_n=15, min_articoli=5):
51
- autori_df = df[['anno_pubblicazione', 'primo_autore']].dropna()
52
- total_counts = autori_df['primo_autore'].value_counts()
53
- autori_eligible = total_counts[total_counts > min_articoli]
54
- top_authors = autori_eligible.head(top_n).index
55
- filtered_df = autori_df[autori_df['primo_autore'].isin(top_authors)]
56
- produttivita = filtered_df.groupby(['anno_pubblicazione', 'primo_autore']).size().reset_index(name='conteggio')
57
-
58
- return px.line(produttivita, x='anno_pubblicazione', y='conteggio', color='primo_autore',
59
- title="Produttività degli Autori (Top 15 con >5 articoli)",
60
- labels={'anno_pubblicazione': 'Anno', 'conteggio': 'Numero di Articoli'})
61
-
62
- # Funzione per calcolare la frequenza dei luoghi citati
63
- def frequenza_luoghi(top_n=10):
64
- luoghi_df = df[['anno_pubblicazione', 'luoghi_citati']].dropna()
65
- luoghi_df['luoghi_citati'] = luoghi_df['luoghi_citati'].str.split(', ')
66
- luoghi_df = luoghi_df.explode('luoghi_citati')
67
- luoghi_counts = luoghi_df['luoghi_citati'].value_counts().head(top_n).index
68
- luoghi_df = luoghi_df[luoghi_df['luoghi_citati'].isin(luoghi_counts)]
69
- luoghi_df = luoghi_df.groupby(['anno_pubblicazione', 'luoghi_citati']).size().reset_index(name='conteggio')
70
-
71
- return px.line(luoghi_df, x='anno_pubblicazione', y='conteggio', color='luoghi_citati',
72
- title="Frequenza dei Luoghi nel Tempo",
73
- labels={'anno_pubblicazione': 'Anno', 'conteggio': 'Frequenza'})
74
-
75
- # Funzioni per grafici aggiuntivi
76
- def numero_parole_per_articolo():
77
- return px.histogram(df, x='num_parole', title='Distribuzione del Numero di Parole per Articolo',
78
- nbins=50, labels={'num_parole': 'Numero di Parole', 'count': 'Numero di Articoli'},
79
- template='plotly')
80
-
81
- def distribuzione_per_anno():
82
- return px.histogram(df, x='anno_pubblicazione', title='Distribuzione degli Articoli per Anno di Pubblicazione',
83
- nbins=50, labels={'anno_pubblicazione': 'Anno di Pubblicazione', 'count': 'Numero di Articoli'},
84
- template='plotly')
85
-
86
- def distribuzione_per_lingua():
87
- return px.pie(df, names='lingua', title='Distribuzione degli Articoli per Lingua', template='plotly')
88
-
89
- # **NUOVI GRAFICI AGGIUNTI**
90
- def distribuzione_articoli_per_autore():
91
- return px.histogram(df, x='primo_autore', title='Distribuzione del Numero di Articoli per Autore',
92
- nbins=50, labels={'primo_autore': 'Autore', 'count': 'Numero di Articoli'},
93
- template='plotly')
94
-
95
- def evoluzione_articoli_per_anno():
96
- conteggio_annuale = df['anno_pubblicazione'].value_counts().reset_index()
97
- conteggio_annuale.columns = ['anno_pubblicazione', 'conteggio']
98
- return px.line(conteggio_annuale, x='anno_pubblicazione', y='conteggio',
99
- title='Evoluzione Temporale del Numero di Articoli Pubblicati',
100
- labels={'anno_pubblicazione': 'Anno', 'conteggio': 'Numero di Articoli'})
101
-
102
- def lunghezza_media_articoli_per_anno():
103
- lunghezza_media = df.groupby('anno_pubblicazione')['num_parole'].mean().reset_index()
104
- return px.line(lunghezza_media, x='anno_pubblicazione', y='num_parole',
105
- title='Lunghezza Media degli Articoli per Anno',
106
- labels={'anno_pubblicazione': 'Anno', 'num_parole': 'Lunghezza Media (Parole)'})
107
-
108
- # **Creazione interfaccia Gradio**
109
- with gr.Blocks() as app:
110
- gr.Markdown("## Dashboard per l'Analisi degli Articoli di Storia dell'Arte")
111
-
112
- with gr.Row():
113
- cooccorrenza = gr.Plot(label="Co-occorrenza delle Parole Chiave")
114
- trend = gr.Plot(label="Trend Temporale delle Keyword")
115
-
116
- with gr.Row():
117
- produttivita = gr.Plot(label="Produttività degli Autori")
118
- distribuzione_autori = gr.Plot(label="Distribuzione del Numero di Articoli per Autore")
119
-
120
- with gr.Row():
121
- evoluzione_articoli = gr.Plot(label="Evoluzione del Numero di Articoli Pubblicati")
122
- lunghezza_media = gr.Plot(label="Lunghezza Media degli Articoli per Anno")
123
-
124
- btn = gr.Button("Genera Grafici")
125
- btn.click(lambda: (calcola_cooccorrenza_keywords(), calcola_trend_keyword(), produttivita_autori_mod(),
126
- frequenza_luoghi(), numero_parole_per_articolo(), distribuzione_per_anno(),
127
- distribuzione_per_lingua(), distribuzione_articoli_per_autore(),
128
- evoluzione_articoli_per_anno(), lunghezza_media_articoli_per_anno()),
129
- inputs=[], outputs=[cooccorrenza, trend, produttivita, distribuzione_autori,
130
- evoluzione_articoli, lunghezza_media])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
131
 
132
  if __name__ == "__main__":
133
- app.launch()
 
 
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)
24
+
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
 
182
  if __name__ == "__main__":
183
+ demo.launch()