У нас есть файл с данными в формате csv какой тип данных лучше всего подойдет
Перейти к содержимому

У нас есть файл с данными в формате csv какой тип данных лучше всего подойдет

  • автор:

Выбор оптимального решения для хранения разнородных данных pandas

Проблема выбора формата файла, с которым предстоит работать для чтения и записи pandas.DataFrame, заключается как раз в том, что есть из чего выбрать: даже сам pandas включает в себя функционал, позволяющий работать с большим перечнем типов файлов. Обилие доступных для данной задачи форматов обусловлено невозможностью решить проблему импорта/экспорта раз и навсегда: ничего идеального, как и формата для хранения данных, к сожалению, не существует, поскольку даже самый, на первый взгляд, оптимальный и минимально затратный по ресурсам pickle способен создать очень много проблем.

Чем плох pickle?

Данный формат самый быстрый, занимает меньше всего размера и требует меньше всего памяти. Также pickle не требует преобразование изменяемых типов данных, объектов классов при импорте и экспорте. Однако такие хорошие показатели по затратам ресурсов обусловлены особенностями, перекрывающих все достоинства этого формата:

  • не безопасен. Pickle осуществляет десериализацию объекта из потока байтов, не проверяя поток распакованных данных, есть риски считывания вредоносного кода из файла;
  • привязан к python и зависим от его версии;
  • объекты должны быть определены в среде (функции, классы).

Какая альтернатива?

Для того, чтобы понять, чем заменить pickle с наименьшими потерями по эффективности с точки зрения затраты ресурсов, было проведено исследование для нескольких кейсов:

  • числовые данные (int, float);
  • строки;
  • смешанные данные (int, float, bool, string, datetime, category);
  • изменяемые типы данных (list, set, tuple, dict, класс).

Для исследования были выбраны следующие форматы файлов, расскажем о них подробнее.

CSV

CSV – текстовый формат файла, не является стандартом. Csv файл легко сломать: достаточно записать неподдерживаемый символ или не заключить зарезервированные символы в кавычки. Проблемы с импортом возникнут, если в файл было записано пустое поле и если данные были заключены в кавычки. CSV-файл не имеет стандартных способов представления двоичных данных. Данный формат хорошо себя показывает при работе со строками, но не все типы данных десериализует корректно. Поддерживается pandas, отдельных библиотек не требует.

Feather

Бинарный формат. Зависит от Arrow, но независим от языка: экспортировать файл можно средствами Python, а импортировать с помощью R. поддерживает только неизменяемые типы данных и не нуждается в их дополнительной сериализации и десериализации, в связи с чем показывает неплохие результаты при работе с кейсом с разными форматами неизменяемых типов данных.
Pandas включает функционал работы с данным форматом, однако требуется подключение pyarrow.

Msgpack

Бинарный формат, похож на JSON, но занимает значительно меньше места на диске. Имеет ограничения по размеру записываемых данных – 64 бита. Требует преобразования датасета в словарь при записи и восстановлении из словаря при распаковке соответственно. Дополнительного преобразования типов не требует при записи, однако десериализацию необходимо прописать отдельно. Хорошо себя показывает при работе с изменяемыми типами данных.
Не поддерживается pandas напрямую, для работы с данным форматом необходимо подключение библиотеки msgpack.

JAY

Jay – бинарный формат. Для записи датасета необходимо преобразование в datatable.Frame и обратно для чтения соответственно. Демонстрирует хорошие результаты при работе с числовыми данными, а также с изменяемыми типами данных. Требует подключение пакета datatable, при импортировании на Window могут возникнуть проблемы.

Parquet

Parquet — бинарный, колоночно-ориентированный формат хранения данных, является независимым от языка. В каждой колонке данные должны быть строго одного типа. Parquet предоставляет возможность считывать не целиком весь файл, а только одну колонку, что может значительно минимизировать показатели ввода-вывода. Данный формат отлично справляется с сериализацией и десериализацией данных, если датасет содержит данные только неизменяемых форматов. Parquet показывает высокую производительность на датасетах со строковыми данными, а также неплохо справляется с точки зрения потребления ресурсов с изменяемыми типами данных. Функционал для работы с данным форматом поддерживается pandas.

