Python очистить файл csv
Эта статья подробно покажет, как работать с файлами Excel и как изменять конкретные данные с Python.
Сначала мы узнаем, как работать с файлами CSV, чтение, запись и обновление их. Затем мы посмотрим, как читать файлы, отфильтровать их по листам, искать строки/столбцы и обновлять ячейки файлов XLSX.
Начнем с самых простых формата электронной таблицы: CSV.
8.2. Что делать?
Мы можем установить критерии для преобразования этих опечаток в правильные значения.
Например, если расстояние некоторого значения от слова toronto не превышает 2 буквы, мы преобразуем это значение в правильное – toronto .
Исправление найденных опечаток
Адреса – ужасная головная боль для всех аналитиков данных. Ведь мало кто следует стандартному формату, вводя свой адрес в базу данных.
9.2. Что делать?
Минимальное форматирование включает следующие операции:
- приведение всех символов к нижнему регистру;
- удаление пробелов в начале и конце строки;
- удаление точек;
- стандартизация формулировок: замена street на st , apartment на apt и т. д.
Теперь признак стал намного чище:
Стандартизация адресов
Мы сделали это! Это был долгий и трудный путь, но теперь все «грязные" данные очищены и готовы к анализу, а вы стали спецом по чистке данных ;)
У нас есть еще куча полезных статей по Data Science, например, среди недавних:
Или просто посмотрите тег Data Science.
Больше полезной информации вы можете получить на нашем телеграм-канале «Библиотека питониста». Рекомендуем также обратить внимание на учебный курс по Python от «Библиотеки программиста».
Эта библиотека пригодится, если вы хотите читать и редактировать файлы .xlsx, xlsm, xltx и xltm.
Установите openpyxl using pip. Общие рекомендации по установке этой библиотеки — сделать это в виртуальной среде Python без системных библиотек. Вы можете использовать виртуальную среду для создания изолированных сред Python: она создает папку, содержащую все необходимые файлы, для использования библиотек, которые потребуются для Python.
Перейдите в директорию, в которой находится ваш проект, и повторно активируйте виртуальную среду venv. Затем перейдите к установке openpyxl с помощью pip, чтобы убедиться, что вы можете читать и записывать с ним файлы:
Теперь, когда вы установили openpyxl, вы можете начать загрузку данных. Но что именно это за данные? Например, в книге с данными, которые вы пытаетесь получить на Python, есть следующие листы:
На первый взгляд, с этими объектами Worksheet мало что можно сделать. Однако, можно извлекать значения из определенных ячеек на листе книги, используя квадратные скобки [], к которым нужно передавать точную ячейку, из которой вы хотите получить значение.
Обратите внимание, это похоже на выбор, получение и индексирование массивов NumPy и Pandas DataFrames, но это еще не все, что нужно сделать, чтобы получить значение. Нужно еще добавить значение атрибута:
Помимо value, есть и другие атрибуты, которые можно использовать для проверки ячейки, а именно row, column и coordinate:
Атрибут row вернет 2;
Добавление атрибута column к “С” даст вам «B»;
coordinate вернет «B2».
Вы также можете получить значения ячеек с помощью функции cell (). Передайте аргументы row и column, добавьте значения к этим аргументам, которые соответствуют значениям ячейки, которые вы хотите получить, и, конечно же, не забудьте добавить атрибут value:
Обратите внимание: если вы не укажете значение атрибута value, вы получите , который ничего не говорит о значении, которое содержится в этой конкретной ячейке.
Вы используете цикл с помощью функции range (), чтобы помочь вам вывести значения строк, которые имеют значения в столбце 2. Если эти конкретные ячейки пусты, вы получите None.
Более того, существуют специальные функции, которые вы можете вызвать, чтобы получить другие значения, например get_column_letter () и column_index_from_string.
В двух функциях уже более или менее указано, что вы можете получить, используя их. Но лучше всего сделать их явными: пока вы можете получить букву прежнего столбца, можно сделать обратное или получить индекс столбца, перебирая букву за буквой. Как это работает:
Вы уже получили значения для строк, которые имеют значения в определенном столбце, но что нужно сделать, если нужно вывести строки файла, не сосредотачиваясь только на одном столбце?
Конечно, использовать другой цикл.
Обратите внимание, что выбор области очень похож на выбор, получение и индексирование списка и элементы NumPy, где вы также используете квадратные скобки и двоеточие чтобы указать область, из которой вы хотите получить значения. Кроме того, вышеприведенный цикл также хорошо использует атрибуты ячейки!
Чтобы визуализировать описанное выше, возможно, вы захотите проверить результат, который вернет вам завершенный цикл:
Наконец, есть некоторые атрибуты, которые вы можете использовать для проверки результата импорта, а именно max_row и max_column. Эти атрибуты, конечно, являются общими способами обеспечения правильной загрузки данных, но тем не менее в данном случае они могут и будут полезны.
Это все очень классно, но мы почти слышим, что вы сейчас думаете, что это ужасно трудный способ работать с файлами, особенно если нужно еще и управлять данными.
Должно быть что-то проще, не так ли? Всё так!
Openpyxl имеет поддержку Pandas DataFrames. И можно использовать функцию DataFrame () из пакета Pandas, чтобы поместить значения листа в DataFrame:
Затем вы можете начать управлять данными при помощи всех функций, которые есть в Pandas. Но помните, что вы находитесь в виртуальной среде, поэтому, если библиотека еще не подключена, вам нужно будет установить ее снова через pip.
Чтобы записать Pandas DataFrames обратно в файл Excel, можно использовать функцию dataframe_to_rows () из модуля utils:
Но это определенно не все! Библиотека openpyxl предлагает вам высокую гибкость в отношении того, как вы записываете свои данные в файлы Excel, изменяете стили ячеек или используете режим только для записи. Это делает ее одной из тех библиотек, которую вам точно необходимо знать, если вы часто работаете с электронными таблицами.
И не забудьте деактивировать виртуальную среду, когда закончите работу с данными!
Теперь давайте рассмотрим некоторые другие библиотеки, которые вы можете использовать для получения данных в электронной таблице на Python.
Готовы узнать больше?
Чтение и форматирование Excel файлов xlrd
Эта библиотека идеальна, если вы хотите читать данные и форматировать данные в файлах с расширением .xls или .xlsx.
Если вы не хотите рассматривать всю книгу, можно использовать такие функции, как sheet_by_name () или sheet_by_index (), чтобы извлекать листы, которые необходимо использовать в анализе.
Наконец, можно получить значения по определенным координатам, обозначенным индексами.
О том, как xlwt и xlutils, соотносятся с xlrd расскажем дальше.
Запись данных в Excel файл при помощи xlrd
Если нужно создать электронные таблицы, в которых есть данные, кроме библиотеки XlsxWriter можно использовать библиотеки xlwt. Xlwt идеально подходит для записи и форматирования данных в файлы с расширением .xls.
Когда вы вручную хотите записать в файл, это будет выглядеть так:
Если нужно записать данные в файл, то для минимизации ручного труда можно прибегнуть к циклу for. Это позволит немного автоматизировать процесс. Делаем скрипт, в котором создается книга, в которую добавляется лист. Далее указываем список со столбцами и со значениями, которые будут перенесены на рабочий лист.
Цикл for будет следить за тем, чтобы все значения попадали в файл: задаем, что с каждым элементом в диапазоне от 0 до 4 (5 не включено) мы собираемся производить действия. Будем заполнять значения строка за строкой. Для этого указываем row элемент, который будет “прыгать” в каждом цикле. А далее у нас следующий for цикл, который пройдется по столбцам листа. Задаем условие, что для каждой строки на листе смотрим на столбец и заполняем значение для каждого столбца в строке. Когда заполнили все столбцы строки значениями, переходим к следующей строке, пока не заполним все имеющиеся строки.
В качестве примера скриншот результирующего файла:
Теперь, когда вы видели, как xlrd и xlwt взаимодействуют вместе, пришло время посмотреть на библиотеку, которая тесно связана с этими двумя: xlutils.
Коллекция утилит xlutils
Эта библиотека в основном представляет собой набор утилит, для которых требуются как xlrd, так и xlwt. Включает в себя возможность копировать и изменять/фильтровать существующие файлы. Вообще говоря, оба этих случая подпадают теперь под openpyxl.
Использование pyexcel для чтения файлов .xls или .xlsx
Еще одна библиотека, которую можно использовать для чтения данных таблиц в Python — pyexcel. Это Python Wrapper, который предоставляет один API для чтения, обработки и записи данных в файлах .csv, .ods, .xls, .xlsx и .xlsm.
Чтобы получить данные в массиве, можно использовать функцию get_array (), которая содержится в пакете pyexcel:
Однако, если вы хотите вернуть в словарь двумерные массивы или, иными словами, получить все листы книги в одном словаре, стоит использовать функцию get_book_dict ().
Имейте в виду, что обе упомянутые структуры данных, массивы и словари вашей электронной таблицы, позволяют создавать DataFrames ваших данных с помощью pd.DataFrame (). Это упростит обработку ваших данных!
Наконец, вы можете просто получить записи с pyexcel благодаря функции get_records (). Просто передайте аргумент file_name функции и обратно получите список словарей:
Записи файлов при помощи pyexcel
Так же, как загрузить данные в массивы с помощью этого пакета, можно также легко экспортировать массивы обратно в электронную таблицу. Для этого используется функция save_as () с передачей массива и имени целевого файла в аргумент dest_file_name:
Обратите внимание: если указать разделитель, то можно добавить аргумент dest_delimiter и передать символ, который хотите использовать, в качестве разделителя между “”.
Однако, если у вас есть словарь, нужно будет использовать функцию save_book_as (). Передайте двумерный словарь в bookdict и укажите имя файла, и все ОК:
Помните, что когда используете код, который напечатан в фрагменте кода выше, порядок данных в словаре не будет сохранен!
Чтение и запись .csv файлов
Если вы все еще ищете библиотеки, которые позволяют загружать и записывать данные в CSV-файлы, кроме Pandas, рекомендуем библиотеку csv:
Обратите внимание, что NumPy имеет функцию genfromtxt (), которая позволяет загружать данные, содержащиеся в CSV-файлах в массивах, которые затем можно помещать в DataFrames.
Финальная проверка данных
Когда данные подготовлены, не забудьте последний шаг: проверьте правильность загрузки данных. Если вы поместили свои данные в DataFrame, вы можете легко и быстро проверить, был ли импорт успешным, выполнив следующие команды:
Note: Используйте DataCamp Pandas Cheat Sheet, когда вы планируете загружать файлы в виде Pandas DataFrames.
Если данные в массиве, вы можете проверить его, используя следующие атрибуты массива: shape, ndim, dtype и т.д.:
Поздравляем, теперь вы знаете, как читать файлы Excel в Python :) Но импорт данных — это только начало рабочего процесса в области данных. Когда у вас есть данные из электронных таблиц в вашей среде, вы можете сосредоточиться на том, что действительно важно: на анализе данных.
Если вы хотите глубже погрузиться в тему — знакомьтесь с PyXll, которая позволяет записывать функции в Python и вызывать их в Excel.
Есть несколько больших файлов csv, порядка 1,5-2 гигабайт. Необходимо эти файлы распарсить и обработать. Чем лучше всего пользоваться? Какими библиотеками?
- Вопрос задан более трёх лет назад
- 351 просмотр
Простой 2 комментария
распарсить - прочитать значения
обработать - произвести вычисления
sim3x, ну уже давно тут сидим, ну к чему вопросы?)))
Чем не нравится pandas - при указании на csv - он читает его сразу и полностью, что занимает оперативную память ровно столько, сколько и "вес" файла.
Вариант с чанками мне подходит думаю. Простая обработка файла(просто нужные столбцы выделил в отдельный массив) в 1 гигабайт у меня заняла 40 секунд. хороший результат
помимо pandas, как указал Хомон, можно использовать numpy.
в некоторых случаях, работа в нампи может оказаться значительно быстрее, чем в пандас.
Также имейте в виду, что датафреймы в пандас - это в принципе медленная штука, поэтому если будет необходимость часто строить запросы а-ля sql, то можно поднять локальный postgresql и производить эти операции там.
Локальный postgres поднят, так как до этого через него и несколькими селектами\апдейтами\инсертами как раз и вычислял нужные мне значения. хотел как раз уйти от этого и сделать обработку на питоне.
Заметил, вам не хочется загружать весь файл в память.
С помощью numpy.genfromtxt и параметра usecols вы сможете прочитать только необходимые вам столбцы. Индексация с 0, пример использования: usecols = (1, 4, 5) извлечет второй, пятый и шестой столбцы. Это пример из официальных доков, ссылка в моем первом комментарии.
Протестировал. один и тот же файл обработал 2мя способами. с помощью pandas, как предложили выше, и с помощью numpy. Из файла в 1 гигабайт мне нужно было 5 столбцов выделить в отдельный массив, чтобы дальше работать с ним. pandas выдал 40 секунд, а numpy(по вашей рекомендации с usecols) 10 минут. разница очевидна.
Обновление файлов CSV
Чтобы обновить этот файл, вы должны создать новую функцию с именем Updater это займет всего один параметр под названием Имя файла Отказ
Эта функция сначала открывает файл, определенный в Имя файла Переменная, а затем сохраняет все данные, которые он читает из файла внутри переменной с именем ReadData Отказ Второй шаг – это сложный код новое значение и поместить его вместо старого в ReadData [0] [‘Рейтинг’] должность.
Последний шаг в функции – это позвонить писатель Функция, добавив новый параметр Обновить Это скажет функцию, которую вы выполняете обновление.
Для писатель Чтобы работать с новым параметром, вам нужно добавить новый параметр везде писатель определено. Вернитесь на место, где вы впервые назвали писатель Функция и добавить «Написать» как новый параметр:
Чуть ниже писательской функции позвоните Updater и пройти Имя файла Параметр в него:
Теперь вам нужно изменить писатель Функция, чтобы сделать новый параметр с именем Опция :
Отныне мы ожидаем получить два разных варианта для писатель Функция ( Написать и обновить ). Из-за этого мы должны добавить два приложения, чтобы поддержать эту новую функциональность. Первая часть Функция под «если вариант уже известна вам. Вам просто нужно добавить» Элиф Вариант: Раздел кода и еще Часть так же, как они написаны ниже:
Браво! Вы готовы!
Теперь ваш код должен выглядеть что-то подобное:
Вы также можете найти код здесь:
В первой части этой статьи мы видели, как работать с файлами CSV. Мы создали и обновили один такой файл.
2.1.4. Другие методы
Для обнаружения выбросов можно использовать другие методы, например, построение точечной диаграммы, z-оценку или кластеризацию. В этом руководстве они не рассматриваются.
2.1.3. Столбчатая диаграмма
Для категориальных признаков можно построить столбчатую диаграмму – для визуализации данных о категориях и их распределении.
Например, распределение признака ecology вполне равномерно и допустимо. Но если существует категория только с одним значением "другое" , то это будет выброс.
outlier_barchart.py Построение столбчатой диаграммы для обнаружения выбросов
8.1. Как обнаружить?
Для обнаружения опечаток требуется особый подход. В нашем наборе данных о недвижимости опечаток нет, поэтому для примера создадим новый набор. В нем будет признак city , а его значениями будут torontoo и tronto . В обоих случаях это опечатки, а правильное значение – toronto .
Простой способ идентификации подобных элементов – нечеткая логика или редактирование расстояния. Суть этого метода заключается в измерении количества букв (расстояния), которые нам нужно изменить, чтобы из одного слова получить другое.
Предположим, нам известно, что в признаке city должно находиться одно из четырех значений: toronto , vancouver , montreal или calgary . Мы вычисляем расстояние между всеми значениями и словом toronto (и vancouver ).
Те слова, в которых содержатся опечатки, имеют меньшее расстояние с правильным словом, так как отличаются всего на пару букв.
fuzzy_logic_distance.py Вычисление расстояния между словами для обнаружения опечаток
9.1. Как обнаружить?
Проще предположить, что проблема разных форматов адреса точно существует. Даже если визуально вы не обнаружили беспорядка в этом признаке, все равно стоит стандартизировать их для надежности.
В нашем наборе данных по соображениям конфиденциальности отсутствует признак адреса, поэтому создадим новый набор df_add_ex :
Признак адреса здесь загрязнен:
Значения адреса
Написание файлов CSV
Сначала откройте новый файл Python и импортируйте модуль Python CSV.
CSV модуль
Модуль CSV включает в себя все необходимые методы, встроенные в. К ним относятся:
- CSV.Reader.
- csv.writer.
- csv.dictreader
- csv.dictwriter.
- и другие
В этом руководстве мы собираемся сосредоточиться на методах писателя, DictWriter и Dictreader. Они позволяют редактировать, изменять и манипулировать данными, хранящимися в файле CSV.
На первом шаге нам нужно определить имя файла и сохранить его как переменную. Мы должны сделать то же самое с заголовком и информацией о данных.
Теперь нам нужно создать функцию с именем писатель Это примет три параметра: Заголовок , данные и Имя файла Отказ
Следующий шаг – изменить писатель Функция, поэтому она создает файл, который содержит данные из Заголовок и данные Переменные. Это сделано путем написания первого ряда из Заголовок переменная, а затем писать четыре ряда из данные Переменная (есть четыре ряда, потому что в списке есть четыре кортежи).
И VUILà! Вы создали свой первый файл CSV с именем IMDB_TOP_4.csv. Откройте этот файл с предпочтительным приложением электронной таблицы, и вы должны увидеть что-то вроде этого:
Результатом может быть написан так, если вы решите открыть файл в каком-то другом приложении:
3.1. Как обнаружить?
Составим список признаков, у которых более 95% строк содержат одно и то же значение.
Теперь можно последовательно перебрать их и определить, несут ли они полезную информацию.
Список признаков с высоким процентом одинаковых значений
1.1.1. Тепловая карта пропущенных значений
Когда признаков в наборе не очень много, визуализируйте пропущенные значения с помощью тепловой карты.
Приведенная ниже карта демонстрирует паттерн пропущенных значений для первых 30 признаков набора. По горизонтальной оси расположены признаки, по вертикальной – количество записей/строк. Желтый цвет соответствует пропускам данных.
Заметно, например, что признак life_sq имеет довольно много пустых строк, а признак floor – напротив, всего парочку – около 7000 строки.
Карта отсутствующих данных
5.2. Что делать с дубликатами?
Очевидно, что повторяющиеся записи нам не нужны, значит, их нужно исключить из набора.
Вот так выглядит удаление дубликатов, основанное на наборе ключевых признаков:
В результате новый набор df_dedupped2 стал короче на 16 записей.
Результат отбрасывания дубликатов записей
Большая проблема очистки данных – разные форматы записей. Для корректной работы модели важно, чтобы набор данных соответствовал определенным стандартам – необходимо тщательное исследование с учетом специфики самих данных. Мы рассмотрим четыре самых распространенных несогласованности:
- Разные регистры символов.
- Разные форматы данных (например, даты).
- Опечатки в значениях категориальных признаков.
- Адреса.
Непоследовательное использование разных регистров в категориальных значениях является очень распространенной ошибкой, которая может существенно повлиять на анализ данных.
Часть 2 – файл XLSX
В течение нескольких выходных я работал над этим проектом. Я начал работать над этим, потому что в моем компании была необходима необходимость решения. Моя первая идея состояла в том, чтобы построить это решение непосредственно в системе моей компании, но тогда мне не было бы ничего писать, а?
Я создаю это решение с помощью Python 3 и openpyxl библиотека. Причина, почему я выбрал openpyxl Это потому, что он представляет собой полное решение для создания рабочих листов, загрузки, обновления, переименования и удаления их. Это также позволяет нам читать или записывать на строки и столбцы, слияние или сердечных ячеек или создавать графики Excel Python и т. Д.
6.1. Как обнаружить?
Давайте посмотрим на признак sub_area :
В нем содержатся названия населенных пунктов. Все выглядит вполне стандартизированным:
Записи с разным регистром символов
Но если в какой-то записи вместо Poselenie Sosenskoe окажется poselenie sosenskoe , они будут расценены как два разных значения.
1.2.1. Отбрасывание записей
Первая техника в статистике называется методом удаления по списку и заключается в простом отбрасывании записи, содержащей пропущенные значения. Это решение подходит только в том случае, если недостающие данные не являются информативными.
Для отбрасывания можно использовать и другие критерии. Например, из гистограммы, построенной в предыдущем разделе, мы узнали, что лишь небольшое количество строк содержат более 35 пропусков. Мы можем создать новый набор данных df_less_missing_rows , в котором отбросим эти строки.
Opternyxl терминология и основная информация
- Рабочая тетрадь – это имя для файла Excel в OutonPyXL.
- Рабочая тетрадь состоит из листов (по умолчанию 1 лист). Листы ссылаются на их имена.
- Лист состоит из строк (горизонтальные линии), начиная с номера 1 и колонн (вертикальные линии), начиная с буквы А.
- Ряды и колонны приводят к сетке и образуют клетки, которые могут содержать некоторые данные (числовое или строковое значение) или формулы.
Первый шаг – открыть свою среду Python и установить openpyxl В вашем терминале:
Далее импорт openpyxl в ваш проект, а затем загрузить рабочую книгу в Thefile Переменная.
Как видите, этот код печатает все листы по их именам. Затем он выбирает лист, который называется «клиентами 1» и сохраняет его к CurrentSheet Переменная. В последней строке код печатает значение, которое находится в положении B4 «Клиенты 1» листа.
Этот код работает как следует, но это очень сложно закодировано. Чтобы сделать эту динамику, мы напишем код, который будет:
- Прочитайте файл
- Получить все имена листов
- Петли через все листы
- На последнем шаге код будет печатать значения, которые расположены в полях B4 каждого найденного листа внутри рабочей книги.
Это лучше, чем раньше, но он все еще является жестким кодированным решением, и он по-прежнему предполагает ценность, которую вы будете искать в камере B4, что просто глупо:)
Я ожидаю, что ваш проект должен будет найти все листы в файле Excel для конкретного значения. Для этого мы добавим еще один для цикла в диапазоне «ABCDEF», а затем просто печатайте имена ячейки и их значения.
Мы сделали это, введя « за ряд в ассортименте .. » петля. Диапазон циклов для цикла определен из ячейки в строке 1 к максимальному количеству листа или рядами. Второй для поиска петли в пределах предопределенных имен столбцов « abcdef ». Во второй цикле мы отобразим полное положение ячейки (имя столбца и номер строки) и значение.
Однако в этой статье моя задача – найти определенный столбец, который называется «Телефон», а затем пройти все строки этого столбца. Для этого нам нужно изменить код, как ниже.
Этот модифицированный код проходит через все ячейки каждого листа, и, как до того, как перед динамическим диапазоном строки и диапазон колонны специфичен. Кодовые петли через ячейки и ищут клетку, которая удерживает текст «телефон». После того, как код найдет определенную ячейку, он уведомляет пользователя, в котором находится текст текста. Код делает это для каждой ячейки внутри всех листов, которые находятся в файле Excel.
Следующим шагом является пройти через все строки этого определенного столбца и значения печати.
Это сделано путем добавления функции с именем get_column_letter Это находит букву столбца. После того, как буква столбца найдена, мы проходим все строки этого определенного столбца. Это делается с get_all_values_by_cell_letter Функция, которая будет распечатать все значения этих ячеек.
1.1. Как обнаружить?
Рассмотрим три метода обнаружения отсутствующих данных в наборе.
Dialects and Formatting Parameters¶
To make it easier to specify the format of input and output records, specific formatting parameters are grouped together into dialects. A dialect is a subclass of the Dialect class having a set of specific methods and a single validate() method. When creating reader or writer objects, the programmer can specify a string or a subclass of the Dialect class as the dialect parameter. In addition to, or instead of, the dialect parameter, the programmer can also specify individual formatting parameters, which have the same names as the attributes defined below for the Dialect class.
Dialects support the following attributes:
A one-character string used to separate fields. It defaults to ',' .
Controls how instances of quotechar appearing inside a field should themselves be quoted. When True , the character is doubled. When False , the escapechar is used as a prefix to the quotechar. It defaults to True .
On output, if doublequote is False and no escapechar is set, Error is raised if a quotechar is found in a field.
A one-character string used by the writer to escape the delimiter if quoting is set to QUOTE_NONE and the quotechar if doublequote is False . On reading, the escapechar removes any special meaning from the following character. It defaults to None , which disables escaping.
The string used to terminate lines produced by the writer . It defaults to '\r\n' .
The reader is hard-coded to recognise either '\r' or '\n' as end-of-line, and ignores lineterminator. This behavior may change in the future.
A one-character string used to quote fields containing special characters, such as the delimiter or quotechar, or which contain new-line characters. It defaults to '"' .
Controls when quotes should be generated by the writer and recognised by the reader. It can take on any of the QUOTE_* constants (see section Module Contents ) and defaults to QUOTE_MINIMAL .
When True , whitespace immediately following the delimiter is ignored. The default is False .
When True , raise exception Error on bad CSV input. The default is False .
Writer Objects¶
Writer objects ( DictWriter instances and objects returned by the writer() function) have the following public methods. A row must be an iterable of strings or numbers for Writer objects and a dictionary mapping fieldnames to strings or numbers (by passing them through str() first) for DictWriter objects. Note that complex numbers are written out surrounded by parens. This may cause some problems for other programs which read CSV files (assuming they support complex numbers at all).
csvwriter. writerow ( row ) ¶
Write the row parameter to the writer’s file object, formatted according to the current Dialect . Return the return value of the call to the write method of the underlying file object.
Changed in version 3.5: Added support of arbitrary iterables.
Write all elements in rows (an iterable of row objects as described above) to the writer’s file object, formatted according to the current dialect.
Writer objects have the following public attribute:
A read-only description of the dialect in use by the writer.
DictWriter objects have the following public method:
Write a row with the field names (as specified in the constructor) to the writer’s file object, formatted according to the current dialect. Return the return value of the csvwriter.writerow() call used internally.
New in version 3.2.
Changed in version 3.8: writeheader() now also returns the value returned by the csvwriter.writerow() method it uses internally.
2.1.2. Описательная статистика
Отклонения численных признаков могут быть слишком четкими, чтобы не визуализироваться коробчатой диаграммой. Вместо этого можно проанализировать их описательную статистику.
Например, для признака life_sq видно, что максимальное значение равно 7478, в то время как 75% квартиль равен только 43. Значение 7478 – выброс.
outlier_describe.py
Examples¶
The simplest example of reading a CSV file:
Reading a file with an alternate format:
The corresponding simplest possible writing example is:
Since open() is used to open a CSV file for reading, the file will by default be decoded into unicode using the system default encoding (see locale.getpreferredencoding() ). To decode a file using a different encoding, use the encoding argument of open:
The same applies to writing in something other than the system default encoding: specify the encoding argument when opening the output file.
Registering a new dialect:
A slightly more advanced use of the reader — catching and reporting errors:
And while the module doesn’t directly support parsing strings, it can easily be done:
If newline='' is not specified, newlines embedded inside quoted fields will not be interpreted correctly, and on platforms that use \r\n linendings on write an extra \r will be added. It should always be safe to specify newline='' , since the csv module does its own ( universal ) newline handling.
Прежде чем передать набор данных ML-модели, его нужно очистить: обработать пропуски, дубликаты, выбросы. Как это сделать, не потеряв важную информацию, – в этом посте.
Ни одна модель машинного обучения не выдаст осмысленных результатов, если вы предоставите ей сырые данные. После формирования выборки данных их необходимо очистить.
Очистка данных – это процесс обнаружения и исправления (или удаления) поврежденных или неточных записей из набора записей, таблицы или базы данных. Процесс включает в себя выявление неполных, неправильных, неточных или несущественных данных, а затем замену, изменение или удаление «загрязненных» данных.
Определение очень длинное и не очень понятное :(
Чтобы детально во всем разобраться, мы разбили это определение на составные части и создали пошаговый гайд по очистке данных на Python. Здесь мы разберем методы поиска и исправления:
- отсутствующих данных;
- нетипичных данных – выбросов;
- неинформативных данных – дубликатов;
- несогласованных данных – одних и тех же данных, представленных в разных регистрах или форматах.
Для работы с данными мы использовали Jupyter Notebook и библиотеку Pandas.
Базой для наших экспериментов послужит набор данных по ценам на жилье в России, найденный на Kaggle. Мы не станем очищать всю базу целиком, но разберем на ее основе главные методы и операции.
Прежде чем переходить к процессу очистки, всегда нужно представлять исходный датасет. Давайте быстро взглянем на сами данные:
Этот код покажет нам, что набор данных состоит из 30471 строки и 292 столбцов. Мы увидим, являются ли эти столбцы числовыми или категориальными признаками.
Теперь мы можем пробежаться по чек-листу «грязных» типов данных и очистить их один за другим.
Работа с отсутствующими значениями – одна из самых сложных, но и самых распространенных проблем очистки. Большинство моделей не предполагают пропусков.
Reader Objects¶
Reader objects ( DictReader instances and objects returned by the reader() function) have the following public methods:
Return the next row of the reader’s iterable object as a list (if the object was returned from reader() ) or a dict (if it is a DictReader instance), parsed according to the current Dialect . Usually you should call this as next(reader) .
Reader objects have the following public attributes:
A read-only description of the dialect in use by the parser.
The number of lines read from the source iterator. This is not the same as the number of records returned, as records can span multiple lines.
DictReader objects have the following public attribute:
If not passed as a parameter when creating the object, this attribute is initialized upon first access or when the first record is read from the file.
1.2.2. Отбрасывание признаков
Как и предыдущая техника, отбрасывание признаков может применяться только для неинформативных признаков.
В процентном списке, построенном ранее, мы увидели, что признак hospital_beds_raion имеет высокий процент недостающих значений – 47%. Мы можем полностью отказаться от этого признака:
1.2. Что делать с пропущенными значениями?
Не существует общих решений для проблемы отсутствующих данных. Для каждого конкретного набора приходится искать наиболее подходящие методы или их комбинации.
Разберем четыре самых распространенных техники. Они помогут в простых ситуациях, но, скорее всего, придется проявить творческий подход и поискать нетривиальные решения, например, промоделировать пропуски.
1.1.3. Гистограмма пропущенных данных
Еще одна хорошая техника визуализации для наборов с большим количеством признаков – построение гистограммы для числа отсутствующих значений в записи.
Отсюда понятно, что из 30 тыс. записей более 6 тыс. строк не имеют ни одного пропущенного значения, а еще около 4 тыс.– всего одно. Такие строки можно использовать в качестве «эталонных» для проверки различных гипотез по дополнению данных.
Гистограмма пропущенных значений
7.1. Как обнаружить?
Признак timestamp представляет собой строку, хотя является датой:
string_to_datetime1.py
2.1.1. Гистограмма/коробчатая диаграмма
Если признак численный, можно построить гистограмму или коробчатую диаграмму (ящик с усами). Посмотрим на примере уже знакомого нам признака life_sq .
Из-за возможных выбросов данные выглядят сильно искаженными.
Построение гистограммы для обнаружения выбросов
Чтобы изучить особенность поближе, построим коробчатую диаграмму.
Видим, что есть выброс со значением более 7000.
Построение коробчатой диаграммы для обнаружения выбросов
1.2.4. Замена недостающих значений
Можно использовать некоторый дефолтный плейсхолдер для пропусков, например, новую категорию _MISSING_ для категориальных признаков или число -999 для числовых.
Таким образом, мы сохраняем данные о пропущенных значениях, что тоже может быть ценной информацией.
Выбросы – это данные, которые существенно отличаются от других наблюдений. Они могут соответствовать реальным отклонениям, но могут быть и просто ошибками.
Часть 1 – файл CSV
Файл CSV – это файл значений, разделенных запятыми, где простые текстовые данные отображаются в табличном формате. Их можно использовать с любой программой электронной таблицы, такой как Microsoft Office Excel, Google Teversshies или LibreOffice Calc.
Файлы CSV не похожи на другие файлы электронных таблиц, потому что они не позволяют вам сохранять ячейки, столбцы, строки или формулы. Их ограничение состоит в том, что они также позволяют только один лист на файл. Мой план для этой первой части статьи – показать вам, как создавать файлы CSV, используя Python 3 и стандартный библиотечный модуль CSV.
Этот учебник закончится двумя репозиториями GitHUB и встроенное веб-приложение, которое фактически использует код второй части этого урока (но обновляется и модифицирован для определенной цели).
Часть 1 – файл CSV
Файл CSV – это файл значений, разделенных запятыми, где простые текстовые данные отображаются в табличном формате. Их можно использовать с любой программой электронной таблицы, такой как Microsoft Office Excel, Google Teversshies или LibreOffice Calc.
Файлы CSV не похожи на другие файлы электронных таблиц, потому что они не позволяют вам сохранять ячейки, столбцы, строки или формулы. Их ограничение состоит в том, что они также позволяют только один лист на файл. Мой план для этой первой части статьи – показать вам, как создавать файлы CSV, используя Python 3 и стандартный библиотечный модуль CSV.
Этот учебник закончится двумя репозиториями GitHUB и встроенное веб-приложение, которое фактически использует код второй части этого урока (но обновляется и модифицирован для определенной цели).
2.1. Как обнаружить выбросы?
Для численных и категориальных признаков используются разные методы изучения распределения, позволяющие обнаружить выбросы.
6.2. Что делать?
Эта проблема легко решается принудительным изменением регистра:
string_lower_case2.py Приведение всех символов к нижнему регистру
Ряд данных в наборе находится не в том формате, с которым нам было бы удобно работать. Например, даты, записанные в виде строки, следует преобразовать в формат DateTime .
7.2. Что же делать?
Чтобы было проще анализировать транзакции по годам и месяцам, значения признака timestamp следует преобразовать в удобный формат:
string_to_datetime2.py Преобразование строк в даты
Опечатки в значениях категориальных признаков приводят к таким же проблемам, как и разные регистры символов.
Обертывание
Бюстгальтер Gьорт! Там много, что вы можете сделать после этого. Мой план состоял в том, чтобы построить онлайн-приложение, которое стандартизирует все шведские телефонные номера, взятые из текстового поля и предлагают пользователям возможность просто скопировать результаты из того же текстового поля. Второй шаг моего плана состоял в том, чтобы расширить функциональность веб-приложения для поддержки загруженности файлов Excel, обработки телефонных номеров внутри этих файлов (стандартизация их в шведский формат) и предлагая обработанные файлы обратно к пользователям.
The so-called CSV (Comma Separated Values) format is the most common import and export format for spreadsheets and databases. CSV format was used for many years prior to attempts to describe the format in a standardized way in RFC 4180. The lack of a well-defined standard means that subtle differences often exist in the data produced and consumed by different applications. These differences can make it annoying to process CSV files from multiple sources. Still, while the delimiters and quoting characters vary, the overall format is similar enough that it is possible to write a single module which can efficiently manipulate such data, hiding the details of reading and writing the data from the programmer.
The csv module implements classes to read and write tabular data in CSV format. It allows programmers to say, “write this data in the format preferred by Excel,” or “read data from this file which was generated by Excel,” without knowing the precise details of the CSV format used by Excel. Programmers can also describe the CSV formats understood by other applications or define their own special-purpose CSV formats.
The csv module’s reader and writer objects read and write sequences. Programmers can also read and write data in dictionary form using the DictReader and DictWriter classes.
The Python Enhancement Proposal which proposed this addition to Python.
Module Contents¶
The csv module defines the following functions:
csv. reader ( csvfile , dialect = 'excel' , ** fmtparams ) ¶
Return a reader object which will iterate over lines in the given csvfile. csvfile can be any object which supports the iterator protocol and returns a string each time its __next__() method is called — file objects and list objects are both suitable. If csvfile is a file object, it should be opened with newline='' . 1 An optional dialect parameter can be given which is used to define a set of parameters specific to a particular CSV dialect. It may be an instance of a subclass of the Dialect class or one of the strings returned by the list_dialects() function. The other optional fmtparams keyword arguments can be given to override individual formatting parameters in the current dialect. For full details about the dialect and formatting parameters, see section Dialects and Formatting Parameters .
Each row read from the csv file is returned as a list of strings. No automatic data type conversion is performed unless the QUOTE_NONNUMERIC format option is specified (in which case unquoted fields are transformed into floats).
A short usage example:
Return a writer object responsible for converting the user’s data into delimited strings on the given file-like object. csvfile can be any object with a write() method. If csvfile is a file object, it should be opened with newline='' 1. An optional dialect parameter can be given which is used to define a set of parameters specific to a particular CSV dialect. It may be an instance of a subclass of the Dialect class or one of the strings returned by the list_dialects() function. The other optional fmtparams keyword arguments can be given to override individual formatting parameters in the current dialect. For full details about dialects and formatting parameters, see the Dialects and Formatting Parameters section. To make it as easy as possible to interface with modules which implement the DB API, the value None is written as the empty string. While this isn’t a reversible transformation, it makes it easier to dump SQL NULL data values to CSV files without preprocessing the data returned from a cursor.fetch* call. All other non-string data are stringified with str() before being written.
A short usage example:
Associate dialect with name. name must be a string. The dialect can be specified either by passing a sub-class of Dialect , or by fmtparams keyword arguments, or both, with keyword arguments overriding parameters of the dialect. For full details about dialects and formatting parameters, see section Dialects and Formatting Parameters .
csv. unregister_dialect ( name ) ¶
Delete the dialect associated with name from the dialect registry. An Error is raised if name is not a registered dialect name.
csv. get_dialect ( name ) ¶
Return the dialect associated with name. An Error is raised if name is not a registered dialect name. This function returns an immutable Dialect .
Return the names of all registered dialects.
csv. field_size_limit ( [ new_limit ] ) ¶
Returns the current maximum field size allowed by the parser. If new_limit is given, this becomes the new limit.
The csv module defines the following classes:
class csv. DictReader ( f , fieldnames = None , restkey = None , restval = None , dialect = 'excel' , * args , ** kwds ) ¶
Create an object that operates like a regular reader but maps the information in each row to a dict whose keys are given by the optional fieldnames parameter.
The fieldnames parameter is a sequence . If fieldnames is omitted, the values in the first row of file f will be used as the fieldnames. Regardless of how the fieldnames are determined, the dictionary preserves their original ordering.
If a row has more fields than fieldnames, the remaining data is put in a list and stored with the fieldname specified by restkey (which defaults to None ). If a non-blank row has fewer fields than fieldnames, the missing values are filled-in with the value of restval (which defaults to None ).
All other optional or keyword arguments are passed to the underlying reader instance.
Changed in version 3.6: Returned rows are now of type OrderedDict .
Changed in version 3.8: Returned rows are now of type dict .
A short usage example:
class csv. DictWriter ( f , fieldnames , restval = '' , extrasaction = 'raise' , dialect = 'excel' , * args , ** kwds ) ¶
Create an object which operates like a regular writer but maps dictionaries onto output rows. The fieldnames parameter is a sequence of keys that identify the order in which values in the dictionary passed to the writerow() method are written to file f. The optional restval parameter specifies the value to be written if the dictionary is missing a key in fieldnames. If the dictionary passed to the writerow() method contains a key not found in fieldnames, the optional extrasaction parameter indicates what action to take. If it is set to 'raise' , the default value, a ValueError is raised. If it is set to 'ignore' , extra values in the dictionary are ignored. Any other optional or keyword arguments are passed to the underlying writer instance.
Note that unlike the DictReader class, the fieldnames parameter of the DictWriter class is not optional.
A short usage example:
The Dialect class is a container class whose attributes contain information for how to handle doublequotes, whitespace, delimiters, etc. Due to the lack of a strict CSV specification, different applications produce subtly different CSV data. Dialect instances define how reader and writer instances behave.
All available Dialect names are returned by list_dialects() , and they can be registered with specific reader and writer classes through their initializer ( __init__ ) functions like this:
The excel class defines the usual properties of an Excel-generated CSV file. It is registered with the dialect name 'excel' .
class csv. excel_tab ¶
The excel_tab class defines the usual properties of an Excel-generated TAB-delimited file. It is registered with the dialect name 'excel-tab' .
class csv. unix_dialect ¶
The unix_dialect class defines the usual properties of a CSV file generated on UNIX systems, i.e. using '\n' as line terminator and quoting all fields. It is registered with the dialect name 'unix' .
New in version 3.2.
The Sniffer class is used to deduce the format of a CSV file.
The Sniffer class provides two methods:
sniff ( sample , delimiters = None ) ¶
Analyze the given sample and return a Dialect subclass reflecting the parameters found. If the optional delimiters parameter is given, it is interpreted as a string containing possible valid delimiter characters.
Analyze the sample text (presumed to be in CSV format) and return True if the first row appears to be a series of column headers. Inspecting each column, one of two key criteria will be considered to estimate if the sample contains a header:
the second through n-th rows contain numeric values
the second through n-th rows contain strings where at least one value’s length differs from that of the putative header of that column.
Twenty rows after the first row are sampled; if more than half of columns + rows meet the criteria, True is returned.
This method is a rough heuristic and may produce both false positives and negatives.
An example for Sniffer use:
The csv module defines the following constants:
Instructs writer objects to quote all fields.
Instructs writer objects to only quote those fields which contain special characters such as delimiter, quotechar or any of the characters in lineterminator.
Instructs writer objects to quote all non-numeric fields.
Instructs the reader to convert all non-quoted fields to type float.
Instructs writer objects to never quote fields. When the current delimiter occurs in output data it is preceded by the current escapechar character. If escapechar is not set, the writer will raise Error if any characters that require escaping are encountered.
Instructs reader to perform no special processing of quote characters.
The csv module defines the following exception:
exception csv. Error ¶
Raised by any of the functions when an error is detected.
5.1. Как обнаружить повторяющиеся записи?
Способ обнаружения дубликатов зависит от того, что именно мы считаем дубликатами. Например, в наборе данных есть уникальный идентификатор id . Если две записи имеют одинаковый id , мы считаем, что это одна и та же запись. Удалим все неуникальные записи:
Получаем в результате 10 отброшенных дубликатов:
Обнаружение неуникальных записей по идентификатору
Другой распространенный способ вычисления дубликатов: по набору ключевых признаков. Например, неуникальными можно считать записи с одной и той же площадью жилья, ценой и годом постройки.
Найдем в нашем наборе дубликаты по группе критических признаков – full_sq , life_sq , floor , build_year , num_room , price_doc :
Получаем в результате 16 дублирующихся записей:
Обнаружение дубликатов по набору ключевых признаков
1.2.3. Внесение недостающих значений
Для численных признаков можно воспользоваться методом принудительного заполнения пропусков. Например, на место пропуска можно записать среднее или медианное значение, полученное из остальных записей.
Для категориальных признаков можно использовать в качестве заполнителя наиболее часто встречающееся значение.
Возьмем для примера признак life_sq и заменим все недостающие значения медианой этого признака:
Одну и ту же стратегию принудительного заполнения можно применить сразу для всех числовых признаков:
К счастью, в нашем наборе не нашлось пропусков в категориальных признаках. Но это не мешает нам продемонстрировать использование той же стратегии:
3.2. Что делать?
Если после анализа причин получения повторяющихся значений вы пришли к выводу, что признак не несет полезной информации, используйте drop() .
Нерелевантные признаки обнаруживаются ручным отбором и оценкой значимости. Например, признак, регистрирующий температуру воздуха в Торонто точно не имеет никакого отношения к прогнозированию цен на российское жилье. Если признак не имеет значения для проекта, его нужно исключить.
Если значения признаков (всех или большинства) в двух разных записях совпадают, эти записи называются дубликатами.
2.2. Что делать?
Выбросы довольно просто обнаружить, но выбор способа их устранения слишком существенно зависит от специфики набора данных и целей проекта. Их обработка во многом похожа на обработку пропущенных данных, которую мы разбирали в предыдущем разделе. Можно удалить записи или признаки с выбросами, либо скорректировать их, либо оставить без изменений.
Переходим к более простой части очистки данных – удалению мусора.
Вся информация, поступающая в модель, должна служить целям проекта. Если она не добавляет никакой ценности, от нее следует избавиться.
Три основных типа «ненужных» данных:
- неинформативные признаки с большим количеством одинаковых значений,
- нерелевантные признаки,
- дубликаты записей.
Рассмотрим работу с каждым типом отдельно.
Если признак имеет слишком много строк с одинаковыми значениями, он не несет полезной информации для проекта.
1.1.2. Процентный список пропущенных данных
Если в наборе много признаков и визуализация занимает много времени, можно составить список долей отсутствующих записей для каждого признака.
Такой список для тех же 30 первых признаков выглядит следующим образом:
Список недостающих данных % – первые 30 функций
У признака life_sq отсутствует 21% значений, а у floor – только 1%.
Этот список является полезным резюме, которое может отлично дополнить визуализацию тепловой карты.
Читайте также: