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

Utilização de interpolação em preenchimento

Gostaria de saber como posso preencher dados faltantes, já tendo um conhecimento prévio do comportamento dos dados.

Por exemplo: Estou medindo a trajetória de uma bola arremessada para cima, pela sua posição no tempo. Por algum motivo, não foi captado algumas posições. Sabendo que a bola possui uma trajetória descrita por um modelo físico, como faço para preencher esses dados faltantes, cumprindo a regra do modelo físico?

Obrigado!

6 respostas

Olá Martin tudo bem com você??

É possível efetuar o preenchimento através da média dos valores. Veja o exemplo a seguir:

In [27]: df 
Out[27]: 
          A         B         C
0 -0.166919  0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3       NaN -2.027325  1.533582
4       NaN       NaN  0.461821
5 -0.788073       NaN       NaN
6 -0.916080 -0.612343       NaN
7 -0.887858  1.033826       NaN
8  1.948430  1.025011 -2.982224
9  0.019698 -0.795876 -0.046431

In [28]: df.mean()
Out[28]: 
A   -0.151121
B   -0.231291
C   -0.530307
dtype: float64

In [29]: df.fillna(df.mean()) 
Out[29]: 
          A         B         C
0 -0.166919  0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3 -0.151121 -2.027325  1.533582
4 -0.151121 -0.231291  0.461821
5 -0.788073 -0.231291 -0.530307
6 -0.916080 -0.612343 -0.530307
7 -0.887858  1.033826 -0.530307
8  1.948430  1.025011 -2.982224
9  0.019698 -0.795876 -0.046431

Espero que tenha te ajudado e qualquer coisa é só retornar aqui!

Olá Victor! Tudo bem e você?

Então, a média é uma boa solução, pois é um tipo de função de aproximação por interpolação linear. Mas para alguns sistemas, esse tipo de aproximação é bastante grosseiro e seria rezoável utilizar em pequenos intervalos, somente. Acredito que eu tenha que usar alguma outra biblioteca para implementar a função que descreve o sistema, pra então preencher os valores faltantes.

Obrigado pela ajuda! :)

Sim eu entendo. Esta é uma opção pela constância e uma prática utilizada quando há dados faltantes. Outros preenchimentos seriam menos interessantes, como transformar os NaN ou Null em literalmente 0.0

Por isso a minha sugestão para o caso.

Uma opção seria fazer o cálculo literalmente na mão e adicionar o valor..mas dependendo da quantidade isso se tornaria inviável...

Espero ter te ajudado mesmo assim e qualquer coisa só voltar hehe

solução!

Olá Martin,

De função direta do pandas a mais próxima que eu conheço é a fillna com a média também que o Victor já explicou.

A solução então deve ser algo mais específico/manual como o Victor também falou, mas provavelmente pode ser feita com o pandas sem mais bibliotecas externas, dependendo muito dos dados que você tem e da fórmula e suas dependências que deve ser aplicada.

Segue um exemplo genérico que você pode tentar adaptar para o seu cenário:

# Exemplo simples com a função: y = -x² + 5x
import pandas as pd
import numpy as np

# Montagem dos dados iniciais
df = pd.DataFrame({
    'X': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'Y': [0, 4, np.nan, 6, np.nan, 0, np.nan, np.nan, -24, np.nan, -50]
})

# Função que aplica a fórmula definida
def funcao(x):
    # y = -x² + 5x
    return -(x ** 2) + (5 * x)

# Função a ser aplicada em cada linha do DataFrame para aplicar a fórmula caso necessário
def preenche(row):
    return funcao(row['X']) if pd.isnull(row['Y']) else row['Y']


df['Y'] = df.apply(preenche, axis=1)

Esse é um exemplo bem específico onde a gente tem uma coluna com o valor base, o código final vai depender muito do que você já tem de início.

Olá Lucas! Tudo bom?

Excelente Lucas! Muito obrigado!

Realmente, foge do alcance do fillna do Pandas.

Muito obrigado pela ajuda de vocês!

Sem problemas Martin! Sempre bom saber que a gente conseguiu ajudar.