[PYTHON] C'est pourquoi je calcule le nombre de sièges pour le représentant proportionnel à l'élection de la Chambre des représentants

Un an après la levée de l'interdiction des élections en ligne, il y avait un grand nombre de nostradams sur le net que le Japon prendrait fin si un parti l'emportait, et la précipitation de Kibayashi-san ne peut pas rattraper son retard.

En passant, cette fois, je vais essayer de calculer la formule Ne pas faire lors de l'élection à la représentation proportionnelle.

résultat

http://needtec.sakura.ne.jp/analyze_election/page/dondt/shuin_47

Entrez le nombre de votes et appuyez sur le bouton "Calculer" pour obtenir le nombre de sièges en fonction du nombre de votes. Si la cote d'approbation du parti est poussée telle quelle, le PLD obtiendra 140 sièges, et même la Société de restauration sera anéantie.

Au moment de l'élection de 2013 à la Chambre des conseillers, si vous saisissez le taux de vote pour chaque parti lors de la dernière élection de l'Assemblée métropolitaine de Tokyo, la différence entre le résultat estimé et le résultat réel est de 1 siège.

Code source

https://github.com/mima3/analyze_election

Fichier de calcul de formule réelle

dondt_util.py


# coding=utf-8
import os
import re
from collections import defaultdict
import math
import json
import copy
import operator

class political_party_info:
    """
Classe pour stocker les informations du parti
    name :Nom de la fête
    votes:Nombre de votes
    max    :Nombre de candidats (quel que soit le nombre de votes que vous obtenez, vous ne pouvez pas obtenir plus de sièges)
    seats:Nombre de sièges acquis
    """
    def __init__(self, name, votes, max):
        self.name = name
        self.votes = votes
        self.max = max
        self.seats = 0

def select_political_party(votes):
    """
Entrez le nom du parti, la valeur politique_party_Obtenez le nom du parti avec le plus de votes dans le dictionnaire avec info
    """
    max = -1
    ret = None
    for k, v in votes.items():
        #Si le nombre est le même, il sera décidé par tirage au sort, mais cette fois ce sera dans l'ordre d'inscription
        if max < v.votes:
            ret = k
            max = v.votes
    return ret

def dondt(votes_data, max):
    """
Par la méthode Don't
    votes_data:Entrez le nom du parti, la valeur politique_party_Dictionnaire avec info
    max:Nombre total de sièges
    votes_data[x].Le nombre de sièges est stocké dans les sièges.
    """
    tmp_votes = copy.deepcopy(votes_data)
    for i in range(1, max+1):
        s = select_political_party(tmp_votes)
        if s is None:
            return None
        votes_data[s].seats += 1
        tmp_votes[s].votes = math.floor(votes_data[s].votes / (votes_data[s].seats + 1))
        if tmp_votes[s].max == votes_data[s].seats:
            #Le nombre de candidats étant dépassé, le vote pour ce parti est invalide.
            tmp_votes[s].votes = 0
    return votes_data

