Pandas pct_change с данными, содержащими NaN, приводит к бессмысленным значениям

#python #pandas #dataframe #nan

#python #pandas #фрейм данных #nan

Вопрос:

Я очень смущен выводом функции pct_change, когда задействованы данные со значениями NaN. Первые несколько строк вывода в правом столбце верны — это дает процентное изменение в десятичной форме ячейки слева в столбце A относительно ячейки в столбце A двумя строками ранее. Но как только он достигает значений NaN в столбце A, вывод функции pct_change теряет смысл.

Например:

 Row 8: NaN is 50% greater than 2?

Row 9: NaN is 0% greater than 3? 

Row 11: 4 is 33% greater than NaN?

Row 12: 2 is 33% less than NaN?`
 

Основываясь на приведенной выше математике, кажется, что pct_change присваивает NaN значение «3». Это потому, что pct_change эффективно заполняет последнее значение, отличное от NaN? Не мог бы кто-нибудь, пожалуйста, объяснить логику здесь и почему это происходит?

 import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [2,1,3,1,4,5,2,3,np.nan,np.nan,np.nan,4,2,1,0,4]})
x = 2
df['pctchg_A'] = df['A'].pct_change(periods = x)

print(df.to_string())
 

Вот результат:

введите описание изображения здесь

Ответ №1:

Поведение соответствует ожиданиям. Вам нужно внимательно прочитать df.pct_change docs .

Согласно документам:

 fill_method: str, default ‘pad’
How to handle NAs before computing percent changes.
 

Здесь метод pad означает, что он будет forward-fill NaN принимать значения с ближайшим non-NaN значением.

Итак, если вы ffill or pad укажете свои NaN значения, вы поймете, что именно происходит. Проверьте это:

 In [3201]: df['padded_A'] = df['A'].fillna(method='pad')

In [3203]: df['pctchg_A'] = df['A'].pct_change(periods = x)

In [3204]: df
Out[3204]: 
      A  padded_A  pctchg_A
0   2.0       2.0       NaN
1   1.0       1.0       NaN
2   3.0       3.0  0.500000
3   1.0       1.0  0.000000
4   4.0       4.0  0.333333
5   5.0       5.0  4.000000
6   2.0       2.0 -0.500000
7   3.0       3.0 -0.400000
8   NaN       3.0  0.500000
9   NaN       3.0  0.000000
10  NaN       3.0  0.000000
11  4.0       4.0  0.333333
12  2.0       2.0 -0.333333
13  1.0       1.0 -0.750000
14  0.0       0.0 -1.000000
15  4.0       4.0  3.000000
 

Теперь вы можете сравнить padded_A значения pctchg_A и убедиться, что все работает так, как ожидалось.

Комментарии:

1. Спасибо — это имеет смысл. Я все еще учусь, и хотя я знаком с fillna, я не понял значения «pad». Просматривая документы, я вижу, что «pad» является методом по умолчанию — как я могу увидеть другие параметры для fill_method? Например, я бы предпочел, чтобы результат был просто «NaN» всякий раз, когда в вычислении из столбца A.

2. this Проверьте fillna .