Что такое датасет python
Перейти к содержимому

Что такое датасет python

  • автор:

Вы все еще используете Pandas для Big Data?

У Pandas нет многопроцессорной поддержки и Pandas медленно работает с большими наборами данных. Но, оказывается, для этого есть более совершенный инструмент!

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

Недавно я нашел время и отыскал лучший инструмент, который заставил меня преобразовать процесс обработки данных. Я использую этот инструмент для сложной обработки — например, для чтения нескольких файлов с 10 гигабайтами данных, применения к ним фильтров и агрегирования. После окончания этой обработки, я сохраняю результат в файле CSV и продолжаю исследовательский анализ данных в Pandas.

Встречайте — Dask

Dask предоставляет расширенный параллелизм для аналитики, обеспечивая деятельность на уровне инструментов, которые вы любите. Dask включает в себя numpy, pandas и sklearn. Это библиотека с открытым исходным кодом, находящаяся в свободном доступе. В ней используются существующие API-интерфейсы Python и структуры данных, чтобы упростить переключение между эквивалентами на основе Dask.

Dask делает обычные вещи легкими, а сложные — возможными

Pandas vs Dask

Я мог бы продолжать рассказывать про Dask, о том, что он имеет много функций, но, вместо этого, давайте лучше взглянем на практический пример. В своей работе я обычно получаю кучу файлов, которые мне нужно проанализировать. Давайте сымитируем мой рабочий день и создадим 10 файлов по 100 записей в каждом (каждый файл весит 196 МБ).

from sklearn.datasets import make_classification
import pandas as pd

for i in range(1, 11):
print('Generating trainset %d' % i)
x, y = make_classification(n_samples=100_000, n_features=100)
df = pd.DataFrame(data=x)
df['y'] = y
df.to_csv('trainset_%d.csv' % i, index=False)

Теперь давайте загрузим эти файлы с помощью Pandas и замерим время. У Pandas нет встроенной поддержки glob, поэтому нам нужно делать это в цикле.

%%time

import glob

df_list = []
for filename in glob.glob('trainset_*.csv'):
df_ = pd.read_csv(filename)
df_list.append(df_)
df = pd.concat(df_list)
df.shape

Pandas прочитал файлы за 16 секунд.

CPU times: user 14.6 s, sys: 1.29 s, total: 15.9 s
Wall time: 16 s

Теперь представьте, что эти файлы будут в 100 раз больше — вы даже не сможете прочитать их с помощью Pandas.

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

import dask.dataframe as dd

%%time
df = dd.read_csv('trainset_*.csv')

CPU times: user 154 ms, sys: 58.6 ms, total: 212 ms
Wall time: 212 ms

Dask понадобилось 154 миллисекунд! Как это вообще возможно? Что ж, это не совсем так. Dask отложил исполнение парадигмы. Он делает вычисления только тогда, когда это нужно. Мы определяем график выполнения, чтобы Dask мог оптимизировать выполнение задач. Давайте повторим эксперимент — отметим также, что функция Dask read_csv изначально имеет встроенную поддержку glob.

%%time

df = dd.read_csv('trainset_*.csv').compute()

CPU times: user 39.5 s, sys: 5.3 s, total: 44.8 s
Wall time: 8.21 s

Функция вычисления заставляет Dask возвращать результат. Dask читает файлы в два раза быстрее, чем pandas.

Dask изначально масштабируется Python

Pandas vs Dask — использование процессора

Использует ли Dask все ядра, за которые вы заплатили? Давайте сравним между Pandas и Dask использование центрального процессора во время чтения файлов — код тот же, что и был выше.

Использование процессора c Pandas при чтении файлов

Использование процессора с Dask при чтении файлов

На записях экранов выше разница в многопроцессорности при чтении файлов с Pandas и Dask очевидна .

Что происходит за кулисами?

DataFrame Dask состоит из нескольких DataFrames Pandas, которые разделены по индексу. Когда мы выполняем команду read_csv с Dask, несколько механизмов читают один файл.

Мы можем даже визуализировать график выполнения.

exec_graph = dd.read_csv('trainset_*.csv')
exec_graph.visualize()

График выполнения Dask при чтении нескольких файлов

Недостатки Dask

