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')
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")
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']) log.debug('<-- Schuze')
def __init__(self, *args, **kwargs): log.debug('--> StenoRecnici') super(StenoRecnici, self).__init__(*args, **kwargs) self.nacti_steno_recniky() # Merge steno suffix = "__steno" self.tbl['steno_recnici'] = pd.merge(left=self.tbl['steno_recnici'], right=self.tbl['steno'], on='id_steno', suffixes = ("", suffix), how='left') self.drop_by_inconsistency(self.tbl['steno_recnici'], suffix, 0.1, "steno_recnici", "steno", inplace=True) if self.volebni_obdobi != -1: self.tbl['steno_recnici'] = self.tbl['steno_recnici'][self.tbl['steno_recnici'].id_organ == self.snemovna.id_organ] # Merge osoby suffix = "__osoby" self.tbl['steno_recnici'] = pd.merge(left=self.tbl['steno_recnici'], right=self.tbl['osoby'], on='id_osoba', suffixes = ("", suffix), how='left') self.drop_by_inconsistency(self.tbl['steno_recnici'], suffix, 0.1, 'steno_rec', 'osoby', inplace=True) # Merge bod schuze #suffix = "__bod_schuze" #self.steno_rec = pd.merge(left=self.steno_rec, right=self.bod_schuze, on='id_bod', suffixes = ("", suffix), how='left') #self.steno_rec = self.drop_by_inconsistency(self.steno_rec, suffix, 0.1, 'steno_rec', 'bod_schuze') self.nastav_dataframe(self.tbl['steno_recnici']) log.debug('<-- StenoRecnici')
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') # Připoj Orgány suffix = "__organy" self.tbl['omluvy'] = pd.merge(left=self.tbl['omluvy'], right=self.tbl['organy'], on='id_organ', suffixes=("", suffix), how='left') self.tbl['omluvy'] = self.drop_by_inconsistency( self.tbl['omluvy'], suffix, 0.1, 'omluvy', 'organy') # Zúžení na volební období self.tbl['omluvy'] = self.tbl['omluvy'][( self.tbl['omluvy'].id_parlament == self.snemovna.id_organ)] self.nastav_dataframe(self.tbl['omluvy']) log.debug("<-- Omluvy")
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")
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")
def __init__(self, *args, **kwargs): log.debug('--> Steno') super().__init__(*args, **kwargs) self.nacti_steno() if self.volebni_obdobi != -1: self.tbl['steno'] = self.tbl['steno'][self.tbl['steno'].id_organ == self.snemovna.id_organ] self.nastav_dataframe(self.tbl['steno'])
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")
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)
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")
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")
def __init__(self, *args, **kwargs): log.debug('--> StenoBod') super().__init__(*args, **kwargs) self.nacti_steno_bod() # Merge steno suffix = "__steno" self.tbl['steno_bod'] = pd.merge(left=self.tbl['steno_bod'], right=self.tbl['steno'], on='id_steno', suffixes = ("", suffix), how='left') self.drop_by_inconsistency(self.tbl['steno_bod'], suffix, 0.1, "steno_bod", "steno") if self.volebni_obdobi != -1: self.tbl['steno_bod'] = self.tbl['steno_bod'][self.tbl['steno_bod'].id_organ == self.snemovna.id_organ] self.nastav_dataframe(self.tbl['steno_bod']) log.debug('<-- StenoBod')
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
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)
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")
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")
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', "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.volebni_obdobi = volebni_obdobi self.snemovna = None self.tzn = pytz.timezone('Europe/Prague') self.parameters = {} self.parameters['data_dir'] = data_dir log.debug("<-- SnemovnaDataFrame")
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 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_recnici'][['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_recnici suffix = "__steno_recnici" self.tbl['steno_texty'] = pd.merge(left=self.tbl['steno_texty'], right=self.tbl['steno_recnici'], 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_recnici'], axis=1) # this inconsistency comes from the 'turn-fix' self.drop_by_inconsistency(self.tbl['steno_texty'], suffix, 0.1, 'steno_texty', 'steno_recnici', 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')
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")
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")
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")
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']['je_zpochybneni'] = self.tbl[ 'hlasovani'].id_hlasovani.isin( self.tbl['zpochybneni'].id_hlasovani.unique()) self.meta.nastav_hodnotu( 'je_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)) suffix = '__hlasovani_vazba_stenozaznam' self.tbl['hlasovani'] = pd.merge( left=self.tbl['hlasovani'], right=self.tbl['hlasovani_vazba_stenozaznam'], on="id_hlasovani", how="left", suffixes=('', suffix)) self.drop_by_inconsistency(self.tbl['hlasovani'], suffix, 0.1, 'hlasovani', 'hlasovani_vazba_stenozaznam', inplace=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")
def __init__(self, *args, **kwargs): log.debug("--> HlasovaniPoslance") super().__init__(*args, **kwargs) self.nacti_hlasovani_poslance() # Připoj Poslance self.tbl['hlasovani_poslance'] = pd.merge( left=self.tbl['hlasovani_poslance'], right=self.tbl['poslanci'], on="id_poslanec", suffixes=("", "__poslanci"), how='left') self.drop_by_inconsistency(self.tbl['hlasovani_poslance'], "__poslanci", 0.1, 'hlasovani_poslance', 'poslanci', inplace=True) self.tbl['hlasovani_poslance'] = self.tbl['hlasovani_poslance'][ self.tbl['hlasovani_poslance'].id_parlament == self.snemovna.id_organ] # Připoj Hlasovani hlasovani_columns = [ 'id_hlasovani', 'schuze', 'cislo', 'bod', 'cas', 'nazev_dlouhy', 'datum', 'bod__KAT', 'druh_hlasovani', 'je_zpochybneni', 'je_zmatecne' ] self.tbl['hlasovani_poslance'] = pd.merge( left=self.tbl['hlasovani_poslance'], right=self.tbl['hlasovani'][hlasovani_columns], on="id_hlasovani", suffixes=("", "__hlasovani"), how='left') self.drop_by_inconsistency(self.tbl['hlasovani_poslance'], "__hlasovani", 0.1, 'hlasovani_poslance', 'hlasovani', 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['hlasovani_poslance'] = pd.merge( self.tbl['hlasovani_poslance'], strany[['id_osoba', 'zkratka']], on='id_osoba', how="left") ## Merge Strana zarazeni_osoby = self.tbl['zarazeni_osoby'] snemovna_od = self.snemovna.od_organ snemovna_do = self.snemovna.do_organ 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['hlasovani_poslance'].zkratka.mask( (self.tbl['hlasovani_poslance'].datum >= od) & (self.tbl['hlasovani_poslance'].datum <= do) & (self.tbl['hlasovani_poslance'].id_osoba == id_prebehlik), zkratka, inplace=True) self.nastav_dataframe(self.tbl['hlasovani_poslance'], vyber=[ 'id_hlasovani', 'nazev_dlouhy', 'vysledek', 'id_poslanec', 'id_osoba', 'pred', 'jmeno', 'prijmeni', 'za' ], 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")