Exemplo n.º 1
0
    def __init__(self, *args, **kwargs):
        log.debug("--> TypFunkce")
        super().__init__(*args, **kwargs)

        self.nacti_typ_funkce()

        # Připoj Typu orgánu
        suffix = "__typ_organ"
        self.tbl['typ_funkce'] = pd.merge(left=self.tbl['typ_funkce'],
                                          right=self.tbl['typ_organ'],
                                          on="id_typ_organ",
                                          suffixes=("", suffix),
                                          how='left')
        # Odstraň nedůležité sloupce 'priorita', protože se vzájemně vylučují a nejspíš ani k ničemu nejsou.
        # Tímto se vyhneme varování v 'drop_by_inconsistency'.
        self.tbl['typ_funkce'].drop(
            columns=["priorita", "priorita__typ_organ"], inplace=True)
        self.tbl['typ_funkce'] = self.drop_by_inconsistency(
            self.tbl['typ_funkce'],
            suffix,
            0.1,
            t1_name='typ_funkce',
            t2_name='typ_organ',
            t1_on='id_typ_organ',
            t2_on='id_typ_organ')

        self.nastav_dataframe(self.tbl['typ_funkce'],
                              vyber=[
                                  'id_typ_funkce', 'typ_funkce_cz',
                                  'typ_funkce_en', 'typ_funkce_obecny'
                              ],
                              odstran=['typ_funkce_obecny__ORIG'])

        log.debug("<-- TypFunkce")
Exemplo n.º 2
0
    def __init__(self, *args, **kwargs):
        log.debug('--> BodSchuze')

        super().__init__(*args, **kwargs)

        self.nacti_bod_schuze()
        self.nacti_bod_stav()

        # TODO: Zúžení na dané volební období

        # Připoj informace o stavu bodu
        suffix = "__bod_stav"
        self.tbl['bod_schuze'] = pd.merge(left=self.tbl['bod_schuze'],
                                          right=self.tbl['bod_stav'],
                                          on='id_bod_stav',
                                          suffixes=("", suffix),
                                          how='left')
        self.drop_by_inconsistency(self.tbl['bod_schuze'],
                                   suffix,
                                   0.1,
                                   'bod_schuze',
                                   'bod_stav',
                                   inplace=True)

        self.nastav_dataframe(self.tbl['bod_schuze'])

        log.debug('<-- BodSchuze')
Exemplo n.º 3
0
    def __init__(self, *args, **kwargs):
        log.debug('--> Schuze')

        super().__init__(*args, **kwargs)

        self.nacti_schuze()
        self.nacti_schuze_stav()

        # Zúžení na dané volební období
        if ('id_organ' in self.snemovna) and (self.snemovna.id_organ != -1):
            self.tbl['schuze'] = self.tbl['schuze'][self.tbl['schuze'].id_org
                                                    == self.snemovna.id_organ]

        # Připoj informace o stavu schůze
        suffix = "__schuze_stav"
        self.tbl['schuze'] = pd.merge(left=self.tbl['schuze'],
                                      right=self.tbl['schuze_stav'],
                                      on='id_schuze',
                                      suffixes=("", suffix),
                                      how='left')
        self.drop_by_inconsistency(self.tbl['schuze'],
                                   suffix,
                                   0.1,
                                   'schuze',
                                   'schuze_stav',
                                   inplace=True)

        self.nastav_dataframe(
            self.tbl['schuze'],
            odstran=['pozvanka__ORIG', 'stav__ORIG', 'typ__ORIG'])

        log.debug('<-- Schuze')
Exemplo n.º 4
0
    def __init__(self, stahni=True, *args, **kwargs):
        log.debug("--> PoslanciOsobyBase")

        super().__init__(*args, **kwargs)

        if stahni == True:
            self.stahni_zip_data("poslanci")

        log.debug("<-- PoslanciOsobyBase")
Exemplo n.º 5
0
    def __init__(self, stahni=True, *args, **kwargs):
        log.debug("--> HlasovaniBase")

        super().__init__(stahni=stahni, *args, **kwargs)

        if stahni == True:
            self.stahni_zip_data(f"hl-{self.volebni_obdobi}ps")

        log.debug("<-- HlasovaniBase")
Exemplo n.º 6
0
    def __init__(self, *args, **kwargs):
        log.debug("--> Osoby")
        super(Osoby, self).__init__(*args, **kwargs)

        self.nacti_osoby()
        self.nacti_osoba_extra()

        #suffix='__osoba_extra'
        #self.tbl['osoby'] = pd.merge(left=self.tbl['osoby'], right=self.tbl['osoba_extra'], on="id_osoba", how="left", suffixes=('', suffix))
        #self.drop_by_inconsistency(self.tbl['osoby'], suffix, 0.1, 'hlasovani', 'osoba_extra', inplace=True)

        self.nastav_dataframe(self.tbl['osoby'])

        log.debug("<-- Osoby")
Exemplo n.º 7
0
    def __init__(self, *args, **kwargs):
        log.debug("--> ZpochybneniPoslancem")

        super().__init__(*args, **kwargs)

        self.nacti_zpochybneni_poslancem()

        # Připojuje se tabulka 'hlasovani', nikoliv 'zpochybneni_hlasovani', protože není možné mapovat řádky 'zpochybneni_hlasovani' na 'zpochybneni_poslancem'. Jedná se zřejmě o nedokonalost datového modelu.
        suffix = "__hlasovani"
        self.tbl['zpochybneni_poslancem'] = pd.merge(
            left=self.tbl['zpochybneni_poslancem'],
            right=self.tbl['hlasovani'],
            on='id_hlasovani',
            suffixes=("", suffix),
            how='left')
        self.drop_by_inconsistency(self.tbl['zpochybneni_poslancem'],
                                   suffix,
                                   0.1,
                                   'zpochybneni_poslancem',
                                   'hlasovani',
                                   inplace=True)

        # Připoj informace o osobe # TODO: Neměli by se připojovat spíš Poslanci než Osoby?
        suffix = "__osoby"
        self.tbl['zpochybneni_poslancem'] = pd.merge(
            left=self.tbl['zpochybneni_poslancem'],
            right=self.tbl['osoby'],
            on='id_osoba',
            suffixes=("", suffix),
            how='left')
        self.drop_by_inconsistency(self.tbl['zpochybneni_poslancem'],
                                   suffix,
                                   0.1,
                                   'zpochybneni_poslancem',
                                   'osoby',
                                   inplace=True)

        id_organ_dle_volebniho_obdobi = self.tbl['organy'][
            (self.tbl['organy'].nazev_organ_cz == 'Poslanecká sněmovna')
            & (self.tbl['organy'].od_organ.dt.year == self.volebni_obdobi
               )].iloc[0].id_organ
        self.tbl['zpochybneni_poslancem'] = self.tbl['zpochybneni_poslancem'][
            self.tbl['zpochybneni_poslancem'].id_organ ==
            id_organ_dle_volebniho_obdobi]

        self.nastav_dataframe(self.tbl['zpochybneni_poslancem'])

        log.debug("<-- ZpochybneniPoslancem")
