Exemple #1
0
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)