HDF

HDF – формат, позволяющий хранить данные в иерархической структуре, сохранять метаданные для каждого объекта данных. Данный формат поддерживает организацию файла группами связанных данных и фрагментарное чтение и запись. В функционале HDF реализован автоматический подсчёт контрольных сумм для проверки целостности данных. Поддерживает несколько способов сжатия данных. В спецификации указано, что данный формат предназначен для хранения больших данных; на тестах данного исследования показал себя плохо практически во всех тестах, однако порой занимал лидирующие позиции по одному-двум критериям. Поддерживается pandas.

NPY

NPY – бинарный файл для хранения одного произвольного NumPy-массива на диске. Формат хранит всю необходимую информацию о форме и типе данных для правильного восстановления массива в т.ч. на другой машине с другой архитектурой. Возможно использование исключительно с массивами numpy, так что в тестах использовался только в кейсе с датасетом с числовыми данными. Не требует сохранения и восстановления типов данных при записи и чтении соответственно, однако необходимо преобразовать выходные данные для сохранения датасета, в том числе и имена колонок. Поскольку данный формат создавался специально для хранения числовых данных, в кейсе с датасетом, состоящем из данных типа int и float показал отличные результаты. Для использования необходим импорт библиотеки numpy.

В рамках данной задачи сравнивались показатели для каждого типа файла по следующим параметрам:

  • время чтения и время записи;
  • количество оперативной памяти, требующееся для чтения и для записи файлов соответственно;
  • размер файла на диске.

При оценке времени и памяти учитывалось время в том числе и на преобразование типов, сохранение названий колонок для тех файлов, для которых это необходимо, чтобы получить показатели времени и памяти, необходимых не только для непосредственно чтения или записи файла, но еще и для подготовки и восстановления датасета, так сказать, под ключ.

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

  • только числовые данные (int, float);
  • только строковые данные;
  • данные неизменяемых типов (int, float, string, bool, datetime, category);
  • данные изменяемых типов (list, set, tuple, dict, класс).

Для каждого типа датасетов было произведено 100 итераций, в каждой из которых типы данных столбцов генерировались случайным образом исходя из доступного множества, значения элементов также генерировались случайно. Размер датасета: 100 колонок, 10000 строк для всех неизменяемых типов данных и 50 колонок, 1000 строк для изменяемых, что обусловлено бОльшими временными затратами.

Числовые данные

С числовыми данными лучше всех справились jay и npy.

Npy лучше, если необходимо многократно записывать, jay тратит меньше ресурсов на чтение. jay выигрывает npy, если хранить большие объемы данных, но незначительно.

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

Feather, parquet стоит использовать в том случае, если важно время, но не важно потребление памяти, при этом

  • при многократной записи предпочтительнее parquet;
  • при многократном чтении предпочтительнее feather.

Притом, что csv не показывает сильно плохих результатов по времени и памяти, на диске он занимает значительно больше места, чем его конкуренты.

Вывод: для датасетов из чисел предпочтительнее использовать форматы jay и npy; hdf и msgpack использовать не стоит, остальные форматы имеют опциональные преимущества.

Строковые данные

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

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

Parquet и feather хороши по времени чтения и записи (результаты сравнимы с pickle), остальные форматы по сравнению с ними плохи.

Parquet и csv значительно лучше остальных рассматриваемых форматов по размеру файла, при этом csv лучше, чем parquet, по потреблению памяти, но хуже по времени.

Csv лучше использовать в случае, если надо часто сохранять при минимальных затратах памяти.

Hdf сильно лучше остальных форматов по потреблению памяти, если есть необходимость часто считывать файл и нет жестких ограничений по времени, в противном случае (нужно быстро и неограничена память) предпочтительнее jay.

Но оптимальнее при большом количестве считываний использовать feather, поскольку и по памяти, и по времени он неплохо выглядит по сравнению с другими форматами.

Также для частого чтения файла подойдет и parquet, поскольку его результаты хотя и немного хуже, но сравнимы с feather по памяти и времени, а также он занимает меньше места на диске.

Вывод: лучше всех с работой со строковыми датасетами себя показывают parquet и csv; msgpack и hdf точно не стоит использовать; feather и jay выдающихся результатов не показали.