Exemplo n.º 8
0
    def stahni_zip_data(self, nazev):
        url_prefix = "https://www.psp.cz/eknih/cdrom/opendata/"
        url = url_prefix + nazev + '.zip'
        data_dir = self.parameters['data_dir']

        a = urlparse(url)
        filename = os.path.basename(a.path)
        zip_path = f"{data_dir}/{filename}"
        log.debug(
            f"SnemovnaZipDataMixin: Nastavuji cestu k zip souboru na: {zip_path}"
        )

        # smaz starý zip soubor, pokud existuje
        if os.path.isfile(zip_path):
            os.remove(zip_path)

        download_and_unzip(url, zip_path, data_dir)
Exemplo n.º 9
0
    def __init__(self, *args, **kwargs):
        log.debug("--> Omluvy")

        super().__init__(*args, **kwargs)

        self.nacti_omluvy()

        # Připoj informace o poslanci
        suffix = "__poslanci"
        self.tbl['omluvy'] = pd.merge(left=self.tbl['omluvy'],
                                      right=self.tbl['poslanci'],
                                      on='id_poslanec',
                                      suffixes=("", suffix),
                                      how='left')
        self.tbl['omluvy'] = self.drop_by_inconsistency(
            self.tbl['omluvy'], suffix, 0.1, 'omluvy', 'poslanci')

        # Zúžení na volební období
        self.tbl['omluvy'] = self.tbl['omluvy'][(
            self.tbl['omluvy'].id_parlament == self.snemovna.id_organ)]

        # Vyznačení poslanců v tabulce omluv
        om = self.tbl['omluvy']
        om['je_poslanec'] = False
        zo = self.tbl['zarazeni_osoby']
        zo_poslanci_snemovna = zo[(zo.id_organ == self.snemovna.id_organ)
                                  & (zo.cl_funkce == 'členství')]

        for (id_osoba, od_o, do_o), _ in zo_poslanci_snemovna.groupby(
            ['id_osoba', 'od_o', 'do_o'], dropna=False).size().iteritems():
            om.je_poslanec.mask(
                (om.id_osoba == id_osoba)
                & (om.den.dt.date >= od_o.date())
                & ((om.den.dt.date <= do_o.date()) | pd.isna(do_o)),
                True,
                inplace=True)

        self.meta.nastav_hodnotu(
            'je_poslanec',
            dict(popis='Příznak, že omlouvající se osoba patří mezi poslance.',
                 tabulka='df',
                 vlastni=True))

        self.nastav_dataframe(self.tbl['omluvy'])

        log.debug("<-- Omluvy")
Exemplo n.º 10
0
    def __init__(self, *args, **kwargs):
        log.debug("--> ZmatecneHlasovani")

        super().__init__(*args, **kwargs)
        self.nacti_zmatecne_hlasovani()

        suffix = "__hlasovani"
        self.tbl['zmatecne'] = pd.merge(left=self.tbl['zmatecne'],
                                        right=self.tbl['hlasovani'],
                                        on='id_hlasovani',
                                        suffixes=("", suffix),
                                        how='left')
        self.tbl['zmatecne'] = self.drop_by_inconsistency(
            self.tbl['zmatecne'], suffix, 0.1, 'zmatecne', 'hlasovani')

        self.nastav_dataframe(self.tbl['zmatecne'])

        log.debug("<-- ZmatecneHlasovani")
Exemplo n.º 11
0
def pretypuj(df, header, name=None, inplace=False):
    if inplace:
        new_df = df
    else:
        new_df = df.copy()

    if name is not None:
        log.debug(f"Přetypování v tabulce '{name}'.")
    for col in df.columns:
        if col in header:
            #log.debug(f"Přetypovávám sloupec: '{col}'.")
            if isinstance(header[col], str):
                new_df[col] = df[col].astype(header[col])
            elif isinstance(header[col], MItem):
                new_df[col] = df[col].astype(header[col].typ)
            else:
                log.error(
                    f"Chyba: Neznámý formát přetypování. Sloupec '{col}' nebylo možné přetypovat."
                )
    return new_df
Exemplo n.º 12
0
    def __init__(self,
                 volebni_obdobi=None,
                 data_dir='./data',
                 *args,
                 **kwargs):
        log.debug("--> SnemovnaDataFrame")
        log.debug(f"Base kwargs: {kwargs}")
        super().__init__(*args, **kwargs)
        self._metadata = [
            "meta", 'tbl', 'parameters', 'paths', "volební období", "snemovna",
            "tzn"
        ]

        self.meta = SnemovnaMeta(
            index_name='sloupec',
            dtypes=dict(popis='string',
                        tabulka='string',
                        vlastni='bool',
                        aktivni='bool'),
            defaults=dict(popis=None, tabulka=None, vlastni=None,
                          aktivni=None),
        )
        self.tbl = {}
        self.paths = {}
        self.volebni_obdobi = volebni_obdobi
        self.snemovna = None
        self.tzn = pytz.timezone('Europe/Prague')

        self.parameters = {}
        self.parameters['data_dir'] = data_dir

        log.debug("<-- SnemovnaDataFrame")
