Pular para o conteúdo

    Capítulo 15, Básico

    Revisão: as 20 perguntas

    O curso original fecha com 20 perguntas de múltipla escolha. Aqui cada uma tem a resposta e o **motivo**, e uma célula de código que **prova** as 20 afirmações: se alguma estivesse errada, um `assert` falharia.

    As perguntas e as respostas

    #PerguntaRespostaOnde
    1s = pd.Series([10, 20, 30]); s[1] imprime...20: o rótulo 1 (índice padrão)Cap. 4
    2df[["salario"]] devolve...Um DataFrame com uma colunaCap. 7
    3Com índice padrão, quantas linhas df.loc[0:3] devolve?4 (o loc inclui o fim)Cap. 7
    4O que mostra os ausentes por coluna?df.isnull().sum()Cap. 9
    5O que preenche em vez de remover?fillna()Cap. 9
    6Melhor ferramenta para trocar valores por um dicionário?map()Cap. 11
    7O que há de errado em df[df["a"] > 1 and df["b"] > 3]?Falta usar & com parênteses em cada condiçãoCap. 8
    8astype(int) quebra com ausentes. A correção?pd.to_numeric(..., errors="coerce") (ou um tipo anulável)Cap. 10
    9Por que uma coluna criada com apply fica cheia de None?A função não tem returnCap. 11
    10Que método casa com qualquer valor de uma lista?isinCap. 8
    11Que método dá o salário médio por departamento?groupbyCap. 13
    12Quantas linhas df.iloc[0:5] devolve?5 (o iloc exclui o fim)Cap. 7
    13Com índice id_funcionario, o que df.iloc[0] devolve?A primeira linha física, qualquer que seja o rótuloCap. 7
    14O que faz o ~ em df[~(df["c"] == "x")]?Nega a condiçãoCap. 8
    15Por que o dropna() sem argumentos é perigoso?Uma coluna ruim apaga linhas boas das outrasCap. 9
    16O que o duplicated() compara por padrão?Todas as colunasCap. 10
    17Por que o to_numeric(coerce) é mais seguro que o astype(float)?Valores ruins viram NaN, e a execução continuaCap. 10
    18Qual lambda é válido?lambda x: "Alto" if x > 70000 else "Normal"Cap. 11
    19nlargest(5, c) contra sort_values(c).head(5)?O mesmo resultado, sem ordenar a coluna inteiraCap. 12
    20Por que resumo["departamento"] dá KeyError depois de um agg?O departamento virou o índiceCap. 13

    A prova

    basico/cap15_revisao.pylinhas 10 a 78
    import numpy as np
    import pandas as pd
    
    df = pd.read_csv("dados/funcionarios_15.csv")
    
    
    def levanta(excecao, funcao):
        try:
            funcao()
        except excecao:
            return True
        return False
    
    
    # 1 a 3
    assert pd.Series([10, 20, 30])[1] == 20
    assert isinstance(df[["salario"]], pd.DataFrame)
    assert len(df.loc[0:3]) == 4
    
    # 4 e 5
    assert df.isnull().sum().equals(df.isna().sum()) and int(df.isnull().sum()["cidade"]) == 2
    assert df["idade"].fillna(0).isna().sum() == 0 and len(df.dropna()) < len(df)
    
    # 6
    assert pd.Series(["a", "b"]).map({"a": "x", "b": "y"}).tolist() == ["x", "y"]
    
    # 7: o `and` do Python não funciona em uma Series
    assert levanta(ValueError, lambda: df[(df["experiencia"] > 3) and (df["nota_desempenho"] > 7)])
    
    # 8 e 17: astype(int) quebra, to_numeric(coerce) converte o que dá
    assert levanta(ValueError, lambda: df["idade"].astype(int))
    texto = pd.Series(["10", "abc", "30"])
    assert pd.to_numeric(texto, errors="coerce").tolist()[0] == 10 and pd.to_numeric(texto, errors="coerce").isna().sum() == 1
    
    
    # 9: sem return, tudo vira None
    def sem_return(x):
        if x > 3:
            "alto"
    
    
    assert df["experiencia"].apply(sem_return).isna().all()
    
    # 10 e 11
    assert df["departamento"].isin(["Engenharia", "RH"]).sum() == 5
    assert df.groupby("departamento")["experiencia"].mean().notna().all()
    
    # 12 e 13
    assert len(df.iloc[0:5]) == 5
    por_id = df.set_index("id_funcionario")
    assert por_id.iloc[0]["nome"] == "Ana Souza" and levanta(KeyError, lambda: por_id.loc[0])
    
    # 14
    assert (~(df["cidade"] == "Curitiba")).sum() == len(df) - 2
    
    # 15 e 16
    assert len(df.dropna()) == 9 and int(df.duplicated().sum()) == 0
    
    # 18
    assert (lambda x: "Alto" if x > 70000 else "Normal")(80000) == "Alto"
    
    # 19
    assert df.nlargest(5, "projetos_concluidos")["projetos_concluidos"].tolist() == \
        df.sort_values("projetos_concluidos", ascending=False).head(5)["projetos_concluidos"].tolist()
    
    # 20
    resumo = df.groupby("departamento").agg(media=("experiencia", "mean"))
    assert levanta(KeyError, lambda: resumo["departamento"]) and "departamento" in resumo.reset_index().columns
    print("as 20 respostas conferem")
    
    Saída
    as 20 respostas conferem
    

    Se você errou alguma pergunta, o melhor é voltar ao capítulo da última coluna da tabela, rodar o exemplo e mudar o código para ver o que acontece. Decorar a resposta não adianta: o que fica é ter visto o Pandas falhar.