Вы можете подумать, если Dask так хорош, то почему бы не избавиться от Pandas насовсем? Что ж, это не так просто. Только некоторые функции Pandas переносятся на Dask. Некоторые из них трудно параллелизовать, например, сортировку значений и установку индексов на несортированные столбцы. Dask не является волшебной пулей — использование Dask рекомендуется только для наборов данных, которые не вписываются в основную память. Поскольку Dask построен на основе Pandas, операции, которые были медленными в Pandas, остаются медленными в Dask. Как я уже упоминал ранее, Dask является полезным инструментом в процессе передачи данных, но он не заменяет другие библиотеки.

Dask рекомендуется только для наборов данных, которые не помещаются в основную память

Как установить Dask

Для установки Dask просто запустите:

python -m pip install "dask [complete]"

Это установит всю библиотеку Dask.

Заключение

В этом посте я только поверхностно коснулся библиотеки Dask. Если вы хотите нырнуть глубже, то вам стоит обратиться к замечательному руководству Dask и к документации DataFrame Dask. Интересно, какие функции DataFrame поддерживаются в Dask? — Загляните DataFrame API

MNIST dataset

MNIST dataset — это база данных, в которой хранятся образцы написания рукописных цифр. Она состоит из 70 тысяч картинок одинакового размера, где изображены написанные от руки цифры. Набор данных, или датасет, используют для машинного обучения — на нем программы учат распознавать числа.

«IT-специалист с нуля» наш лучший курс для старта в IT

Название расшифровывается как Modified National Institute of Standards and Technology — «Модифицированная [база данных] Национального института стандартов и технологий США». Институт занимается стандартизацией: он собрал большой набор образцов почерка, привел все изображения с цифрами к единообразному виду и отрегулировал их.

Образцы написания цифр взяты из результатов переписи населения. Позже к ним добавлялись другие варианты, например взятые из тестирований студентов.

Существуют другие вариации набора, усложненные или нужные для иных задач. Например, датасет Fashion-MNIST — это подборка изображений с разными предметами одежды.

Профессия / 8 месяцев
IT-специалист с нуля

Попробуйте 9 профессий за 2 месяца и выберите подходящую вам

vsrat_7 1 (1)

Для чего нужна база MNIST

Набор данных MNIST активно применяют в машинном обучении, в частности в создании и обучении нейронных сетей. Это такие цифровые модели, которые по структуре повторяют соединения нейронов в человеческом мозгу. Их можно обучать, но для этого нужны большие массивы данных — так программа «запомнит», как выглядит то, с чем она имеет дело.

Базу MNIST используют, когда обучают программу распознавать рукописные числа и цифры. Это важно в практических целях — сейчас есть много сервисов, которые работают с распознаванием картинок. Но кроме того, датасет используют в научных целях — например, когда сравнивают эффективность разных алгоритмов распознавания.

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

Как выглядят данные в базе MNIST

В датасете 70 тысяч картинок с цифрами от 0 до 9, приведенных к одинаковому виду. Все они переведены в формат CSV и имеют размер 28×28 пикселей. У них черный фон, на котором изображена белая цифра. Цифра помещена в середине, так, чтобы ее центр масс совпадал с центром изображения. Сама она чуть меньше целой картинки — ее размер составляет 20×20 пикселей.

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

Обучающая и тестовая выборки

70 тысяч картинок разделены на две части: train и test.

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

Test это 10 тысяч изображений тестовой выборки. Их не используют для обучения, а показывают нейросети позже, чтобы проверить, насколько правильно она научилась распознавать числа.

Современные нейронные сети дают точность до 99,6% при распознавании цифр из MNIST. Это много: получается, что качественные программы практически всегда правильно распознают цифры.

Курс для новичков «IT-специалист
с нуля» – разберемся, какая профессия вам подходит, и поможем вам ее освоить

Как пользоваться базой данных MNIST

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

Например, MNIST есть среди данных библиотеки Keras. Чтобы добавить датасет к программе, нужно просто указать в начале кода строчку:

from keras.datasets import mnist

Библиотека Keras работает на основе фреймворка для машинного обучения Tensor Flow — тот тоже поддерживает MNIST. А изобразить результаты в графическом виде можно с помощью библиотеки Matplotlib, которая может построить график или диаграмму.

Что нужно учесть

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

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

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

Как начать работу с MNIST

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

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

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

IT-специалист с нуля

Наш лучший курс для старта в IT. За 2 месяца вы пробуете себя в девяти разных профессиях: мобильной и веб-разработке, тестировании, аналитике и даже Data Science — выберите подходящую и сразу освойте ее.

