Пример #1
0
def query_crif(df, select, db, chiave_indirizzo=None, feat_indirizzo=None):
    '''
    Funzione per recuperare info crif a partire da un indirizzo standard in un DataFrame
    '''

    aux = df.copy()
    aux.fillna('', inplace=True)
    aux[[feat_indirizzo['CAP']]] = aux[feat_indirizzo['CAP']].apply(
        lambda x: int(x) if '.' in str(x) else x)
    if chiave_indirizzo is None:
        assert feat_indirizzo, 'Specificare le colonne con le quali costruire l\'indirizzo'

    if chiave_indirizzo is None:
        aux['indirizzo_completo'] = aux.apply(lambda x: ','.join([
            str(x[feat_indirizzo['INDIRIZZO']]) + ' ' + str(x[feat_indirizzo[
                'CIVICO']]),
            str(x[feat_indirizzo['CITTA']]),
            str(x[feat_indirizzo['PROVINCIA']]),
            str(x[feat_indirizzo['CAP']]).zfill(5), 'ITALIA'
        ]),
                                              axis=1)

    aux['indirizzo_completo'] = aux['indirizzo_completo'].apply(
        lambda x: x.replace("\'", "\'\'"))

    ls_indirizzi = aux.indirizzo_completo.unique()
    # prendo le microzone
    qry_geo = '''
    SELECT address, microzona
    FROM public.id_cerved_crif
    WHERE address in {}
    '''

    qry_crif = '''
    select sezrid09, {}
    from public.crif_data
    where sezrid09 in {}
    '''

    ls_df_microzona = list()
    for chunk in grouper(ls_indirizzi, 1000, ''):
        tempqry = qry_geo.format(list_to_query(chunk))
        dfchunk = pd.read_sql(tempqry, db)
        ls_df_microzona.append(dfchunk)

    indirizzi_full = pd.concat(ls_df_microzona, axis=0, ignore_index=True)

    ls_microzona = [
        e for e in indirizzi_full.microzona.unique().tolist() if type(e) == str
    ]

    ls_df_crif = list()
    for chunk in grouper(ls_microzona, 100, ''):
        tempqry = qry_crif.format(', '.join(['"' + e + '"' for e in select]),
                                  list_to_query(chunk))
        dfchunk = pd.read_sql(tempqry, db)
        ls_df_crif.append(dfchunk)

    return pd.concat(ls_df_crif, axis=0, ignore_index=True)
Пример #2
0
def query_cerved(df, geokey, idkey, select, table, db, feat_indirizzo=None):
    '''
    Funzione per recuperare info crif a partire da un indirizzo standard in un DataFrame
    '''

    ls_microzona = df[geokey].dropna().unique().tolist()

    print('Abbiamo {} celle da cercare'.format(len(ls_microzona)))

    qry_cerved = '''
    select {p[chiave]}, {p[feat_select]}
    from {p[table]}
    where {p[chiave]} in {p[lista_chiavi]}
    '''

    ls_df_crif = list()
    for chunk in grouper(ls_microzona, 1000, ''):
        ls_qry = list_to_query(list(chunk))
        diz_qry = {
            'chiave': '"' + idkey + '"',
            'feat_select': ', '.join(['"' + e + '"' for e in select]),
            'table': table,
            'lista_chiavi': ls_qry
        }
        tempqry = qry_cerved.format(p=diz_qry)
        dfchunk = pd.read_sql(tempqry, db)
        ls_df_crif.append(dfchunk)

    return pd.concat(ls_df_crif, axis=0, ignore_index=True)
Пример #3
0
def iterate_over_list(db,
                      ls_valori,
                      chunksize=None,
                      table=None,
                      select=None,
                      filteriter=None,
                      qry=None,
                      verbose=True):
    '''
    Funzione per iterare grosse liste quando si estrae con un WHERE IN

    Parameters:
        * db: oggetto connessione db
        * ls_valori: lista dei valori usati per filtrare
        * table: stringa tabella
        * select: lista stringhe campi selezionati
        * filteriter: stringa campo dove si applica WHERE $campo IN
        * chunksize: numero di righe da prendere a iterazione
        * qry: stringa opzionale di query, se vogliamo inserirne una personalizzata

    result:
        * DataFrame con tabella risultante
    '''

    assert not (qry is None and not np.all([table, select, filteriter])
                ), "Non abbastanza parametri definiti"

    lenls = len(ls_valori)
    if chunksize is None:
        chunksize = int(lenls / 10)

    if qry is None:
        qry = "SELECT {} FROM {} WHERE {} IN {}"

        ls_df = list()
        for chunk in grouper(ls_valori, chunksize, ''):
            tempqry = qry.format(', '.join(select), table, filteriter, chunk)
            dfchunk = pd.read_sql(tempqry, db)
            ls_df.append(dfchunk)

    else:

        ls_df = list()
        c = 0
        for chunk in grouper(ls_valori, chunksize, ''):
            chunk = [e for e in chunk if e != '']
            tempqry = qry.format(list_to_query(chunk))
            dfchunk = pd.read_sql(tempqry, db)
            ls_df.append(dfchunk)

            c += chunksize
            if verbose:
                print("Ne abbiamo lavorati {} su {}".format(
                    min(c, lenls), lenls))

    res = pd.concat(ls_df, axis=0)

    return res
