Как избежать ошибки NameError: name 'unrate' is not defined?
Объясните, что делать, чтобы не вылезала такая ошибка: "NameError: name 'unrate' is not defined" в jupyter notebook?
Пишу код, сохраняю, закрываю файл с написанным кодом, завтра опять приступаю к писанию, открываю этот же файл, вылезает эта ошибка. Я нажимаю Kernel, далее restart&run all, ошибка исчезает.
Но если у меня много строк кода, и есть такие строки, которые нельзя дважды считать/перезапускать (допустим, исследую таблицу в 100 000 строк и использую Series.map), то что делать?
Ниже пример кода:
import matplotlib.pyplot as plt
import pandas as pd
unrate = pd.read_csv(r"/тропинка_к_коду/unrate.csv")
unrate['DATE'] = pd.to_datetime(unrate['DATE'])
unrate.head(12)
plt.plot(unrate["DATE"].head(12), unrate["VALUE"].head(12))
захожу на следующий день:
print(unrate)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-2-5844a0f8d885> in <module>
----> 1 print(unrate)
NameError: name 'unrate' is not defined
Если мне нужно продолжать исследовать датасет, я не могу этого сделать, jupyter notebook "не видит" эту таблицу. (для аналогии: пишу диплом в Microsoft Word, и каждый день дописываю новую главу, при этом уже написанные главы сохраняются, в jupyter notebook можно также с кодом?)
Ответы (2 шт):
Я так понимаю, у вас Jupyter Notebook и какая-то мешанина кода. Надо смотреть на ваш код, иначе можно только гадать. Например, можно предположить, что вы где-то используете переменную unrate, а потом делаете del unrate и если запускать ячейки подряд через run all, то всё ок - переменная создаётся и потом удаляется. А если вы потом уже запускаете отдельно какую-то ячейку или выполняете функцию, где используется эта переменная unrate (и она там была ещё не удалена когда вы делали run all) - вы видите ошибку, потому что у вас уже выполнилась инструкция del unrate и такой переменной в памяти больше нет.
Jupyter Notebook - очень коварная в этом плане штука, там очень сложно отследить последовательность выполнения кода и состояние переменных, если вы прыгаете по ячейкам и выполняете их не последовательно.
Я бы вам посоветовал после того как вы обработали данные и получили датасет, с которым вы хотите работать далее, сохранить этот готовый датасет в бинарном формате, например в формате Parquet, HDF5 или Pickle файла. Если вам нужно будет читать данные целиком из файла, то я бы выбрал Parquet - совместимый, поддерживает компрессию и один из наиболее быстрых форматов.
Установка:
conda install -n <your_py_environment_name> pyarrow python-snappy
Пример сохранения датасета:
df.to_parquet(r"c:\project\ds_ready.parquet")
Пример чтения датасета:
df2 = pd.read_parquet(r"c:\project\ds_ready.parquet")
Таким образом вы можете только лишь импортировать все необходимые модули и загрузить уже обработанные ранее данные из бинарного файла, вместо того, чтобы выполнять все ячейки Jupyter Notebook.
почему лучше хранить данные в бинарном, а не в текстовом виде?
При сохранении/загрузке данных в/из бинарного формата, данные о типах данных сохраняются и нам не нужна снова парсить данные и определять правильный тип данных, формат даты/времент и т.д. Кроме того бинарные форматы хранения данных поддерживают сжатие, что позволяет экономить место на диске и быстрее читать данные, т.к. распаковка данных в памяти часто работает гораздо быстрее по сравнению со чтением несжатых данных. Ещё некоторые бинарные форматы, например HDF5, поддерживают индексирование и чтение части данных по индексу - это позволяет хранить датасеты, которые не помещаются в памяти и читать и обрабатывать данные по частям (по индексу).