1
resposta

Como suavizar linhas no matplot

Estou tentando fazer um comparativo de casos de covid com países. Estou concatenando em relação aos dias, algo comparando quantidade de casos no primeiro dia, no segundo dia e assim por diante sem usar a data. Porém, em um trecho as linhas sobem e descem, variam muito como um "zig zag". O que posso fazer para mudar isso?

Gráfico plotado

Meu data Frame: DataFrame

Minha função:

def desde1caso(data, paises, dias, situacao):

  covid = pd.DataFrame()

  for pais in paises:
    try:
      df = data.loc[data.Country==pais ,  :]
      df = df.groupby('Date').sum()[situacao].reset_index()
      df = df.drop("Date", axis=1)
      covid = pd.concat([covid, df], ignore_index=True, axis=1)
    except:
      print("Is not " + situacao + " in " + pais )
  
  covid.columns = paises

  return covid.head(dias)
  
 
paises_dias = desde1caso(covid, ['Brazil','Colombia', 'Chile', 'Peru',  'Venezuela', 'Argentina' ], 400, 'Confirmed')
paises_dias.plot(grid=True, figsize=(10,6));
1 resposta

Olá, Jardel! Tudo bem? Espero que sim!

Desde já peço desculpa pela demora em responder o seu tópico.

Uma maneira de suavizar as linhas é usando uma técnica chamada "média móvel". A média móvel é uma técnica estatística usada para suavizar dados de séries temporais. Ela funciona criando uma série de médias de diferentes subconjuntos do conjunto de dados completo.

No seu caso, você poderia aplicar a média móvel ao seu dataframe antes de plotar o gráfico. Aqui está um exemplo de como você pode fazer isso:

def desde1caso(data, paises, dias, situacao, window_size=7):

  covid = pd.DataFrame()

  for pais in paises:
    try:
      df = data.loc[data.Country==pais ,  :]
      df = df.groupby('Date').sum()[situacao].reset_index()
      df = df.drop("Date", axis=1)
      df = df.rolling(window=window_size).mean()  # Aplicando a média móvel
      covid = pd.concat([covid, df], ignore_index=True, axis=1)
    except:
      print("Is not " + situacao + " in " + pais )
  
  covid.columns = paises

  return covid.head(dias)
  
paises_dias = desde1caso(covid, ['Brazil','Colombia', 'Chile', 'Peru',  'Venezuela', 'Argentina' ], 400, 'Confirmed')
paises_dias.plot(grid=True, figsize=(10,6));

No exemplo acima, eu adicionei um novo argumento window_size à função desde1caso que define o tamanho da janela para a média móvel. Eu defini o valor padrão como 7, o que significa que a média móvel será calculada sobre uma janela de 7 dias. Você pode ajustar esse valor de acordo com suas necessidades.

Espero ter ajudado e bons estudos!

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