[PYTHON] Deshalb berechne ich die Anzahl der Sitze für den proportionalen Vertreter bei den Wahlen zum Repräsentantenhaus

Ein Jahr nach Aufhebung des Verbots von Online-Wahlen gab es eine große Anzahl von Nostradams im Netz, die Japan beenden würde, wenn eine Partei gewinnt, und Kibayashi-sans Ansturm kann nicht aufholen. Wie geht es Ihnen jetzt?

Übrigens werde ich diesmal versuchen, die Don't-Formel bei den proportionalen repräsentativen Wahlen zu berechnen.

Ergebnis

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

Geben Sie die Anzahl der Stimmen ein und klicken Sie auf die Schaltfläche "Berechnen", um die Anzahl der Sitze entsprechend der Anzahl der Stimmen zu ermitteln. Wenn die Zustimmungsrate der Partei so wie sie ist erhöht wird, wird die LDP 140 Sitze erhalten und sogar die Restoration Society wird ausgelöscht.

Wenn Sie zum Zeitpunkt der Wahl des House of Councilors 2013 die Stimmenzahl für jede Partei bei den letzten Wahlen zur Tokyo Metropolitan Assembly eingeben, beträgt die Differenz zwischen dem geschätzten und dem tatsächlichen Ergebnis 1 Sitz.

Quellcode

https://github.com/mima3/analyze_election

Tatsächlich Berechnungsdatei für Formel nicht

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:
    """
Klasse zum Speichern von Partyinformationen
    name :Parteinamen
    votes:Anzahl der Stimmen
    max    :Anzahl der Kandidaten (Egal wie viele Stimmen Sie erhalten, Sie können nicht mehr Sitze bekommen)
    seats:Anzahl der erworbenen Sitze
    """
    def __init__(self, name, votes, max):
        self.name = name
        self.votes = votes
        self.max = max
        self.seats = 0

def select_political_party(votes):
    """
Der Name der Partei ist der Schlüssel, der Wert ist politisch_party_Holen Sie sich den Namen der Partei mit den meisten Stimmen im Wörterbuch mit Informationen
    """
    max = -1
    ret = None
    for k, v in votes.items():
        #Wenn die Nummer gleich ist, wird sie per Lotterie entschieden, diesmal jedoch in der Reihenfolge der Registrierung
        if max < v.votes:
            ret = k
            max = v.votes
    return ret

def dondt(votes_data, max):
    """
Mit nicht Methode
    votes_data:Der Name der Partei ist der Schlüssel, der Wert ist politisch_party_Wörterbuch mit Info
    max:Gesamtzahl der Sitzplätze
    votes_data[x].Die Anzahl der Sitze wird in Sitzen gespeichert.
    """
    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:
            #Da die Anzahl der Kandidaten überschritten wurde, ist die Abstimmung für diese Partei ungültig.
            tmp_votes[s].votes = 0
    return votes_data

Brüche bei der Suche nach einem Quotienten werden abgerundet. Wenn die Anzahl der Stimmen gleich ist, wird dies ursprünglich per Lotterie entschieden, hier jedoch in der Reihenfolge des Zeichencodes (die Ex-Midori-Partei hat Vorrang vor der LDP).

Im Folgenden erfahren Sie, wie Sie die Don't-Formel berechnen. http://www.pref.tochigi.lg.jp/senkyo/sangisenkyo/qanda/qanda-9.html

Proportionale Bezirksinformationen

Normalerweise sollten die Anzahl der Sitze im Block des proportionalen Distrikts und die Anzahl der Kandidaten für jede Partei auf der Seite des Ministeriums für innere Angelegenheiten und Kommunikation festgelegt werden. Das Ministerium für innere Angelegenheiten und Kommunikation veröffentlicht es jedoch nur als PDF, das nicht in Textform verarbeitet werden kann.

Unabhängig von der Anzahl der Sitze im Proportionalblock ist es schwierig, Daten für Kandidaten einzugeben. Deshalb habe ich versucht, eine CSV-Datei zu erstellen, indem ich die Homepage des Asahi Shimbun im Internet durchsucht habe. Die folgenden URLs werden als Ziel ausgewählt. http://www.asahi.com/senkyo/sousenkyo47/kouho/B01.html ~ http://www.asahi.com/senkyo/sousenkyo47/kouho/B11.html

Es hatte die gleiche HTML-Struktur wie 2012, sodass es wahrscheinlich bei der nächsten Auflösung verwendet werden kann.

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):
    """
Dieses Skript bezieht die Kandidaten für den kleinen Wahlkreis aus den Informationen im 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))

** Daten von Kandidaten für proportionale Stationen mit voller Breite, halber Breite oder "Präfektur" nach Erhalt von Daten von Asahi Shimbun ** https://github.com/mima3/analyze_election/blob/master/script/candidate_shuin_47_hirei.csv

** Proportionale Blockinformationen CSV, die beim Betrachten der Asahi Shimbun-Daten erstellt wurden ** https://github.com/mima3/analyze_election/blob/master/script/block_shuin_47_hirei.csv

Recommended Posts

Deshalb berechne ich die Anzahl der Sitze für den proportionalen Vertreter bei den Wahlen zum Repräsentantenhaus
Deshalb werde ich Tweets von den Wahlen zum Repräsentantenhaus nachschlagen
Deshalb analysiere ich die Homepages jeder Partei
Deshalb berechne ich die Anzahl der Sitze für den proportionalen Vertreter bei den Wahlen zum Repräsentantenhaus
Deshalb werde ich Tweets von den Wahlen zum Repräsentantenhaus nachschlagen
Deshalb analysiere ich die Homepages jeder Partei
Ermitteln Sie die Anzahl der Vorkommen für jedes Element in der Liste
Berechnen Sie die Anzahl der Änderungen
[Python] Berechnen Sie die Anzahl der Stellen, die zum Ausfüllen von Nullen erforderlich sind. [Hinweis]
Geben Sie die Anzahl der CPU-Kerne in Python aus
Berechnen Sie die Gesamtzahl der Kombinationen mit Python
Finden Sie die Anzahl der Tage in einem Monat
Das Konzept der Referenz in Python brach für einen Moment zusammen, also experimentierte ich ein bisschen.
Suchen Sie eine Richtlinie für die Anzahl der Prozesse / Threads, die auf dem Anwendungsserver festgelegt werden sollen
Überprüfen Sie die Verarbeitungszeit und die Anzahl der Aufrufe für jeden Prozess mit Python (cProfile).