RuntimeWarning: недопустимое значение в журнале "" "Точка входа для запуска ядра I Python - PullRequest
0 голосов
/ 28 января 2020

У меня было это выражение: RuntimeWarning: недопустимое значение, обнаруженное в журнале "" "Точка входа для запуска ядра I Python.

при попытке этого:

IN1:

import numpy as np
import pandas as pd
from pandas_datareader import data as wb
import matplotlib.pyplot as plt

IN2:

tickers = ['BP', 'F', 'XOM', 'LNC', 'AAPL']

sec_data = pd.DataFrame()

for t in tickers:
    sec_data[t] = wb.DataReader(t, data_source='yahoo', start='2000-1-1')['Adj Close']

IN3:

sec_returns = np.log(sec_data / sec_data.shift(1))
sec_returns

OUT3:

                BP          F          XOM         LNC         AAPL
Date                    
2000-01-03     NaN         NaN         NaN         NaN         NaN
2000-01-04  -0.005328   -0.033984   -0.019340   -0.029223   -0.088078
2000-01-05  0.033616    0.003697    0.053082    -0.035209   0.014528
2000-01-06  0.002064    0.001230    0.050405    0.018136    -0.090514
2000-01-07  -0.018731   0.071119    -0.002939   0.025022    0.046281
... ... ... ... ... ...
2020-01-21  -0.011675   0.005444    -0.014397   -0.025472   -0.006800
2020-01-22  -0.011549   -0.005444   -0.005788   0.003241    0.003563
2020-01-23  0.008412    -0.002186   -0.006271   -0.006664   0.004804
2020-01-24  -0.001834   -0.015436   -0.006762   -0.030991   -0.002886
2020-01-27  -0.018262   -0.012297   -0.024112   -0.034176   -0.029846

5048 rows × 5 columns

C: \ Program Files \ Anaconda \ lib \ site-packages \ ipykernel_launcher.py: 1: RuntimeWarning: недопустимое значение в журнале "" "Точка входа для запуска ядра I Python.

Есть ли шанс избежать этого RuntimeWarning? Может это из-за отрицательных значений? Но они мне нужны.

PS - делаем это на windows 10, jupyter-notebook.

Ответы [ 3 ]

0 голосов
/ 28 января 2020

Почему в этом случае он работает без предупреждения RuntimeWarning?

IN1:

import numpy as np
from pandas_datareader import data as wb

IN2:

MSFT = wb.DataReader('MSFT', data_source='yahoo', start='1995-1-1')
MSFT

IN3:

MSFT['log_return'] = np.log(MSFT['Adj Close'] / MSFT['Adj Close'].shift(1))
MSFT['log_return']

OUT3:

Date
1995-01-03         NaN
1995-01-04    0.007243
1995-01-05   -0.016632
1995-01-06    0.016632
1995-01-09   -0.006205
                ...   
2020-01-22   -0.004816
2020-01-23    0.006137
2020-01-24   -0.010128
2020-01-27   -0.016865
2020-01-28    0.019769
Name: log_return, Length: 6312, dtype: float64
0 голосов
/ 04 апреля 2020

Почти наверняка проблема в данных, возвращаемых Yahoo. Имея ту же проблему, что и вы, я попробовал один и тот же код, используя (а) разные тикеры (что фактически вы сделали, индексируя только столбец MSFT) и (б) разные диапазоны дат, и в обоих случаях избегали проблема. До сих пор я не смог идентифицировать пример проблемы с данными, но когда я это сделаю, я опубликую.

PS В курсе уже упоминалось, что возвращаемые данные не всегда могут быть чистыми, но пока они есть. не говорил о методах смягчения!

РЕДАКТИРОВАТЬ: я забираю это. В диапазоне дат с 2007 по сегодняшний день вычисление лога завершается неудачно с ЛЮБЫМ списком тикеров с более чем двумя элементами (насколько я могу найти). Альтернативно, более длинный список тикеров с более коротким диапазоном дат будет успешным. Предлагает преодолеть какое-то ограничение, но, конечно, numpy и pandas предназначены для работы с массивами большего размера, чем это?

РЕДАКТИРОВАТЬ 2: Экспериментируя с различным количеством тикеров и диапазонами дат, казалось, что журнал ( ) операция выдаст предупреждение, если фрейм данных содержит более 8000 с чем-то ячеек. Чтобы устранить специфику источника данных Yahoo и библиотеки pandas_datareader, я написал следующее:

eles = 8192
cols = 2
arr = pd.DataFrame(np.arange(1, eles+1).reshape((int(eles/cols), cols)))
print(arr.head())
logarr = np.log(arr / arr.shift(1))
#logarr = arr / arr.shift(1)
#logarr = np.log(arr)
#logarr = np.log(arr / arr.add(3))
print(logarr.head())

Независимо от формы массива, выдается предупреждение, если число элементов превышает 8192. Закомментированные варианты не показывают эту проблему: это влияет только (насколько я нашел) на комбинацию numpy .log () и pandas .DataFrame.shift ().

8192, конечно , является степенью 2 (8192 = 2 ^ 13), так что это предполагает (для меня) ошибку или ограничение, влияющее на взаимодействие между numpy и pandas. Или я что-то упустил?

Конечно, это "просто" предупреждение. Возвращенный DataFrame кажется полным и пригодным для использования. Вы можете подавить его с помощью

import warnings
warnings.simplefilter(action='ignore', category=RuntimeWarning)
import pandas as pd

, хотя подавление предупреждений во время выполнения по всем направлениям заставило бы меня чувствовать себя довольно неловко

РЕДАКТИРОВАТЬ 3: После всего этого оказывается, что ответ на обновление numpy и pandas до последней версии (pandas: 1.0.3 и numpy: 1.18.2 в 2020-04-04). Doh. Есть важный урок!

0 голосов
/ 28 января 2020

Лог не определен для отрицательных значений, только для положительных. Вы просто не можете взять журнал отрицательного значения. Это не python проблема, это математическая задача.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...