Exemplo n.º 13
0
def download_and_unzip(url, zip_file_name, data_dir):
    log.info(f"Stahuji '{url}'.")
    log.debug(f"Vytvářím adresář: '{data_dir}'")
    Path(data_dir).mkdir(parents=True, exist_ok=True)

    log.debug(f"Stahuji data z: '{url}'")
    r = requests.get(url)
    with open(zip_file_name, 'wb') as f:
        f.write(r.content)
    log.debug(
        f"Status: {r.status_code}, headers: {r.headers['content-type']}, encoding: {r.encoding}"
    )

    log.debug(f"Rozbaluji data do: '{data_dir}'")
    with zipfile.ZipFile(zip_file_name, 'r') as zip_ref:
        zip_ref.extractall(data_dir)
Exemplo n.º 14
0
    def __init__(self, *args, **kwargs):
        log.debug("--> Funkce")
        super().__init__(*args, **kwargs)

        self.nacti_funkce()

        # Zúžení
        self.vyber_platne_funkce()

        # Připoj Orgány
        suffix = "__organy"
        self.tbl['funkce'] = pd.merge(left=self.tbl['funkce'],
                                      right=self.tbl['organy'],
                                      on='id_organ',
                                      suffixes=("", suffix),
                                      how='left')
        self.tbl['funkce'] = self.drop_by_inconsistency(
            self.tbl['funkce'], suffix, 0.1, 'funkce', 'organy')

        # Připoj Typ funkce
        suffix = "__typ_funkce"
        self.tbl['funkce'] = pd.merge(left=self.tbl['funkce'],
                                      right=self.tbl['typ_funkce'],
                                      on="id_typ_funkce",
                                      suffixes=("", suffix),
                                      how='left')

        # Fix the knows inconsistency in data
        x = self.tbl['funkce']
        idx = x[(x.id_typ_organ == 42)
                & (x.id_typ_organ__typ_funkce == 15)].index
        log.debug(
            f"Řešení známé nekonzistence v datech: Upřednostňuji sloupce z tabulky 'funkce' před 'typ_funkce' pro {len(idx)} hodnot."
        )
        to_update = [
            'id_typ_organ', 'typ_id_typ_organ', 'nazev_typ_organ_cz',
            'nazev_typ_organ_en', 'typ_organ_obecny'
        ]
        for i in to_update:
            x.at[idx, i + '__typ_funkce'] = x.loc[idx][i]

        self.tbl['funkce'] = self.drop_by_inconsistency(self.tbl['funkce'],
                                                        suffix,
                                                        0.1,
                                                        'funkce',
                                                        'typ_funkce',
                                                        t1_on='id_typ_funkce',
                                                        t2_on='id_typ_funkce')

        if self.volebni_obdobi != -1:
            assert len(
                self.tbl['funkce'][self.tbl['funkce'].id_organ.isna()]) == 0

        self.nastav_dataframe(self.tbl['funkce'])

        log.debug("<-- Funkce")
Exemplo n.º 15
0
    def __init__(self, *args, **kwargs):
        log.debug("--> Organy")
        super().__init__(*args, **kwargs)

        self.nacti_organy()

        # Připoj Typu orgánu
        suffix = "__typ_organ"
        self.tbl['organy'] = pd.merge(left=self.tbl['organy'],
                                      right=self.tbl['typ_organ'],
                                      on="id_typ_organ",
                                      suffixes=("", suffix),
                                      how='left')
        # Odstraň nedůležité sloupce 'priorita', protože se vzájemně vylučují a nejspíš k ničemu nejsou.
        # Tímto se vyhneme varování funkce 'drop_by_inconsistency.
        self.tbl['organy'].drop(columns=["priorita", "priorita__typ_organ"],
                                inplace=True)
        self.tbl['organy'] = self.drop_by_inconsistency(
            self.tbl['organy'], suffix, 0.1, 'organy', 'typ_organ')

        # Nastav volební období, pokud chybí
        if self.volebni_obdobi == None:
            self.volebni_obdobi = self._posledni_snemovna().od_organ.year
            log.debug(
                f"Nastavuji začátek volebního období na: {self.volebni_obdobi}."
            )

        if self.volebni_obdobi != -1:
            x = self.tbl['organy'][
                (self.tbl['organy'].nazev_organ_cz == 'Poslanecká sněmovna')
                & (self.tbl['organy'].od_organ.dt.year == self.volebni_obdobi)]
            if len(x) == 1:
                self.snemovna = x.iloc[0]
            else:
                log.error(
                    'Bylo nalezeno více sněmoven pro dané volební období!')
                raise ValueError

        self.tbl['organy'] = self.vyber_platne_organy()
        self.nastav_dataframe(self.tbl['organy'])

        log.debug("<-- Organy")