Данные неизменяемых типов

Типы: int, float, bool, string, datetime, category

В случае с данными разных неизменяемых типов выбора немного больше: в этом кейсе лидеры feather, jay и csv.

Среди лидеров feather лучше по размеру файла на диске, а также его стоит выбрать, если нужны минимальные затраты по времени чтения и записи и есть много памяти. Однако памяти feather требует больше почти всех своих конкурентов.

Csv лучше в противоположной ситуации: если мало памяти и временные затраты не сильно важны.

Для частой записи файла предпочтительнее jay и по времени, и по памяти, но по суммарному времени он хуже feather больше, чем в 3 раза.

Parquet лучше, если редко считывать и редко записывать, но хранить нужно много данных, при этом результаты по времени у этого формата лучше, чем у csv.

Видно, насколько сильно hdf отстает по размеру файла от своих конкурентов. Если важен именно этот критерий, hdf – худший вариант.

Вывод: если работать с датасетами разных неизменяемых типов данных, то лучше выбирать feather, jay и csv, опционально parquet.

Изменяемые типы данных

В случае изменяемых типов данных сериализация и десериализация требуется для всех форматов, (кроме pickle, который мы не рассматриваем).

Заметно, что показатели по времени записи у всех файлов примерно похожи, но feather вырывается вперед за счет маленьких временных затрат на чтение. Также feather лучше, если важно время чтения+записи и не важна память.

Формат jay – лучшее решение, когда мало памяти и когда не важны затраты по времени.

Сsv и msgpack лучше, когда надо часто записывать файл. При этом csv проигрывает всем форматам по ресурсам, требуемым для чтения, и выигрывает всех по ресурсам, требуемым для записи.

Msgpack оптимален по времени чтения и записи, а также по использованию памяти.

parquet лучше, если нужно хранить большие объемы данных и если есть необходимость часто читать файл.

Формат hdf вновь сильно плох по размеру файла, по остальным критериям — средние результаты.

Вывод: для хранения изменяемых типов данных подойдут msgpack, parquet и jay. Csv и feather имеют некоторые преимущества, которые тоже могут быть полезны.

Заключение

Pickle за счет своих особенностей идеален почти по всем показателям для всех типов датасетов, рассмотренных в рамках этой задачи. Этот формат – лучший для использования, если безопасность не важна и исключена возможность влезть в код для злоумышленника.

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

Числа

Строки

Разные типы

Изменяемые форматы

Оптимальное решение

Основы Pandas №1 // Чтение файлов, DataFrame, отбор данных

Pandas — одна из самых популярных библиотек Python для аналитики и работы с Data Science. Это как SQL для Python. Все потому, что pandas позволяет работать с двухмерными таблицами данных в Python. У нее есть и масса других особенностей. В этой серии руководств по pandas вы узнаете самое важное (и часто используемое), что необходимо знать аналитику или специалисту по Data Science. Это первая часть, в которой речь пойдет об основах.

Примечание: это практическое руководство, поэтому рекомендуется самостоятельно писать код, повторяя инструкции!

Чтобы разобраться со всем, необходимо…

  1. Установить Python3.7+, numpy и Pandas.
  2. Следующий шаг: подключиться к серверу (или локально) и запустить Jupyter. Затем открыть Jupyter Notebook в любимом браузере. Создайте новый ноутбук с именем «pandas_tutorial_1».
  3. Импортировать numpy и pandas в Jupyter Notebook с помощью двух строк кода:
import numpy as np import pandas as pd 

import pandas as pd

Примечание: к «pandas» можно обращаться с помощью аббревиатуры «pd». Если в конце инструкции с import есть as pd , Jupyter Notebook понимает, что в будущем, при вводе pd подразумевается именно библиотека pandas.

Теперь все настроено! Переходим к руководству по pandas! Первый вопрос:

Как открывать файлы с данными в pandas

Информация может храниться в файлах .csv или таблицах SQL. Возможно, в файлах Excel. Или даже файлах .tsv. Или еще в каком-то другом формате. Но цель всегда одна и та же. Если необходимо анализировать данные с помощью pandas, нужна структура данных, совместимая с pandas.

