differential_privacy_budget.../data.py
2026-08-28 16:57:17 -03:00

108 lines
2.9 KiB
Python

import pandas as pd
import numpy as np
file = "./data/pnad_trimestral_trimestre_012026.parquet"
regions_ufs = {
"Sul": [41, 42, 43],
"Sudeste": [31, 32, 33, 35],
"CentroOeste": [50, 51, 52, 53],
"Norte": [11, 12, 13, 14, 15, 16, 17],
"Nordeste": [21, 22, 23, 24, 25, 26, 27, 28, 29],
}
regions_names = list(regions_ufs.keys())
regions: dict[str, dict[str, float]] = {}
carteira_assinada = "V4029"
# carteira_assinada_opcoes = [1, # sim
# 2] # não
renda = "VD4019"
renda_norm = "VD4019_norm"
def clip_and_normalize(df: pd.DataFrame, c):
df = df.dropna(subset=[renda]).copy()
df[renda_norm] = df[renda].clip(0, c) / c
return df
def get_regions(df: pd.DataFrame, C: float):
for region_name in regions_names:
region_df = df[df["UF"].isin(regions_ufs[region_name])]
n_formal = (region_df[carteira_assinada] == 1).sum()
n_informal = (region_df[carteira_assinada] == 2).sum()
regions[region_name] = {
"informal_count": n_informal,
"informal_mean": region_df.loc[
region_df[carteira_assinada] == 2, renda_norm
].mean(),
"informal_std": region_df.loc[
region_df[carteira_assinada] == 2, renda_norm
].std(ddof=0),
"formal_count": n_formal,
"formal_mean": region_df.loc[
region_df[carteira_assinada] == 1, renda_norm
].mean(),
"formal_std": region_df.loc[
region_df[carteira_assinada] == 1, renda_norm
].std(ddof=0),
"sens_count": 1.0,
"sens_formal_mean": 1 / (n_formal - 1),
"sens_formal_std": 1 / np.sqrt(n_formal - 1),
"sens_informal_mean": 1 / (n_informal - 1),
"sens_informal_std": 1 / np.sqrt(n_informal - 1),
}
return regions
def get_Sta(regions):
groups = [
(region, formality)
for region in regions_names
for formality in ["formal", "informal"]
]
Sta = []
stat_kinds = ["count", "mean", "std"]
for region, formality in groups:
for stat_kind in stat_kinds:
Sta.append(regions[region][f"{formality}_{stat_kind}"])
return Sta
def get_Sen(regions):
groups = [
(region, formality)
for region in regions_names
for formality in ["formal", "informal"]
]
Sen = []
stat_kinds = ["count", "mean", "std"]
for region, formality in groups:
for stat_kind in stat_kinds:
if stat_kind == "count":
Sen.append(1.0)
continue
Sen.append(regions[region][f"sens_{formality}_{stat_kind}"])
return Sen
def main():
df = pd.read_parquet(file)
df = clip_and_normalize(df, 30_000)
regions = get_regions(df, 30_000)
Sta = get_Sta(regions)
print(len(Sta))
Sen = get_Sen(regions)
print(len(Sen))
if __name__ == "__main__":
main()