Exemplo n.º 16
0
    def __init__(self, *args, **kwargs):
        log.debug("--> Hlasovani")

        super().__init__(*args, **kwargs)

        self.nacti_hlasovani()
        self.nacti_zmatecne_hlasovani()
        self.nacti_zpochybneni_hlasovani()
        self.nacti_hlasovani_vazba_stenozaznam()

        # Zúžení dat na zvolené volební období. Tohle je asi nejjednodušší způsob.
        min_id = self.tbl['hlasovani'].id_hlasovani.min()
        max_id = self.tbl['hlasovani'].id_hlasovani.max()
        self.tbl['zmatecne'] = self.tbl['zmatecne'][
            (self.tbl['zmatecne'].id_hlasovani >= min_id)
            & (self.tbl['zmatecne'].id_hlasovani <= max_id)]
        self.tbl['zpochybneni'] = self.tbl['zpochybneni'][
            (self.tbl['zpochybneni'].id_hlasovani >= min_id)
            & (self.tbl['zpochybneni'].id_hlasovani <= max_id)]
        self.tbl['hlasovani_vazba_stenozaznam'] = self.tbl[
            'hlasovani_vazba_stenozaznam'][
                (self.tbl['hlasovani_vazba_stenozaznam'].id_hlasovani >= min_id
                 )
                & (self.tbl['hlasovani_vazba_stenozaznam'].id_hlasovani <=
                   max_id)]

        # Přidání indikátorů
        self.tbl['hlasovani']['ma_zpochybneni'] = self.tbl[
            'hlasovani'].id_hlasovani.isin(
                self.tbl['zpochybneni'].id_hlasovani.unique())
        self.meta.nastav_hodnotu(
            'ma_zpochybneni',
            dict(popis='Indikátor zpochybnění hlasování',
                 tabulka='df',
                 vlastni=True))

        self.tbl['hlasovani']['je_zmatecne'] = self.tbl[
            'hlasovani'].id_hlasovani.isin(
                self.tbl['zmatecne'].id_hlasovani.unique())
        self.meta.nastav_hodnotu(
            'je_zmatecne',
            dict(popis='Indikátor zmatečného hlasování',
                 tabulka='df',
                 vlastni=True))

        # Připojení informací o stenozaznamu. Pozor, nemusí být aktuální. Například pro snemovnu 2017 momentálně (16.2.2021) data chybí.
        self.tbl['hlasovani']['ma_stenozaznam'] = self.tbl[
            'hlasovani'].id_hlasovani.isin(
                self.tbl['hlasovani_vazba_stenozaznam'].id_hlasovani.unique())
        self.meta.nastav_hodnotu(
            'ma_stenozaznam',
            dict(popis='Indikátor existence stenozáznamu',
                 tabulka='df',
                 vlastni=True))

        self.nastav_dataframe(self.tbl['hlasovani'],
                              odstran=[
                                  'datum__ORIG', 'druh_hlasovani__ORIG',
                                  'vysledek__ORIG', 'typ__ORIG'
                              ])
        # Uprav informace, které se přepsaly při načítání tabulek
        self.meta.loc['id_hlasovani', 'tabulka'] = 'hlasovani'

        log.debug("<-- Hlasovani")
Exemplo n.º 17
0
    def __init__(self, *args, **kwargs):
        log.debug("--> HlasovaniPoslance")

        super().__init__(*args, **kwargs)

        self.nacti_hlasovani_poslanci()

        # Připoj Poslance. Získáme mimo jiné také 'id_osoba'.
        self.tbl['hlasovani_poslanci'] = pd.merge(
            left=self.tbl['hlasovani_poslanci'],
            right=self.tbl['poslanci'],
            on="id_poslanec",
            suffixes=("", "__poslanci"),
            how='left')
        self.drop_by_inconsistency(self.tbl['hlasovani_poslanci'],
                                   "__poslanci",
                                   0.1,
                                   'hlasovani_poslanci',
                                   'poslanci',
                                   inplace=True)
        self.tbl['hlasovani_poslanci'] = self.tbl['hlasovani_poslanci'][
            self.tbl['hlasovani_poslanci'].id_parlament ==
            self.snemovna.id_organ]

        # Připoj Hlasovani
        hlasovani_columns = [
            'id_hlasovani', 'schuze', 'cislo', 'bod', 'cas', 'nazev_dlouhy',
            'datum', 'bod__KAT', 'druh_hlasovani', 'ma_zpochybneni',
            'je_zmatecne'
        ]
        self.tbl['hlasovani_poslanci'] = pd.merge(
            left=self.tbl['hlasovani_poslanci'],
            right=self.tbl['hlasovani'][hlasovani_columns],
            on="id_hlasovani",
            suffixes=("", "__hlasovani"),
            how='left')
        self.drop_by_inconsistency(self.tbl['hlasovani_poslanci'],
                                   "__hlasovani",
                                   0.1,
                                   'hlasovani_poslanci',
                                   'hlasovani',
                                   inplace=True)

        # Ze zarazeni_osoby získáme informace o tom, v jakém poslaneckém klubu byl daný poslanec v den hlasování
        zarazeni_osoby = self.tbl['zarazeni_osoby']

        # Vyber všechny osoby, které byly členy dané poslanecné sněmovny
        id_osoba_all = set(zarazeni_osoby[
            (zarazeni_osoby.id_organ == self.snemovna.id_organ)
            & (zarazeni_osoby.cl_funkce == 'členství')].id_osoba)
        # Vyber všechna zařazení osob do poslaneckých klubů dané poslanecké sněmovny
        zarazeni_osoby_kluby = zarazeni_osoby[(zarazeni_osoby.id_osoba.isin(id_osoba_all)) & (zarazeni_osoby.nazev_typ_organ_cz == "Klub") & (zarazeni_osoby.cl_funkce=='členství')]\
            .rename(columns={
                'id_organ': 'id_klub',
                'nazev_organ_cz': 'nazev_klub_cz', 'zkratka': 'zkratka_klub',
                'od_o': 'od_klub', 'do_o': 'do_klub'
            })

        # Některé osoby mohli být zařazeny ve více klubech.
        # Pro každou osobu zatím vybereme poslední hodnotu, kterou pro přeběhlíky a nezařazené později upravíme.
        zarazeni_do_klubu = zarazeni_osoby_kluby.groupby('id_osoba').tail(1)

        # Nastav poslanecký klub pro všechny poslance.
        # Hodnota je správně jen pro poslance, kteří byli celou dobu v jediném klubu.
        # Přeběhlíky (poslance ve více klubech) nebo vystoupivší z klubů (nezařazené) budeme muset řešit zvlášť.
        self.tbl['hlasovani_poslanci'] = pd.merge(
            self.tbl['hlasovani_poslanci'],
            zarazeni_do_klubu[[
                'id_osoba', 'id_klub', 'nazev_klub_cz', 'zkratka_klub'
            ]],
            on='id_osoba',
            how="left",
            suffixes=('', '__zarazeni_do_klubu'))
        self.drop_by_inconsistency(self.tbl['hlasovani_poslanci'],
                                   "__zarazeni_do_klubu",
                                   0.1,
                                   'hlasovani_poslanci',
                                   'zarazeni_do_klubu',
                                   inplace=True,
                                   silent=True)
        #print(zarazeni_do_klubu.columns)
        #print(self.tbl['hlasovani_poslanci'].columns)

        # Pro přeběhlíky a vystoupivší je nutné vybrat řádky se správným údajem o zařazení do klubu.
        s = zarazeni_osoby_kluby.groupby('id_osoba').size().sort_values()
        oprav_zarazeni = s[s > 1]

        for id_osoba in oprav_zarazeni.index:
            for idx, row in zarazeni_osoby_kluby[zarazeni_osoby_kluby.id_osoba
                                                 == id_osoba].iterrows():
                od_klub, do_klub = row['od_klub'], row['do_klub']
                id_klub, nazev_klub_cz, zkratka_klub = row['id_klub'], row[
                    'nazev_klub_cz'], row['zkratka_klub']

                # nastav id_klub dle data hlasování (pro prebehliky a vystoupivší)
                self.tbl['hlasovani_poslanci'].id_klub.mask(
                    (self.tbl['hlasovani_poslanci'].id_osoba == id_osoba)
                    & (self.tbl['hlasovani_poslanci'].datum >= od_klub)
                    & ((self.tbl['hlasovani_poslanci'].datum <= do_klub) |
                       (pd.isna(do_klub))),
                    id_klub,
                    inplace=True)

                # nastav nazev_klub_cz dle data hlasování (pro prebehliky a vystoupivší)
                self.tbl['hlasovani_poslanci'].nazev_klub_cz.mask(
                    (self.tbl['hlasovani_poslanci'].id_osoba == id_osoba)
                    & (self.tbl['hlasovani_poslanci'].datum >= od_klub)
                    & ((self.tbl['hlasovani_poslanci'].datum <= do_klub) |
                       (pd.isna(do_klub))),
                    nazev_klub_cz,
                    inplace=True)

                # nastav zkratka_klub dle data hlasování (pro prebehliky a vystoupivší)
                self.tbl['hlasovani_poslanci'].zkratka_klub.mask(
                    (self.tbl['hlasovani_poslanci'].id_osoba == id_osoba)
                    & (self.tbl['hlasovani_poslanci'].datum >= od_klub)
                    & ((self.tbl['hlasovani_poslanci'].datum <= do_klub) |
                       (pd.isna(do_klub))),
                    zkratka_klub,
                    inplace=True)

        self.nastav_dataframe(
            self.tbl['hlasovani_poslanci'],
            vyber=[
                'id_hlasovani',
                'nazev_dlouhy',
                'vysledek',  # základní informace o hlasování poslance 
                'id_poslanec',
                'id_osoba',
                'pred',
                'jmeno',
                'prijmeni',  # základní informace o poslanci
                'id_klub',
                'nazev_klub_cz',
                'zkratka_klub',  #
                'narozeni',
                'pohlavi',
                'pred',
                'za',
                'id_klub',
                'nazev_klub_cz',
                'zkratka_klub',
                'id_kraj',
                'nazev_kraj_cz',
                'zkratka_kraj',
                'id_kandidatka',
                'nazev_kandidatka_cz',
                'zkratka_kandidatka',
                'schuze',
                'cislo',
                'bod',
                'cas',
                'datum',
                'bod__KAT',
                'druh_hlasovani',
                'ma_zpochybneni',
                'je_zmatecne'
                'id_organ',
                'id_parlament',  # informace o PS
            ],
            odstran=[
                'vysledek__ORIG', 'pohlavi__ORIG', 'od_parlament',
                'do_parlament', 'web', 'ulice', 'obec', 'psc', 'telefon',
                'fax', 'psp_telefon', 'email', 'facebook', 'foto', 'zmena',
                'umrti', 'adresa', 'sirka', 'delka'
            ])

        log.debug("<-- HlasovaniPoslance")