Pandas

Pandas — это библиотека Python для обработки и анализа структурированных данных, её название происходит от «panel data» («панельные данные»). Панельными данными называют информацию, полученную в результате исследований и структурированную в виде таблиц. Для работы с такими массивами данных и создан Pandas.

Освойте профессию «Аналитик данных»

Работа с открытым кодом

Pandas — это opensource-библиотека, то есть ее исходный код в открытом доступе размещен на GitHub. Пользователи могут добавлять туда свой код: вносить пояснения, дополнять методы работы и обновлять разделы. Для работы потребуется компилятор (программа, которая переводит текст с языка программирования в машинный код) C/C++ и среда разработки Python. Подробный процесс установки компилятора С для разных операционных систем можно найти в документации Pandas.

Профессия / 12 месяцев
Аналитик данных

Находите закономерности и делайте выводы, которые помогут бизнесу

Group 1321314279 (1)

В каких профессиях понадобится библиотека?

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

Как установить Pandas

Пошаговая инструкция по установке библиотеки Pandas

    Скачать библиотеку На официальном сайте Pandas указан самый простой способ начать работу с библиотекой. Для этого потребуется установить Anaconda — дистрибутив (форма распространения программного обеспечения, набор библиотек или программного кода для установки программы) для Python с набором библиотек. Безопасно скачать его можно на официальном сайте.

Настройка установки Вот несколько советов по установке Anaconda для новичков:

— Выбирайте рекомендованные настройки, на первое время этого будет достаточно. Например, Install for: Just me (recommended).

— Но если не поставить галочку «Add Anaconda to my PATH environment variable», то Anaconda не будет запускаться по умолчанию, каждый раз ее нужно будет запускать отдельно.

— На вопрос: «Do you wish to initialize Anaconda3?» (Хотите ли вы инициализировать Anaconda3?) отвечайте «Да».

— После завершения установки перезагрузите компьютер.

Запуск JupyterLab В командной строке Anaconda запустите JupyterLab — это интерактивная среда для работы с кодом, данными и блокнотами, которая входит в пакет дистрибутива. Для этого введите jupyter-lab .

Открытие блокнота Создайте в JupyterLab новый блокнот Python3. Для его создания надо щелкнуть на значке «+», расположенном в верхней левой части интерфейса. В появившемся меню выбрать «Python 3» для создания блокнота.

Импорт библиотеки В первой ячейке пропишите: import pandas as pd , после этого в следующих ячейках можно писать код.

Читайте также Как выбрать IT-специальность в новых реалиях?

DataFrame и Series

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

Series

Pandas Series (серия) — это одномерный массив. Визуально он похож на пронумерованный список: слева в колонке находятся индексы элементов, а справа — сами элементы.

my_series = pd.Series([5, 6, 7, 8, 9, 10])

Pandas Series пример массива

Индексом может быть числовой показатель (0, 1, 2…), буквенные значения (a, b, c…) или другие данные, выбранные программистом. Если особое значение не задано, то числовые индексы проставляются автоматически. Например, от 0 до 5 как в примере выше.

Такая нумерация называется RangeIndex, в ней всегда содержатся числа от 0 до определенного числа N, которое обозначает количество элементов в серии. Собственные значения индексов задаются в квадратных скобках через index, как в примере ниже:

my_series2 = pd.Series([5, 6, 7, 8, 9, 10]), index=['a', 'b', 'c', 'd', 'e', 'f'])

Собственные значения индексов в Pandas

Индексы помогают обращаться к элементам серии и менять их значения. Например, чтобы в нашей серии [5, 6, 7, 8, 9, 10] заменить значения некоторых элементов на 0, мы прописываем индексы нужных элементов и указываем, что они равны нулю:

my_series2[['a', 'b', 'f']] = 0

Можно сделать выборку по нескольким индексам, чтобы ненужные элементы в серии не отображались:

my_series2[['a', 'b', 'f']]
a 5 b 6 f 10 dtype: int64

DataFrame

Pandas DataFrame — это двумерный массив, похожий на таблицу/лист Excel (кстати, данные из Excel можно читать с помощью команды pandas.read_excel(‘file.xls’)) . В нем можно проводить такие же манипуляции с данными: объединять в группы, сортировать по определенному признаку, производить вычисления. Как любая таблица, датафрейм состоит из столбцов и строк, причем столбцами будут уже известные объекты — Series.

