[Python] libreria Pandas e clustering
Ciao a tutti!!!
Sto tentando la distribuzione (a scatter) dei AVG. Clustering Coeff (asse y) in funzione dei Neighbors (asse x).
Ho dei problemi con i dati Clustering ottenuti da nx.clustering(G) : Ho usato pd.Series().unique() per raggrupparli ma risultano numericamente superiori ai Neigh nell'asse delle x.
Ho 65 valori in asse x e 73 in asse y.
Ho provato a studiare la distribuzione su cytoscape e alcuni valore di C (Clust Coeff) non ci sono proprio.
Ragazzi mi potete aiutare a capire come poter procedere ed eliminare quei dati in più?
Tutti gli altri dati corrispondono alla perfezione ma a causa di questi dati in più vengono tutti un po' spaiati e perdono l'abbinamento, ma i dati da quel che ho visto nella Distribuzione in Cytoscape sembrano essere giusti.
Ho provato ad usare round() ed effettuato delle prove con pd.truncate() ma non mi risolve il problema.
Devo effettuare io manualmente l'abbinamento delle x e y individuando i dati in eccesso o c'è un modo più semplice? anche perchè vorrei che il mio elaborato possa essere valido per qualsiasi file di network caricato in input e non limitarlo a questo.
Ringrazio chiunque possa risolvermi questo enigma. E' una settimana che ci lavoro!!!
Ho usato :
AvgNC = nx.average_degree_connectivity(G2) per ricavare i Neighbors
C = nx.clustering(G2) per i Coeff Clustering
Sto tentando la distribuzione (a scatter) dei AVG. Clustering Coeff (asse y) in funzione dei Neighbors (asse x).
Ho dei problemi con i dati Clustering ottenuti da nx.clustering(G) : Ho usato pd.Series().unique() per raggrupparli ma risultano numericamente superiori ai Neigh nell'asse delle x.
Ho 65 valori in asse x e 73 in asse y.
Ho provato a studiare la distribuzione su cytoscape e alcuni valore di C (Clust Coeff) non ci sono proprio.
Ragazzi mi potete aiutare a capire come poter procedere ed eliminare quei dati in più?
Tutti gli altri dati corrispondono alla perfezione ma a causa di questi dati in più vengono tutti un po' spaiati e perdono l'abbinamento, ma i dati da quel che ho visto nella Distribuzione in Cytoscape sembrano essere giusti.
Ho provato ad usare round() ed effettuato delle prove con pd.truncate() ma non mi risolve il problema.
Devo effettuare io manualmente l'abbinamento delle x e y individuando i dati in eccesso o c'è un modo più semplice? anche perchè vorrei che il mio elaborato possa essere valido per qualsiasi file di network caricato in input e non limitarlo a questo.
Ringrazio chiunque possa risolvermi questo enigma. E' una settimana che ci lavoro!!!