Les fractions lors de la recherche d'un quotient sont arrondies. Si le nombre de votes est le même, il est initialement décidé par tirage au sort, mais ici c'est par ordre de code de caractère (l'ex-parti Midori a priorité sur LDP)

Voir ci-dessous pour savoir comment calculer la formule ne pas. http://www.pref.tochigi.lg.jp/senkyo/sangisenkyo/qanda/qanda-9.html

Information proportionnelle sur le district

Normalement, le nombre de sièges dans le bloc de la circonscription proportionnelle et le nombre de candidats pour chaque parti doivent être créés à partir de la page du ministère de l'Intérieur et des Communications. Cependant, le ministère de l'Intérieur et des Communications ne le publie qu'en format PDF, qui ne peut être traité sous forme de texte.

Quel que soit le nombre de sièges dans le bloc proportionnel, il est difficile de saisir des données pour les candidats, j'ai donc essayé de créer un fichier CSV en grattant sur le Web la page d'accueil de l'Asahi Shimbun. Les URL suivantes sont ciblées. http://www.asahi.com/senkyo/sousenkyo47/kouho/B01.html ~ http://www.asahi.com/senkyo/sousenkyo47/kouho/B11.html

Il avait la même structure HTML que 2012, donc il sera probablement utilisable lors de la prochaine dissolution.

script/analyze_asahi_hirei.py


#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import urllib2
import lxml.html
import re
import os.path
import urlparse

def print_area(url):
    r = urllib2.urlopen(url, timeout=30)
    html = r.read()
    dom = lxml.html.fromstring(html)
    parties = dom.xpath('//div[@class="snkH2Box"]/h2')
    tables = dom.xpath('//table[@class="snkTbl01"]')
    block = dom.xpath('//div[@class="BreadCrumb"]/h1')[0].text_content().encode('utf-8')
    block = block[block.find(':')+len(':'):]
    for i in range(0, len(parties)):
        h2 = parties[i].text_content().encode('utf-8')
        partyName = h2.split('\n')[0]
        members = tables[i].xpath('tbody/tr')
        for m in members:
            name = m.xpath('td[@class="namae"]')[0].text_content().encode('utf-8')
            lstNum = m.xpath('td[@class="lstNum"]')[0].text_content().encode('utf-8')
            age = m.xpath('td[@class="age"]')[0].text_content().encode('utf-8')
            status = m.xpath('td[@class="status"]')[0].text_content().encode('utf-8')
            net = m.xpath('td[@class="net"]/ul')[0]
            twitterEl = net.xpath('li[@id="twitter"]/a')
            facebookEl = net.xpath('li[@id="facebook"]/a')
            hpEl = net.xpath('li[@id="HomePage1"]/a')
            areaEl = m.xpath('td[@class="w"]/a')
            area = ''
            twitter = ''
            facebook = ''
            hp = ''
            if twitterEl:
                twitter = twitterEl[0].attrib['href'].encode('utf-8')
            if facebookEl:
                facebook = facebookEl[0].attrib['href'].encode('utf-8')
            if hpEl:
                hp = hpEl[0].attrib['href'].encode('utf-8')
            if areaEl:
                area =areaEl[0].text_content().encode('utf-8')
            print ('%s,%s,%s,%s,%s,%s,%s,%s,%s,%s' % (block, partyName,lstNum, name, age, status, area, twitter, facebook, hp))

def main(argvs, argc):
    """
Ce script obtient les candidats pour la petite circonscription à partir des informations contenues dans l'Asahi Shimbun.
    """
    for i in range(1, 12):
        url = ('http://www.asahi.com/senkyo/sousenkyo47/kouho/B%s.html' % str(i).zfill(2))
        print_area(url)

if __name__ == '__main__':
    argvs = sys.argv
    argc = len(argvs)
    sys.exit(main(argvs, argc))

** Données des candidats aux quartiers proportionnels avec demi-largeur pleine largeur ou «préfecture» après obtention des données d'Asahi Shimbun ** https://github.com/mima3/analyze_election/blob/master/script/candidate_shuin_47_hirei.csv

** Informations de bloc proportionnelles CSV créées en regardant les données Asahi Shimbun ** https://github.com/mima3/analyze_election/blob/master/script/block_shuin_47_hirei.csv

Recommended Posts

C'est pourquoi je calcule le nombre de sièges pour le représentant proportionnel à l'élection de la Chambre des représentants
C'est pourquoi je vais chercher les tweets de l'élection de la Chambre des représentants
C'est pourquoi j'analyserai la page d'accueil de chaque partie
C'est pourquoi je calcule le nombre de sièges pour le représentant proportionnel à l'élection de la Chambre des représentants
C'est pourquoi je vais chercher les tweets de l'élection de la Chambre des représentants
C'est pourquoi j'analyserai la page d'accueil de chaque partie
Obtenez le nombre d'occurrences pour chaque élément de la liste
Calculez le nombre de changements
[Python] Calculez le nombre de chiffres requis lors de la saisie de 0 [Note]
Sortie du nombre de cœurs de processeur en Python
Calculez le nombre total de combinaisons avec python
Trouvez le nombre de jours dans un mois
Le concept de référence en Python s'est effondré un instant, j'ai donc expérimenté un peu.
Trouvez une ligne directrice pour le nombre de processus / threads à définir sur le serveur d'applications
Vérifiez le temps de traitement et le nombre d'appels pour chaque processus avec python (cProfile)