Чтобы проверить, действительно ли серии — это части датафрейма, можно извлечь любую колонку из таблицы. Возьмем набор данных о нескольких странах СНГ, их площади и населении и выберем колонку country:

df = pd.DataFrame(< 'country': ['Kazakhstan', 'Russia', 'Belarus', 'Ukraine'], 'population': [17.04, 143.5, 9.5, 45.5], 'square': [2724902, 17125191, 207600, 603628] >)

Pandas DataFrame пример

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

df['country']
type(df['country'])

Pandas DataFrame индексы по строкам

Станьте аналитиком данных и получите востребованную специальность

Кроме этого, у датафрейма есть индексы по столбцам, которые задаются вручную. Для простоты написания кода обозначим страны индексами из двух символов: Kazakhstan — KZ, Russia — RU и так далее:

# Создаем датафрейм с заданными индексами df = pd.DataFrame(< 'country': ['Kazakhstan', 'Russia', 'Belarus', 'Ukraine'], 'population': [17.04, 143.5, 9.5, 45.5], 'square': [2724902, 17125191, 207600, 603628] >, index=['KZ', 'RU', 'BY', 'UA'])

Pandas пример индекса по строкам

# Изменяем индексы df.index = ['KZ', 'RU', 'BY', 'UA'] df.index.name = 'Country Code'

По индексам можно искать объекты и делать выборку, как в Series . Возьмем тот же датафрейм и сделаем выборку по индексам KZ, RU и колонке population методом .loc (в случае .loc мы используем квадратные скобки, а не круглые, как с другими методами), чтобы сравнить население двух стран:

df.loc[['KZ', 'RU'], 'population']

Anaconda выведет следующее:

Country Code
KZ 17.04
RU 143.50
Name: population, dtype: float64

Также в DataFrame производят математические вычисления. Например, рассчитаем плотность населения каждой страны в нашем датафрейме. Данные в колонке population (численность населения) делим на square (площадь) и получаем новые данные в колонке density, которые показывают плотность населения:

# Вычисление плотности населения df['density'] = df['population'] / df['square'] * 1000000

в Pandas

Станьте аналитиком данных и получите востребованную специальность

Чтение и запись данных

В Pandas работают с форматами csv, excel, sql, html, hdf и другими. Полный список можно посмотреть с помощью метода .read, где через нижнее подчеркивание «_» будут указаны все доступные форматы.

Ниже представлены примеры чтения и записи данных на Python с использованием Pandas:

Чтение данных:

  1. Чтение данных из CSV файла:
import pandas as pd # Чтение CSV файла data = pd.read_csv('data.csv') # Вывод первых нескольких строк датафрейма print(data.head())
  1. Чтение данных из Excel файла:
# Чтение данных из Excel файла data = pd.read_excel('data.xlsx') # Вывод первых нескольких строк датафрейма print(data.head())
  1. Чтение данных из SQL базы данных:
from sqlalchemy import create_engine # Создание подключения к базе данных engine = create_engine('sqlite:///database.db') # Чтение данных с помощью SQL запроса query = "SELECT * FROM table_name" data = pd.read_sql(query, engine) # Вывод первых нескольких строк датафрейма print(data.head())

Запись данных:

  1. Запись данных в CSV или Exсel файл:
# Создание датафрейма data = pd.DataFrame(< 'name': ['Alice', 'Bob', 'Charlie'], 'age': [25, 30, 22] >) # Запись в CSV файл (или Exсel, нужно будет поменять расширение ниже) data.to_csv('output.csv', index=False)
  1. Запись данных в SQL базу данных:
import pandas as pd from sqlalchemy import create_engine # Создание датафрейма data = pd.DataFrame(< 'name': ['Alice', 'Bob', 'Charlie'], 'age': [25, 30, 22] >) # Создание подключения к базе данных engine = create_engine('sqlite:///new_database.db') # Запись данных в базу данных data.to_sql('new_table', engine, index=False, if_exists='replace')

Доступ по индексу в DataFrame

Для поиска данных в библиотеке Pandas используются два метода: .loc и .iloc . Рассмотрим их функциональность и применение.

Метод .loc:

Метод .loc предоставляет доступ к данным по заданному имени строки (индексу) в DataFrame. Рассмотрим пример с набором данных о скорости и ядовитости нескольких видов змей:

data = index = ['cobra', 'viper', 'sidewinder'] df = pd.DataFrame(data, index=index) # Вывод датафрейма print(df)

Используя метод .loc , мы можем получить информацию о конкретном виде змеи, например, гадюке (viper):

# Получение данных о гадюке (viper) viper_data = df.loc['viper'] print(viper_data)

метод .loc python pandas

Метод .iloc:

Метод .iloc позволяет осуществлять доступ к данным по порядковому номеру строки в DataFrame. Рассмотрим пример с набором данных, имеющим числовые индексы:

mydict = [, , ] df = pd.DataFrame(mydict) # Вывод датафрейма print(df)
 a b c d 0 1 2 3 4 1 100 200 300 400 2 1000 2000 3000 4000 

Используя метод .iloc , можно получить данные из первой строки с индексом 0:

first_row = df.iloc[0] first_row

пример использования метода iloc в Pandas

Читайте также Что нужно знать, чтобы стать дата-сайентистом?

Группировка и агрегирование данных

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

Используем .groupby и указываем название колонки title, на основе которой Pandas объединит все данные. После этого используем метод .agregate – он поможет провести математические вычисления, то есть суммировать стоимость внутри каждой группы.

import pandas as pd # Создание DataFrame с данными о курсах data = < 'title': ['Курс A', 'Курс B', 'Курс C', 'Курс D', 'Курс E'], 'income': [100, 150, 200, 120, 180] >df = pd.DataFrame(data) # Группировка данных по названию курса и агрегирование дохода grouped = df.groupby('title', as_index=False).aggregate() grouped

Обратите внимание на as_index=False , эта часть кода отвечает за то, чтобы сохранить числовые индексы в результатах группировки и вычисления.

Сводные таблицы в Pandas

Их используют для обобщения информации, собранной об объекте исследования. Когда исходных данных много и все они разного типа, составление таблиц помогает упорядочить информацию. Чтобы создавать на Python сводные таблицы, тоже используют библиотеку Pandas, а именно — метод .pivot_table .

Для примера возьмем условный набор данных с простыми категориями one / two, small / large и числовыми значениями. В столбце A две категории foo / bar складываются в слово foobar — текст, который используется в программировании для условного обозначения. В этом случае он указывает, что мы делим данные на две группы по неопределенному признаку.

df = pd.DataFrame() df

Результат выполнения кода:

Python сводная таблица с помощью pandas

С помощью метода .pivot_table преобразуем эти данные в таблицу, а в скобках прописываем условия.

table = pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'], aggfunc=np.sum) table

преобразованные данные в таблицу

Мы разбиваем данные на две категории: bar и foo, в каждой из них будут подгруппы со значениями one и two, которые в свою очередь делятся на small и large. В сводной таблице мы вычисляем, сколько объектов будет в каждой группе. Для этого используем методы values, index, columns и aggfunc:

  • values — метод для агрегации, объединяет элементы в одну систему;
  • index и columns — методы, отвечающие за группировку столбцов;
  • aggfunc — метод, который передает список функций, необходимых для расчета.

Визуализация данных в Pandas

Дата-аналитики составляют наглядные графики с помощью Pandas и библиотеки Matplotlib. В этой связке Pandas отвечает за вычислительную часть работы, а вспомогательная библиотека «создает» картинку.

Посмотрим на данные о продажах в одной из компаний:

Число покупок на одного покупателя Количество покупателей
7000 4
3755 6
2523 13
541 16
251 21
1 31

В таблице видно, что одни пользователи совершили уже более 7 000 покупок, а некоторые — сделали первую. Чтобы увидеть подробную картину, составляем график sns.distplot. На горизонтальной оси будет отображаться число покупок на одного покупателя, а на вертикальной — количество покупателей, которые совершили именно столько покупок в этой компании. Так по графику можно определить, что самой многочисленной оказалась группа клиентов, которая совершила всего несколько покупок, а группа постоянных клиентов немногочисленная.

import seaborn as sns import matplotlib.pyplot as plt # Создание данных purchase_counts = [7000, 3755, 2523, 541, 251, 1] customer_counts = [4, 6, 13, 16, 21, 31] # Создание графика sns.set(style="whitegrid") sns.distplot(purchase_counts, bins=20, kde=False, hist_kws=) plt.xlabel('Число покупок на одного покупателя') plt.ylabel('Количество покупателей') plt.title('Распределение числа покупок') plt.show()

график с помощью Pandas на Python

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

Кроме этого, в Pandas есть другие виды графиков:

  • kdeplot — график плотности распределения, который останется, если убрать гистограммы из distplot;
  • jointplot — график, показывающий распределение данных между двумя переменными. Каждая строка из набора данных в исходном файле отображается на графике как точка внутри системы координат. У точек на графике jointplot будет два заданных значения: одно по оси X, другое по оси Y.

Например, можно отследить взаимосвязь между тем, сколько минут посетитель проводит в торговом центре и сколько магазинов успевает посетить за это время: кто-то за 30 минут успеет зайти в 5 бутиков, а кто-то обойдет 16. При этом каждый посетитель на графике будет отображаться отдельной точкой.

Аналитик данных

Аналитики влияют на рост бизнеса. Они выясняют, какой товар и в какое время больше покупают. Считают юнит-экономику. Оценивают окупаемость рекламной кампании. Поэтому компании ищут и переманивают таких специалистов.

картинка (73)

Статьи по теме:

Анализ данных с использованием Python

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

В этой статье разберем простой пример исследования и классификации данных с использованием некоторых библиотек на Python. Для исследования, нам понадобится выбрать интересующий нас набор данных (DataSet). Разнообразные наборы Dataset’ы можно скачать с сайта. DataSet обычно представляет собой файл с таблицей в формате JSON или CSV. Для демонстрации возможностей исследуем простой набор данных с информацией о наблюдениях НЛО. Наша цель будет не получить исчерпывающие ответы на главный вопрос жизни, вселенной и всего такого, а показать простоту обработки достаточно большого объема данных средствами Python. Собственно, на месте НЛО могла быть любая таблица.

И так, таблица с наблюдениями имеет следующие столбцы:

  • datetime — дата появления объекта
  • city — город в котором появился объект
  • state — штат
  • country — страна
  • duration (seconds) — время на которое появился объект в секундах
  • duration (hours/min) — время на которое появился объект в часах/минутах
  • shape — форма объекта
  • comments — коментарий
  • date posted — дата публикации
  • latitude — широта
  • longitude — долгота

Для тех, кто хочет пробовать нуля, подготовим рабочее место. У меня на домашнем ПК стоит Ubuntu, поэтому покажу для нее. Для начала нужно установить сам интерпретатор Python3 с библиотеками. В убунту подобном дистрибутиве это будет:

 sudo apt-get install python3 sudo apt-get install python3-pip 

pip — это система управления пакетами, которая используется для установки и управления программными пакетами, написанными на Python. С её помощью устанавливаем библиотеки, которые будем использовать:

  • sklearn — библиотека, алгоритмов машинного обучения, она понадобится нам в дальнейшем для классификации исследуемых данных,
  • matplotlib — библиотека для построения графиков,
  • pandas — библиотека для обработки и анализа данных. Будем использовать для первичной обработки данных,
  • numpy — математическая библиотека с поддержкой многомерных массивов,
  • yandex-translate — библиотека для перевода текста, через yandex API (для использования нужно получить API ключ в яндексе),
  • pycountry — библиотека, которую будем использовать для преобразования кода страны в полное название страны,

Используя pip пакеты ставятся просто:

pip3 install sklearn pip3 install matplotlib pip3 install pandas pip3 install numpy pip3 install yandex-translate pip3 install pycountry 

Файл DataSet — scrubbed.csv должен лежать в рабочей директории, где создается файл программы.

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

 import

Если название модуля слишком длинное, и/или не нравится по соображениям удобства или политическим убеждениямм, то с помощью ключевого слова as для него можно создать псевдоним:

 import as

Тогда, чтобы обратиться к определенному атрибуту, который определен в модуле

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

 from import

Подключение нужных нам модулей:

import pandas as pd import numpy as np import pycountry import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import Axes3D from yandex_translate import YandexTranslate # Используем класс YandexTranslate из модуля yandex_translate from yandex_translate import YandexTranslateException # Используем класс YandexTranslateException из модуля yandex_translate

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

# Размер надписей на графиках PLOT_LABEL_FONT_SIZE = 14 # Генерация цветовой схемы # Возвращает список цветов def getColors(n): COLORS = [] cm = plt.cm.get_cmap('hsv', n) for i in np.arange(n): COLORS.append(cm(i)) return COLORS 

