Pandas - это гибкая библиотека, которая является неотъемлемой частью разработки кода специалистом по данным. Причиной популярности этой библиотеки в Python является ее мощная функция векторизации, при которой за один раз может выполняться весь массив. Это приводит к меньшему времени выполнения по сравнению с эквивалентной операцией с циклом. Кроме того, большинство команд в pandas довольно просты, и у pandas действительно хорошая документация с четкими примерами.
Несмотря на то, что у pandas есть много замечательных функций, которые позволяют обрабатывать миллионы строк данных, есть скрытые мины, о которых нам нужно знать, прежде чем вмешиваться и писать код.
Когда я впервые начал работать с этой библиотекой, я мало знал об этих препятствиях, которые легко проскользнуть, но могут привести к ошибке или неверным результатам. Поэтому я собрал эту статью, чтобы рассказать о некоторых возможных минах, на которые нам нужно обратить внимание, чтобы мы могли их очистить :)
Важность индексации
Имея дело с миллионами точек данных и особенно при выполнении операций с частью набора данных путем фильтрации, важно позаботиться о порядке индекса. Pandas используют индекс в качестве поиска и сопоставляют индекс для выполнения любой операции.
Но некоторые операции могут изменить индекс, и это полезно знать.
💣 Mine 1 - merge (): при объединении двух фреймов данных слияние pandas имеет качество сброса индекса. Это скрытое качество явно не показано в документации. Следовательно, всегда полезно быть осторожным с индексом результирующего фрейма данных, и если в случае, если мы хотим выполнить какие-либо операции (арифметические, агрегированные и т. Д.), Нам придется сохранить индекс старого фрейма данных и применить его к новому. Таким образом, мы можем устранить ошибку несоответствия индекса, которую будет довольно неприятно обнаружить, если мы имеем дело с 1000 строк кода и 100 миллионами данных.
💣 Mine 2 - Остерегайтесь предупреждений на основе индекса: библиотека Pandas по своей сути выдает предупреждение ⚠️, когда собирается изменить индекс фрейма данных при выполнении отфильтрованного поиска (операций, которые включить фильтрацию на основе .loc, .iloc). Всегда полезно полностью осознавать и понимать их, прежде чем переносить наш код в рабочую среду.
В качестве одного из таких примеров я недавно выполнял индексирование на основе логических значений и наткнулся на предупреждение UserWarning: логический ключ индекса переиндексирован для соответствия индексу фрейма данных. Вот пример индексации на основе логических значений
import pandas as pd df = pd.DataFrame(data={'values':[1,56,3,4,5,98,100]}) condition = (df.values > 10) df.loc[condition, 'marker'] = 'Yes'
Если индекс condition и df не совпадают, pandas попытается обработать это и даст нам предупреждение, чтобы убедиться, что наша логика кода верна.
Знать, когда использовать Inplace
💣 Mine 3 - Многие операции в пандах имеют этот внутренний параметр, называемый inplace, который может иметь значение True или False в зависимости от того, хотим ли мы изменения непосредственно в исходном фрейме данных или назначить изменения новому фрейму данных соответственно.
При установке inplace = True должны произойти следующие серии событий:
- Панды создают копию исходных данных
- Выполняет описанные вычисления, такие как удаление столбца, строки, dropna и т. Д.
- Присваивает результат исходным данным
- Удаляет копию
Несмотря на то, что на высоком уровне inplace = True кажется, что он не создает копию фрейма данных в памяти, он все же создает его для выполнения необходимых вычислений, как описано в потоке событий выше.
Кроме того, код становится труднее отлаживать, если панды выдают предупреждение ⚠️ SettingwithCopy, которое часто обязательно происходит, когда inplace включен.
Но в некоторых операциях inplace = True может сэкономить время вычислений. Следовательно, часто бывает полезно понять объем и объем набора данных, который мы используем, прежде чем использовать параметр inplace.
Дата и время неудач
Когда я впервые начал работать с пандами, мне было немного сложно работать с полем DateTime. Это связано с тем, что при работе с полем DateTime важно учитывать часовой пояс, и при выполнении любых арифметических операций с этим полем, таких как добавление часов / дней / месяцев, его необходимо сначала преобразовать в формат DateTime от целого числа, и в противном случае может возникнуть ошибка, на которую трудно было обратить внимание вначале 🤖
Была одна конкретная проблема, о которой я не мог получить много информации из Интернета. Я подробно расскажу о сценарии и о том, как я справился с инцидентом.
💣 Mine 4 - Фактическая постановка проблемы состоит в том, чтобы отфильтровать на основе условия и заполнить значения дат только в этих отфильтрованных строках. После завершения этой задачи я обнаружил, что некоторые значения даты в конкретном столбце datetime были числами. Целочисленные значения заполнялись спорадически, в том смысле, что некоторые строки имели правильные значения даты, а некоторые - числа. Когда я попытался найти эту проблему в Интернете, мне предложили преобразовать dtype результирующего столбца в DateTime. Но это не решило мою проблему.
Позже я понял, что проблема была в инициализации столбца. Поскольку я инициализировал столбец как
df['date_field'] = np.NaN
Вместо этого он должен быть инициализирован как
df['date_field'] = pd.NaT
Отсутствующие скобки
💣 Mine 5 - для некоторых команд pandas присуще указывать ()
, даже если функции не передаются аргументы. Если мы забудем указать скобки для этих функций, pandas не выдаст ошибок, а выведет немного странные результаты, которые могут сбивать с толку.
[IN] df.values.sample 1,56,3,4,5,98,100 [OUT] <bound method NDFrame.sample of 0 1 1 56 2 3 3 4 4 5 5 98 6 100
Вывод
Имея дело с огромным количеством данных с большим количеством несоответствий, всегда полезно полностью понять базовую логику кода, и если в случае, pandas выдает некоторые предупреждающие ошибки, полезно проверить, почему и как их удалить, прежде чем игнорировать.
Следовательно, на высоком уровне мы могли справляться с любыми неудачами, постепенно знакомясь с фреймворком 🤓