Ho usato :
AvgNC = nx.average_degree_connectivity(G2) per ricavare i Neighbors
C = nx.clustering(G2) per i Coeff Clustering
Risposte
def DistrCLUSTER(self): xc = [] #Num Neighbors yc = [] AvgNC = nx.average_degree_connectivity(G2) a = list(AvgNC) C = nx.clustering(G2) ax = pd.Series(C) l = ax.unique() l1 = ax.nunique() for i in range(1, l1): ayy = l[i] axx = a[i] ay = round(ayy, 3) print(i, axx, ay) yc.append(ay) xc.append(axx) ..... self.scatter(xc, yc, alpha=0.6) .....
Questi sono i valori ottenuti dopo il raggruppamento con Pandas e l'arrotondamento a 3 cifre :
[table=]
1 357 0.091 ok
2 76 0.549 ok
3 186 0.301 ok
4 78 0.549 ok
5 162 0.277 ok
6 56 0.842 0.806
7 85 0.677 ok
8 64 0.658 0.667
9 61 0.852 ok
10 7 1.0 0.96
11 68 0.67 ok
12 81 0.74 ok
13 128 0.434 ok
14 114 0.475 ok
15 134 0.41 ok
16 63 0.841 ok
eliminati 0.825 e 0.851
17 62 0.825 0.799
18 58 0.851 0.818
eliminare 0.785
19 77 0.785 0.537
20 9 0.537 0.997
aggiunto 0.997
eliminare 0.286
21 2 0.286 1.0
22 5 0.4 ok
23 4 0.958 0.926
24 40 0.368 0.958
25 135 0.612 0.368
26 75 0.485 0.612
27 95 0.66 0.485
28 73 0.992 0.66
29 54 0.993 0.992
30 53 0.741 0.993
31 44 0.556 0.741
32 86 0.985 0.556
33 35 0.652 0.985
34 72 0.999 0.652
35 50 0.894 0.93
36 59 0.622 0.894
37 69 0.772 0.622
eliminare 0.772
38 55 0.96 ok
39 14 0.901 ok
40 18 0.588 ok
41 21 0.557 ok
eliminare 0.799 e 0.801
42 47 0.799 0.927
43 37 0.801 0.988
44 38 0.927 0.98
45 60 0.988 0.868
46 92 0.98 0.487
47 108 0.868 0.467
48 107 0.487 0.448
49 39 0.467 0.957
50 80 0.448 0.555
51 67 0.957 0.695
eliminare 0.747
52 71 0.555 0.644
53 101 0.842 0.473
54 36 0.695 0.986
55 52 0.747 0.772
56 43 0.644 0.793
57 33 0.473 0.943
58 45 0.986 0.754
59 8 0.772 1.0
aggiunto 0.793
eliminare 0.857
60 25 0.857 0.99
61 3 0.943 0.963
62 29 0.754 0.978
aggiunto 1.0
63 30 0.944 0.977
64 57 0.973 0.847
eliminare 0.73
Ho risolto!!!! Finalmente tutto torna.
Ho provato ad usare una funzione diversa, con valori per ciascun nodo ed ho notato che uno stesso valore di grado corrisponde a più valori di clustering per cui, in sostanza, quei valori non presenti nell'elenco di nx.clustering(G) non sono altro che i valori medi.
Ho considerato G2.degree() quindi i miei Neighbors non sono altro che il grado del mio Grafo semplice (G2).
Il mio Grafo originario è un MultiGrafo, (G), che ho reso poi Semplice per lo studio e analisi.
Quindi :
i Gradi del grafo li prendo come G.degree(),
mentre i Neighbors li prendo con G2.degree()
per uno stesso numero di nodi totale.
La funzione nx.average_degree_connectivity(G2) mi resituisce gli stessi valori di G2.degree() ma raggruppati, il chè non mi permetteva di capire.
Spero che questa spiegazione possa aiutare qualcuno.
Ho provato ad usare una funzione diversa, con valori per ciascun nodo ed ho notato che uno stesso valore di grado corrisponde a più valori di clustering per cui, in sostanza, quei valori non presenti nell'elenco di nx.clustering(G) non sono altro che i valori medi.
Ho considerato G2.degree() quindi i miei Neighbors non sono altro che il grado del mio Grafo semplice (G2).
Il mio Grafo originario è un MultiGrafo, (G), che ho reso poi Semplice per lo studio e analisi.
Quindi :
i Gradi del grafo li prendo come G.degree(),
mentre i Neighbors li prendo con G2.degree()
per uno stesso numero di nodi totale.
La funzione nx.average_degree_connectivity(G2) mi resituisce gli stessi valori di G2.degree() ma raggruppati, il chè non mi permetteva di capire.
Spero che questa spiegazione possa aiutare qualcuno.
Inizio con l'augurare a tutti Buon 2020!!!
Ragazzi pensavo di aver risolto ma ultimamente non riesco a uscire dal tunnel.
Sto provando a rintracciare i valori che si ripetono ma nulla da fare.
Ho pensato di mettere (dato, valore) in una lista per poi renderli univoci. Contare i dati che si ripetono e di solo questi prenderne il valore, metterli in lista e calcolarne la media, ma non ne sto uscendo fuori.
Correggetemi se sbaglio ma è possibile che Pandas funzioni su liste e non su dizionari? E' corretto?
Non riesco ad accodare gli elementi in un ciclo FOR in un dizionario:
se si potesse fare tutto in maniera più snella con i dizionari ne sarei felice.
Qualcuno mi potrebbe aiutare? Cosa sbaglio??? Grazie 1000!!!
Ho provato a creare un dizionario in questo modo:
ma non stampa nulla...
Ho poi provato in questo modo:
ma stampa dizionari di dizionari e non so come uscirne. GrAZIE
Ragazzi pensavo di aver risolto ma ultimamente non riesco a uscire dal tunnel.
Sto provando a rintracciare i valori che si ripetono ma nulla da fare.
Ho pensato di mettere (dato, valore) in una lista per poi renderli univoci. Contare i dati che si ripetono e di solo questi prenderne il valore, metterli in lista e calcolarne la media, ma non ne sto uscendo fuori.
Correggetemi se sbaglio ma è possibile che Pandas funzioni su liste e non su dizionari? E' corretto?
Non riesco ad accodare gli elementi in un ciclo FOR in un dizionario:
def DistrCLUSTER(self): from numpy import mean XX = [] DD = list(nx.clustering(G2, G2.nodes()).items()) DDD = list(G2.degree()) for i in range(0, nx.number_of_nodes(G2)): if (DDD[i][1] == 1): continue else: x = (DDD[i][1], DD[i][1]) XX.append(x) # elimino i doppioni X_ = pd.Series(XX) XX_ = list(X_.unique()) tt = [] qq = [] for j in range(0, len(XX_)): ss = XX_[j][0] pp = XX_[j][1] # conto quante volte il dato della colonna 0 si ripete tt.append(ss) n = tt.count(ss) # ho provato a creare un dizionario per poter poi risalire con facilità ai valori colonna 1 di quei dati della colonna 0 che si ripetono dicctt = dict() dicctt[ss].append(pp) #accodo i dati con più valori if (n == 1): continue else: temp = ss qq.append(temp) # rendo univoci i dati Y_ = pd.Series(qq) YY_ = list(Y_.unique()) # A QUESTO PUNTO VORREI RICERCARE I DATI YY_ NELLA LISTA XX_ O NEL DIZIONARIO E PRENDERE I VALORI PER CIASCUN DATO PER POI CALCOLARNE LA MEDIA CON LA FUNZIONE mean() print(dicctt) #non mi stampa nulla
se si potesse fare tutto in maniera più snella con i dizionari ne sarei felice.
Qualcuno mi potrebbe aiutare? Cosa sbaglio??? Grazie 1000!!!
Ho provato a creare un dizionario in questo modo:
dicctt = {} dicctt[ss].append(pp) # vedere codice in alto
ma non stampa nulla...
Ho poi provato in questo modo:
dicctt = {} dicctt[ss] = pp
ma stampa dizionari di dizionari e non so come uscirne. GrAZIE
Ho trovato il primo errore:
questa istruzione la devo mettere fuori dal ciclo FOR. Inoltre ho pensato di crearmi un dizzionario di questo tipo in modo che automaticam mi viene creata la lista dei diversi valori per ciascuna key.
Ora provo a calcolarmi la media delle liste.
Cmq se poteste consigliarmi una strada più semplice e veloce ne sarei grata. Sto studiando python da pochi mesi e non sono proprio un asso in programmazione
Resto in attesa... Grazie!!!
dicctt = {}
questa istruzione la devo mettere fuori dal ciclo FOR. Inoltre ho pensato di crearmi un dizzionario di questo tipo in modo che automaticam mi viene creata la lista dei diversi valori per ciascuna key.
dicctt = defaultdict(list)
Ora provo a calcolarmi la media delle liste.
Cmq se poteste consigliarmi una strada più semplice e veloce ne sarei grata. Sto studiando python da pochi mesi e non sono proprio un asso in programmazione

Resto in attesa... Grazie!!!