Для перевода некоторых названий с англиского на русский язык создадим функцию translate. И да, нам понадобится интернет, чтобы воспользоваться API переводчика от Яндекс.

Функция принимает на вход аргументы:

  • string — строка, которую нужно перевести,
  • translator_obj — объект в котором реализован переводчик, если равен None, то строка не переводится.

и возвращает переведенную на русский язык строку.

def translate(string, translator_obj=None): if translator_class == None: return string t = translator_class.translate(string, 'en-ru') return t['text'][0] 

Инициализация объекта переводчика должна быть в начале кода.

YANDEX_API_KEY = 'Здесь должен быть определен API ключ . ' try: translate_obj = YandexTranslate(YANDEX_API_KEY) except YandexTranslateException: translate_obj = None 

YANDEX_API_KEY — это ключ доступа к API Yandex, его следует получить в Яндексе. Если он пустой, то объект translate_obj инициализируется значением None и перевод будет игнорироваться.

Напишем еще одну вспомогательную функцию для сортировки объектов dict.

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

def dict_sort(my_dict): keys = [] values = [] my_dict = sorted(my_dict.items(), key=lambda x:x[1], reverse=True) for k, v in my_dict: keys.append(k) values.append(v) return (keys,values) 

Мы добрались до непосредственно данных. Для чтения файла с таблицей используем метод read_csv модуля pd. На вход функции подаем имя csv файла, и чтобы подавить предупреждения при чтении файла, задаем параметры escapechar и low_memory.

  • escapechar — символы, которые следует игнорировать
  • low_memory — настройка обработки файла. Задаем False для считывание файла целиком, а не частями.
df = pd.read_csv('./scrubbed.csv', escapechar='`', low_memory=False) 

В некоторых полях таблицы есть поля со значением None. Этот встроенный тип, обозначающий неопределенность, поэтому некоторые алгоритмы анализа могут работать некорректно с этим значением, поэтому произведем замену None на строку ‘unknown’ в полях таблицы. Эта процедура называется импутацией.

df = df.replace(, 'unknown') 

Поменяем коды стран на названия на русском языке с помощью библиотеки pycountry и yandex-translate.

country_label_count = pd.value_counts(df['country'].values) # Получить из таблицы список всех меток country с их количеством for label in list(country_label_count.keys()): c = pycountry.countries.get(alpha_2=str(label).upper()) # Перевести код страны в полное название t = translate(c.name, translate_obj) # Перевести название страны на русский язык df = df.replace(, t) 

Переведем все названия видов объектов на небе на русский язык.

shapes_label_count = pd.value_counts(df['shape'].values) for label in list(shapes_label_count.keys()): t = translate(str(label), translate_obj) # Перевести название формы объекта на русский язык df = df.replace(, t) 

Первичную обработку данных на этом завершаем.

Постороим график наблюдений по странам. Для построения графиков используется библиотека pyplot. Примеры построения простого графика можно найти на официальном сайте https://matplotlib.org/users/pyplot_tutorial.html. Для построения гистограммы можно использовать метод bar.

country_count = pd.value_counts(df['country'].values, sort=True) country_count_keys, country_count_values = dict_sort(dict(country_count)) TOP_COUNTRY = len(country_count_keys) plt.title('Страны, где больше всего наблюдений', fontsize=PLOT_LABEL_FONT_SIZE) plt.bar(np.arange(TOP_COUNTRY), country_count_values, color=getColors(TOP_COUNTRY)) plt.xticks(np.arange(TOP_COUNTRY), country_count_keys, rotation=0, fontsize=12) plt.yticks(fontsize=PLOT_LABEL_FONT_SIZE) plt.ylabel('Количество наблюдений', fontsize=PLOT_LABEL_FONT_SIZE) plt.show() 

Больше всего наблюдений естественно в США. Тут ведь оно как, все гики, которые следят за НЛО живут в США (о версии, что таблица составлялась гражданами США, лукаво умолчим). Судя по количеству американских фильмов скорее всего второе. От Кэпа: если инопланетяне действительно посещали землю в открытую, то вряд ли бы их заинтересовала одна страна, сообщение об НЛО появлялись бы из разных стран.

Интересно еще посмотреть в какое время года наблюдали больше всего объектов. Есть резонное предположение, что больше всего наблюдений в весеннее время.