Структуры данных Python

В pandas есть два вида структур данных: Series и DataFrame.

Series в pandas — это одномерная структура данных («одномерная ndarray»), которая хранит данные. Для каждого значения в ней есть уникальный индекс.

Series в pandas

DataFrame — двухмерная структура, состоящая из колонок и строк. У колонок есть имена, а у строк — индексы.

DataFrame в pandas

В руководстве по pandas основной акцент будет сделан на DataFrames. Причина проста: с большей частью аналитических методов логичнее работать в двухмерной структуре.

Загрузка файла .csv в pandas DataFrame

Для загрузки .csv файла с данными в pandas используется функция read_csv() .

Начнем с простого образца под названием zoo. В этот раз для практики вам предстоит создать файл .csv самостоятельно. Вот сырые данные:

animal,uniq_id,water_need elephant,1001,500 elephant,1002,600 elephant,1003,550 tiger,1004,300 tiger,1005,320 tiger,1006,330 tiger,1007,290 tiger,1008,310 zebra,1009,200 zebra,1010,220 zebra,1011,240 zebra,1012,230 zebra,1013,220 zebra,1014,100 zebra,1015,80 lion,1016,420 lion,1017,600 lion,1018,500 lion,1019,390 kangaroo,1020,410 kangaroo,1021,430 kangaroo,1022,410 

Вернемся во вкладку “Home” https://you_ip:you_port/tree Jupyter для создания нового текстового файла…

Создания нового текстового файла в Jupyter

затем скопируем данные выше, чтобы вставить информацию в этот текстовый файл…

Копируем данные в текстовый файл в Jupyter

…и назовем его zoo.csv!

Переименуем новый текстовый файл в Jupyter

Это ваш первый .csv файл.

Вернемся в Jupyter Notebook (который называется «pandas_tutorial_1») и откроем в нем этот .csv файл!

Для этого нужна функция read_csv()

Введем следующее в новую строку:

pd.read_csv('zoo.csv', delimiter=',') 

Чтение csv-файла в pandas

Готово! Это файл zoo.csv , перенесенный в pandas. Это двухмерная таблица — DataFrame. Числа слева — это индексы. А названия колонок вверху взяты из первой строки файла zoo.csv.

На самом деле, вам вряд ли придется когда-нибудь создавать .csv файл для себя, как это было сделано в примере. Вы будете использовать готовые файлы с данными. Поэтому нужно знать, как загружать их на сервер!

Вот небольшой набор данных: ДАННЫЕ

Если кликнуть на ссылку, файл с данными загрузится на компьютер. Но он ведь не нужен вам на ПК. Его нужно загрузить на сервер и потом в Jupyter Notebook. Для этого нужно всего два шага.

Шаг 1) Вернуться в Jupyter Notebook и ввести эту команду:

!wget https://pythonru.com/downloads/pandas_tutorial_read.csv 

Это загрузит файл pandas_tutorial_read.csv на сервер. Проверьте:

Загрузка файла на сервер

Если кликнуть на него…

Вся информация из файла

…можно получить всю информацию из файла.

Шаг 2) Вернуться в Jupyter Notebook и использовать ту же функцию read_csv (не забыв поменять имя файла и значение разделителя):

pd.read_csv('pandas_tutorial_read.csv', delimete=';') 

Данные загружены в pandas!

Данные загружены в pandas!

Что-то не так? В этот раз не было заголовка, поэтому его нужно настроить самостоятельно. Для этого необходимо добавить параметры имен в функцию!

pd.read_csv('pandas_tutorial_read.csv', delimiter=';', names=['my_datetime', 'event', 'country', 'user_id', 'source', 'topic']) 

Передали имена колонок в read_csv

Так лучше!
Теперь файл .csv окончательно загружен в pandas DataFrame .

Примечание: есть альтернативный способ. Вы можете загрузить файл .csv через URL напрямую. В этом случае данные не загрузятся на сервер данных.

pd.read_csv( 'https://pythonru.com/downloads/pandas_tutorial_read.csv', delimiter=';', names=['my_datetime', 'event', 'country', 'user_id', 'source', 'topic'] ) 