Exemplo n.º 18
0
 def __init__(self, stahni=True, *args, **kwargs):
     log.debug("--> SchuzeBase")
     super().__init__(stahni=stahni, *args, **kwargs)
     if stahni == True:
         self.stahni_zip_data("schuze")
     log.debug("<-- SchuzeBase")
Exemplo n.º 19
0
    def __init__(self, *args, **kwargs):
        log.debug("--> Poslanci")

        super().__init__(*args, **kwargs)

        self.nacti_poslanci_pkgps()
        self.nacti_poslance()

        # Zúžení na dané volební období
        if self.volebni_obdobi != -1:
            self.tbl['poslanci'] = self.tbl['poslanci'][
                self.tbl['poslanci'].id_organ == self.snemovna.id_organ]

        # Připojení informace o osobě, např. jméno a příjmení
        suffix = "__osoby"
        self.tbl['poslanci'] = pd.merge(left=self.tbl['poslanci'],
                                        right=self.tbl['osoby'],
                                        on='id_osoba',
                                        suffixes=("", suffix),
                                        how='left')
        self.tbl['poslanci'] = self.drop_by_inconsistency(
            self.tbl['poslanci'], suffix, 0.1, 'poslanci', 'osoby')

        # Připoj informace o kanceláři
        suffix = "__poslanci_pkgps"
        self.tbl['poslanci'] = pd.merge(left=self.tbl['poslanci'],
                                        right=self.tbl['poslanci_pkgps'],
                                        on='id_poslanec',
                                        suffixes=("", suffix),
                                        how='left')
        self.drop_by_inconsistency(self.tbl['poslanci'],
                                   suffix,
                                   0.1,
                                   'poslanci',
                                   'poslanci_pkgps',
                                   inplace=True)

        # Připoj informace o kandidátce
        suffix = "__organy"
        self.tbl['poslanci'] = pd.merge(
            left=self.tbl['poslanci'],
            right=self.tbl['organy'][["id_organ", "nazev_organ_cz",
                                      "zkratka"]],
            left_on='id_kandidatka',
            right_on='id_organ',
            suffixes=("", suffix),
            how='left')
        self.tbl['poslanci'].drop(columns=['id_organ__organy'], inplace=True)
        self.tbl['poslanci'].rename(columns={
            'nazev_organ_cz': 'nazev_kandidatka_cz',
            'zkratka': 'zkratka_kandidatka'
        },
                                    inplace=True)
        self.drop_by_inconsistency(self.tbl['poslanci'],
                                   suffix,
                                   0.1,
                                   'poslanci',
                                   'organy',
                                   t1_on='id_organ',
                                   t2_on='id_kandidatka',
                                   inplace=True)
        self.meta.nastav_hodnotu(
            'nazev_kandidatka_cz', {
                "popis":
                'Název strany, za kterou poslanec kandidoval, viz Organy:nazev_organ_cz',
                'tabulka': 'df',
                'vlastni': True
            })
        self.meta.nastav_hodnotu(
            'zkratka_kandidatka', {
                "popis":
                'Zkratka strany, za kterou poslanec kandidoval, viz Organy:nazev_organ_cz',
                'tabulka': 'df',
                'vlastni': True
            })

        # Připoj informace o kraji
        suffix = "__organy"
        self.tbl['poslanci'] = pd.merge(
            left=self.tbl['poslanci'],
            right=self.tbl['organy'][["id_organ", "nazev_organ_cz",
                                      "zkratka"]],
            left_on='id_kraj',
            right_on='id_organ',
            suffixes=("", suffix),
            how='left')
        self.tbl['poslanci'].drop(columns=['id_organ__organy'], inplace=True)
        self.tbl['poslanci'].rename(columns={
            'nazev_organ_cz': 'nazev_kraj_cz',
            'zkratka': 'zkratka_kraj'
        },
                                    inplace=True)
        self.drop_by_inconsistency(self.tbl['poslanci'],
                                   suffix,
                                   0.1,
                                   'poslanci',
                                   'organy',
                                   t1_on='id_kraj',
                                   t2_on='id_organ',
                                   inplace=True)
        self.meta.nastav_hodnotu(
            'nazev_kraj_cz', {
                "popis":
                'Název kraje, za který poslanec kandidoval, viz Organy:nazev_organ_cz',
                'tabulka': 'df',
                'vlastni': True
            })
        self.meta.nastav_hodnotu(
            'zkratka_kraj', {
                "popis":
                'Zkratka kraje, za který poslanec kandidoval, viz Organy:nazev_organ_cz',
                'tabulka': 'df',
                'vlastni': True
            })

        # Pripoj data nastoupení do parlamentu, příp. odstoupení z parlamentu
        parlament = self.tbl['zarazeni_osoby'][
            (self.tbl['zarazeni_osoby'].id_osoba.isin(
                self.tbl['poslanci'].id_osoba))
            & (self.tbl['zarazeni_osoby'].nazev_typ_organ_cz == "Parlament") &
            (self.tbl['zarazeni_osoby'].cl_funkce == 'členství')].copy()
        #parlament = parlament.sort_values(['id_osoba', 'od_o']).groupby('id_osoba').tail(1).reset_index()
        parlament = parlament.sort_values(
            ['id_osoba', 'od_o']).groupby('id_osoba').tail(1).reset_index()
        parlament.rename(columns={
            'id_organ': 'id_parlament',
            'od_o': 'od_parlament',
            'do_o': 'do_parlament'
        },
                         inplace=True)
        self.tbl['poslanci'] = pd.merge(self.tbl['poslanci'],
                                        parlament[[
                                            'id_osoba', 'id_parlament',
                                            'od_parlament', 'do_parlament'
                                        ]],
                                        on='id_osoba',
                                        how="left")
        self.tbl['poslanci'] = self.drop_by_inconsistency(
            self.tbl['poslanci'], suffix, 0.1, 'poslanci', 'zarazeni_osoby')
        self.meta.nastav_hodnotu(
            'id_parlament', {
                "popis":
                'Identifikátor parlamentu, jehož byli poslanci členy, viz Organy:id_organ',
                'tabulka': 'df',
                'vlastni': True
            })
        self.meta.nastav_hodnotu(
            'od_parlament', {
                "popis":
                'Datum začátku zařazení poslanců do parlamentu, viz Organy:od_o',
                'tabulka': 'df',
                'vlastni': True
            })
        self.meta.nastav_hodnotu(
            'do_parlament', {
                "popis":
                'Datum konce zařazení poslanců do parlamentu, viz Organy:do_o',
                'tabulka': 'df',
                'vlastni': True
            })

        # Připoj informace o posledním poslaneckém klubu z 'zarazeni_osoby'.
        kluby = self.tbl['zarazeni_osoby'][
            (self.tbl['zarazeni_osoby'].id_osoba.isin(
                self.tbl['poslanci'].id_osoba))
            & (self.tbl['zarazeni_osoby'].nazev_typ_organ_cz == "Klub") &
            (self.tbl['zarazeni_osoby'].cl_funkce == 'členství')].copy()
        kluby = kluby.sort_values(
            ['id_osoba', 'od_o']).groupby('id_osoba').tail(1).reset_index()
        kluby.rename(columns={
            'id_organ': 'id_klub',
            'nazev_organ_cz': 'nazev_klub_cz',
            'zkratka': 'zkratka_klub',
            'od_o': 'od_klub',
            'do_o': 'do_klub'
        },
                     inplace=True)
        self.tbl['poslanci'] = pd.merge(self.tbl['poslanci'],
                                        kluby[[
                                            'id_osoba', 'id_klub',
                                            'nazev_klub_cz', 'zkratka_klub',
                                            'od_klub', 'do_klub'
                                        ]],
                                        on='id_osoba',
                                        how="left")
        self.tbl['poslanci'] = self.drop_by_inconsistency(
            self.tbl['poslanci'], suffix, 0.1, 'poslanci', 'zarazeni_osoby')
        self.meta.nastav_hodnotu(
            'id_klub', {
                "popis":
                'Identifikátor posledního klubu, do něhož byli poslanci zařazeni, viz Organy:id_organ',
                'tabulka': 'df',
                'vlastni': True
            })
        self.meta.nastav_hodnotu(
            'nazev_klub_cz', {
                "popis":
                'Název posledního klubu, do něhož byli poslanci zařazeni, viz Organy:nazev_organ_cz',
                'tabulka': 'df',
                'vlastni': True
            })
        self.meta.nastav_hodnotu(
            'zkratka_klub', {
                "popis":
                'Zkratka posledního klubu, do něhož byli poslanci zařazeni, viz Organy:zkratka',
                'tabulka': 'df',
                'vlastni': True
            })
        self.meta.nastav_hodnotu(
            'od_klub', {
                "popis":
                'Datum začátku zařazení poslanců do posledního klubu, viz Organy:od_o',
                'tabulka': 'df',
                'vlastni': True
            })
        self.meta.nastav_hodnotu(
            'do_klub', {
                "popis":
                'Datum konce zařazení poslanců do posledního klubu, viz Organy:do_o',
                'tabulka': 'df',
                'vlastni': True
            })

        self.nastav_dataframe(self.tbl['poslanci'], odstran=['pohlavi__ORIG'])

        log.debug("<-- Poslanci")
