Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Erro ao executar o comando scatter

Gostaria de saber porque a execução do código

import matplotlib.pyplot as plt
plt.scatter(teste_x.horas_esperadas, teste_x.preco, c=teste_y)

está retornando os seguintes erros:

ValueError                                Traceback (most recent call last)
/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_axes.py in _parse_scatter_color_args(c, edgecolors, kwargs, xsize, get_next_color_func)
   4230             try:  # Is 'c' acceptable as PathCollection facecolors?
-> 4231                 colors = mcolors.to_rgba_array(c)
   4232             except ValueError:

9 frames
ValueError: Invalid RGBA argument: 'finalizado'

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_axes.py in _parse_scatter_color_args(c, edgecolors, kwargs, xsize, get_next_color_func)
   4236                 # severe failure => one may appreciate a verbose feedback.
   4237                 raise ValueError(
-> 4238                     f"'c' argument must be a color, a sequence of colors, or "
   4239                     f"a sequence of numbers, not {c}")
   4240             else:

ValueError: 'c' argument must be a color, a sequence of colors, or a sequence of numbers, not       finalizado
499            0
1149           1
870            1
1617           0
1896           1
...          ...
151            1
1357           1
295            0
1239           1
626            1

[540 rows x 1 columns]

Como eu posso resolver?

4 respostas

Olá Adriana.

O erro está dizendo que dentro da sua Series teste_y, que você passou com parâmetro c = teste_y, deveria apenas conter números, mas tem uma String que é a palavra "finalizado".

Isso está acontecendo porque o cabeçalho do DataFrame se misturou com a Series em algum momento.

Existem duas soluções:

Primeira reiniciar seu notebook e rodar todo o código novamente e ficar atenta se em algum momento a variável teste_y é alterada, porque na teoria ela só recebe valor nesse momento:

treino_x, teste_x, treino_y, teste_y = train_test_split(x, y, test_size = 0.25,
                                                         stratify = y)

A segunda solução menos recomendada seria remover a primeira linha da Series com o método drop:

teste_y = teste_y.drop(0)

Dessa maneira antes de você utilizar o teste_y você removeria essa 'sujeira' que em algum momento do código apareceu:

import matplotlib.pyplot as plt
teste_y = teste_y.drop(0)
plt.scatter(teste_x.horas_esperadas, teste_x.preco, c=teste_y)

Se for tentar a primeira solução, você me mandar o seu código e eu tento encontrar como você o momento em que a Series teste_y foi alterada, se estiver usando o Google Colab fica mais fácil porque ele tem um botão para compartilhar o seu notebook.

Fico no aguardo para saber se consegui te ajudar.

Bons Estudos.

Oi Igor,

O trecho de código plt.contourf(xx, yy, z, alpha=0.3) teste_y = teste_y.drop(0) plt.scatter(teste_x.horas_esperadas, teste_x.preco, c=teste_y, s=1) continua com o mesmo erro, mesmo o comando teste_y = teste_y.drop(0) tendo sido inserido. Além disso, tentei observar em todo o projeto onde a variável teste_y estaria sendo modificada, mas não encontrei. Troquei a minha seção de inicialização de variável pela seu trecho treino_x, teste_x, treino_y, teste_y = train_test_split(x, y, test_size = 0.25, stratify = y) mas o erro persistiu. Vc poderia me ajudar?

Tbm estou tentando compartilhar meu projeto com vc, mas não consigo pq não sei seu e-mail do gmail. Teria como vc me mandar?

Inseri um par de chaves a mais na declaração de y!

Agradeço!

solução!

Olá Adriana.

Encontrei o ponto no código que estava gerando o problema.

import numpy as np

x = dados[['horas_esperadas', 'preco']]
y = dados[['finalizado']]

Desse jeito o retorno de y é um DataFrame e precisamos que ele seja do tipo Series. Do jeito que está atualmente ele trás o cabeçalho junto, no caso a String finalizado na primeira linha.

print(type(dados[['finalizado']]))
print(type(dados['finalizado']))

<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.series.Series'>

Para resolver basta tirar as chaves uma das [ ], ficando assim:

import numpy as np

x = dados[['horas_esperadas', 'preco']]
y = dados['finalizado']

Acredito que isso vai resolver seu problema, se ficou com duvida não hesite em perguntar.

Bons Estudos.