Python: принять разницу журнала для каждого столбца в кадре данных - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть список фреймов данных, и я хотел бы взять журнал для каждого элемента в этих фреймах и найти первое различие. В эконометрике временных рядов эта процедура дает приблизительную скорость роста. Следующие коды

for i in [0, 1, 2, 5]:
    df1_list[i] = 100 * np.log(df_list[i]).diff() 

выдают ошибку

__main__:7: RuntimeWarning: divide by zero encountered in log
__main__:7: RuntimeWarning: invalid value encountered in log

Когда я смотрю на результат, многие из элементов результирующих кадров данных являются нан. Как я могу исправить коды? Спасибо !!

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Некоторые тестовые данные

df = pd.DataFrame(np.random.rand(5, 5))
df = df.mask(np.random.random(df.shape) < .1)
          0         1         2         3         4
0  0.579643  0.614592  0.333945  0.241791  0.426162
1  0.576076  0.841264  0.235148  0.577707  0.278260
2  0.735097  0.594789  0.640693  0.913639  0.620021
3  0.015446       NaN  0.062203  0.253076  0.042025
4  0.401775  0.522634  0.521139  0.032310       NaN

Применение вашего кода

for c in df:
    print(100 * np.log(df[c]).diff())

дает такой вывод (для c = 1):

0          NaN
1    31.394708
2   -34.670002
3          NaN
4          NaN

Вы можете удалить nans с помощью .dropna()

for c in df:
    print(100 * np.log(df[c].dropna()).diff())

, что дает (для c = 1)

0          NaN
1    31.394708
2   -34.670002
4   -12.932474

Как видите, мы "потеряли" одну строку как следствие .dropna() и ваш 0-й ряд всегда будет nan, так как нет никакой разницы.

Если вы заинтересованы в замене nans другими значениями, существуют различные методы, такие как fillna или вменение .

0 голосов
/ 15 апреля 2020

Проблема не в вашем коде, а в ваших данных. Вы получаете не ошибку, а два предупреждения. Наиболее вероятными причинами являются следующие типы значений в ваших фреймах данных:

  1. Нули
  2. Отрицательные числа
  3. Нечисловые значения

Логарифм любого из них просто не определен, поэтому вы получите NaN.

...