MONTH_COUNT = [0,0,0,0,0,0,0,0,0,0,0,0] MONTH_LABEL = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь' ,'Октябрь' ,'Ноябрь' ,'Декабрь'] for i in df['datetime']: m,d,y_t = i.split('/') MONTH_COUNT[int(m)-1] = MONTH_COUNT[int(m)-1] + 1 plt.bar(np.arange(12), MONTH_COUNT, color=getColors(12)) plt.xticks(np.arange(12), MONTH_LABEL, rotation=90, fontsize=PLOT_LABEL_FONT_SIZE) plt.ylabel('Частота появления', fontsize=PLOT_LABEL_FONT_SIZE) plt.yticks(fontsize=PLOT_LABEL_FONT_SIZE) plt.title('Частота появления объектов по месяцам', fontsize=PLOT_LABEL_FONT_SIZE) plt.show() 

Ожидалось весеннее обострение, но предположение не подтвердилось. Кажется теплые летние ночи и период отпусков дают о себе знать сильнее.

Посмотрим какие формы объектов на небе видели и сколько раз.

shapes_type_count = pd.value_counts(df['shape'].values) shapes_type_count_keys, shapes_count_values = dict_sort(dict(shapes_type_count)) OBJECT_COUNT = len(shapes_type_count_keys) plt.title('Типы объектов', fontsize=PLOT_LABEL_FONT_SIZE) bar = plt.bar(np.arange(OBJECT_COUNT), shapes_type_count_values, color=getColors(OBJECT_COUNT)) plt.xticks(np.arange(OBJECT_COUNT), shapes_type_count_keys, rotation=90, fontsize=PLOT_LABEL_FONT_SIZE) plt.yticks(fontsize=PLOT_LABEL_FONT_SIZE) plt.ylabel('Сколько раз видели', fontsize=PLOT_LABEL_FONT_SIZE) plt.show() 

Из графика мы видим, что больше всего на небе видели просто свет, который в принципе необязательно является НЛО. Этому явлению существует внятное объяснение, например, ночное небо отражает свет от прожекторов, как в фильмах про Бэтмена. Также это вполне может быть северным сиянием, которое появляется не только в полярной зоне, но и в средних широтах, а изредка даже и в близи эвкватора. Вообще атмосфера земли пронизана множеством излучений различной природы, электрическими и магнитными полями.

Вообще, атмосфера Земли пронизана множеством излучений различной природы, электрическими и магнитными полями.

Интересно еще посмотреть среднее время, на которое в небе появлялся каждый из объектов.

shapes_durations_dict = <> for i in shapes_type_count_keys: dfs = df[['duration (seconds)', 'shape']].loc[df['shape'] == i] shapes_durations_dict[i] = dfs['duration (seconds)'].mean(axis=0)/60.0/60.0 shapes_durations_dict_keys = [] shapes_durations_dict_values = [] for k in shapes_type_count_keys: shapes_durations_dict_keys.append(k) shapes_durations_dict_values.append(shapes_durations_dict[k]) plt.title('Среднее время появление каждого объекта', fontsize=12) plt.bar(np.arange(OBJECT_COUNT), shapes_durations_dict_values, color=getColors(OBJECT_COUNT)) plt.xticks(np.arange(OBJECT_COUNT), shapes_durations_dict_keys, rotation=90, fontsize=16) plt.ylabel('Среднее время появления в часах', fontsize=12) plt.show() 

Из диаграммы видими, что больше всего в небе в среднем висел конус (более 20 часов). Если покопаться в интернетах, то ясно, что конусы в небе, это тоже свечение, только в виде конуса (неожиданно, да?). Вероятнее всего это свет от падающих комет. Среднее время больше 20 часов — это какая-то нереальная величина. В исследуемых данных большой разброс, и вполне могла вкраться ошибка. Несколько очень больших, неверных значений времени появления могут существенно исказить расчет среднего значения. Поэтому при больших отклонениях, считают не среднее значение, а медиану.

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

Заменим в коде выше:

shapes_durations_dict[i] = dfs['duration (seconds)'].mean(axis=0)/60.0/60.0
shapes_durations_dict[i] = dfs['duration (seconds)'].median(axis=0)/60.0/60.0

Полумесяц видели в небе чуть больше 5-ти часов. Другие объекты не надолго промелькнули в небе. Это уже наиболее достоверно.

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

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

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