1
resposta

[Dúvida] Desafio 4 Projeto 2 apresentando erro


dados_locatario.head()

dados_locatario['datas_combinadas_pagamento'] = pd.to_datetime(dados_locatario['datas_combinadas_pagamento'], format=('%d/%m/%Y'))
dados_locatario['datas_de_pagamento'] = pd.to_datetime(dados_locatario['datas_de_pagamento'], format=('%d/%m/%Y'))

dados_locatario['atraso'] = (dados_locatario['datas_de_pagamento'] - dados_locatario['datas_combinadas_pagamento']).dt.days
dados_locatario.head()

media_atraso = dados_locatario.groupby(['apartamento'])['atraso'].mean()

A linha media_atraso apresenta esse erro e não sei o que significa e como arrumar:

TypeError                                 Traceback (most recent call last)
/tmp/ipython-input-178-375047098.py in <cell line: 0>()
----> 1 media_atraso = dados_locatario.groupby(['apartamento'])['atraso'].mean()

11 frames
properties.pyx in pandas._libs.properties.CachedProperty.__get__()

properties.pyx in pandas._libs.properties.CachedProperty.__get__()

properties.pyx in pandas._libs.properties.CachedProperty.__get__()

/usr/local/lib/python3.11/dist-packages/pandas/core/algorithms.py in factorize_array(values, use_na_sentinel, size_hint, na_value, mask)
    593 
    594     table = hash_klass(size_hint or len(values))
--> 595     uniques, codes = table.factorize(
    596         values,
    597         na_sentinel=-1,

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.factorize()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable._unique()

TypeError: unhashable type: 'list'
1 resposta

Olá, Danilo, tudo bem?

O erro ocorre na linha media_atraso = dados_locatario.groupby(['apartamento'])['atraso'].mean() . Esse erro TypeError: unhashable type: 'list' , indica que a coluna apartamento ou atraso está com dados em formato de lista, e o Pandas não consegue agrupar por colunas que contenham listas (pois listas não são “hashables”).

No JSON usado na atividade, cada linha representa um apartamento com várias datas de pagamento armazenadas como listas. Por isso, é necessário “explodir” esses dados em várias linhas, uma para cada pagamento, antes de fazer os cálculos.

Tente adaptar o seu código assim:

df = pd.DataFrame(dados_json['dados_locacao'])

df = df.explode(['datas_combinadas_pagamento', 'datas_de_pagamento'])

df['datas_combinadas_pagamento'] = pd.to_datetime(df['datas_combinadas_pagamento'], format='%d/%m/%Y')
df['datas_de_pagamento'] = pd.to_datetime(df['datas_de_pagamento'], format='%d/%m/%Y')

df['atraso'] = (df['datas_de_pagamento'] - df['datas_combinadas_pagamento']).dt.days

media_atraso = df.groupby('apartamento')['atraso'].mean()

Destaco que na opinião do instrutor, a instrutora disponibilizou o notebook com a resolução. Lá você pode comparar o seu código e identificar as diferenças. Deixo abaixo também:

Espero ter ajudado.

Qualquer dúvida que surgir, compartilhe no fórum. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!