Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save legale/65e766b38e10969802a04c0cdb5a8eae to your computer and use it in GitHub Desktop.

Select an option

Save legale/65e766b38e10969802a04c0cdb5a8eae to your computer and use it in GitHub Desktop.
yandex_python_data_analyst_5_Pandas для анализа данных
Данные исследуют в четыре стадии:
Получение данных и ознакомление с ними
Предподготовка данных
Анализ данных
Оформление результатов исследования
В этой теме мы начнём с первой стадии. В получении данных и ознакомлении с ними важную роль выполняет библиотека Pandas.
Чему вы научитесь
Познакомитесь с библиотекой Pandas и её базовыми методами: чтением файла, выводом данных на экран, получением сводной информации и запросом значений из определённых ячеек таблицы.
Сколько времени это займёт
2 часа = 6 уроков от 2 до 30 минут.
Постановка задачи
Решим задачу из реальной практики сервиса Яндекс.Музыка: исследовать предпочтения пользователей и ответить на вопрос, целесообразна ли интеграция двух сервисов — Музыки и Радио.
Мы готовим к запуску новый релиз, где соединим вместе приложения Музыка и Радио. Нам важно понимать, как пользователи отреагируют на такое новшество. Для этого мы оцениваем на небольшом количестве пользователей, насколько им понравилась возможность быстрого доступа к Радио.
Каждая компания по-разному оценивает реакцию пользователя на нововведения. Продуктовые исследования в нашем сервисе показали, что среднее время прослушивания лучше всего отражает лояльность пользователей.
Метрика удовлетворенности пользователя сервисом называется happiness. В Яндекс.Музыке метрика happiness равна среднему времени прослушивания треков. Чем выше этот показатель, тем больше доволен пользователь.
image
Есть и другие метрики, которые помогают ответить на вопрос: «Как дела у нашего продукта?»
Если метрика happiness в эксперименте повысится, команда примет решение добавить Радио всем пользователям.
Ваша задача как аналитика Яндекс.Музыки определить текущее значение метрики happiness. Вы пройдёте все стадии – от знакомства с данными до решения бизнес-задачи.
Вот так выглядят наши данные на этапе знакомства:
image
Этот хаос нужно превратить в аккуратную табличку, поддающуюся обработке. Для такой задачи подойдёт и Excel, но лучше использовать профильный инструмент — программную библиотеку Pandas.
Библиотеки – это наборы готовых методов для решения распространённых задач. Из того, что есть в Python, для операций с таблицами чаще всего применяют Pandas. Название — от сокращения panel data (англ. «панельные данные») — пришло из терминологии применяемого в экономике панельного анализа, который изучает изменение определённого признака у определённого объекта во времени (например, уровень бедности в Бразилии во второй половине 20 века). Библиотека Pandas оказалась таким универсальным инструментом, что годится для исследования любых данных, которые вообще можно собрать в таблицу.
Почему библиотека Pandas такая крутая и популярная? У неё богатейшие возможности:
Готовые методы для всяческих манипуляций с таблицами: добавления, удаления, преобразования, агрегирования данных;
Одновременная обработка данных из разных файлов;
Готовые методы для операций с пропущенными значениями, выявления и устранения проблемных данных;
Использование данных в самых разных форматах.
Кроме того, вы всегда можете обратиться к хорошо подготовленной документации и активному комьюнити.
Инструменты библиотеки становятся доступны, когда мы вызываем её командой import.
import pandas
Библиотека хранится в переменной, через которую можно вызвать её методы. В сообществе принято давать ей короткое имя pd.
import pandas as pd
Эта команда означает «импортируй библиотеку Pandas как pd».
У нас есть набор данных, который нужно превратить в таблицу. Это делается вызовом конструктора DataFrame().
Конструктор принимает два аргумента – список данных и названия столбцов, которые должны быть в таблице. Например, если информация о столицах разных стран хранится в переменной atlas:
atlas = [
['Франция','Париж'],
['Россия','Москва'],
['Китай','Пекин'],
['Мексика','Мехико'],
['Египет','Каир']
]
и нужно построить таблицу из двух столбцов country и capital,
geography = ['country', 'capital']
синтаксис вызова конструктора DataFrame() выглядит так:
world_map = pd.DataFrame(data = atlas , columns = geography)
image
Обратите внимание, что DataFrame() – это конструктор библиотеки Pandas, поэтому перед именем конструктора стоит обращение к переменной, в которой библиотека хранится – pd.DataFrame().
atlas = [
['Франция','Париж'],
['Россия','Москва'],
['Китай','Пекин'],
['Мексика','Мехико'],
['Египет','Каир'],
]
geography = ['country', 'capital']
world_map = pd.DataFrame(data = atlas , columns = geography) # таблица сохраняется в переменной с произвольно выбранным именем world_map
print(world_map) # вывод на экран
COUNTRY CAPITAL
0 Франция Париж
1 Россия Москва
2 Китай Пекин
3 Мексика Мехико
4 Египет Каир
В результате простой список пар страна-столица превратился в таблицу с индексами и именованными столбцами. Давайте создадим таблицу с данными о ваших музыкальных предпочтениях.
TASK_1_4
Получите доступ к библиотеке Pandas, используйте имя переменной pd.
SOLUTION
import pandas as pd
TASK_2_4
Создайте список music с 5 парами «имя вашего любимого исполнителя - название его песни». Пример такого списка - atlas из теоретического введения к этому уроку.
import pandas as pd
SOLUTION
import pandas as pd
music=[['Меладзе','Она была'],
['Билан','Тоска'],
['Пресняков','Стюардесса'],
['Тальков','Чистые пруды'],
['Розенбаум','Брат мой'],
]
TASK_3_4
Создайте список entries с названиями для двух столбцов — artist и track (здесь эти английские слова употребляются в значении «исполнитель» и «композиция»).
SOLUTION
import pandas as pd
music=[['Меладзе','Она была'],
['Билан','Тоска'],
['Пресняков','Стюардесса'],
['Тальков','Чистые пруды'],
['Розенбаум','Брат мой'],
]
entries=['artist','track']
TASK_4_4
Используя конструктор DataFrame(), создайте таблицу из списка ваших любимых исполнителей music и списка столбцов entries. Сохраните таблицу в переменной playlist и выведите эту сборную таблицу на экран.
SOLUTION
import pandas as pd
music=[['Меладзе','Она была'],
['Билан','Тоска'],
['Пресняков','Стюардесса'],
['Тальков','Чистые пруды'],
['Розенбаум','Брат мой'],
]
entries=['artist','track']
playlist=pd.DataFrame(data=music, columns=entries)
print (playlist)
У вас есть набор данных. Чтобы начать работу с ним, данные нужно прочитать. Давайте разберёмся, как это сделать.
Знакомому формату электронной таблицы Excel в Pandas соответствует структура данных DataFrame. Аналитики обычно называют такие объекты просто DataFrame.
В рабочей практике вы столкнётесь с тем, что данные хранят в файлах разных форматов. Из них самый распространённый – CSV (от англ. Comma-Separated Values, «значения, разделённые запятой»). Каждая строка такого файла представляет собой одну строку таблицы, где данные разделены запятыми. В первой строке собраны заголовки столбцов (если они есть).
Посмотрите, как одинаковые данные выглядят в Excel (снизу) и CSV (сверху):
image
Файлы CSV удобнее всего открывать вызовом метода read_csv() из библиотеки Pandas.
import pandas as pd
df = pd.read_csv('music_log.csv') # аргумент - путь к файлу
Обратите внимание, что содержимое файла CSV сохраняется в переменной df. Это имя, которое будет встречаться постоянно — общепринятое сокращение от DataFrame.
Теперь все данные из файла можно напечатать на экране командой print(df), но это не всегда нужно делать — не исключено, что таблица огромна и неудобна для изучения. Для знакомства с данными запрашивают несколько строк из начала или конца таблицы, вызывая специальные методы head() и tail(). По умолчанию head() возвращает первые 5 строк набора данных, а метод tail() – последние 5 строк. Когда нужно не 5, количество строк передаётся этим методам как аргумент. Например, head(10) вернёт первые 10 строк. Давайте возьмёмся за поставленную менеджером задачу и откроем файл с данными сервиса Яндекс.Музыка. Получим первый десяток строк этой обширной таблицы:
print(df.head(10))
USER_ID TOTAL PLAY ARTIST GENRE TRACK
0 BF6EA5AF 92.851388 Marina Rei pop Musica
1 FB1E568E 282.981000 Stive Morgan ambient Love Planet
2 FB1E568E 282.981000 Stive Morgan ambient Love Planet
3 EF15C7BA 8.966000 NaN dance Loving Every Minute
4 82F52E69 193.776327 Rixton pop Me And My Broken Heart
5 4166D680 3.007000 Henry Hall & His Gleneagles Hotel Band jazz Home
6 F4F5677 0.100000 NaN classicmetal NaN
7 386FE1ED 211.880000 NaN electronic Riviera
8 A5E0D927 3.161000 Andrew Paul Woodworth pop The Name of This Next Song Is Called
9 E9E8A0CA 274.390000 Pillar Point indie Dove
TASK_1_2
Прочитайте файл music_log.csv и сохраните его в переменной df. Сохраните первые 5 строк с данными из music_log.csv в переменной music_head и выведите значение переменной на экран.
SOLUTION
# <импортируйте библиотеку pandas>
import pandas as pd
df=pd.read_csv('music_log.csv')
music_head = df[:5]
print(music_head.head())
TASK_2_2
Прочитайте файл music_log.csv и сохраните его в переменной df. Сохраните последние 10 строк с данными из music_log.csv в переменной music_tail и выведите значение переменной на экран.
SOLUTION
import pandas as pd
df=pd.read_csv('music_log.csv')
music_tail = df[-10:]
print(music_tail.tail(10))
Таблица, которую мы получили, хранится в структуре данных DataFrame. Давайте подробно разберём, из чего состоит этот объект и какие операции с ним можно выполнять.
image
DataFrame — это двумерная структура данных Pandas, где у каждого элемента есть две координаты: по строке и по столбцу.
image
Вы видите две оси, которые формируют объект DataFrame. Первая ось называется индексы, вторая ось — столбцы. По умолчанию индексация в DataFrame начинается с нуля.
Каждая строка — это одно наблюдение, запись об объекте исследования. А столбцы — признаки объектов. В нашем случае одна строка — это одно действие одного пользователя. Прослушивание такой-то композиции в исполнении такой-то группы в течение такого-то времени.
Для лучшего понимания данных полезно получить доступ к их описанию. Это либо документация со сведениями о содержании каждого столбца, либо – не самый лучший вариант – рассказ человека, который предоставил вам эту информацию. Сейчас документация выглядит так:
user_id — содержит информацию об уникальном идентификаторе пользователя;
total play — сколько секунд пользователь слушал трек;
Artist — имя исполнителя;
genre — жанр (рок, поп, электронная музыка, классическая и др.);
track — название трека.
Такое описание поможет нам ставить себе корректные задачи.
У DataFrame есть неотъемлемые свойства, значения которых можно запросить. Они называются атрибуты. Например, атрибут columns содержит информацию о названиях столбцов в наборе данных.
print(df.columns)
image
В данном случае атрибут columns вернул список названий столбцов и сообщил, что каждое из них имеет тип данных object.
Вообще типы данных могут быть разные. Для просмотра типа данных каждого столбца лучше всего использовать атрибут dtypes.
print(df.dtypes)
image
Типы данных, о которых сообщают нам атрибуты — это типы данных библиотеки Pandas. Каждому из них соответствует определённый тип данных языка Python.
Так, для int таким «двойником» в Pandas будет int64. Тип данных object используется, когда данные не подходят ни под одну категорию или соответствуют в Python типу «строка». Вот таблица соответствия типов данных Pandas и Python:
PANDAS DTYPE PYTHON TYPE ЗНАЧЕНИЕ
object str Строка
int64 int Целые числа
float64 float Вещественные числа
bool bool Логический тип данных
О размерах таблицы с данными сообщает её атрибут shape. В результате получается кортеж (неизменяемый список) из двух чисел: первое – количество строк, второе – количество столбцов.
print(df.shape)
image
В таблице 67963 строк (наблюдений) и 5 столбцов.
Кортеж – одномерная неизменяемая последовательность. Это структура данных, похожая на список, её тоже можно сохранять в переменной. Например, кортеж artist содержит имена исполнителей:
artist = ('Queen', 'Led Zeppelin', 'Scorpions')
Но если мы попытаемся изменить элемент кортежа, то Python вернёт ошибку:
artist[0] = 'Spice Girls'
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-25-4409a5f0dbe8> in <module>()
----> 1 artist[0] = 'Spice Girls'
TypeError: 'tuple' object does not support item assignment
Можно получить информацию как обо всём кортеже, так и об отдельных его элементах:
print(artist)
('Queen', 'Led Zeppelin', 'Scorpions')
print(artist[0])
'Queen'
Кортеж нужен для хранения и чтения данных, которые лучше не изменять. Он похож на текстовый документ, защищённый от редактирования.
Всю информацию, которую предоставляют разные атрибуты DataFrame, можно получить вызовом одного-единственного метода info(). Изучив результаты, которые этот метод возвращает, аналитик выбирает тактику дальнейшей работы с таблицей.
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 67963 entries, 0 to 67962
Data columns (total 5 columns):
user_id 67963 non-null object
total play 67963 non-null float64
Artist 60157 non-null object
genre 65223 non-null object
track 65368 non-null object
dtypes: float64(1), object(4)
memory usage: 2.6+ MB
image
Например, здесь в разных столбцах разное количество элементов с определёнными значениями (non-null). Следовательно, в таблице есть пропущенные значения (null). Прежде чем анализировать такие данные, их нужно обработать. Это одна из самых интересных задач аналитика, и мы поговорим о ней подробнее в следующей теме.
TASK_1_4
Прочитайте файл music_log.csv и сохраните его в переменной df. Создайте переменную shape_table и сохраните в ней размеры таблицы music_log.csv. Напечатайте на экране размер таблицы в таком виде:
Размер таблицы: ...
SOLUTION
import pandas as pd
df=pd.read_csv('music_log.csv')
shape_table=df.shape
print('Размер таблицы:', shape_table)
TASK_2_4
Сколько наблюдений в наборе данных? В переменной shape_table хранится кортеж. Его первый элемент — количество наблюдений, который надо сохранить в переменной observations_table (не забывайте, что индексация элементов идёт с 0). Напечатайте на экране ответ в таком виде:
Количество наблюдений: ...
SOLUTION
import pandas as pd
df = pd.read_csv('music_log.csv')
shape_table = df.shape
observations_table = shape_table [0]
print('Количество наблюдений:', observations_table)
TASK_3_4
Найдите в информации, которую вернул метод info(), число наблюдений. Вручную присвойте это число как значение переменной observations_info_table.
SOLUTION
import pandas as pd
df = pd.read_csv('music_log.csv')
df.info()
observations_info_table = 67963
TASK_4_4
Вы ещё не запутались? Давайте осмотримся и заодно вспомним условные конструкции.
Поскольку в ходе работы аналитик объявляет разные переменные и сохраняет в них добытую разными способами информацию, запутаться очень легко. Именно поэтому необходимо проверять себя и текущие результаты. Сравните полученные результаты в переменных observations_info_table и observations_table. Если значения переменных совпадают, то выведите количество наблюдений и сообщение:
"Решение верно, количество наблюдений равно", observations_table
Если значения переменных не совпадают, то выведите сообщение:
"Решение неверно, проверьте ещё раз!"
SOLUTION
import pandas as pd
df = pd.read_csv('music_log.csv')
observations_info_table = df.shape[0]
observations_table = 67963
if observations_info_table == observations_table:
print("Решение верно, количество наблюдений равно", observations_table)
else:
print("Решение неверно, проверьте ещё раз!", observations_table)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment