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

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +133 -0
app.py ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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()