Следующая тема: БРу. Предварительная обработка данных

Вернуться в раздел: Базовый 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 минут

Задание 1 из 12
Какая структура у датафрейма в pandas?

Правильный ответ Двумерная

С двумерными структурами вы уже встречались. Вложенный список — тоже двумерная структура. Не зря его часто представляют в виде таблицы. В одномерной структуре, например в списке, вы найдёте элемент по одной координате — его индексу. В двумерной структуре вам понадобится две координаты: одна для столбца, другая для строки. В 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

Вернуться в оглавление: Я.Практикум