Примечание: если вам интересно, что в этом наборе, то это лог данных из блога о путешествиях. Ну а названия колонок говорят сами за себя.

Отбор данных из dataframe в pandas

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

Вывод всего dataframe

Базовый метод — вывести все данные из dataframe на экран. Для этого не придется запускать функцию pd.read_csv() снова и снова. Просто сохраните денные в переменную при чтении!

article_read = pd.read_csv( 'pandas_tutorial_read.csv', delimiter=';', names = ['my_datetime', 'event', 'country', 'user_id', 'source', 'topic'] ) 

После этого можно будет вызывать значение article_read каждый раз для вывода DataFrame!

Сохранение денных в переменную при чтении

Вывод части dataframe

Иногда удобно вывести не целый dataframe, заполнив экран данными, а выбрать несколько строк. Например, первые 5 строк можно вывести, набрав:

article_read.head() 

Первые 5 строк dataframe

Или последние 5 строк:

article_read.tail() 

Последние 5 строк dataframe

Или 5 случайных строк:

article_read.sample(5) 

Случайные 5 строк dataframe

Вывод определенных колонок из dataframe

А это уже посложнее! Предположим, что вы хотите вывести только колонки «country» и «user_id».

Для этого нужно использовать команду в следующем формате:

article_read[['country', 'user_id']] 

Выбор определение колонки из dataframe

Есть предположения, почему здесь понадобились двойные квадратные скобки? Это может показаться сложным, но, возможно, так удастся запомнить: внешние скобки сообщают pandas, что вы хотите выбрать колонки, а внутренние — список (помните? Списки в Python указываются в квадратных скобках) имен колонок.

Поменяв порядок имен колонов, изменится и результат вывода.

Это DataFrame выбранных колонок.

Примечание: иногда (особенно в проектах аналитического прогнозирования) нужно получить объекты Series вместе DataFrames. Это можно сделать с помощью одного из способов:

  • article_read.user_id
  • article_read[‘user_id’]

Вывод объекта Series

Фильтрация определенных значений в dataframe

Если прошлый шаг показался сложным, то этот будет еще сложнее!

Предположим, что вы хотите сохранить только тех пользователей, которые представлены в источнике «SEO». Для этого нужно отфильтровать по значению «SEO» в колонке «source»:

article_read[article_read.source == 'SEO'] 

Важно понимать, как pandas работает с фильтрацией данных:

Шаг 1) В первую очередь он оценивает каждую строчку в квадратных скобках: является ли ‘SEO’ значением колонки article_read.source ? Результат всегда будет булевым значением ( True или False ).

Фильтрация данных в pandas

Шаг 2) Затем он выводит каждую строку со значением True из таблицы article_read .

Фильтрация данных в pandas

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

Функции могут использоваться одна за другой

Важно понимать, что логика pandas очень линейна (как в SQL, например). Поэтому если вы применяете функцию, то можете применить другую к ней же. В таком случае входящие данные последней функции будут выводом предыдущей.

Например, объединим эти два метода перебора:

article_read.head()[['country', 'user_id']] 

Первая строчка выбирает первые 5 строк из набора данных. Потом она выбирает колонки «country» и «user_id».

Можно ли получить тот же результат с иной цепочкой функций? Конечно:

article_read[['country', 'user_id']].head() 

В этом случае сначала выбираются колонки, а потом берутся первые 5 строк. Результат такой же — порядок функций (и их исполнение) отличается.

А что будет, если заменить значение «article_read» на оригинальную функцию read_csv():

pd.read_csv( 'pandas_tutorial_read.csv', delimiter=';', names = ['my_datetime', 'event', 'country', 'user_id', 'source', 'topic'] )[['country', 'user_id']].head() 

Так тоже можно, но это некрасиво и неэффективно. Важно понять, что работа с pandas — это применение функций и методов один за одним, и ничего больше.

Проверьте себя!

Как обычно, небольшой тест для проверки! Выполните его, чтобы лучше запомнить материал!

Выберите used_id , country и topic для пользователей из country_2 . Выведите первые 5 строк!

А вот и решение!

Его можно преподнести одной строкой:

article_read[article_read.country == 'country_2'][['user_id','topic', 'country']].head() 

Или, чтобы было понятнее, можно разбить на несколько строк:

ar_filtered = article_read[article_read.country == 'country_2'] ar_filtered_cols = ar_filtered[['user_id','topic', 'country']] ar_filtered_cols.head() 

В любом случае, логика не отличается. Сначала берется оригинальный dataframe ( article_read ), затем отфильтровываются строки со значением для колонки country — country_2 ( [article_read.country == ‘country_2’] ). Потому берутся три нужные колонки ( [[‘user_id’, ‘topic’, ‘country’]] ) и в конечном итоге выбираются только первые пять строк ( .head() ).

Итого

Вот и все. В следующей статье вы узнаете больше о разных методах агрегации (например, sum, mean, max, min) и группировки.

Выбираем формат хранения данных в экосистеме Hadoop

Привет, %username%! Меня зовут Кирилл Фурзанов, я Data Scientist в Сбере, участник профессионального сообщества NTA. При формировании витрин данных и датасетов в экосистеме Hadoop одним из важных вопросов является выбор оптимального способа хранения данных в hdfs. Рассмотрим один из важных вопросов при создании витрины – выбор соответствующего формата файла для хранения.

Решением данной задачи я занимался при формировании датасета по транзакциям клиентов за последние полгода. Попробую, с точки зрения теории, определить наилучший формат для хранения данных нашей задачи. Первоначально опишем существующие форматы файлов. Hdfs поддерживает несколько основных типов форматов файлов для хранения, которые принято разделять на 2 группы:

Строковые форматы: csv, json, avro.

Колоночные форматы: rc, orc, parquet.

Строковые типы данных, такие как csv, json, avro сохраняют данные в строки. Данный тип позволяет достаточно быстро записывать данные в витрину, а такой формат, как avro позволяет так же динамически изменять схему данных. Однако, задачи по чтению и фильтрации данных строковых форматов требуют большего времени, чем в колоночных форматах из-за самого алгоритма чтения и фильтрации данных. Данный алгоритм можно описать в 3 этапа:

1) выбирается одна отдельная строка;

2) производится разделение этой строки на столбцы;

3) производится фильтрация данных и применение функций к соответствующим строкам.

Кроме того, строковые форматы зачастую занимают значительно большее место в хранилище, чем колоночные форматы, ввиду их плохой сжимаемости. Кратко опишем вышеперечисленные строковые форматы.

CSV – распространенный формат данных, используемый зачастую для передачи информации между различными хранилищами. Схема данных в таком формате статична и не подлежит изменению.

JSON – хранение данных на hdfs в формате json несколько отличается от привычного json-файла тем, что каждая строка представляет собой отдельный json-файл.

Примером данного формата файла может послужить следующий набор данных:

Как видно из примера, основным отличием данного формата от формата CSV является его разделимость и то, что он содержит метаданные вместе с данными, что позволяет изменять исходную схему данных. Так же данный формат файлов позволяет хранить сложные структуры данных в колонках, что является еще одним отличием данного формата перед CSV форматом. К недостаткам данного формата можно отнести так же плохую сжимаемость в блоках данных и значительные затраты на хранение данного типа файлов (даже по сравнению с форматом CSV из-за необходимости дублирования метаданных для каждой строки).

Наибольшую же популярность среди строковых форматов хранения данных занимает формат avro. Данный формат представляет собой контейнер, содержащий в себе заголовок и один или несколько блоков с данными:

Заголовок состоит из:

  • ASCII слова ‘Obj1’.
  • Метаданных файла, включая определение схемы.
  • 16-байтного случайного слова (маркера синхронизации).

Блоки данных в свою очередь состоят из:

  • Числа объектов в блоке.
  • Размера серриализованых объектов в блоке.
  • Сами данные, представленные в двоичном виде с определенным типом сжатия.
  • 16-байтного случайного слова (маркера синхронизации).

Основным преимуществом данного формата являются его сжимаемость, возможность изменения схемы данных. К минусам можно отнести то, что этот формат отсутствует из коробки и для возможности чтения и записи необходимо устанавливать внешний компонент Avro.

Колоночные же форматы напротив занимают значительно большее время для записи данных, однако же они значительно быстрее решают задачи чтения и фильтрации данных, занимая при этом значительно меньшее пространство на дисках, по сравнению со строковыми форматами. Наиболее распространенными колоночными форматами являются форматы orc и parquet.

