Следующая тема: БРу. Предварительная обработка данных
Вернуться в раздел: Базовый Python
Вернуться в оглавление: Я.Практикум
9. Библиотека Pandas
9.1 Анализ данных продолжается сдесь
Задача №1
Подключите pandas так, чтобы обращаться к библиотеке через pd.
# напишите ваш код здесь
import pandas as pd
Задача №2
Создайте список списков music с четырьмя элементами. В каждом подсписке сохраните по два строковых значения, имя исполнителя и название песни:
'Bob Dylan' — 'Like A Rolling Stone';
'John Lennon' — 'Imagine';
'The Beatles' — 'Hey Jude';
'Nirvana' — 'Smells Like Teen Spirit'.
import pandas as pd
music = [
['Bob Dylan','Like A Rolling Stone'],
['John Lennon','Imagine'],
['The Beatles','Hey Jude'],
['Nirvana','Smells Like Teen Spirit']
]
Задача №3
Создайте список entries с названиями двух столбцов — artist и track (от англ. «исполнитель» и «композиция»).
import pandas as pd
music = [
['Bob Dylan', 'Like A Rolling Stone'],
['John Lennon', 'Imagine'],
['The Beatles', 'Hey Jude'],
['Nirvana', 'Smells Like Teen Spirit'],
]
# напишите ваш код здесь
entries = ['artist','track']
Задача №4
С помощью конструктора DataFrame() создайте таблицу из списков music и entries. Сохраните результат в переменную playlist и выведите его на экран.
import pandas as pd
music = [
['Bob Dylan', 'Like A Rolling Stone'],
['John Lennon', 'Imagine'],
['The Beatles', 'Hey Jude'],
['Nirvana', 'Smells Like Teen Spirit'],
]
entries = ['artist', 'track']
playlist = pd.DataFrame(data=music,columns=entries)
print (playlist)
9.2 Таблицы в Pandas
9.3 Получение данных
9.4 Обзор данных
9.5 Яндекс музыка. Обзор данных
Задача №1
Прочитайте файл music_log.csv и сохраните его данные в переменной df. Создайте переменную shape_table и сохраните в ней размеры таблицы music_log.csv. Напечатайте на экране размер таблицы в таком виде:
import pandas as pd
# напишите ваш код здесь
df = pd.read_csv('music_log.csv')
shape_table = df.shape
print ('Размер таблицы:',shape_table)
Задача №2
Сохраните в observations_table количество строк таблицы. Для этого получите первый элемент из кортежа shape_table. Выведите результат на экран в следующем виде:
import pandas as pd
df = pd.read_csv('music_log.csv')
shape_table = df.shape
observations_table = df.shape[0] # <напишите код здесь>
print ('Количество наблюдений:',observations_table)
Задача №3
Вызовите метод info(). Найдите в его выводе количество наблюдений (количество строк таблицы, вы выводили его на экран в предыдущей задаче). Вручную присвойте это число переменной observations_info_table.
import pandas as pd
df = pd.read_csv('music_log.csv')
# напишите вызов метода info() и нажмите кнопку «Выполнить»
df.info()
# затем раскомментируйте строку ниже и впишите туда полученное количество наблюдений
observations_info_table = 67963
Задача №4
Вы ещё не запутались? Осмотритесь и заодно вспомните условные конструкции. В ходе работы вы объявляете разные переменные и сохраняете в них добытую разными способами информацию. Запутаться очень легко, поэтому необходимо проверять себя и текущие результаты.
Сравните полученные результаты в переменных observations_info_table и observations_table. Если их значения совпадают, выведите количество наблюдений и сообщение:
'Решение верно, количество наблюдений равно', observations_table Если значения переменных не совпадают, выведите сообщение:
'Решение неверно, проверьте ещё раз!'
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 ('Решение неверно, проверьте ещё раз!')
9.6 Индексация в DataFrame
9.7 Яндекс музыка. Индексация
Задача №1
Из таблицы в переменной df извлеките два столбца: genre и Artist. Результат сохраните в genre_fight. Тогда print() выведет результат на экран.
import pandas as pd
df = pd.read_csv('music_log.csv')
# напишите ваш код здесь
genre_fight = df.loc[:,['genre','Artist']]
print(genre_fight)
Задача №2
Добавьте в код подсчёт треков жанра «поп». С помощью логической индексации получите ячейки со значением 'pop' — можно использовать сокращённую форму записи — и посчитайте их методом count(). Результат сохраните в переменной genre_pop. Вывод значения на экран уже есть в коде, не меняйте его.
import pandas as pd
df = pd.read_csv('music_log.csv')
genre_fight = df[['genre', 'Artist']]
# напишите ваш код здесь
genre_pop = genre_fight[genre_fight['genre'] == 'pop']
genre_pop = genre_pop['genre'].count()
print("Число прослушанных треков в жанре поп равно", genre_pop)
Задача №3
Не удаляя код из предыдущего задания, добавьте подсчёт треков в жанре 'rock'. Решение будет похожим: изменится только логическое выражение. Сохраните результат в переменной genre_rock. Напечатайте ответ на экране в таком виде: Число прослушанных треков в жанре рок равно ...
import pandas as pd
df = pd.read_csv('music_log.csv')
genre_fight = df[['genre', 'Artist']]
# напишите ваш код здесь
genre_pop = genre_fight[genre_fight['genre'] == 'pop']
genre_pop = genre_pop['genre'].count()
genre_rock = genre_fight[genre_fight['genre'] == 'rock']
genre_rock = genre_rock['genre'].count()
print("Число прослушанных треков в жанре поп равно", genre_pop)
print("Число прослушанных треков в жанре рок равно", genre_rock)
Задача №4
Напишите условную конструкцию, чтобы сравнить результаты предыдущих расчётов: если значение genre_pop больше, выведите сообщение 'Поп-музыку слушают больше.'; если больше genre_rock — 'Рок слушают больше.'; а если они равны — 'Поп и рок слушают одинаково часто.'.
import pandas as pd
df = pd.read_csv('music_log.csv')
genre_fight = df[['genre', 'Artist']]
# напишите ваш код здесь
genre_pop = genre_fight[genre_fight['genre'] == 'pop']
genre_pop = genre_pop['genre'].count()
genre_rock = genre_fight[genre_fight['genre'] == 'rock']
genre_rock = genre_rock['genre'].count()
print("Число прослушанных треков в жанре поп равно", genre_pop)
print("Число прослушанных треков в жанре рок равно", genre_rock)
if genre_pop > genre_rock:
print ('Поп-музыку слушают больше.')
elif genre_pop < genre_rock:
print ('Рок слушают больше.')
elif genre_pop == genre_rock:
print ('Поп и рок слушают одинаково часто.')
9.8 Объект Series
9.9 Яндекс Музыка. Series
Задача №1
Из df получите таблицу только с жанром rock и сохраните её в переменной rock.
import pandas as pd
df = pd.read_csv('music_log.csv')
# напишите код здесь
rock = df[df['genre'] == 'rock']
Задача №2
Сохраните столбец total play таблицы rock в переменной rock_time.
import pandas as pd
df = pd.read_csv('music_log.csv')
rock = df[df['genre'] == 'rock']
# напишите ваш код здесь
rock_time = rock['total play']
Задача №3
Посчитайте треки в rock_time, которые слушали пять секунд или менее. Это пропущенные композиции: пользователи начинали их слушать, но быстро выключали. Результат сохраните в переменной rock_haters.
import pandas as pd
df = pd.read_csv('music_log.csv')
rock = df[df['genre'] == 'rock']
rock_time = rock['total play']
# посчитайте и сохраните значение в переменной rock_haters
rock_haters = rock_time[rock_time <= 5].count()
print("Количество пропущенных треков жанра рок равно", rock_haters)
Задача №4
Теперь исследуйте любителей поп-музыки. Выберите в таблице df только строки с жанром 'pop' и сохраните эту новую таблицу в переменной pop.
import pandas as pd
df = pd.read_csv('music_log.csv')
rock = df[df['genre'] == 'rock']
rock_time = rock['total play']
rock_haters = rock_time[rock_time <= 5].count()
print("Количество пропущенных треков жанра рок равно", rock_haters)
#напишите код здесь
pop = df[df['genre'] == 'pop']
Задача №5
Сохраните столбец total play таблицы pop в переменной pop_time, как вы это делали в задании 2 для жанра рок.
import pandas as pd
df = pd.read_csv('music_log.csv')
rock = df[df['genre'] == 'rock']
rock_time = rock['total play']
rock_haters = rock_time[rock_time <= 5].count()
print("Количество пропущенных треков жанра рок равно", rock_haters)
pop = df[df['genre'] == 'pop']
# извлеките столбец здесь
pop_time = pop['total play']
Задача №6
Посчитайте треки из столбца pop_time, которые слушали пять секунд или менее. Это пропущенные композиции: пользователи начинали их слушать, но быстро выключали. Результат сохраните в переменной pop_haters.
import pandas as pd
df = pd.read_csv('music_log.csv')
rock = df[df['genre'] == 'rock']
rock_time = rock['total play']
rock_haters = rock_time[rock_time <= 5].count()
print("Количество пропущенных треков жанра рок равно", rock_haters)
pop = df[df['genre'] == 'pop']
pop_time = pop['total play']
# напишите ваш код здесь
pop_haters = pop_time[pop_time <=5].count()
print("Количество пропущенных треков жанра поп равно", pop_haters)
Задача №7
Вы посчитали пропущенные треки для двух жанров. Не удаляя вывод количества пропущенных треков, рассчитайте их долю: отношение к общему числу треков того же жанра. rock_haters разделите на общее число треков в таблице rock. Результат сохраните в переменную rock_skip. pop_haters — на число треков в pop. Результат сохраните в pop_skip.
import pandas as pd
df = pd.read_csv('music_log.csv')
rock = df[df['genre'] == 'rock']
rock_time = rock['total play']
rock_haters = rock_time[rock_time <= 5].count()
print("Количество пропущенных треков жанра рок равно", rock_haters)
pop = df[df['genre'] == 'pop']
pop_time = pop['total play']
pop_haters = pop_time[pop_time <= 5].count()
print("Количество пропущенных треков жанра поп равно", pop_haters)
# посчитайте rock_skip здесь
rock_skip = rock_haters/rock.shape[0]
print('Доля пропущенных композиций жанра рок равна:', rock_skip)
# посчитайте pop_skip здесь
pop_skip = pop_haters/pop.shape[0]
print('Доля пропущенных композиций жанра поп равна:', pop_skip)
9.10 Лаборатория индексации
Задача №1
Импортируйте библиотеку pandas и считайте СSV-файл game_board.csv в датафрейм board_df.
# импортируйте библиотеку pandas
import pandas as pd
# напишите ваш код
board_df = pd.read_csv('game_board.csv')
Задача №2
Выведите на экран корабль под номером 1 — с одной палубой. Для этого обратитесь к соответствующей ячейке по номеру строки и названию столбца. Примените полную запись индексации.
import pandas as pd
board_df = pd.read_csv('game_board.csv')
# напишите ваш код здесь
print (board_df.loc[0,'J'])
Задача №3
Выведите на экран корабль 2 с помощью обычной индексации. Запросите срез строк, на которых расположен корабль, и выберите нужный столбец. В решении примените полную запись с атрибутом loc[].
import pandas as pd
board_df = pd.read_csv('game_board.csv')
# напишите ваш код здесь
print(board_df.loc[1:3,'B'])
Задача №4
Выведите на экран корабль 3 — с четырьмя палубами. Для этого задайте соответствующую строку и срез столбцов. Примените полную форму атрибута loc[].
import pandas as pd
board_df = pd.read_csv('game_board.csv')
# напишите ваш код здесь
print(board_df.loc[5,'C':'F'])
Задача №5
Выведите на экран корабль 4. В решении примените сокращённую запись логической индексации.
import pandas as pd
board_df = pd.read_csv('game_board.csv')
# напишите ваш код здесь
print(board_df[board_df['H'] == 1]['H'])
9.11 Заключение
Заключение
Результат работы Соединив знание основ языка Python — арифметические и логические операторы, переменные, вызов функции print() — с некоторыми возможностями библиотеки pandas, вы уже получили важный для реального бизнеса результат. Он касается задачи, которую вам поставит менеджер Яндекс Музыки.
Вывод из вашего исследования контринтуитивный, как это нередко бывает в анализе данных. Казалось бы, раз «все» качают попсу, время прослушивания можно увеличить, просто добавив в плейлист побольше поп-музыки. А вот и нет! Хотя попсу действительно слушают чаще, пропускают её так же быстро, как и рок. Яндекс пошёл другим путём: объединил сервисы Музыка и Радио. С этим фактом и будет связано ваше исследование.
Что дальше
Перед тем как взяться за предоставленную менеджером громадную таблицу, надо вычистить из неё пропуски, дубликаты и другие нежелательные артефакты. Готовится важное решение. Нельзя, чтобы «информационный мусор» толкнул вас на неверный путь. Предобработка данных так важна, что её приёмам посвящена вся следующая тема. Заберите с собой Чтобы ничего не забыть, скачайте шпаргалку.
9.12 Проверочные задания. Библиотека Pandas
Pandas для анализа данных Чтобы пройти тест нужно правильно ответить на 5 вопросов из 12. Время на прохождение: 10 минут
Правильный ответ Двумерная
С двумерными структурами вы уже встречались. Вложенный список — тоже двумерная структура. Не зря его часто представляют в виде таблицы. В одномерной структуре, например в списке, вы найдёте элемент по одной координате — его индексу. В двумерной структуре вам понадобится две координаты: одна для столбца, другая для строки. В pandas встречаются двумерные и одномерные структуры. Поэтому важно понимать их особенности.
Задание 2 из 12
Какой метод создаст датафрейм из файла в формате .csv?
Правильный ответ read_csv()
Этот метод вам пригодится, ведь вы часто будете работать с такими файлами. Для других форматов в pandas свои методы. Устроены они так же: прочитай_<название формата>.
Задание 3 из 12
Что делает конструктор pd.DataFrame()?
Правильный ответ Создаёт новый объект pandas
Получить таблицу в pandas можно разными способами. Данные из файла можно прочитать специальным методом. Для данных из списка подойдёт конструктор. Это специальный метод, который создаёт новые объекты. Конструктору pd.DataFrame() понадобится два аргумента: список с данными и список с названиями столбцов.
Задание 4 из 12
Какой атрибут хранит информацию о размере датафрейма?
Правильный ответ shape
index
Атрибуты помогут быстро оценить данные в датафрейме: сколько их, какого они типа. Кроме shape ещё используют dtypes и columns. Атрибут dtypes вернёт тип данных в датафрейме, а columns выведет список с названиями столбцов — c ним вы познакомитесь позже. Если нужно всё и сразу, используют метод info().
Задание 5 из 12
Сколько строк датафрейма по умолчанию выводит метод head()?
Правильный ответ Пять
Метод head() выведет пять строк. Это количество можно скорректировать, если в аргументе метода указать число. Например, head(10) выведет первые десять строк.
Задание 6 из 12
Какой путь к файлу можно назвать абсолютным?
Правильный ответ '/datasets/music.csv'
Косая черта в начале пути указывает на то, что путь начинается с «корня». Так выглядит абсолютный путь в macOS. В Windows абсолютный путь будет таким: 'C:\datasets\music.csv'.
Задание 7 из 12
Какой тип у столбца в pandas?
Правильный ответ Series
Вы заметите, что одни методы в pandas применяют к объекту DataFrame, а другие — к объекту Series. Поэтому нужно помнить, что у датафрейма и столбца разные типы. Объекты Series чем-то похожи на списки. В отличие от датафрейма, у них одномерная структура.
Задание 8 из 12
С помощью индексации получают данные из таблицы по координатам. Какой атрибут для этого используют?
Правильный ответ loc
Атрибут loc вам не раз пригодится. С его помощью обращаются к ячейке, строке, столбцу и даже к нескольким столбцам. Позицию нужных элементов указывают с помощью координат или срезов.
Задание 9 из 12
Датафрейм music_df хранит информацию о разных музыкальных группах. Что попадёт в переменную result? result = music_df.loc[3, 'year']
Правильный ответ Значение ячейки из строки с индексом 3, столбца year
Индексация сильно упрощает поиск по таблице. Один запрос с атрибутом loc заменит несколько строчек кода. Разобраться в срезах и координатах сложнее. Координаты используют, чтобы обратиться к ячейке. Таких координат две: номер строки и название столбца. С помощью срезов получают группы ячеек: строки или столбцы.
Задание 10 из 12
Как выглядит сокращённая запись для индексации из переменной result?
Правильный ответ result = music_df[5:]
Cокращённой версии для этой команды нет В такой срез попадут строки, начиная с индекса 5. В сокращённой записи нет атрибута loc, а срез в этом случае останется прежним. Но так бывает не всегда. В сокращённой записи конец диапазона в срез не входит. Например, в срез music_df[:5] строка с индексом 5 не попадёт.
Задание 11 из 12
Как выглядит сокращённая запись для индексации из переменной result?
Правильный ответ result = music_df['genre']
Cокращённой версии для этой команды нет В переменную result попадёт столбец genre целиком. Но запись можно сократить, оставив в квадратных скобках только название столбца.
Задание 12 из 12
Как выглядит сокращённая запись для индексации из переменной filtered_df?
Cокращённой версии для этой команды нет
Разобраться с обычной индексацией не так легко, а тут ещё и сокращённые записи со своей логикой. Но такую форму часто используют на практике. Например, сокращают запись среза строк. Вспомните, какие записи ещё можно сократить.
Следующая тема: БРу. Предварительная обработка данных
Вернуться в раздел: Базовый Python
Вернуться в оглавление: Я.Практикум