1
resposta

Melhoria na função de criação do gráfico.

Olá a todos!

Ultimamente nas aulas estou tendo o costume de prever passos e tentar fazer melhorias. Eu neste tópico quero mostrar uma melhoria na função criada pelo Instrutor Guilherme na aula de "Decompondo vendas" para criação de gráficos e também aproveitar e fazer algumas perguntas do meu micro-projetinho. Então vamos lá!

A minha ideia era criar um programa que insira informações através da função input(), para isso, peguei a função criada pelo professor e a acoplei dentro de uma nova função:

def plotar(dataset, x, y, titulo, labelx, labely):
  sns.set_palette('Accent')
  sns.set_style('darkgrid')
  alucar_g0 = sns.lineplot(x=x, y=y, data = dataset)
  alucar_g0.figure.set_size_inches(12,6)
  alucar_g0.set_title(titulo, loc='left', fontsize=18)
  alucar_g0.set_xlabel(labelx, fontsize = 14)
  alucar_g0.set_ylabel(labely,fontsize = 14)
  alucar_g0 = alucar_g0
  alucar_g0.figure
def dados(dataset, x=x, y=y, titulo=titulo, labelx=labelx, labely=labely):
   #dataset = object(input(f'Forneça o DataFrame: {}'))
  x = str(input(f'Forneça os dados para o eixo x: {x}'))
  y = str(input(f'Forneça os dados para o eixo y: {y}'))
  titulo = input(f'Nomeia o título do gráfico:{titulo}')
  labelx = input(f'Nomeia o eixo x do gráfico:{labelx}')
  labely = input(f'Nomeia o eixo y do gráfico:{labely}')
  plotar(dataset,x,y,labelx,labely,titulo)

O resultado final foi esse aqui:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Vamos as dúvidas e observações:

1. Eu tentei usar a função .format(), mas não tive sucesso. Eu vou persistir aqui depois de escrever este tópico.

2. Na minha função foi necessário colocar o parâmetro do dataset, pois não soube inserir com a função .input()

3. Teria como fazer a mesma função com menos linhas?

1 resposta

Olá André! Tudo bem com você?

Muito legal a sua iniciativa de tentar fazer melhorias nos códigos. Parabéns por isso!

Vamos analisar sua função.

Observe que, na declaração da sua função você está utilizando argumentos nomeados. Esses argumentos são utilizados quando queremos deixar algum valor padrão para aquele argumento, caso nenhum outro valor seja passado. Por exemplo, se temos a seguinte função com os parâmetros x e y:

def soma(x = 1, y = 1):
  """
  x e y são parâmetros nomeados
  ou seja, na falta deles o valor 1 será usado
  """
  return x + y;

Se chamarmos ela sem passar nenhum parâmetro:

soma()

Teremos como resultado o número 2, uma vez que, como não passamos parâmetros, os valores utilizados foram aqueles que definimos direto na função.

No caso da sua função, não é necessário ter esse tipo de parâmetro, uma vez que você vai solicitar todos os parâmetros necessários para sua função, dentro dela mesma. Algo que ficaria interessante de fazer, seria mostrar ao usuário, antes dele escolher os argumentos para o eixo x e y, quais as opções que ele tem disponível. Observe:

def dados(dataset):

  eixo_x = list(dataset.columns) # pegando os nomes das colunas
  eixo_y = list(dataset.columns) # pegando os nomes das colunas

  print(f'Valores disponíveis para o eixo x: {eixo_x}') # apresentando os nomes das colunas do dataset para o usuario
  x = input('Forneça os dados para o eixo x: ')

  eixo_y.remove(x) # removendo a coluna escolhida para o eixo x, para que o usuário perceba que ela já está sendo utilizada
  print(f'\nValores disponíveis para o eixo y: {eixo_y}')
  y = input('Forneça os dados para o eixo y: ')

  titulo = input('\nNomeia o título do gráfico: ') # titulo do grafico
  label_x = input('Nomeia o eixo x do gráfico: ') # titulo do eixo x
  label_y = input('Nomeia o eixo y do gráfico: ') # titulo do eixo y

  plotar(dataset, x, y, titulo, label_x, label_y)

dados(df)

Vamos fazer um teste dessa função utilizando o seguinte dataframe como exemplo:

MotorAnoQuilometragemZero_kmValor
JettaMotor 4.0 Turbo20190True88000
PassatMotor Diesel20035712False106000
CrossfoxMotor Diesel V8199137123False72000
DS5Motor Diesel20190True89000
FuscaMotor 1.61990120000False32000

Agora, utilizando a função mostrada anteriormente, vamos montar um gráfico que mostra a relação da coluna “Motor” e “Valor”:

Função mostrada anteriormente sendo executada em uma célula do google colab. Como argumento para essa função passamos o dataframe denominado df. O resultado da execução desta célula são os prints e inputs colocados na função. Onde são mostrados os nomes das colunas do dataframe e como input o usuário colocou: x = Motor e y = Valor. Abaixo dos prints encontra-se o gráfico resultante. Esse gráfico possui o eixo x com os nomes dos motores apresentados na coluna Motor do dataframe mostrado anteriormente, e no eixo y temos os valores da coluna Valor do mesmo dataframe. O gráfico é uma linha verde decrescente

Observe que, antes do usuário entrar com os dados de x e y, foram mostradas as opções que ele tem disponível.

Em relação ao método format() eu não consegui entender muito bem onde você deseja utilizá-lo. Mas caso seja em um print, um exemplo de seu uso seria assim:

print('\nValores disponíveis para o eixo y: {}'.format(eixo y))

De todo modo, ele funciona da mesma forma que o método de formatação “f-strings”. A diferença entre eles é que o f-strings é um método mais novo de formatação e um pouco mais sucinto :)

Sobre colocar o parâmetro dataset como input. Realmente é complicado pedir que o usuário passe todo o dataframe como uma entrada, mas o que você pode fazer é solicitar que ele entre com o caminho desse dataframe, e, por meio de algum método de leitura de arquivo, você acessaria esse dataset. Por exemplo

caminho_dataset = input('Informe o caminho para acessar o dataset: ')
dataset = pd.read_csv(caminho_dataset)

dataset

Testando essa função com um arquivo ‘frutas.csv’, temos:

Executando a função mostrada anteriormente. Nessa função o usuário entra com o caminho “frutas.csv” e obtem como resultado um dataframe com 3 linhas e 3 colunas. Onde temos como colunas: id, frutas e quantidade

Espero que isso te ajude. Qualquer dúvida me coloco a disposição para ajudar ^^

Bons estudos!