human
I am working on the file "2017/05-naive-bayes/nb_abelardo_mota.ipynb".
The first task is:
Modelo utilizando frequência dos valores das features
Can you write Python code for it?
assistant
#Here is the Python code you requested.

# leitura do arquivo
df = pd.read_csv("carData.csv", header=None)

# índice das colunas de features
f_cols = list(range(0, 6))

# frequência de registros por classe
freq_classes = df.groupby(6).size()

# classes
classes = df[6].unique()

# probabilidade atribuída às combinações de feature/classe
#    que não possuem exemplos no dataset
DEFAULT_NO_FREQ_PROB = 0.01

def fit(df):
    # probabilidades estimadas como #(feature, classe)/#classe
    base_probs = {}

    # para cada feature
    for f_col in f_cols:

        # matriz de probabilidades da feature x classes
        #              agrupa pela classe e pela feature
        #              manda índice da feature para as colunas
        #              divide pela frequência das classes
        #              preenche os missing values(pares não presentes no dataset)
        base_probs[f_col] = df.groupby([6, f_col]).size()\
                         .unstack() \
                         .div(freq_classes, axis=0)\
                         .fillna(DEFAULT_NO_FREQ_PROB) 

    # função que realiza a predição sobre um dataset
    #    a partir das probabilidades estimadas no passo anterior
    def predict(ds):

        predictions = []
        probs = []
        # para cada exemplo
        for ix, row in ds.iterrows():
            prob = {}
            # para cada classe
            for classe in classes:
                # calcula a probabilidade do exemplo estar associado à classe
                prob[classe] = 1.
                # como o produto das probabilidades de cada uma de suas features pertencer à classe
                for f_col in f_cols:
                    prob[classe] = prob[classe] * base_probs[f_col].loc[classe, str(row[f_col])]
            
            predictions.append(max(prob.keys(), key=lambda key: prob[key]))
            probs.append(prob)

        return probs, predictions
    
    return predict

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

accs = []

for x in range(100):

    #...