ORC (Optimized Record Columnar File) – колоночный формат данных, разделяющий исходный набор данных на полосы, размером в 250M каждая. Колонки в таких полосках разделены друг от друга, обеспечивая избирательное чтение, что увеличивает скорость обработки такой полоски. Кроме того, данные полоски хранят в себе индексы и предикаты, что в свою очередь обеспечивает еще большую скорость чтения и фильтрации данных. Ниже приведена схема структуры ORC файла.

Parquet – это бинарный колоночно-ориентированный формат данных. Данный формат имеет сложную структуру данных, которая разделяется на 3 уровня:

  • Row-group – логическое горизонтальное разбиение данных на строки, состоящие из фрагментов каждого столбца в наборе данных.
  • Column chunk – фрагмент конкретного столбца.
  • Page – Содержит в себе наборы row-group. Данные страницы разграничиваются между собой с помощью header и footer. Header содержит волшебное число PAR1, определяющее начало страницы. Footer содержит стартовые координаты каждого из столбцов, версию формата, схему данных, длину метаданных (4 байта), и волшебное число PAR1 как флаг окончания.

Более подробно структура файла parquet представлена на следующей схеме:

Выбор определенного типа и группы форматов файлов во многом зависит от решаемой задачи.

Мой датасет состоит в основном из простейших типов данных, таких как числа, дата со временем и небольших строковых данных, в связи с чем каких-либо ограничений на выбор формата для хранения у нас нет, и основным критерием будет обеспечение наилучшего быстродействия для операций чтения и фильтрации данных, при этом обеспечивая минимальный занимаемый размер данных. В связи с этим я построил краткую матрицу, описывающую качественные характеристики вышеизложенных форматов на основе заданных критериев:

Формат

Чтение и фильтрация данных

Подходит для длительного хранения большого объема данных

Сжимаемость

Медленное чтение и фильтрация

Не сжимаемый формат

Медленное чтение и фильтрация

Не сжимаемый формат

Медленное чтение и фильтрация

Достаточная скорость чтения и фильтрации

Достаточная скорость чтения и фильтрации

Формат AVRO далее не будет рассматриваться, так как не поддерживается на нашем кластере. Ниже приведена матрица сопоставления количественных характеристик данных форматов файлов на реализованном датасете, который содержит около 100 млн. строк различных простых форматов:

Формат

Занимаемый объем

Скорость чтения данных без фильтра (avg)

Скорость чтения данных с фильтром (avg)

Анализ данных с помощью pandas. Часть 1: Чтение данных из csv файла

Python 3 логотип

Эта часть показывает способ обработки данных, хранящихся в формате csv, а также построение простейших графиков.

Необходимые импорты и настройки

Чтение из csv файла

Можно читать данные из CSV файла с помощью функции read_csv . По умолчанию предполагается, что поля разделены запятыми.

Мы рассмотрим некоторые данные о велосипедистах Монреаля. Скачаем данные отсюда.

Этот набор данных описывает, сколько людей находилось на 7 различных велосипедных дорожках Монреаля, каждый день.

Просто взять и прочитать с помощью read_csv не получится, нужно задать аргументы, которые сделают следующее:

  • Изменят разделитель на ;
  • Изменят кодировку на ‘latin1’ (по умолчанию считается ‘utf8’ )
  • Обработают даты в колонке ‘Date’
  • Скажут, что сначала идёт день, а потом месяц (формат YYYY-DD-MM)
  • Изменят индекс на значения в колонке ‘Date’
  Berri 1Brébeuf (données non disponibles)Côte-Sainte-CatherineMaisonneuve 1Maisonneuve 2du ParcPierre-DupuyRachel1St-Urbain (données non disponibles)Date 2012-01-0135NaN03851261016NaN2012-01-0283NaN16815353643NaN2012-01-03135NaN210424889358NaN

Выбор колонок

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

Графики

Просто добавьте .plot() в конец! Что может быть проще этого? =)

Мы можем видеть (сюрприз!), что не так много людей катаются на велосипеде в январе, феврале и в марте.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *