def getARI(dataset, candidates, labels, options): # Leer archivo JSON de candidatos para parsear candidatos del dataset # Luego, obtener partidos y candidatos parseados # - parsedParties: Lista de tuplas (idPartido, nombrePartido, candidatosPartido) # - parsedCandidates: Lista de partidos que preserva el orden de candidatos en el dataset original partyJSON = reader.readParties(options['candidate_division'], options) parsedParties, parsedCandidates = parser.parseCandidates( candidates.values, partyJSON) unique, counts = np.unique(labels, return_counts=True) labelsCount = dict(zip(unique, counts)) unique, counts = np.unique(parsedCandidates, return_counts=True) labelsTrueCount = dict(zip(unique, counts)) labels_true = [] labels = [] for party in labelsTrueCount: labels_true = np.append(labels_true, (np.ones(labelsTrueCount[party]) * party)) for party in labelsCount: labels = np.append(labels, (np.ones(labelsCount[party]) * party)) return adjusted_rand_score(labels_true, labels)
def readDatasetPartiesMenosMil(filename, options = {'from_notebook': False}): dataset = pd.read_csv(filename) candidates = dataset.iloc[:, 1] answers = dataset.iloc[:, 2:28] general_parties = readParties(options) parties = parseCandidates(candidates, general_parties) answers['parties'] = parties filtered = answers[answers.parties.isin(parties.value_counts()[parties.value_counts() < 1000].index.values)] answers = filtered.iloc[:, :26] parties = filtered.iloc[:, 26] return answers.apply(pd.to_numeric, downcast='unsigned'), parties.apply(pd.to_numeric, downcast='unsigned')
def plotAllPartyPCA(dataset, candidates, options): # Leer archivo JSON de candidatos para parsear candidatos del dataset # Luego, obtener partidos y candidatos parseados # - parsedParties: Lista de tuplas (idPartido, nombrePartido, candidatosPartido) # - parsedCandidates: Lista de partidos que preserva el orden de candidatos en el dataset original partyJSON = reader.readParties(options['candidate_division'], options) parsedParties, parsedCandidates = parser.parseCandidates( candidates.values, partyJSON) # Agregar partidos al dataset results = np.column_stack((dataset, parsedCandidates.transpose())) # Procesar y generar estructura para guardar los resultados por partido junto a su nombre aux = [] for party, partyName, partyCandidates in parsedParties: # Generar subconjunto de dataset para un partido partyResults = results[results[:, 2] == party] partyResults = partyResults[:, [0, 1]] # Generar etiqueta con nombre de partido y porcentaje de votos prob = (len(partyResults) / (len(results))) * 100 partyName += ' (' + str(round(prob, 2)) + '%)' aux.append((prob, partyName, partyResults)) # Ordenar datos por porcentaje de votos y separar en dos listas aux = sorted(aux, key=itemgetter(0), reverse=True) data = [] labels = [] for prob, partyName, partyResults in aux: data.append(partyResults) labels.append(partyName) # Generar metadatos de la gráfica meta = { 'title': 'Corpus en 2 dimensiones (PCA) - División por partido político', 'size': 8, 'colors': COLORS } # Generar gráfica general de puntos plotScatter(data, labels, meta)
def plotPartiesKMeans(dataset, candidates, centroids, classes, options): # Leer archivo JSON de candidatos para parsear candidatos del dataset # Luego, obtener partidos y candidatos parseados # - parsedParties: Lista de tuplas (idPartido, nombrePartido, candidatosPartido) # - parsedCandidates: Lista de partidos que preserva el orden de candidatos en el dataset original partyJSON = reader.readParties(options['candidate_division'], options) parsedParties, parsedCandidates = parser.parseCandidates(candidates.values, partyJSON) # Ordenamiento de parsedParties según la proporción de votos de cada una. parties = [] unique, counts = np.unique(parsedCandidates, return_counts=True) partiesCount = dict(zip(unique, counts)) for party, partyName, partyCandidates in parsedParties: parties.append((party, partyName, partyCandidates, partiesCount[party])) parties = sorted(parties, key=itemgetter(3), reverse=True) # Inicialización estructuras classified = {} for party, partyName, partyCandidates, partyCount in parties: classified[party] = {} for classification in classes: classified[party][classification] = 0 # Re-clasificación del dataset acorde a los centroides y recolección de proporción de cada party en cada cluster. for index, row in dataset.iterrows(): party = parser.getParty(parties, candidates[index], options['candidate_division']) classified[party][classify(row.values, centroids)] += 1 # Generar metadatos de la gráfica meta = { 'title': 'K-Means - División por partido político', 'colors': COLORS, 'lengthDataset': len(dataset), 'lengthClasses': len(classes), 'classes': list(classes.keys()) } plotStackedBars((parties, classified), meta)
def plotEachPartyPCA(dataset, candidates, options): # Leer archivo JSON de candidatos para parsear candidatos del dataset # Luego, obtener partidos y candidatos parseados # - parsedParties: Lista de tuplas (idPartido, nombrePartido, candidatosPartido) # - parsedCandidates: Lista de partidos que preserva el orden de candidatos en el dataset original partyJSON = reader.readParties(CandidateDivision.PARTIES, options) parsedParties, parsedCandidates = parser.parseCandidates( candidates.values, partyJSON) # Agregar partidos al dataset results = np.column_stack((dataset, parsedCandidates.transpose())) # Procesar y generar estructura para guardar los resultados por partido junto a su nombre aux = [] for party, partyName, partyCandidates in parsedParties: # Generar subconjunto de dataset para un partido partyResults = results[results[:, 2] == party] partyResults = partyResults[:, [0, 1]] # Generar etiqueta con nombre de partido y porcentaje de votos prob = (len(partyResults) / (len(results))) * 100 partyName += ' (' + str(round(prob, 2)) + '%)' aux.append((prob, partyName, partyResults)) # Ordenar datos por porcentaje de votos y separar en dos listas aux = sorted(aux, key=itemgetter(0), reverse=True) data = [] labels = [] probs = [] for prob, partyName, partyResults in aux: data.append(partyResults) labels.append(partyName) probs.append(prob) # Generar metadatos de la gráfica meta = { 'title': 'Corpus en 2 dimensiones (PCA) - División para cada partido político', 'size': 4, 'colors': [COLORS[0], COLORS[1]] } # Graficar para cada partido for i in range(0, len(data)): # Agrupar todos los partidos menos el i-ésimo otherParties = list(data) otherParties.pop(i) otherParties = np.concatenate(otherParties, axis=0) # Generar estructuras auxiliares auxData = [data[i], otherParties] auxLabels = [ labels[i], 'Otros (' + str(round(100 - probs[i], 2)) + '%)' ] # Generar gráfica general de puntos plotScatter(auxData, auxLabels, meta)