Exemplo n.º 20
0
    def __init__(self, *args, **kwargs):
        log.debug("--> ZarazeniOsoby")

        super().__init__(*args, **kwargs)

        self.nacti_zarazeni_osoby()

        # Připoj Osoby
        suffix = "__osoby"
        self.tbl['zarazeni_osoby'] = pd.merge(left=self.tbl['zarazeni_osoby'],
                                              right=self.tbl['osoby'],
                                              on='id_osoba',
                                              suffixes=("", suffix),
                                              how='left')
        self.tbl['zarazeni_osoby'] = self.drop_by_inconsistency(
            self.tbl['zarazeni_osoby'], suffix, 0.1, 'zarazeni_osoby', 'osoby')

        # Připoj Organy
        suffix = "__organy"
        sub1 = self.tbl['zarazeni_osoby'][self.tbl['zarazeni_osoby'].cl_funkce
                                          == 'členství'].reset_index()
        if self.volebni_obdobi == -1:
            m1 = pd.merge(left=sub1,
                          right=self.tbl['organy'],
                          left_on='id_of',
                          right_on='id_organ',
                          suffixes=("", suffix),
                          how='left')
        else:
            # Pozor, how='left' nestačí, 'inner' se podílí na zúžení na danou sněmovnu
            m1 = pd.merge(left=sub1,
                          right=self.tbl['organy'],
                          left_on='id_of',
                          right_on='id_organ',
                          suffixes=("", suffix),
                          how='inner')
        m1 = self.drop_by_inconsistency(m1, suffix, 0.1, 'zarazeni_osoby',
                                        'organy')

        # Připoj Funkce
        sub2 = self.tbl['zarazeni_osoby'][self.tbl['zarazeni_osoby'].cl_funkce
                                          == 'funkce'].reset_index()
        if self.volebni_obdobi == -1:
            m2 = pd.merge(left=sub2,
                          right=self.tbl['funkce'],
                          left_on='id_of',
                          right_on='id_funkce',
                          suffixes=("", suffix),
                          how='left')
        else:
            # Pozor, how='left' nestačí, 'inner' se podílí na zúžení na danou sněmovnu
            m2 = pd.merge(left=sub2,
                          right=self.tbl['funkce'],
                          left_on='id_of',
                          right_on='id_funkce',
                          suffixes=("", suffix),
                          how='inner')
        m2 = self.drop_by_inconsistency(m2, suffix, 0.1, 'zarazeni_osoby',
                                        'funkce')

        self.tbl['zarazeni_osoby'] = pd.concat(
            [m1, m2], axis=0,
            ignore_index=True).set_index('index').sort_index()

        # Zúžení na dané volební období
        self.vyber_platne_zarazeni_osoby()

        self.nastav_dataframe(self.tbl['zarazeni_osoby'])

        log.debug("<-- ZarazeniOsoby")
