Pagina 1 di 1

[Python] libreria Pandas e clustering

MessaggioInviato: 16/12/2019, 11:51
da mic_1
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

Re: [Python] libreria Pandas e clustering

MessaggioInviato: 18/12/2019, 13:07
da mic_1
Codice:
    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

[/table]

Re: [Python] libreria Pandas e clustering

MessaggioInviato: 20/12/2019, 13:19
da mic_1
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.

Re: [Python] libreria Pandas e clustering

MessaggioInviato: 02/01/2020, 13:44
da mic_1
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:

Codice:
    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:
Codice:
dicctt = {}
dicctt[ss].append(pp)  # vedere codice in alto


ma non stampa nulla...
Ho poi provato in questo modo:
Codice:
dicctt = {}
dicctt[ss] = pp


ma stampa dizionari di dizionari e non so come uscirne. GrAZIE

Re: [Python] libreria Pandas e clustering

MessaggioInviato: 02/01/2020, 15:07
da mic_1
Ho trovato il primo errore:
Codice:
 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.
Codice:
  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 :D

Resto in attesa... Grazie!!!