Пример #4
0
def query_indirizzi(df,
                    db,
                    geokey='microzona',
                    chiave_indirizzo=None,
                    feat_indirizzo=None):
    '''
    Funzione che restituisce una pd.DataFrame con indirizzo e microcella da usare come chiave per ulteriori query
    '''
    aux = df.copy()
    aux.fillna('', inplace=True)
    aux[[feat_indirizzo['CAP']]] = aux[feat_indirizzo['CAP']].apply(
        lambda x: int(x) if '.' in str(x) else x)
    if chiave_indirizzo is None:
        assert feat_indirizzo, 'Specificare le colonne con le quali costruire l\'indirizzo'

    if chiave_indirizzo is None:
        aux['indirizzo_completo'] = aux.apply(lambda x: ','.join([
            str(x[feat_indirizzo['INDIRIZZO']]) + ' ' + str(x[feat_indirizzo[
                'CIVICO']]),
            str(x[feat_indirizzo['CITTA']]),
            str(x[feat_indirizzo['PROVINCIA']]),
            str(x[feat_indirizzo['CAP']]).zfill(5), 'ITALIA'
        ]),
                                              axis=1)

    aux['indirizzo_completo'] = aux['indirizzo_completo'].apply(
        lambda x: x.replace("\'", "\'\'"))

    ls_indirizzi = aux.indirizzo_completo.unique()
    # prendo le microzone
    qry_geo = '''
    SELECT address, {}
    FROM public.id_cerved_crif
    WHERE address in {}
    '''

    ls_df_microzona = list()
    for chunk in grouper(ls_indirizzi, 1000, ''):
        tempqry = qry_geo.format(geokey, list_to_query(chunk))
        dfchunk = pd.read_sql(tempqry, db)
        ls_df_microzona.append(dfchunk)

    indirizzi_full = pd.concat(ls_df_microzona, axis=0, ignore_index=True)

    return indirizzi_full
Пример #5
0
def geo_loc_address(df,
                    db,
                    chiave_indirizzo=None,
                    feat_indirizzo=None,
                    chunksize=1000):

    aux = df.copy()
    aux.fillna('', inplace=True)
    aux[[feat_indirizzo['CAP']]] = aux[feat_indirizzo['CAP']].apply(
        lambda x: int(x) if '.' in str(x) else x)
    if chiave_indirizzo is None:
        assert feat_indirizzo, 'Specificare le colonne con le quali costruire l\'indirizzo'

    if chiave_indirizzo is None:
        aux['indirizzo_completo'] = aux.apply(lambda x: ','.join([
            str(x[feat_indirizzo['INDIRIZZO']]) + ' ' + str(x[feat_indirizzo[
                'CIVICO']]),
            str(x[feat_indirizzo['CITTA']]),
            str(x[feat_indirizzo['PROVINCIA']]),
            str(x[feat_indirizzo['CAP']]).zfill(5), 'ITALIA'
        ]),
                                              axis=1)

    aux['indirizzo_completo'] = aux['indirizzo_completo'].apply(
        lambda x: x.replace("\'", "\'\'"))

    ls_indirizzi = aux.indirizzo_completo.unique()

    qry_geo = '''
    SELECT address, lat, lng, source_precision
    FROM public.addresses
    WHERE address in {}
    '''

    ls_df_coord = list()
    for chunk in grouper(ls_indirizzi, chunksize, ''):
        tempqry = qry_geo.format(list_to_query(chunk))
        dfchunk = pd.read_sql(tempqry, db)
        ls_df_coord.append(dfchunk)

    res = pd.concat(ls_df_coord, axis=0, ignore_index=True)

    return res