#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
.