Exemplo n.º 21
0
    def __init__(self,
                 stahni=True,
                 limit=-1,
                 soubezne_stahovani_max=12,
                 soubezne_zpracovani_max=-1,
                 *args,
                 **kwargs):
        log.debug('--> StenoTexty')

        super().__init__(stahni=stahni, *args, **kwargs)

        self.parameters['limit'] = limit
        self.parameters['soubezne_stahovani_max'] = soubezne_stahovani_max
        self.parameters['soubezne_zpracovani_max'] = soubezne_zpracovani_max

        volebni_obdobi = self.volebni_obdobi
        if volebni_obdobi < 2010:
            log.warning(
                f"Pro volební období {volebni_obdobi} nebude stahování stenografických přepisů (StenoTextů) velmi pravděpodobně fungovat. Stahování dat funguje pro sněmovny mladší než volební období 2010 (včetně)."
            )

        log.info(
            f"Stahuji stenografické přepisy pro volební období {volebni_obdobi}. Proces může trvat v řádu desítek minut."
        )

        if stahni == True:
            self.stahni_steno_texty()

        self.nacti_steno_texty()

        # Doplneni recnika, který mluvil na konci minulého stenozáznamu (přetahujícího řečníka).
        # Přetahující řečník nemá v aktuálním stenozáznamu identifikátor, ale zpravidla (v 99% případů) byl zmíněn v některém z minulých stenozáznamů (turns).
        # Tento stenozáznam je nutné vyhledat a uložit jeho číslo ('id_turn_surrogate') a číslo řečníka ('id_rec_surrogate').
        # V joinu se 'steno_rec' se pak použije 'id_rec_surrogate' místo 'id_rec' a 'id_turn_surrogate' místo 'id_turn' pro získání informací o osobě etc.
        # Pozor: naopak informace o času proslovu jsou navázány na 'turn'.
        self.tbl['steno_texty'].loc[self.tbl['steno_texty'].id_rec.isna(),
                                    'turn_surrogate'] = np.nan
        self.tbl['steno_texty'].loc[
            ~self.tbl['steno_texty'].id_rec.isna(),
            'turn_surrogate'] = self.tbl['steno_texty'].turn
        self.tbl['steno_texty']['turn_surrogate'] = self.tbl[
            'steno_texty'].groupby("schuze")['turn_surrogate'].ffill().astype(
                'Int64')
        self.tbl['steno_texty']['id_rec_surrogate'] = self.tbl['steno_texty'][
            'id_rec']
        self.meta.nastav_hodnotu(
            'turn_surrogate',
            dict(
                popis=
                'Číslo stenozáznamu (turn), ve kterém byla nalezena identifikace řečníka.',
                tabulka='df',
                vlastni=True))

        self.tbl['steno_texty']['id_rec_surrogate'] = self.tbl[
            'steno_texty'].groupby(
                "schuze")['id_rec_surrogate'].ffill().astype('Int64')
        self.meta.nastav_hodnotu(
            'id_rec_surrogate',
            dict(
                popis=
                'Identifikace řečníka na základě zpětmého hledání v stenozáznamech (turn).',
                tabulka='df',
                vlastni=True))

        # připoj osobu ze steno_rec ... we simply add id_osoba to places where it's missing
        m = pd.merge(left=self.tbl['steno_texty'],
                     right=self.tbl['steno_rec'][[
                         'schuze', "turn", "aname", 'id_osoba'
                     ]],
                     left_on=["schuze", "turn_surrogate", "id_rec_surrogate"],
                     right_on=["schuze", "turn", "aname"],
                     how="left")
        ids = m[m.id_osoba_x.eq(m.id_osoba_y)].index
        ne_ids = set(m.index) - set(ids)
        assert m[m.index.isin(ne_ids) &
                 (~m.id_osoba_x.isna())].size / m[m.index.isin(
                     ne_ids)].size < 0.1  # This is a consistency sanity check
        m['id_osoba'] = m['id_osoba_y']
        m['turn'] = m['turn_x']
        self.tbl['steno_texty'] = m.drop(
            labels=['id_osoba_x', 'id_osoba_y', 'turn_y', 'turn_x', 'aname'],
            axis=1)

        # Merge steno_rec
        suffix = "__steno_rec"
        self.tbl['steno_texty'] = pd.merge(
            left=self.tbl['steno_texty'],
            right=self.tbl['steno_rec'],
            left_on=["schuze", "turn_surrogate", "id_rec_surrogate"],
            right_on=['schuze', 'turn', 'aname'],
            suffixes=("", suffix),
            how='left')
        self.tbl['steno_texty'] = self.tbl['steno_texty'].drop(
            labels=['turn__steno_rec'],
            axis=1)  # this inconsistency comes from the 'turn-fix'
        self.drop_by_inconsistency(self.tbl['steno_texty'],
                                   suffix,
                                   0.1,
                                   'steno_texty',
                                   'steno_rec',
                                   inplace=True)

        # Merge osoby
        suffix = "__osoby"
        self.tbl['steno_texty'] = pd.merge(left=self.tbl['steno_texty'],
                                           right=self.tbl['osoby'],
                                           on='id_osoba',
                                           suffixes=("", suffix),
                                           how='left')
        self.drop_by_inconsistency(self.tbl['steno_texty'],
                                   suffix,
                                   0.1,
                                   'steno_texty',
                                   'osoby',
                                   inplace=True)

        ## Merge zarazeni_osoby
        zarazeni_osoby = self.tbl['zarazeni_osoby']
        poslanci = zarazeni_osoby[
            (zarazeni_osoby.do_o.isna()) &
            (zarazeni_osoby.id_organ == self.snemovna.id_organ) &
            (zarazeni_osoby.cl_funkce == 'členství')]  # všichni poslanci
        strany = zarazeni_osoby[
            (zarazeni_osoby.id_osoba.isin(poslanci.id_osoba))
            & (zarazeni_osoby.nazev_typ_organ_cz == "Klub") &
            (zarazeni_osoby.do_o.isna()) &
            (zarazeni_osoby.cl_funkce == 'členství')]
        self.tbl['steno_texty'] = pd.merge(self.tbl['steno_texty'],
                                           strany[['id_osoba', 'zkratka']],
                                           on='id_osoba',
                                           how="left")

        ## Merge Strana
        organy = self.tbl['organy']
        snemovna_id = organy[organy.nazev_organ_cz ==
                             "Poslanecká sněmovna"].sort_values(
                                 by="id_organ").iloc[-1].id_organ
        snemovna_od = pd.to_datetime(
            organy[organy.id_organ ==
                   snemovna_id].iloc[0].od_organ)  #.tz_localize(self.tzn)
        snemovna_do = pd.to_datetime(
            organy[organy.id_organ ==
                   snemovna_id].iloc[0].do_organ)  #.tz_localize(self.tzn)

        snemovna_cond = (zarazeni_osoby.od_o >= snemovna_od) & (
            zarazeni_osoby.nazev_typ_organ_cz
            == "Klub") & (zarazeni_osoby.cl_funkce == 'členství')
        if pd.isnull(snemovna_do) == False:
            snemovna_cond = snemovna_cond | (zarazeni_osoby.do_o >=
                                             snemovna_do)
        s = zarazeni_osoby[snemovna_cond].groupby(
            'id_osoba').size().sort_values()
        prebehlici = s[s > 1]
        #print("prebehlici: ", prebehlici)

        for id_prebehlik in prebehlici.index:
            for idx, row in zarazeni_osoby[snemovna_cond & (
                    zarazeni_osoby.id_osoba == id_prebehlik)].iterrows():
                od, do, id_organ, zkratka = row['od_o'], row['do_o'], row[
                    'id_organ'], row['zkratka']
                #print(id_prebehlik, od, do, id_organ, zkratka)
                self.tbl['steno_texty'].zkratka.mask(
                    (self.tbl['steno_texty'].date >= od) &
                    (self.tbl['steno_texty'].date <= do) &
                    (self.tbl['steno_texty'].id_osoba == id_prebehlik),
                    zkratka,
                    inplace=True)

        to_drop = ['zmena']
        self.tbl['steno_texty'].drop(labels=to_drop, inplace=True, axis=1)

        self.nastav_dataframe(self.tbl['steno_texty'])

        log.debug('<-- StenoTexty')