Почти наверняка проблема в данных, возвращаемых 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. Есть важный урок!