Вот и началось познание курса "Базовый Python"

В курсе 14 тем рассчитанных на 29 часов. При ежедневном выделении на занятия часа по три без пропусков пройти можно не напрягаясь, но мы решили дать себе знаний максимум и уложились за семь дней. При этом часть часа по два уделял занятиям на основной работе а затем дома с шести вечера до полуночи примерно по шесть часов. Ну никак не получилось 29 часов. Мой личный результат составил (7 дней) * (8 часов) = 56 часов, а это уже почти в 2 раза дольше запланированного времени.

Курс в своем составе содержал следующие темы:

1. БPy. Переменные и типы данных.

2. БРу. Строки.

3. БРу. Списки.

4. БРу. Цикл 'for'.

5. БРу. Вложенные списки.

6. БРу. Условный оператор.

7. БРу. Функции.

8. БРу. Словари.

9. БРу. Библиотека Pandas.

10. БРу. Предварительная обработка данных.

11. БРу. Анализ данных и оформление результатов.

12. БРу. Jupyter Notebook.

13. БРу. Проект: Музыка больших городов.

14. БРу. Заключение.

 

Следующая тема: БPy. Переменные и типы данных.

Следующий раздел: Предобработка данных

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

После его освоения хочется сказать, что курс достаточно познавательный и нужный, хотя и носит поверхностный характер. Из всего курса больше всего запомнил команду print() т.к. набирал её более часто. Ну и за собой заметил, что наработал постоянный навык набирать [Ctrl + Enter] в тренажере Jupyter Notebook, до такой степени, что при наборе текста в Word для перехода на новую строку нажимаю сразу две клавиши.

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

1. Переменные и типы данных. Вывод данных и арифметических операций.

 1.1 Введение.

 1.2 Могучий Python.

 1.3 Переменные.

Задание 1

Создайте переменную, хранящую количество друзей Оушена из фильма «Одиннадцать друзей Оушена». Назовите переменную ocean_friends. Поместите в неё значение 11 с помощью оператора присваивания.

# напишите код здесь
ocean_friends = 11
print(ocean_friends)

Задание 2

У мистера Оушена появилось ещё двое друзей. Добавьте на новой строке код, который заменит значение в переменной ocean_friends на 13. Используйте оператор присваивания.

ocean_friends = 11
# напишите код здесь
ocean_friends = 13
print(ocean_friends)

Задание 3

Мы сохранили имена двух актёров в переменных. И нарушили два правила хорошего стиля. Исправьте нас, пожалуйста. Вывод на экран в этой задаче не нужен.

ocean = 'Джордж Клуни'
ocean_friend = 'Брэд Питт'

Задание 4

Мы попробовали перезаписать переменные и заменить имена актёров на имена их героев. Не получилось — какая-то синтаксическая ошибка. Проверьте первые символы названий переменных. Исправьте ошибочные названия. Вывод на экран в этой задаче не нужен.

ocean = 'Джордж Клуни'
ocean_friend = 'Брэд Питт'
ocean = 'Дэнни'
ocean_friend = 'Расти'

 

 1.4 Функция  print()

Задание 1

Таблица описывает три музыкальных трека: Исполнитель Трек Длительность (сек) Sting Shape Of My Heart 278 Sade No Ordinary Love 322 Red Hot Chili Peppers Californication 321 В коде уже объявлена переменная, которая хранит название трека исполнителя Sting из таблицы выше. Выведите значение переменной на экран функцией print().

sting_track_name = 'Shape Of My Heart'
print(sting_track_name)# выведите её значение на экран здесь
Shape Of My Heart

Задание 2

Исполнитель Трек Длительность (сек) Sting Shape Of My Heart 278 Sade No Ordinary Love 322 Red Hot Chili Peppers Californication 321 Объявите переменную, которая будет хранить длительность трека исполнителя Sade в секундах из таблицы выше. Обратите внимание: не перепутайте исполнителя Sade и исполнителя Sting. Имя переменной выберите самостоятельно, но следуйте правилам хорошего стиля: например, начинайте название с маленькой (строчной) буквы. Выведите значение переменной на экран функцией print().

sade_time_sec = 322# объявите переменную здесь
print(sade_time_sec)# выведите её значение на экран здесь

322

 1.5 Знакомство с данными.

Задание 1

Посчитайте долю носителей английского (native_speakers) от общего числа владеющих этим языком (total_speakers). Результат сохраните в переменной native_speakers_part. Выведите на экран её значение.

native_speakers = 378.2
total_speakers = 1121
native_speakers_part = native_speakers / total_speakers# напишите ваш код здесь
print (native_speakers_part)

Задание 2

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

jap_total_speakers = 128.3
jap_native_speakers = 128.2
print ((jap_total_speakers - jap_native_speakers)/ jap_total_speakers) #напишите ваш код здесь

Задание 3

Из прошлых уроков вы знаете, что первый фильм в истории человечества вышел на экраны в январе 1896 года. Эту дату можно считать годом рождения кинематографа (хоть и сняли эту короткометражку в 1895 году). Посчитайте, сколько лет исполнилось кинематографу в 2020 году. Результат выведите на экран.

first_movie_year = 1896
target_year = 2020
print (target_year - first_movie_year) # напишите ваш код здесь

 1.6 Арифметические операции.

 1.7 Арифметические данные и обработка ошибок.

jap_total_speakers = 0
jap_native_speakers = 128.2
try:
    print((jap_total_speakers - jap_native_speakers) / jap_total_speakers)
except:
    print('Деление на ноль!')

 1.8 Типы данных.

Задание 1

Создайте переменную de_website_part, хранящую долю сайтов на немецком языке в рейтинге 10 млн самых популярных сайтов. Какой это тип данных? Проверьте своё предположение: выведите на экран тип объекта из переменной de_website_part.

de_website_part = 0.06 # напишите код здесь
print (type(de_website_part))

Задание 2

Выведите на экран типы переменных chi_language и chi_total_speakers на отдельных строчках.

chi_language = 'китайский'
chi_total_speakers = 1107
# напишите код здесь
print (type(chi_language))
print (type(chi_total_speakers))

Задание 3

Перед вами программа, вычисляющая количество сайтов на русском языке в списке из 10 млн самых популярных сайтов в мире. В переменной russian_web_part мы сохранили долю русского языка в этом списке, а в переменной web_popular — количество сайтов, то есть 10 млн. Затем мы перемножили их в переменной russian_web_popular. Каким будет тип объекта в russian_web_popular? Выведите на экран сначала значение, затем тип переменной russian_web_popular на разных строчках.

russian_web_part = 0.061
web_popular = 10000000
russian_web_popular = web_popular * russian_web_part
# напишите код здесь
print(russian_web_popular)
print(type(russian_web_popular))

 1.9 Преобразование типов.

eng_total_speakers = '1121abc'
print(int(eng_total_speakers)) 

Задание 2

Преобразуйте значение переменной fra_total_speakers из типа str в тип float. Для этого примените функцию float() и поместите результат в ту же переменную. Определите тип объекта после преобразования функцией type() и выведите результат на экран.

fra_total_speakers = '284.9'
# напишите код здесь
fra_total_speakers = float(fra_total_speakers)
print(type(fra_total_speakers))

 1.10 Заключение.

favorite_character = 'Дмитрий Нагиев'# 'напишите имя персонажа вместо комментария'
#напишите ваш код здесь
print(len(favorite_character))
poetry = '''Белая берёза
Под моим окном
Принакрылась снегом,
Точно серебром.

На пушистых ветках
Снежною каймой
Распустились кисти
Белой бахромой.
'''
#выведите значение переменной на экран
print(poetry)

 1.11 Проверочные задания. Переменные и типы данных. Вывод данных.

 

2. Строки.

Вернуться в Начало статьи

 2.1 Введение.

 2.2 Строки в Python/

 2.3 Индексы.

Задание 1

С помощью неотрицательного индекса выведите на экран символ e из строки в переменной word.

word = 'привет'
print(word[4]) #напишите ваш код здесь
word = 'привет'
print(word[-2])#напишите ваш код здесь

 2.4 Срезы.

word = 'sentence'
# напишите ваш код здесь
print (word[3:6])
string = 'abracadabra'
#напишите ваш код здесь
print(string[0:5])

 2.5 Операции над строками.

print('I will not sleep through my education\n' * 100)

Задание 2

Сложите строку start с одной из переменных: first_choice, second_choice, third_choice — на ваш выбор. Обратите внимание, что складывать нужно именно с переменной, а не явно повторять строку, которая в ней хранится. Результат сложения сохраните в переменную с именем result. Тогда функция print() выведет строку-результат на экран.

start = 'Мне бы хотелось отправиться в '
first_choice = 'Париж'
second_choice = 'Рим'
third_choice = 'Нью-Йорк'
# напишите ваш код здесь
result = start + second_choice
print(result)

 2.6 Методы строк.

phrase = 'Чтобы закончить этот курс, нужна лень'
phrase = phrase.replace('лень','дисциплина') # замените подстроку здесь
print(phrase) # выведите значение переменной на экран здесь
word = 'DaTa ScIeNtIsT'
word_to_lower = word.lower() # приведите к нижнему регистру здесь
print(word_to_lower) # выведите значение переменной word_to_lower на экран здесь

 Задание 3

quote = 'Праздновать успех — это хорошо, но более важно извлекать уроки из неудач'
ind = quote.find('уроки') # напишите ваш код здесь
print(ind)

2.7 F - строки.

Задание 1

С помощью правил f-строк выведите на экран строку: Эйфелева башня находится в Париже, и её высота составляет 300 метров. Название города и высоту вставьте в строку из переменных 'city' и "height".

city = 'Париж'
height = 300
print(f'Эйфелева башня находится в {city}е, и её высота составляет {height} метров.') # измените эту строчку
place = 'Театр-музей'
last_name = 'Дали'
location = 'Каталония'
print('{0} художника {1} находится в автономном сообществе {2}.'.format(place,last_name,location)) # измените эту строчку

 2.8 Заключение.

Шпаргалка темы

 2.9 Проверочные задания. Строки.

3.  Списки.

Вернуться в Начало статьи

 3.1 Введение.

 3.2 Списки - основы.

Задание 1

В переменную duration запишите первые пять значений из столбца «Продолжительность (мин)»: 142, 175, 152, 195, 201. Выведите на экран содержимое переменной.

duration = [142,175,152,195,201] #сление значений
print(duration) 
first_row = ['Побег из Шоушенка','США',1994,'драма',142,9.111] #создайте список здесь
print(first_row) #напечатайте список здесь

 3.3 Индексы и срезы.

second_row = ['Крёстный отец', 'США', 1972, 'драма, криминал', 175, 8.730]
country = second_row[1] # напишите ваш код здесь
print (country) #выведите на экран здесь

Задание 2

Получите срез значений:
начало среза — год выпуска, 1972;
конец — продолжительность, 175.
Сохраните срез в переменную movie_slice.

second_row = ['Крёстный отец', 'США', 1972, 'драма, криминал', 175, 8.730]
movie_slice = second_row[2:5] #напишите ваш код здесь
print(movie_slice)

 3.4 Добавление и удаление элементов.

Задание 1

В списке stalker_info — данные о фильме «Сталкер». Но не хватает значений из последних трёх колонок: жанр — 'фантастика, драма, детектив', продолжительность — 163, рейтинг — 8.083. Добавьте эти значения в список методом extend() в том же порядке. Результат выведите на экран.

stalker_info = ['Сталкер', 'СССР', 1979]
stalker_info.extend(['фантастика, драма, детектив',163,8.083]) # используйте метод extend() здесь
print(stalker_info) # выведите список на экран здесь

 3.5 Сложение и умножение списков.

Задание 1

Сложите два списка в том же порядке, в котором они объявлены. Складывайте именно переменные first_part и second_part. Сохраните результат в переменной movie_info и выведите на экран её содержимое.

first_part = ['Криминальное чтиво', 'США', 1994]
second_part = ['триллер, комедия, криминал', 154, 8.619]
movie_info = first_part + second_part # создайте переменную movie_info здесь
print (movie_info) # здесь выведите получившийся список movie_info на экран

 Задание 2

zeros = [0]
zeros = zeros * 100 #напишите ваш код здесь
print (zeros)

3.6 Сортировка.

movies = ['Хороший, плохой, злой', 'Криминальное чтиво', 'Бойцовский клуб', 'Харакири', 'Сталкер']
movies.sort() # отсортируйте список здесь
print(movies) # выведите список на экран здесь
movies_duration = [142, 175, 152, 195, 201, 154, 178, 139]
movies_duration.sort(reverse=True) # отсортируйте список здесь
print(movies_duration) # выведите список на экран здесь
movies_duration = [142, 175, 152, 195, 201, 154, 178, 139]
movies_duration_sorted = sorted(movies_duration, reverse=True) # напишите ваш код здесь
print(movies_duration_sorted) # напечатайте получившийся список здесь

 3.7 Поиск элементов.

 3.8 Списки и строки.

phrase = 'Aladdin#Esmeralda#Hercules#Mulan'
words = phrase.split('#') #напишите ваш код здесь
print(words)

 3.9 Заключение.

Шпаргалка темы:

https://code.s3.yandex.net/data-analyst/praktikum_data_analysis_takeaways_basicPython_theme3.pdf.

3.10 Проверочные задания. Списки.

4. Цикл 'for'

Вернуться в Начало статьи

 4.1 Введение.

 4.2 Понятие цикла. Перебор элементов списка.

duration_list = [142, 175, 152, 195]
for i in duration_list:# напишите цикл for здесь
    print(i)

 4.3 Перебор элементов списка. Функция range()

Задание 1

Инопланетяне оставляют загадочные послания каждый день. Помогите им: напечатайте сообщение ALIENS на экране 100 раз с помощью цикла for.

for i in range(100): 
    print('ALIENS') # напечатайте ваш код здесь
movies_duration = [142, 175, 152, 195, 201]
for i in range(len(movies_duration)): # напишите ваш код здесь
    movies_duration[i] += 2
print(movies_duration)

 4.4 Циклы и встроенные функции для обработки списков.

Встроенная функция max(), min():

movies_duration = [142, 175, 152, 195, 201, 154, 178, 139, 133, 163, 136]
max_duration = max(movies_duration)
print (max_duration) 
marks = [90, 85, 83, 92]
total = sum(marks) # напишите ваш код здесь
print(total)

 4.5 Обработка списков с помощью циклов. Продолжение.

number = 10
fact = 1 # присвойте начальное значение
# напишите цикл
for i in range(1,number+1):
    fact *= i
print (fact)
import math
number = 10
fact = math.factorial(number) # напишите ваш код здесь
print(fact)

 4.6 Заключение

Шпаргалка темы.

https://code.s3.yandex.net/data-analyst/praktikum_data_analysis_takeaways_basicPython_theme4.pdf

 4.7 Проверочные задания. Цикл for

5. Вложенные списки.

Вернуться в Начало статьи

 5.1 Введение.

 5.2 Список списков.

 5.3 Циклы по вложенным спискам.

Задание №1

Выведите на экран столбец с жанрами фильмов таблицы movies_table. Каждое значение выводите на новой строке.

movies_table = [
    ['Побег из Шоушенка', 'США', 1994, 'драма', 142, 9.111],
    ['Крёстный отец', 'США', 1972, 'драма, криминал', 175, 8.730],
    ['Тёмный рыцарь', 'США', 2008, 'фантастика, боевик, триллер', 152, 8.499],
    ['Список Шиндлера', 'США', 1993, 'драма', 195, 8.818],
    ['Властелин колец: Возвращение Короля', 'Новая Зеландия', 2003, 'фэнтези, приключения, драма', 201, 8.625],
    ['Криминальное чтиво', 'США', 1994, 'триллер, комедия, криминал', 154, 8.619],
    ['Хороший, плохой, злой', 'Италия', 1966, 'вестерн', 178, 8.521],
    ['Бойцовский клуб', 'США', 1999, 'триллер, драма, криминал', 139, 8.644],
    ['Харакири', 'Япония', 1962, 'драма, боевик, история', 133, 8.106],
    ['Сталкер', 'СССР', 1979, 'фантастика, драма, детектив', 163, 8.083],
    ['Иди и смотри', 'СССР', 1985, 'драма, военный', 136, 8.094]
]

for row in movies_table: # напишите ваш код здесь
    print (row[3])

 

Задание №2

Выведите на экран столбец с годом релиза из таблицы movies_table. Каждое значение выводите на новой строке.

movies_table = [
    ['Побег из Шоушенка', 'США', 1994, 'драма', 142, 9.111],
    ['Крёстный отец', 'США', 1972, 'драма, криминал', 175, 8.730],
    ['Тёмный рыцарь', 'США', 2008, 'фантастика, боевик, триллер', 152, 8.499],
    ['Список Шиндлера', 'США', 1993, 'драма', 195, 8.818],
    ['Властелин колец: Возвращение Короля', 'Новая Зеландия', 2003, 'фэнтези, приключения, драма', 201, 8.625],
    ['Криминальное чтиво', 'США', 1994, 'триллер, комедия, криминал', 154, 8.619],
    ['Хороший, плохой, злой', 'Италия', 1966, 'вестерн', 178, 8.521],
    ['Бойцовский клуб', 'США', 1999, 'триллер, драма, криминал', 139, 8.644],
    ['Харакири', 'Япония', 1962, 'драма, боевик, история', 133, 8.106],
    ['Сталкер', 'СССР', 1979, 'фантастика, драма, детектив', 163, 8.083],
    ['Иди и смотри', 'СССР', 1985, 'драма, военный', 136, 8.094]
]

for i in movies_table:
    print(i[2]) # напишите ваш код здесь

5.4 Циклы по вложенным циклам. Продолжение.

Задание №1

Список списков field описывает игровое поле в «Крестиках-ноликах». Каждый его элемент — список из крестиков и ноликов, расположенных в одной строке. Выведите на экран список списков с помощью вложенных циклов for: каждый элемент общего списка выводите на новой строке; элементы подсписка отделяйте друг от друга одним пробелом. В вашем коде не должно быть квадратных скобок.

field = [['X', 'X', 'O'], ['O', 'X', 'O'], ['O', 'X', 'X']]
# напишите ваш код здесь
for row in field:
    for col in row:
        print (col, end=' ')
    print()

 5.5 Сумма значений в колонке.

Задание №1

В списке списков sales_info хранится число продаж пяти филиалов компании. С помощью цикла посчитайте сумму продаж всех филиалов. Результат сохраните в переменную total. Тогда функция print() выведет его на экран.

# [название филиала, количество продаж]
sales_info = [
    ['центральный', 12210],
    ['западный', 7612],
    ['восточный', 8110],
    ['южный', 5720],
    ['северный', 9798]
]

total = 0 # присвойте начальное значение
# напишите ваш код здесь
for sales in sales_info:
    total += sales[1]
print(total)

Задание №2

В списке списков movies_table найдите сумму всех значений рейтинга.

movies_table = [
    ['Побег из Шоушенка', 'США', 1994, 'драма', 142, 9.111],
    ['Крёстный отец', 'США', 1972, 'драма, криминал', 175, 8.730],
    ['Тёмный рыцарь', 'США', 2008, 'фантастика, боевик, триллер', 152, 8.499],
    ['Список Шиндлера', 'США', 1993, 'драма', 195, 8.818],
    ['Властелин колец: Возвращение Короля', 'Новая Зеландия', 2003, 'фэнтези, приключения, драма', 201, 8.625],
    ['Криминальное чтиво', 'США', 1994, 'триллер, комедия, криминал', 154, 8.619],
    ['Хороший, плохой, злой', 'Италия', 1966, 'вестерн', 178, 8.521],
    ['Бойцовский клуб', 'США', 1999, 'триллер, драма, криминал', 139, 8.644],
    ['Харакири', 'Япония', 1962, 'драма, боевик, история', 133, 8.106],
    ['Сталкер', 'СССР', 1979, 'фантастика, драма, детектив', 163, 8.083],
    ['Иди и смотри', 'СССР', 1985, 'драма, военный', 136, 8.094]
]

rating_total = 0# присвойте начальное значение счётчику

# напишите ваш код здесь
for rating in movies_table:
    rating_total += rating[5]

print(rating_total)

 5.6 Добавление столбца в таблицу.

Задание №1

В конец каждого вложенного списка добавьте тип фильма: 'полнометражный'.

movies_table = [
    ['Побег из Шоушенка', 'США', 1994, 'драма', 142, 9.111],
    ['Крёстный отец', 'США', 1972, 'драма, криминал', 175, 8.730],
    ['Тёмный рыцарь', 'США', 2008, 'фантастика, боевик, триллер', 152, 8.499],
    ['Список Шиндлера', 'США', 1993, 'драма', 195, 8.818],
    ['Властелин колец: Возвращение Короля', 'Новая Зеландия', 2003, 'фэнтези, приключения, драма', 201, 8.625],
    ['Криминальное чтиво', 'США', 1994, 'триллер, комедия, криминал', 154, 8.619],
    ['Хороший, плохой, злой', 'Италия', 1966, 'вестерн', 178, 8.521],
    ['Бойцовский клуб', 'США', 1999, 'триллер, драма, криминал', 139, 8.644],
    ['Харакири', 'Япония', 1962, 'драма, боевик, история', 133, 8.106],
    ['Сталкер', 'СССР', 1979, 'фантастика, драма, детектив', 163, 8.083],
    ['Иди и смотри', 'СССР', 1985, 'драма, военный', 136, 8.094]
]

# напишите ваш код здесь
for movie in movies_table:
    movie.append('полнометражный')
for movie in movies_table:
    for elem in movie:
        print(f'{elem:<45}', end='')
    print()

Задание №2

После названия каждого фильма добавьте ячейку о качестве видео — 'FullHD'.

movies_table = [
    ['Побег из Шоушенка', 'США', 1994, 'драма', 142, 9.111],
    ['Крёстный отец', 'США', 1972, 'драма, криминал', 175, 8.730],
    ['Тёмный рыцарь', 'США', 2008, 'фантастика, боевик, триллер', 152, 8.499],
    ['Список Шиндлера', 'США', 1993, 'драма', 195, 8.818],
    ['Властелин колец: Возвращение Короля', 'Новая Зеландия', 2003, 'фэнтези, приключения, драма', 201, 8.625],
    ['Криминальное чтиво', 'США', 1994, 'триллер, комедия, криминал', 154, 8.619],
    ['Хороший, плохой, злой', 'Италия', 1966, 'вестерн', 178, 8.521],
    ['Бойцовский клуб', 'США', 1999, 'триллер, драма, криминал', 139, 8.644],
    ['Харакири', 'Япония', 1962, 'драма, боевик, история', 133, 8.106],
    ['Сталкер', 'СССР', 1979, 'фантастика, драма, детектив', 163, 8.083],
    ['Иди и смотри', 'СССР', 1985, 'драма, военный', 136, 8.094]
]

# напишите ваш код здесь
for movie in movies_table:
    movie.insert(1,'FullHD')
for movie in movies_table:
    for elem in movie:
        print(f'{elem:<45}', end='')
    print()

 5.7 Анализ значений в нескольких столбцах.

Задание №1

В каждой строке таблицы — данные о выручке магазинов в разных регионах: элемент с индексом 1 — выручка за первое полугодие; с индексом 2 — за второе. Добавьте в конец каждого вложенного списка сумму продаж за год.

sales = [
    ['Московская область',105820,112180],
    ['Ленинградская область',85899,91021],
    ['Самарская область',35010,32001],
    ['Ростовская область',37011,39595]
]

# напишите ваш код здесь
for sale in sales: # перебираем списки 
    year = (sale[1] + sale[2])
    sale.append(year) # добавляем полученное значение в конец текущего списка

print(sales)

 5.8 Сортировка списка списков.

 5.9 Заключение.

Заключение

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

 5.10 Проверочные задания. Вложенные списки.

Проверочные задания. Вложенные списки

Чтобы пройти тест нужно правильно ответить на 5 вопросов из 10. Время на прохождение: 10 минут

 

Задание 1 из 10 Какие из этих списков вложенные? Выберите несколько вариантов.

Правильный ответ [[7], [7], [7]]

Правильный ответ [[7, 7, 7]]

[7] Элементы вложенного списка — другие списки. В них может быть всего по одному элементу, как в примере [[7], [7], [7]]. Один список может быть целиком вложен в другой, вот так: [[7, 7, 7]]. Практической пользы в такой организации немного. Но использовать вложенные списки всё равно стоит — они помогут упорядочить данные.

Задание 2 из 10 Какой код выведет число 2? matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Правильный ответ print(matrix[0][1])

Внутренние элементы вложенного списка перебирают с помощью индексов или в цикле for. И в том и в другом случае от общего уровня нужно перейти к уровню подсписка. С помощью индексов это делают так: сначала указывают индекс подсписка, затем — индекс элемента. Число 2 находится в первом списке на втором месте. Значит, его вызовет код matrix[0][1].

Задание 3 из 10 Какой код выведет первый элемент каждого подсписка? matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Правильный ответ for row in matrix: print(row[0])

Первый элемент каждого подсписка — это первая «колонка» списка matrix. Вывести такую колонку можно в цикле for. На каждой итерации код выведет первый элемент подсписка. Не забудьте, что его индекс 0.

Задание 4 из 10 Что перебирает первый цикл for? matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] for row in matrix: for col in row: print(col, end=' ') print()

Правильный ответ Каждый вложенный список

Во вложенном списке несколько уровней. Чтобы добраться до всех элементов, используют вложенный цикл for. Первый цикл перебирает элементы списка matrix — это тоже списки. Итератор row принимает значение каждого из них по очереди. Значения внутри подсписков перебирает уже второй цикл. В коде нет индексов — значит, итератор принимает значение каждого элемента, а не только первого.

Задание 5 из 10 Что выведет на экран код? matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] for row in matrix: for col in row: print(col, end=' ') print()

Правильный ответ 1 2 3 4 5 6 7 8 9

Иногда сложно представить, что происходит на каждом этапе вложенного цикла. Стоит разобрать код построчно: «Итератор row принимает значение первого подсписка, а итератор col перебирает все его значения. Затем первый цикл начинается снова — итератор row принимает значение второго подсписка...» и т. д. В этом коде второй цикл печатает один элемент за одну итерацию, добавляя в конец пробел. За это отвечает параметр end. Функция print() в пятой строчке кода относится не ко второму циклу, а к первому. Она добавит вывод с новой строки после каждого подсписка.

Задание 6 из 10 В таблицу из списка списков нужно добавить новый столбец. Какие методы можно использовать? Выберите несколько вариантов.

Правильный ответ append()

Правильный ответ insert()

Новый столбец можно создать так: добавить в каждый подсписок один новый элемент. Можно применить метод для списков append() — он добавит по элементу в конец подсписка. Чтобы вставить элемент в любое место, используют метод insert().

Задание 7 из 10 Какой код добавит новую колонку после названия фильма? movies = [ ['Одержимость', 106], ['Школа рока', 109], ['Ла-ла Ленд', 128], ]

Правильный ответ for movie in movies: movie.insert(1, 'США')

Для такой задачи подойдёт метод insert(). Его используют, чтобы добавить элемент в любое место списка. Для этого в аргументе указывают индекс — позицию нового элемента.

Задание 8 из 10 Какой код посчитает суммарную продолжительность фильмов? movies = [ ['Одержимость', 106], ['Школа рока', 109], ['Ла-ла Ленд', 128], ]

Правильный ответ total = 0

for movie in movies: total += movie[1]

Весь секрет в индексах. Чтобы сложить длительность фильмов, нужно извлечь второй элемент каждого подсписка. Цикл перебирает каждый подсписок и выбирает элемент с индексом 1, прибавляя его к значению в счётчике total. Остальные варианты не сработают — в счётчике будут складываться разные типы данных, и произойдёт ошибка.

Задание 9 из 10 Во второй и третьей колонках — значения рейтингов на платформах Кинопоиск и IMDb. Какой код посчитает средний рейтинг каждого фильма и добавит значения в качестве нового столбца? movies = [ ['Одержимость', 8.3, 8.5], ['Школа рока', 7.2, 7.1], ['Ла-ла Ленд', 7.9, 8.0], ]

Правильный ответ for movie in movies: avg_rating = (movie[1] + movie[2]) / 2 movie.append(avg_rating)

for movie in movies: avg_rating = (movie[2] + movie[3]) / 2 movie.append(avg_rating)

Для такой задачи конструкция со счётчиком не подойдёт. Средний рейтинг нужно посчитать для каждого фильма, поэтому результат вычислений лучше сохранять внутри цикла for. На каждой итерации в переменную avg_rating записывается средний рейтинг фильма. Метод append() добавит его в конец подсписка. Так получится новая колонка из трёх значений. И не забудьте про нумерацию: у второй и третьей колонки индексы 1 и 2 соответственно.

Задание 10 из 10 Какой код отсортирует списки по возрастанию продолжительности фильмов? Выберите несколько вариантов. movies = [ ['Ла-ла Ленд', 128], ['Одержимость', 106], ['Школа рока', 109], ]

Правильный ответ movies_sorted = sorted(movies, key=lambda row: row[1])

Правильный ответ movies_sorted = sorted(movies, key=lambda row: row[1], reverse=False)

Метод sorted() используют, чтобы отсортировать значения. Параметр метода reverse управляет порядком сортировки. Если передать параметру значение True, списки будут расположены по убыванию, если False — по возрастанию. Но значение параметра можно и не указывать — тогда списки будут отсортированы от меньшего к большему.

6. Условный оператор.

Вернуться в Начало статьи

 6.1 Введение

 6.2 Булев тип данных

 6.3 Логические выражения и операторы сравнения

 6.4 Условный оператор

Задание 1

С помощью условного оператора проверьте рейтинг фильма «Крёстный отец». Если он выше или равен 8.5, выведите на экран сообщение 'Высокий рейтинг', иначе — 'Обычный рейтинг'.

movie_rating = 8.73 # рейтинг фильма «Крёстный отец»
# напишите ваш код здесь
if movie_rating >=8.5:
    print('Высокий рейтинг')
else:
    print('Обычный рейтинг')

Задание 2

Проверьте год выхода фильма «Бойцовский клуб»: если он вышел после 2000 года, выведите на экран 'Да'; если в 2000 году или раньше — 'Нет'. Для этого вызовите условный оператор и обратитесь к нужному элементу списка по индексу.

movie_info = ['Бойцовский клуб', 'США', 1999, 'триллер, драма, криминал', 139, 8.644]
# напишите ваш код здесь
if movie_info[2]>2000:
    print('Да')
else:
    print('Нет')

 6.5 Дополнительные ветки кода

Задание №1

переведите оценки из стобалльной системы в пятибалльную по этим правилам: оценка 2: от 0 до 59 баллов; оценка 3: от 60 до 72 баллов; оценка 4: от 73 до 84 баллов; оценка 5: от 85 до 100 баллов. По мере прохождения по списку печатайте результаты на экране — как в примере со списком years. Каждую оценку выводите на новой строке.

marks = [91, 35, 65, 89, 78, 93]

# напишите ваш код здесь
for i in marks:
    if 0<i<=59:
        print(2)
    if 60<i<=72:
        print(3)
    if 73<i<=84:
        print(4)
    if 85<i<=100:
        print(5)

Задание №2

Перед вами список со странами выхода некоторых фильмов. Для каждого элемента напечатайте сообщение в зависимости от названия страны: для СССР напечатайте 'Фильм вышел в СССР.'; для США — 'The movie was released in USA.'; для Италии — 'Il film e stato rilasciato in Italia.'; для любой другой страны — 'Страна не определена.'. Каждое сообщение выводите на новой строке.

countries = ['СССР', 'Новая Зеландия', 'Италия', 'Италия', 'СССР', 'США']

# напишите ваш код здесь
for i in countries:
    if i == 'СССР':
        print('Фильм вышел в СССР.')
    elif i == 'США':
        print('The movie was released in USA.')
    elif i == 'Италия':
        print('Il film e stato rilasciato in Italia.')
    else:
        print('Страна не определена.')

 6.6 Фильтр для таблицы

Задание №1

С помощью фильтра извлеките из movies_table фильмы, снятые в США. Результат сохраните в movies_filtered. Тогда цикл for выведет результат на экран.

movies_table = [
    ['Побег из Шоушенка', 'США', 1994, 'драма', 142, 9.111],
    ['Крёстный отец', 'США', 1972, 'драма, криминал', 175, 8.730],
    ['Тёмный рыцарь', 'США', 2008, 'фантастика, боевик, триллер', 152, 8.499],
    ['Список Шиндлера', 'США', 1993, 'драма', 195, 8.818],
    ['Властелин колец: Возвращение Короля', 'Новая Зеландия', 2003, 'фэнтези, приключения, драма', 201, 8.625],
    ['Криминальное чтиво', 'США', 1994, 'триллер, комедия, криминал', 154, 8.619],
    ['Хороший, плохой, злой', 'Италия', 1966, 'вестерн', 178, 8.521],
    ['Бойцовский клуб', 'США', 1999, 'триллер, драма, криминал', 139, 8.644],
    ['Харакири', 'Япония', 1962, 'драма, боевик, история', 133, 8.106],
    ['Сталкер', 'СССР', 1979, 'фантастика, драма, детектив', 163, 8.083],
    ['Иди и смотри', 'СССР', 1985, 'драма, военный', 136, 8.094]
]

movies_filtered = [] # пустая переменная для хранения результатов

# напишите ваш код здесь
for movies in movies_table:
    if movies[1] == 'США':
        movies_filtered.append(movies)

for movie in movies_filtered: # для каждого списка в списке
    for elem in movie: # перебираем элементы очередного списка
        print(f'{elem:<45}', end='') # выравнивание каждого элемента по левому краю с фиксированной шириной строки 45
    print() # после вывода очередной строки на экран переводим на новую строку

Задание №2

С помощью фильтра извлеките из movies_table фильмы с рейтингом выше 8.6. Результат сохраните в movies_filtered. Тогда цикл for выведет результат на экран.

movies_table = [
    ['Побег из Шоушенка', 'США', 1994, 'драма', 142, 9.111],
    ['Крёстный отец', 'США', 1972, 'драма, криминал', 175, 8.730],
    ['Тёмный рыцарь', 'США', 2008, 'фантастика, боевик, триллер', 152, 8.499],
    ['Список Шиндлера', 'США', 1993, 'драма', 195, 8.818],
    ['Властелин колец: Возвращение Короля', 'Новая Зеландия', 2003, 'фэнтези, приключения, драма', 201, 8.625],
    ['Криминальное чтиво', 'США', 1994, 'триллер, комедия, криминал', 154, 8.619],
    ['Хороший, плохой, злой', 'Италия', 1966, 'вестерн', 178, 8.521],
    ['Бойцовский клуб', 'США', 1999, 'триллер, драма, криминал', 139, 8.644],
    ['Харакири', 'Япония', 1962, 'драма, боевик, история', 133, 8.106],
    ['Сталкер', 'СССР', 1979, 'фантастика, драма, детектив', 163, 8.083],
    ['Иди и смотри', 'СССР', 1985, 'драма, военный', 136, 8.094]
]

movies_filtered = [] # здесь будет отфильтрованный список списков

# напишите ваш код здесь
for movies in movies_table:
    if movies[5] > 8.6:
        movies_filtered.append(movies) 

for movie in movies_filtered: # для каждого списка в списке
    for elem in movie: # перебираем элементы очередного списка
        print(f'{elem:<45}', end='') # выравнивание каждого элемента по левому краю с фиксированной шириной строки 45
    print() # после вывода очередной строки на экран переводим на новую строку

 6.7 Сложные логические выражения

Задание №1

Оставьте в списке списков movies_filtered информацию только о тех фильмах таблицы movies_table, которые вышли в США и имеют хронометраж более 150 минут.

movies_table = [
    ['Побег из Шоушенка', 'США', 1994, 'драма', 142, 9.111],
    ['Крёстный отец', 'США', 1972, 'драма, криминал', 175, 8.730],
    ['Тёмный рыцарь', 'США', 2008, 'фантастика, боевик, триллер', 152, 8.499],
    ['Список Шиндлера', 'США', 1993, 'драма', 195, 8.818],
    ['Властелин колец: Возвращение Короля', 'Новая Зеландия', 2003, 'фэнтези, приключения, драма', 201, 8.625],
    ['Криминальное чтиво', 'США', 1994, 'триллер, комедия, криминал', 154, 8.619],
    ['Хороший, плохой, злой', 'Италия', 1966, 'вестерн', 178, 8.521],
    ['Бойцовский клуб', 'США', 1999, 'триллер, драма, криминал', 139, 8.644],
    ['Харакири', 'Япония', 1962, 'драма, боевик, история', 133, 8.106],
    ['Сталкер', 'СССР', 1979, 'фантастика, драма, детектив', 163, 8.083],
    ['Иди и смотри', 'СССР', 1985, 'драма, военный', 136, 8.094]
]

# создайте пустой список movies_filtered здесь
movies_filtered=[]
# напишите ваш код здесь
for movies in movies_table:
    if movies[1] == 'США' and movies[4]>150:
        movies_filtered.append(movies)
        
for movie in movies_filtered:
    for elem in movie:
        print(f'{elem:<45}', end='')
    print()

Задание №2

Сохраните в movies_filtered информацию только о тех фильмах таблицы, которые либо вышли в 1994 году, либо имеют рейтинг ниже 8.5.

movies_table = [
    ['Побег из Шоушенка', 'США', 1994, 'драма', 142, 9.111],
    ['Крёстный отец', 'США', 1972, 'драма, криминал', 175, 8.730],
    ['Тёмный рыцарь', 'США', 2008, 'фантастика, боевик, триллер', 152, 8.499],
    ['Список Шиндлера', 'США', 1993, 'драма', 195, 8.818],
    ['Властелин колец: Возвращение Короля', 'Новая Зеландия', 2003, 'фэнтези, приключения, драма', 201, 8.625],
    ['Криминальное чтиво', 'США', 1994, 'триллер, комедия, криминал', 154, 8.619],
    ['Хороший, плохой, злой', 'Италия', 1966, 'вестерн', 178, 8.521],
    ['Бойцовский клуб', 'США', 1999, 'триллер, драма, криминал', 139, 8.644],
    ['Харакири', 'Япония', 1962, 'драма, боевик, история', 133, 8.106],
    ['Сталкер', 'СССР', 1979, 'фантастика, драма, детектив', 163, 8.083],
    ['Иди и смотри', 'СССР', 1985, 'драма, военный', 136, 8.094]
]

movies_filtered = [] # создайте пустой список movies_filtered здесь

# напишите ваш код здесь
for movies in movies_table:
    if movies[2] == 1994 or movies[5] < 8.5:
        movies_filtered.append(movies)

for movie in movies_filtered:
    for elem in movie:
        print(f'{elem:<45}', end='')
    print()

 6.8 Счетчики

Задание №1

Посчитайте триллеры в movies_table. Результат сохраните в thrillers_count — тогда функция выведет его на экран.

movies_table = [
    ['Побег из Шоушенка', 'США', 1994, 'драма', 142, 9.111],
    ['Крёстный отец', 'США', 1972, 'драма, криминал', 175, 8.730],
    ['Тёмный рыцарь', 'США', 2008, 'фантастика, боевик, триллер', 152, 8.499],
    ['Список Шиндлера', 'США', 1993, 'драма', 195, 8.818],
    ['Властелин колец: Возвращение Короля', 'Новая Зеландия', 2003, 'фэнтези, приключения, драма', 201, 8.625],
    ['Криминальное чтиво', 'США', 1994, 'триллер, комедия, криминал', 154, 8.619],
    ['Хороший, плохой, злой', 'Италия', 1966, 'вестерн', 178, 8.521],
    ['Бойцовский клуб', 'США', 1999, 'триллер, драма, криминал', 139, 8.644],
    ['Харакири', 'Япония', 1962, 'драма, боевик, история', 133, 8.106],
    ['Сталкер', 'СССР', 1979, 'фантастика, драма, детектив', 163, 8.083],
    ['Иди и смотри', 'СССР', 1985, 'драма, военный', 136, 8.094]
]

thrillers_count = 0 # присвойте начальное значение

# напишите ваш код здесь 
for movies in movies_table:
    if 'триллер' in movies[3]:
        thrillers_count += 1

print(thrillers_count)

Задание №2

Посчитайте фильмы, которые вышли после 1990 года. Результат сохраните в переменную after_ninety_count.

movies_table = [
    ['Побег из Шоушенка', 'США', 1994, 'драма', 142, 9.111],
    ['Крёстный отец', 'США', 1972, 'драма, криминал', 175, 8.730],
    ['Тёмный рыцарь', 'США', 2008, 'фантастика, боевик, триллер', 152, 8.499],
    ['Список Шиндлера', 'США', 1993, 'драма', 195, 8.818],
    ['Властелин колец: Возвращение Короля', 'Новая Зеландия', 2003, 'фэнтези, приключения, драма', 201, 8.625],
    ['Криминальное чтиво', 'США', 1994, 'триллер, комедия, криминал', 154, 8.619],
    ['Хороший, плохой, злой', 'Италия', 1966, 'вестерн', 178, 8.521],
    ['Бойцовский клуб', 'США', 1999, 'триллер, драма, криминал', 139, 8.644],
    ['Харакири', 'Япония', 1962, 'драма, боевик, история', 133, 8.106],
    ['Сталкер', 'СССР', 1979, 'фантастика, драма, детектив', 163, 8.083],
    ['Иди и смотри', 'СССР', 1985, 'драма, военный', 136, 8.094]
]

after_ninety_count = 0 # присвойте начальное значение

# напишите ваш код здесь
for movies in movies_table:
    if movies[2] > 1990:
        after_ninety_count += 1

print(after_ninety_count)

Задание №3

Посчитайте среднее значение рейтинга драм. Для этого вычислите сумму рейтингов всех драм и разделите её на количество драм. Результат выведите на экран.

movies_table = [
    ['Побег из Шоушенка', 'США', 1994, 'драма', 142, 9.111],
    ['Крёстный отец', 'США', 1972, 'драма, криминал', 175, 8.730],
    ['Тёмный рыцарь', 'США', 2008, 'фантастика, боевик, триллер', 152, 8.499],
    ['Список Шиндлера', 'США', 1993, 'драма', 195, 8.818],
    ['Властелин колец: Возвращение Короля', 'Новая Зеландия', 2003, 'фэнтези, приключения, драма', 201, 8.625],
    ['Криминальное чтиво', 'США', 1994, 'триллер, комедия, криминал', 154, 8.619],
    ['Хороший, плохой, злой', 'Италия', 1966, 'вестерн', 178, 8.521],
    ['Бойцовский клуб', 'США', 1999, 'триллер, драма, криминал', 139, 8.644],
    ['Харакири', 'Япония', 1962, 'драма, боевик, история', 133, 8.106],
    ['Сталкер', 'СССР', 1979, 'фантастика, драма, детектив', 163, 8.083],
    ['Иди и смотри', 'СССР', 1985, 'драма, военный', 136, 8.094]
]

drama_rating_total = 0 # переменная для суммарного рейтинга драм
drama_rating_count = 0 # переменная для количества драм

# напишите ваш код здесь
for drama in movies_table:
    if 'драма' in drama[3]:
        drama_rating_count += 1
        drama_rating_total += drama[5]

# здесь разделите суммарный рейтинг на количество и выведите результат на экран
print(drama_rating_total/drama_rating_count)

 6.9 Заключение

В этой теме вы поработали с условным оператором. Условный оператор if входит в конструкцию if..elif..else. С помощью конструкции с условным оператором можно создать несколько веток кода, которые Python выполнит или пропустит. Теперь вы знаете, что: Алгоритм может предполагать разные пути, почти как в сказке: «Направо пойдёшь — коня потеряешь, прямо пойдёшь...» Чтобы создать несколько веток кода, нужно использовать логическое выражение и условный оператор. Ветвление бывает разной сложности: условный оператор с одной ветвью (if); условный оператор с двумя ветвями (if...else); условный оператор с несколькими ветвями (if...elif или if...elif...else). Чтобы ничего не забыть, скачайте шпаргалку темы. 

 6.10  Проверочные задания. Условный оператор

Проверочные задания.

Условный оператор. Цикл while Чтобы пройти тест нужно правильно ответить на 5 вопросов из 9. Время на прохождение: 10 минут

 

Задание 1 из 10 Какие предложения можно назвать логическими высказываниями? Выберите несколько вариантов.

Правильный ответ Адам Левин является солистом группы Maroon 5.

Правильный ответ Фильм «Сыщик» вышел в 1972 году.

Попробуйте задать вопрос: «Может ли это предложение быть истинным или ложным?». Про высказывания с просьбой, приказом или вопросом так сказать нельзя, поэтому их не считают логическими. Третье и четвёртое высказывания логическими назвать можно. И неважно, что фильм «Сыщик» вышел в 1979 году — предложение всё равно останется логическим высказыванием.

Задание 2 из 10 Данные какого типа возвращают логические выражения?

Правильный ответ bool

Логические выражения возвращают True или False. Это булевы значения, их тип — bool.

Задание 3 из 10 Выберите логические операторы, которые используют в Python.

Правильный ответ and

Правильный ответ not

Комбинировать условия в коде полезно. Так можно фильтровать данные или уточнять алгоритм. Для таких инструкций используют логические операторы. В Python их три: and, or и not. Операторы and и or объединят логические выражения, а оператор not поменяет значение выражения на противоположное. Правила, по которым действуют операторы, лучше запомнить.

Задание 4 из 10 В какой части условной конструкции указывают логическое выражение — условие?

Правильный ответ В заголовке условной конструкции

Условные конструкции состоят из разных веток кода, и в них легко запутаться. Поэтому правильный синтаксис так важен. В условных конструкциях две части: заголовок и тело. В заголовке указывают условие, а в теле — инструкции, которые выполняются в зависимости от условия.

Задание 5 из 10 Как называют такую форму условной конструкции? price = 999 if price >= 1000: print('Дорого! :(') else: print('Норм цена! :)')

Правильный ответ Полной

Условную конструкцию с веткой else называют полной. Такая конструкция охватывает все случаи: если условие из первой ветки не выполняется, в дело вступает ветка с else.

Задание 6 из 10 Как называют такую форму условной конструкции? passengers_amount = 10 if passengers_amount > 8: print('Перегрузка лифта!')

Правильный ответ Неполной

В этой конструкции нет ветви на случай, если логическое выражение вернёт False. Такие конструкции называют неполными. Они тоже полезны: если пассажиров больше 8, нужно сообщить о перегрузке лифта. Если их меньше, то ничего выводить не нужно.

Задание 7 из 10 Сколько ветвей может включать условная конструкция?

Правильный ответ Любое количество

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

Задание 8 из 10 Во вложенном списке указаны названия треков и их продолжительность. Какой код отберёт треки длиннее 210 секунд и сложит их продолжительность? tracks = [ ['Love Planet', 270], ['Dove', 291], ['Seen Change', 55], ['Home', 195] ]

Правильный ответ

tracks_length_count = 0

for track in tracks: if track[1] > 210: tracks_length_count += track[1]

Отобрать нужные значения поможет конструкция с условным оператором if. А для сложения используйте уже знакомую переменную-счётчик. Не забудьте, что такую переменную объявляют до запуска цикла. Иначе счётчик будет перезаписываться на каждой итерации.

Задание 9 из 10 Теперь добавили новый столбец с жанром. Какой код отберёт поп-треки длиннее 210 секунд и сложит их продолжительность? tracks = [ ['Donna', 'pop', 242], ['Dove', 'indie', 291], ['Pleasure To Meet You', 'pop', 255], ['Home', 'jazz', 195] ]

Правильный ответ

pop_tracks_length_count = 0

for track in tracks: if track[1] == 'pop' and track[2] > 210: pop_tracks_length_count += track[2]

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

7. Функции.

Вернуться в Начало статьи

 7.1 Введение

 7.2 Функции и высокая кухня

 7.3 Собственные функции

 7.4 Неповторимый код

 7.5 В поисках смысла

 7.6 Параметры: значения по умолчанию

Задача 1

Напишите функцию filter_by_year с двумя параметрами: data: список списков с данными о фильме; year: целое число, по умолчанию — 1990. Функция возвращает данные о фильмах, которые вышли после года year.

# функция печати таблицы, принимает на вход список списков, ничего не возвращает (неявно возвращается None)
def print_movie_table(data):
    for movie in data:
        for elem in movie:
            print(f'{elem:<45}', end='')
        print()


# определите функцию filter_by_year здесь

def filter_by_year(data, year=1990):
    data = []
    for movies in movies_table:
        if movies[2] > year:
            data.append(movies)
    return data


# название, страна, год, жанр, продолжительность (мин.), рейтинг "Кинопоиска" 
movies_table = [
    ['Побег из Шоушенка', 'США', 1994, 'драма', 142, 9.111],
    ['Крёстный отец', 'США', 1972, 'драма, криминал', 175, 8.730],
    ['Тёмный рыцарь', 'США', 2008, 'фантастика, боевик, триллер', 152, 8.499],
    ['Список Шиндлера', 'США', 1993, 'драма', 195, 8.818],
    ['Властелин колец: Возвращение Короля', 'Новая Зеландия', 2003, 'фэнтези, приключения, драма', 201, 8.625],
    ['Криминальное чтиво', 'США', 1994, 'триллер, комедия, криминал', 154, 8.619],
    ['Хороший, плохой, злой', 'Италия', 1966, 'вестерн', 178, 8.521],
    ['Бойцовский клуб', 'США', 1999, 'триллер, драма, криминал', 139, 8.644],
    ['Харакири', 'Япония', 1962, 'драма, боевик, история', 133, 8.106],
    ['Сталкер', 'СССР', 1979, 'фантастика, драма, детектив', 163, 8.083],
    ['Иди и смотри', 'СССР', 1985, 'драма, военный', 136, 8.094],
    ['Один дома', 'США', 1990, 'комедия, семейный', 103, 8.305]
]

movies_table_filtered = filter_by_year(movies_table)
print_movie_table(movies_table_filtered)

Задача 2

Напишите функцию filter_by_genre, которая принимает два аргумента:
data: список списков с информацией о фильмах;
genre: название жанра, по умолчанию — 'драма'.
Функция возвращает данные о фильмах в жанре 'драма'. Если жанров несколько — 'драма' будет среди них.

# функция печати таблицы, принимает на вход список списков, ничего не возвращает (неявно возвращается None)
def print_movie_table(data):
    for movie in data:
        for elem in movie:
            print(f'{elem:<45}', end='')
        print()


# определите функцию filter_by_genre здесь
def filter_by_genre(data, genre='драма'):
    filtered_data = []
    for row in data:
        if genre in row[3]:
            filtered_data.append(row) 
    return filtered_data

movies_table = [
    ['Побег из Шоушенка', 'США', 1994, 'драма', 142, 9.111],
    ['Крёстный отец', 'США', 1972, 'драма, криминал', 175, 8.730],
    ['Тёмный рыцарь', 'США', 2008, 'фантастика, боевик, триллер', 152, 8.499],
    ['Список Шиндлера', 'США', 1993, 'драма', 195, 8.818],
    ['Властелин колец: Возвращение Короля', 'Новая Зеландия', 2003, 'фэнтези, приключения, драма', 201, 8.625],
    ['Криминальное чтиво', 'США', 1994, 'триллер, комедия, криминал', 154, 8.619],
    ['Хороший, плохой, злой', 'Италия', 1966, 'вестерн', 178, 8.521],
    ['Бойцовский клуб', 'США', 1999, 'триллер, драма, криминал', 139, 8.644],
    ['Харакири', 'Япония', 1962, 'драма, боевик, история', 133, 8.106],
    ['Сталкер', 'СССР', 1979, 'фантастика, драма, детектив', 163, 8.083],
    ['Иди и смотри', 'СССР', 1985, 'драма, военный', 136, 8.094]
]

movies_table_filtered = filter_by_genre(movies_table)
print_movie_table(movies_table_filtered)

 7.7 Позиционные и именованные аргументы

 7.8 Результаты по ту сторону функции

 7.9 Лаборатория функций

  1. Определите функцию find_rect_square(side1, side2), которая: принимает в виде аргументов два целых числа — стороны прямоугольника; возвращает их произведение — площадь фигуры.
def find_rect_square(side1, side2):
    # напишите тело функции
    square = side1 * side2
    return square

print(find_rect_square(10, 12))
  1. Напишите функцию-предикат is_speed_ok для датчика превышения скорости. Она должна быть предикатом, который принимает аргумент со скоростью — speed. Если его значение меньше или равно 60, функция вернёт True, иначе — False. Постарайтесь использовать логическое выражение после ключевого слова return. Вспомните, что логические условия вроде a < 1 уже возвращают True или False и использование условного оператора здесь не требуется.
# определите функцию здесь
def is_speed_ok(speed):
    return speed<=60
        
current_speed = 46
print(is_speed_ok(current_speed))
current_speed = 70
print(is_speed_ok(current_speed))
current_speed = 60
print(is_speed_ok(current_speed))
  1. Напишите функцию get_hours_and_minutes(), которая принимает аргумент со строкой — временем в формате 'hh:mm'. C помощью метода split() и функции int() разбейте аргумент на два целых числа: часы и минуты. Верните их в том же порядке. Вспомните, что из функций можно возвращать более одного значения: нужно просто перечислить их через запятую после ключевого слова return.
def get_hours_and_minutes(time_string):
    #напишите ваш код здесь
    time_list = time_string.split(':')
    hh = int(time_list[0])
    mm = int(time_list[1]) 
    return hh, mm

time_str = '12:35'
hours, minutes = get_hours_and_minutes(time_str)
print(hours, minutes)
  1. На одной радиостанции ставят только песни короче 210 секунд. Напишите функцию-предикат check_song_duration(), которая: принимает аргумент-строку с длительностью трека в формате mm:ss; возвращает True, если длительность меньше 210 секунд. Иначе возвращает False. Внутри своей функции вызовите get_minutes_and_seconds(), чтобы извлечь количество минут и секунд из строки.
def get_minutes_and_seconds(time_string):
    time_list = time_string.split(':')
    m = int(time_list[0])
    s = int(time_list[1])
    return m, s


def check_song_duration(time_string):
    #напишите ваш код здесь
    m,s = get_minutes_and_seconds(time_string)
    return (m*60+s) < 210


print(check_song_duration('4:35'))
print(check_song_duration('2:10'))
  1. Создайте цикл, который проверит длительность треков из списка tracks. Цикл должен вывести на экран результат работы функции check_song_duration() для каждого элемента списка. Каждое значение выводите на новой строке.
def get_minutes_and_seconds(time_string):
    time_list = time_string.split(':')
    m = int(time_list[0])
    s = int(time_list[1])
    return m, s


def check_song_duration(time_string):
    minutes, seconds = get_minutes_and_seconds(time_string)
    seconds = minutes * 60 + seconds
    return seconds <= 210


tracks = ['2:25', '2:35', '3:45', '2:00', '5:10']

#напишите ваш код здесь
for row in tracks:
    print (check_song_duration(row))

 7.10 Заключение

В этой теме вы научились структурировать код с помощью собственных функций. Вы узнали, что: Функции позволяют выделить набор команд в отдельный именованный блок. Благодаря этому код можно переиспользовать несколько раз. У функций есть имя и внутренние переменные — параметры. При вызове функции передают значения — аргументы. В Python есть встроенные функции для распространённых задач, например sum() для расчёта суммы. Чтобы ничего не забыть, скачайте шпаргалку темы.

 7.11 Проверочные задания. Функции

Проверочные задания. Функции Чтобы пройти тест нужно правильно ответить на 5 вопросов из 10. Время на прохождение: 10 минут

Задание 1 из 10 С какого ключевого слова начинается объявление функции в Python?

Правильный ответ def

Ключевые слова приходится запоминать. Функцию начинают с def — так задают её заголовок. Ключевое слово return пишут в конце. Оно указывает на значение, которое вернёт функция.

Задание 2 из 10 Какой регистр лучше использовать для имени функции?

Правильный ответ “snake_case”

Как и в случае с переменными, имена функций лучше писать в «змеином регистре». Представьте, что вы работаете с кодом, который написали месяц назад. Вряд ли получится сразу вспомнить, как вы называли функции: имяФункции или ИмяФункции. Таких проблем не возникнет, если использовать только строчные буквы. Вы правильно вызовете все функции с первого раза.

Задание 3 из 10 Выберите все верные утверждения.

Правильный ответ Код с функциями проще редактировать.

Правильный ответ Функции позволяют переиспользовать код.

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

Разработчики часто создают собственные функции. И неудивительно: такой код удобнее использовать. В теле собственной функции можно вызвать другую функцию. Например, изменить тип данных с помощью str() или int(). Плохой практикой скорее считают повторы. Если вы часто копируете и вставляете куски кода, вам пригодится собственная функция.

Задание 4 из 10 Как называются значения, которые указывают при вызове функции?

Правильный ответ Аргументы

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

Задание 5 из 10 Как называются входные значения функции, которые указывают при её объявлении?

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

Может показаться, что термины — это условность. Бывает, что понятия «аргумент» и «параметр» путают и заменяют одно другим. Но знание терминологии вам пригодится: поможет разобраться в документации или чужом коде.

Задание 6 из 10 Функцию можно создать и без ключевого слова return. Какое значение вернёт такая функция?

Правильный ответ None

'' Казалось бы, какая разница, что писать в функции: print('Hello world') или return 'Hello world'. Обе функции напечатают строку 'Hello world'. Но если попытаться использовать результат функции с print(), код выдаст ошибку. Результатом такой функции всё равно будет None.

Задание 7 из 10 В каком месте программы можно обратиться к переменной just_number? def increment_number(number): just_number = 777 return number + 1

Правильный ответ Только в теле функции increment_number()

Переменная just_number — локальная. Она объявлена в теле функции и за её пределами неизвестна. То же самое с переменной number — обратиться к ней вне функции не получится. Чтобы получить результат, функцию нужно вызвать.

Задание 8 из 10 Что вернёт функция greeting? def greeting(): return 'Добро пожаловать!' print('Пожалуйста, подождите немного....')

Правильный ответ Добро пожаловать!

Ключевое слово return сработает раньше, чем функция print(), и остановит выполнение функции. После этого ключевого слова Python сразу завершает работу функции и выводит значение. Даже в том случае, если ключевое слово return встречается в теле функции несколько раз.

Задание 9 из 10 Что произойдёт, если вызвать функцию subtraction? def subtraction(minuend, subtrahend): result = minuend - subtrahend print(result)

Правильный ответ Произойдёт ошибка

Позиционные и именованные аргументы можно сочетать. Но не забудьте, что позиционный аргумент указывают первым. За ним следует именованный аргумент. Поэтому правильный вызов функции выглядит так: subtraction(5, subtrahend=6).

Задание 10 из 10 Сопоставьте вызовы функции send_message() и возвращаемые значения.

def send_message(text, source='email'):

    if source == 'email':

        return 'Message sent via email'

    elif source == 'sms':

        return 'Message sent via sms' else:

    return 'Unknown source'

send_message('Hello')

Message sent via email send_message('Hello', 'sms')

Message sent via sms send_message('Hello', 'email')

Message sent via email send_message('Hello', 'whatsapp') Unknown source

У функции send_message() два параметра. Но у параметра source указано значение по умолчанию. Значит, если вызвать функцию с одним аргументом, ошибки не произойдёт. Вместо этого функция вернёт Message sent via email. Вызов функции с аргументом whatsapp тоже не вернёт ошибки — этот случай предусмотрен третьей веткой условия.

8. Словари.

Вернуться в Начало статьи

 8.1 Введение

 8.2 Словари - основы

 8.3 Поиск и добавление элементов

Задание 1

Запишите в переменную walmart_price стоимость акции 'Walmart'. Для этого извлеките значение из словаря небезопасным способом.

financial_info = {
    'American Express': 93.23,
    'Boeing': 178.44,
    'Coca-Cola': 45.15,
    'Nike': 97.99,
    'JPMorgan':96.27,
    'Walmart': 130.68,
    'Walt Disney': 119.34
}

walmart_price = financial_info['Walmart'] # напишите ваш код здесь
print(walmart_price)

Задание 2 Извлеките из словаря цену акций 'Nike' безопасным способом. В случае, если ключа нет, метод должен вернуть None.

financial_info = {
    'American Express': 93.23,
    'Boeing': 178.44,
    'Coca-Cola': 45.15,
    'Nike': 97.99,
    'JPMorgan': 96.27,
    'Walmart': 130.68,
    'Walt Disney': 119.34
}

nike_price = financial_info.get('Nike') # напишите ваш код здесь
print(nike_price)

Задание 3

Добавьте в словарь financial_info новый элемент c ключом 'Microsoft' и значением — 208.35.

financial_info = {
    'American Express': 93.23,
    'Boeing': 178.44,
    'Coca-Cola': 45.15,
    'Nike': 97.99,
    'JPMorgan': 96.27,
    'Walmart': 130.68,
    'Walt Disney': 119.34
}

# добавьте новую пару здесь
financial_info ['Microsoft'] = 208.35
print(financial_info)

 8.4 Словари и списки

 8.5 Список словарей

Задание 1

В списке словарей monuments описаны некоторые статуи. Выведите на экран их среднюю высоту. В решении должны быть использованы цикл и вызов функции len(). В цикле посчитайте только сумму высот всех статуй. А среднее значение рассчитайте и выведите на экран уже после цикла.

monuments = [
    {
        'name': 'Статуя Единства', # название
        'country': 'Индия', # страна
        'height': 182 # высота без постамента
    },
    {
        'name': 'Статуя богини Каннон в Сендае',
        'country': 'Япония',
        'height': 100
    },
    {
        'name': 'Родина-Мать зовёт!',
        'country': 'Россия',
        'height': 85
    },
    {
        'name': 'Будда Дорденма',
        'country': 'Бутан',
        'height': 51.5
    },
    {
        'name': 'Статуя Свободы',
        'country': 'США',
        'height': 46
    }
]

# напишите ваш код здесь
H = 0
for item in monuments:
    H += item['height']
    
print(H/len(monuments))

Задание 2

Исследуйте список order из урока: найдите общую стоимость всех пицц. Результат выведите на экран.

order = [
    {
        'item': 'Пицца Маргарита', # название позиции
        'category': 'пицца', # категория товара
        'quantity': 2, # количество в заказе
        'comment': 'Побольше сыра, пожалуйста!', # комментарий к заказу
        'price': 320 # стоимость одной единицы товара
    },
    {
        'item': 'Пицца с ветчиной',
        'category': 'пицца',
        'quantity': 1,
        'comment': '',
        'price': 410
    },
    {
        'item': 'Pepsi 1 л',
        'category': 'напитки',
        'quantity': 3,
        'comment': '',
        'price': 75
    },
    {
        'item': 'Сок яблочный 0.5 л',
        'category': 'напитки',
        'quantity': 1,
        'comment': '',
        'price': 80
    },
    {
        'item': 'Круассан с сыром',
        'category': 'выпечка',
        'quantity': 2,
        'comment': '',
        'price': 130
    }
]

# напишите ваш код здесь
sum_pica = 0
for item in order:
    if item['category'] == 'пицца':
        sum_pica += item['price'] * item['quantity']
print (sum_pica)

 8.6 Лаборатория словарей

Задача №1

В словаре arts_info ключи — названия картин, а значения — их авторы. Выведите на экран: Автора картины «Крик» — небезопасным способом. Автора картины «Рожь» — безопасным способом. Значением по умолчанию сделайте -1.

arts_info = {
    'Звёздная ночь': 'Ван Гог Винсент',
    'Крик': 'Мунк Эдвард',
    'Неизвестная': 'Крамской Иван',
    'Итальянский полдень': 'Брюллов Карл',
    'Рожь': 'Шишкин Иван',
}

print(arts_info['Крик']) # допишите ваш код внутри print()
print(arts_info.get('Рожь', -1)) # допишите ваш код внутри print()

Задача №2

Три игрока лиги NBA считали заработанные очки в течение трёх лет. Результат сохранён в словаре списков nba_players. Создайте цикл, который: Пройдётся по элементам словаря методом items() и сложит очки каждого игрока с помощью функции sum(). Получит длину списка функцией len(). Выведет на экран имя игрока и среднее значение очков. Получить его можно, разделив суммы очков на длину списка. Например, для Леброна Джеймса цикл напечатает:

nba_players = {
    'Джеймс Харден': [2191, 2818, 2335],
    'Леброн Джеймс': [2251, 1505, 1698],
    'Дэмиан Лиллард': [1962, 2067, 2009],
}

# напишите ваш код здесь
for playrs,nba in nba_players.items():
    print (playrs, int(sum(nba)/len(nba)))

Задача №3

Список словарей tracklist содержит плейлист для вечеринки. Найдите суммарную длительность треков жанра Hip-Hop с помощью цикла.

tracklist = [
    {
        'title': 'Stronger', # название трека
        'artist': 'Saimoo', # исполнитель
        'duration': 145, # продолжительность (в секундах)
        'genre': 'Deep House', # жанр
    },
    {
        'title': 'Alors On Danse',
        'artist': 'Stromae',
        'duration': 205,
        'genre': 'Hip-Hop',
    },
    {
        'title': 'Don\'t Be So Shy',
        'artist': 'Imany (Filatov & Karas Remix)',
        'duration': 190,
        'genre': 'Deep House',
    },
    {
        'title': 'Off My Mind',
        'artist': 'Matvey Emerson',
        'duration': 130,
        'genre': 'Deep House',
    },
    {
        'title': 'Now You\'re Gone',
        'artist': 'Basshunter',
        'duration': 154,
        'genre': 'Eurodance',
    },
    {
        'title': 'It Was A Good Day',
        'artist': 'Ice Cube',
        'duration': 260,
        'genre': 'Hip-Hop',
    },
    {
        'title': 'Diva',
        'artist': 'Beyonce',
        'duration': 200,
        'genre': 'Hip-Hop',
    }
]

hip_hop_duration = 0

# напишите ваш код здесь
for track  in tracklist:
    if track['genre'] == 'Hip-Hop':
        hip_hop_duration += track['duration']
    
print(hip_hop_duration)

Задача №4

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

from json import dumps

tracklist = [
    {
        'title': 'Stronger',
        'artist': 'Saimoo',
        'duration': 145,
        'genre': 'Deep House',
    },
    {
        'title': 'Alors On Danse',
        'artist': 'Stromae',
        'duration': 205,
        'genre': 'Hip-Hop',
    },
    {
        'title': 'Don\'t Be So Shy',
        'artist': 'Imany (Filatov & Karas Remix)',
        'duration': 190,
        'genre': 'Deep House',
    },
    {
        'title': 'Off My Mind',
        'artist': 'Matvey Emerson',
        'duration': 130,
        'genre': 'Deep House',
    },
    {
        'title': 'Now You\'re Gone',
        'artist': 'Basshunter',
        'duration': 154,
        'genre': 'Eurodance',
    },
    {
        'title': 'It Was A Good Day',
        'artist': 'Ice Cube',
        'duration': 260,
        'genre': 'Hip-Hop',
    },
    {
        'title': 'Diva',
        'artist': 'Beyonce',
        'duration': 200,
        'genre': 'Hip-Hop',
    }
]

deep_house_tracklist = []

# напишите ваш код здесь
for track in tracklist:
    if track['genre'] == 'Deep House':
        deep_house_tracklist.append(track)

for track in deep_house_tracklist:
    print(dumps(track, indent=4))

 8.7 Заключение

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

ШпораКонцепт карта:

 8.8 Проверочные задания. Словари

Проверочные задания.

Словари Чтобы пройти тест нужно правильно ответить на 5 вопросов из 10. Время на прохождение: 10 минут

Задание 1 из 10 Какая структура данных хранит элементы в виде пар «ключ — значение»?

Правильный ответ Словарь

В обычном англо-русском словаре по слову “dictionary” вы найдёте его русский перевод — «словарь». Так же и в словарях Python: по ключевому слову можно найти связанное с ним значение.

Задание 2 из 10 Какое значение выдаст код? movies = { 'Побег из Шоушенка': 1994, 'Крёстный отец': 1972, 'Тёмный рыцарь': 2008, 'Список Шиндлера': 1993 } print(len(movies))

Правильный ответ 4

Функция len() считает число элементов. У строк это символы, у списков — элементы списка, ими могут быть строки, числа и т. д. Элемент словаря — пара ключ:значение. В словаре movies таких пар 4. Это значение и выдаст функция len().

Задание 3 из 10 Какой код добавит новый элемент в словарь? books = { 'Дж. Оруэлл': '1984', 'Лев Толстой': 'Война и мир', 'Ральф Эллисон': 'Человек-невидимка', 'Антуан де Сент-Экзюпери': 'Маленький принц' }

Правильный ответ books['Эрнест Хемингуэй'] = 'Прощай, оружие!'

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

Задание 4 из 10 Из словаря info нужно извлечь значение по ключу city. Выберите безопасный способ, который точно не приведёт к ошибке.

Правильный ответ city_info = info.get('city') print(city_info)

Код info['city'] сработает, если в словаре будет такой ключ. Иначе придётся отлавливать ошибки с помощью try...except. Лучше использовать специальный метод get() — так лаконичнее. Вместо ошибки он выдаст None или любое другое значение, которое вы зададите.

Задание 5 из 10 Какое значение выведет код? items = { 'Пицца Маргарита': 3, 'Сок апельсиновый': 2, 'Картофель фри стандартный': 5 }

item = items.get('Пицца') print(item)

Правильный ответ None

Метод get() проверит, встречается ли такой ключ в словаре, и выдаст его значение. Но передать ключ нужно целиком — 'Пицца Маргарита'. Если передать только часть, метод значения не найдёт и выдаст None.

Задание 6 из 10 Какой результат выдаст код? books = { 'Дж. Оруэлл': '1984', 'Лев Толстой': 'Война и мир', 'Ральф Эллисон': 'Человек-невидимка', 'Антуан де Сент-Экзюпери': 'Маленький принц' }

Правильный ответ Ошибку

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

Задание 7 из 10 Какой результат выдаст код? books = { 'Дж. Оруэлл': '1984', 'Лев Толстой': 'Война и мир', 'Ральф Эллисон': 'Человек-невидимка', 'Антуан де Сент-Экзюпери': 'Маленький принц' }

Правильный ответ Дж. Оруэлл Лев Толстой Ральф Эллисон Антуан де Сент-Экзюпери

В этом случае можно обойтись и без метода items(). С перебором ключей справится цикл for с одним итератором. Но перебрать значения так не получится.

Задание 8 из 10 Что выдаст код? books = { 'Дж. Оруэлл': '1984', 'Лев Толстой': 'Война и мир', 'Ральф Эллисон': 'Человек-невидимка', 'Антуан де Сент-Экзюпери': 'Маленький принц' }

Правильный ответ Дж. Оруэлл 1984 Лев Толстой Война и мир Ральф Эллисон Человек-невидимка Антуан де Сент-Экзюпери Маленький принц

Метод items() поможет перебрать ключи и значения. Не забудьте, что в таком цикле два итератора.

Задание 9 из 10 Какой код найдёт общее количество страниц в книгах? books = [ { 'author': 'Дж. Оруэлл', 'book': '1984', 'page_count': 328 }, { 'author': 'Лев Толстой', 'book': 'Война и мир', 'page_count': 1225 }, { 'author': 'Ральф Эллисон', 'book': 'Человек-невидимка', 'page_count': 624 }, { 'author': 'Антуан де Сент-Экзюпери', 'book': 'Маленький принц', 'page_count': 96 } ]

Правильный ответ total_page_count = 0

Конструкцию со счётчиком вы встречали часто. Для списка словарей такая конструкция тоже подойдёт. Словари упорядочены в списке, поэтому их легко перебрать в цикле for. Для вызова значения из словаря индекс не нужен. Количество страниц можно вызвать по ключу 'page_count'. В этом преимущество списка словарей — удобно вызывать элементы и перебирать данные.

Задание 10 из 10 Какой метод добавит отступы и позволит красиво вывести словарь?

Правильный ответ json.dumps()

json.load()

С этой задачей справится метод json.dumps(). Отступ настраивают с помощью параметра indent. Если указать аргумент ensure_ascii=False, можно обработать кириллические символы.

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окращённой версии для этой команды нет

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

10. Предварительная обработка данных.

Вернуться в Начало статьи

 10.1 От осины не родятся апельсины. Принцип GIGO

 10.2 Поиск проблем в данных

 10.3 Переименование столбцов

Задача №1 

Выведите на экран названия столбцов таблицы в df.

import pandas as pd
df = pd.read_csv('music_log.csv')
print(df.columns)

Задача №2

Измените названия столбцов

import pandas as pd
df = pd.read_csv('music_log.csv')
df = df.rename(columns={'  user_id':'user_id','total play':'total_play','Artist':'artist'})

Задача №3

Проверьте результат изменений. Запросите для df атрибут columns.

import pandas as pd
df = pd.read_csv('music_log.csv')
df = df.rename(columns={'  user_id':'user_id','total play':'total_play','Artist':'artist'})
print(df.columns)

 10.4 Обработка пропущенных значений

 10.5 Яндекс музыка. Пропущенные значения

Задача №1

Получите общую информацию о датасете df с помощью соответствующего метода.

import pandas as pd
df = pd.read_csv('music_log_upd_col.csv')
df.info()

Задача №2

import pandas as pd
df = pd.read_csv('music_log_upd_col.csv')
print(df.isna().sum())

Задача №3

Исправить источник данных в учебной работе не получится. Придётся работать с теми данными, что есть. Для исследования важно сохранить содержание столбца genre_name. Если по какой-то причине имя исполнителя и название трека оказались упущены, а жанр композиции известен, эту строку надо сберечь. Заполните отсутствующие значения столбца track_name строкой 'unknown'.

import pandas as pd
df = pd.read_csv('music_log_upd_col.csv')
df['track_name'] = df['track_name'].fillna('unknown')

Задача №4

Заполните отсутствующие значения столбца artist_name словом 'unknown'.

import pandas as pd
df = pd.read_csv('music_log_upd_col.csv')
df['track_name'] = df['track_name'].fillna('unknown')
df['artist_name'] = df['artist_name'].fillna('unknown')

Задача №5

Удалите строки, в которых отсутствует значение в столбце genre_name. Не забудьте записать результат обратно в переменную df.

import pandas as pd
df = pd.read_csv('music_log_upd_col.csv')
df['track_name'] = df['track_name'].fillna('unknown')
df['artist_name'] = df['artist_name'].fillna('unknown')
df = df.dropna(subset=['genre_name'])

Задача №6

Проверьте полученный результат. Ещё раз получите общую информацию о датафрейме.

import pandas as pd
df = pd.read_csv('music_log_upd_col.csv')

df['track_name'] = df['track_name'].fillna('unknown')
df['artist_name'] = df['artist_name'].fillna('unknown')
df = df.dropna(subset = ['genre_name'])

# напишите ваш код здесь
df.info()

 10.6 Обработка дубликатов

 10.7 Яндекс музыка. Дубликаты

Задача №1

Сохраните размер таблицы в переменной shape_table.

import pandas as pd
df = pd.read_csv('music_log_upd_nan.csv')
shape_table = df.shape

Задача №2

Посчитайте и выведите на экран суммарное количество явных дубликатов в таблице.

import pandas as pd
df = pd.read_csv('music_log_upd_nan.csv')
shape_table = df.shape
print(df.duplicated().sum())

Задача №3

Не удаляя код из предыдущего задания, избавьтесь от дубликатов. Вызовите метод reset_index(drop=True) , чтобы обновить индексы строк и удалить колонку со старыми индексами.

import pandas as pd
df = pd.read_csv('music_log_upd_nan.csv')
shape_table = df.shape
print(df.duplicated().sum())
df = df.drop_duplicates().reset_index(drop=True) 

Задание №4

Теперь очередь неявных дубликатов. Получите уникальные значения столбца genre_name методом unique(). Просмотрите результат и найдите название жанра, которое выглядит как неявный дубликат.

import pandas as pd
df = pd.read_csv('music_log_upd_nan.csv')
print(sorted(df['genre_name'].unique()))

Задание №5

В столбце genre_name замените значение 'электроника' на 'electronic' .

import pandas as pd
df = pd.read_csv('music_log_upd_nan.csv')
print (df['genre_name'].unique())
df['genre_name'] = df['genre_name'].replace('электроника','electronic')

Задача №6

Теперь оцените изменения: пересчитайте количество значений 'электроника' в столбце genre_name. Если удалось заменить все значения 'электроника' на 'electronic', то результат вывода должен быть 0.

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

import pandas as pd
df = pd.read_csv('music_log_upd_nan.csv')

print(df['genre_name'].unique())

df['genre_name'] = df['genre_name'].replace('электроника', 'electronic')
# посчитайте genre_final_count здесь

genre_final_count = df[df['genre_name'] == 'электроника']
genre_final_count = genre_final_count['genre_name'].count()
print(genre_final_count)

 10.8 Лаборатория алгоритма обработки

Задача №1

Выполните предобработку данных для Яндекс Музыки:

Импортируйте библиотеку pandas.

Считайте csv-файл music_log.csv.

Переименуйте три столбца: ' user_id' → 'user_id'; 'total play' → 'total_play'; 'Artist' → 'artist'.

Заполните отсутствующие значения в столбцах track, artist и genre.

Удалите строки-дубликаты, при этом удалите старую индексацию и добавьте новую.

Выведите на экран первые 20 строк обновлённого датафрейма.

# импортируйте библиотеку pandas
import pandas as pd
# считайте csv-файл 'music_log.csv' в переменную df
df = pd.read_csv('music_log.csv')
# переименуйте названия столбцов df
df = df.rename(columns={'  user_id':'user_id','total play':'total_play','Artist':'artist'})
# объявите список columns_to_replace с названиями столбцов track, artist, genre
columns_to_replace = ['track', 'artist', 'genre']
# заполните отсутствующие значения столбцов из списка columns_to_replace значением 'unknown' в цикле
for column in columns_to_replace:
    df[column] = df[column].fillna('unknown')
# удалите строки-дубликаты из датафрейма df
df = df.drop_duplicates().reset_index(drop=True) 
# выведите на экран первые 20 строчек обновлённого набора данных df
print(df.head(20))

 10.9 Заключение

Результат работы Вы избавились от самого вредоносного «мусора»: пропусков и дубликатов. При этом достаточно бережно, чтобы не пострадала самая нужная информация. Всё ради анализа данных — теперь можно начинать исследование. Что дальше Предстоит самая насыщенная математикой и одновременно самая творческая часть работы, потому что здесь начинается настоящее исследование. На память Чтобы ничего не забыть, скачайте шпаргалку.

 10.10 Проверочные задания. Предобработка данных

Проверочные задания. Предобработка данных Чтобы пройти тест нужно правильно ответить на 5 вопросов из 10. Время на прохождение: 10 минут

Задание 1 из 10 Выберите все проблемы, с которыми можно столкнуться во время предобработки?

Правильный ответ Пробелы в названиях столбцов

Правильный ответ Неявные дубликаты в данных

Правильный ответ Пропуски в значениях

Работа аналитика часто начинается с предобработки. Нужно проверить, нет ли в данных ошибок. Ведь пропущенные ошибки приведут к неверным результатам. Распространённая проблема — пробелы или сочетание прописных и строчных букв в названиях столбцов. Лучше заменить на «змеиный регистр». Другая проблема — пропуски. Их можно удалить, но тогда вы потеряете часть ценных данных. Найти неявные дубликаты не так легко, но лучше от них избавиться: такие дубликаты исказят результат.

Задание 2 из 10 Какие методы найдут пропущенные значения в датафрейме?

Правильный ответ isna()

Тоже правильный ответ isnull()

На пропуски укажут значения NA и None. Методы isna() и isnull() помогут их отыскать. В выдаче методов разницы нет, но разработчики больше предпочитают isna().

Задание 3 из 10 Какой метод удалит пропущенные значения в датафрейме?

Правильный ответ dropna()

Два метода найдут пропуски, но всего один их удалит. И это метод dropna().

Задание 4 из 10 Какой код заменит пропущенные значения в столбце 'column' на 'unknown'?

Правильный ответ df['column'] = df['column'].fillna('unknown')

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

Задание 5 из 10 Какой метод переименует столбцы в датафрейме?

Правильный ответ rename()

Метод count() считает значения, а duplicated() и drop_duplicates() работают с дубликатами. Названия столбцов заменит rename(). У него один аргумент — словарь columns. В ключах этого словаря указывают прежние названия столбцов, а в значениях — новые.

Задание 6 из 10 Какие методы вернут объект, состоящий из логических значений True и False?

Правильный ответ duplicated()

Правильный ответ isna()

Правильный ответ isnull()

Методы isna() и isnull() найдут пропуски, а duplicated() отыщет дубликаты. Что у них общего: в случае пропуска или дубликата возвращается True, иначе — False. Количество пропусков или дубликатов можно посчитать. Для этого результаты передают методу sum().

Задание 7 из 10 Какая команда очистит датафрейм от дубликатов, добавит новую индексацию и удалит старую?

Правильный ответ df = df.drop_duplicates().reset_index(drop=True)

Если удалить строки с пропусками или дубликатами, индексация в датафрейме нарушится. Её обновляют с помощью метода reset_index(). Чтобы удалить старую индексацию, нужно вызвать метод с аргументом drop=True.

Задание 8 из 10 Какая команда очистит датафрейм от дубликатов, добавит новую индексацию и сохранит старую?

Правильный ответ df = df.drop_duplicates().reset_index()

Если нужно сохранить старую индексацию, метод reset_index() вызывают без аргумента drop=True. Тогда прежние индексы попадут в столбец index.

Задание 9 из 10 Какой метод поможет в поиске неявных дубликатов?

Правильный ответ unique()

Если данные вносят вручную, неявных дубликатов сложно избежать. Одну позицию можно назвать по-разному: 'Сок апельсиновый', 'сок апельсиновый' и даже 'Сок Апельсиновый'. А если в названии допустить ошибку, вариантов станет ещё больше. Найти такие дубликаты поможет метод unique(). Он вернёт список уникальных значений, среди которых выбирают неявные дубликаты.

Задание 10 из 10 Как избавиться от неявных дубликатов в датафрейме cafe? import pandas as pd

column_names = ['date','position','price'] orders = [ ['2021.05.12', 'Сок апельсиновый', 100], ['2021.05.12', 'Пицца Маргарита', 300], ['2021.05.12', 'Мороженое ванильное', 150], ['2021.05.12', 'Апельсиновый сок', 100] ] cafe = pd.DataFrame(data=orders, columns=column_names)

Правильный ответ cafe['position'] = cafe['position'].replace('Апельсиновый сок', 'Сок апельсиновый')

Абсолютных дубликатов в датафрейме cafe нет. Поэтому метод drop_duplicates() тут не поможет. Найти неявные дубликаты можно с помощью unique(). В датафрейме 4 уникальных значения, но 'Сок апельсиновый' и 'Апельсиновый сок' относятся к одной позиции. Метод replace() это исправит. В первом аргументе метода указывают значение, которое хотят заменить. Во втором — новое значение для дубликата.

11. Анализ данных и оформление результатов.

Вернуться в Начало статьи

 11.1 Введение

 11.2 Задача: Обновление яндекс музыки

 11.3 Яндекс музыка. Работа с предобработанными данными

Задача №1

Файл music_log_upd.csv хранит данные, которые прошли предобработку в предыдущей теме. Прочитайте данные из файла music_log_upd.csv и выведите на экран первые 15 строк.

import pandas as pd
df = pd.read_csv('music_log_upd.csv')

Задача №2

Получите список названий колонок таблицы df через атрибут columns. Результат выведите на экран.

import pandas as pd
df = pd.read_csv('music_log_upd.csv')
print(df.columns)

Задача №3

С помощью метода isna() посчитайте пустые значения в таблице df. Результат сохраните в переменной na_number и выведите на экран.

import pandas as pd
df = pd.read_csv('music_log_upd.csv')
na_number = df.isna().sum()
print (na_number)

Задача №4

Посчитайте количество дубликатов в наборе данных, сохраните результат в переменной duplicated_number. Выведите её значение на экран

import pandas as pd
df = pd.read_csv('music_log_upd.csv')
duplicated_number = df.duplicated().sum()
print (duplicated_number)

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

 11.5 Яндекс  музыка. Группировка данных

Задача №1

Сгруппируйте данные в датафрейме df по столбцу user_id, выберите столбец genre_name, а затем примените метод count(). Сохраните результат в переменную track_grouping. Так вы посчитаете количество композиций, которые слушал каждый пользователь. На экран будет выведена информация о количестве композиций для первых 30 пользователей — код вывода данных уже есть.

import pandas as pd

df = pd.read_csv('music_log_upd.csv')

# напишите ваш код здесь
track_grouping = df.groupby('user_id')['genre_name'].count()

print(track_grouping.head(30))

Задача №2

Предположим, что музыкальные вкусы разнообразнее у тех пользователей, которые слушают больше 50 песен. Нужно найти этих пользователей.

В предыдущем задании вы получили столбец-Series, содержащий целые числа — количество прослушанных композиций для каждого пользователя. С помощью логической индексации получите Series, в котором останутся только пользователи из track_grouping, которые прослушали более 50 композиций. Сохраните получившийся после индексации столбец-Series в переменную track_counting. Код вывода результата уже есть.

import pandas as pd

df = pd.read_csv('music_log_upd.csv')

track_grouping = df.groupby('user_id')['genre_name'].count()
# напишите ваш код здесь
track_counting = track_grouping[track_grouping >50]

print(track_counting)

 11.6 Сортировка данных

Задача №1

У похожей на Солнце звезды телескоп Kepler открыл похожую на Землю планету.
А в прошлом уроке с практикой вы нашли в данных Яндекс Музыки меломанов с уникальными данными. 
Они за день послушали больше 50 композиций.

Больше всего композиций (86) прослушал пользователь с идентификатором 174C0ED6.
Получите таблицу с прослушанными им треками.

Для этого запросите из структуры данных df строки, отвечающие сразу двум условиям:
значение в столбце 'user_id' должно быть равно значению переменной search_user_id;
время прослушивания, значение в столбце 'total_play_seconds', не должно равняться 0.
Сохраните результат в переменной music_user.

import pandas as pd

df = pd.read_csv('music_log_upd.csv')

search_user_id = '174C0ED6'

# напишите ваш код здесь
music_user = df[df['user_id']==search_user_id]
music_user = music_user[music_user['total_play_seconds']!=0]
print(music_user)

Задача №2

Сгруппируйте данные таблицы music_user по столбцу 'genre_name' и получите сумму значений столбца 'total_play_seconds'. Сохраните результат в переменной sum_music_user. Код вывода уже есть — вы увидите, сколько пользователь слушал каждый жанр.

import pandas as pd

df = pd.read_csv('music_log_upd.csv')

search_user_id = '174C0ED6'

music_user = df[df['user_id'] == search_user_id]
music_user = music_user[music_user['total_play_seconds'] != 0]

# напишите ваш код здесь
sum_music_user = music_user.groupby('genre_name')
sum_music_user = sum_music_user['total_play_seconds'].sum()
print(sum_music_user)

Задача №3

Предпочтения меломана начинают проявляться. Но, возможно, длительность композиций от жанра к жанру сильно различается. 
Также важно знать, сколько треков каждого жанра он включил.

Сгруппируйте данные по столбцу genre_name и посчитайте значения в нём. Сохраните результат в переменной count_music_user. Код вывода результата уже есть. 
Не удаляйте вывод из предыдущего задания. Вы увидите два столбца — с суммарной длительностью прослушиваний каждого жанра и количеством прослушанных треков каждого жанра — друг за другом.

import pandas as pd

df = pd.read_csv('music_log_upd.csv')

search_user_id = '174C0ED6'

music_user = df[df['user_id'] == search_user_id]
music_user = music_user[music_user['total_play_seconds'] != 0]

sum_music_user = music_user.groupby('genre_name')['total_play_seconds'].sum()
print(sum_music_user)

# напишите ваш код здесь
count_music_user = music_user.groupby('genre_name')['total_play_seconds'].count()
print(count_music_user)

Задача №4

Чтобы предпочтения были видны сразу, самые большие значения нужно расположить сверху.
Отсортируйте данные в группировке sum_music_user по убыванию. 
Когда применяете метод sort_values() к Series с единственным столбцом, передавать аргумент в by не нужно — только порядок сортировки в ascending.
Сохраните результат сортировки в переменной final_sum.

import pandas as pd

df = pd.read_csv('music_log_upd.csv')

search_user_id = '174C0ED6'

music_user = df[df['user_id'] == search_user_id]
music_user = music_user[music_user['total_play_seconds'] != 0]

sum_music_user = music_user.groupby('genre_name')['total_play_seconds'].sum()

# напишите ваш код здесь'
final_sum = sum_music_user.sort_values(ascending=False)
print(final_sum)

Задача №5

Теперь то же самое сделайте с числом прослушанных меломаном композиций. Отсортируйте данные группировки count_music_user по убыванию и сохраните результат в переменной final_count. Код вывода уже есть.

import pandas as pd

df = pd.read_csv('music_log_upd.csv')

search_user_id = '174C0ED6'

music_user = df[df['user_id'] == search_user_id]
music_user = music_user[music_user['total_play_seconds'] != 0]

count_music_user = music_user.groupby('genre_name')['genre_name'].count()

# напишите ваш код здесь
final_count = count_music_user.sort_values(ascending=False)
print(final_count)

 11.7 Яндекс музыка. Сортировка данных

 11.8 Описательная статистика

 11.9 Яндекс музыка. Описательная статистика

Задача №1

Получите таблицу с композициями самого популярного жанра — pop.

Затем исключите пропущенные треки — которые слушали 0 секунд.

Сохраните результат в переменной pop_music.

import pandas as pd
df = pd.read_csv('music_log_upd.csv')

pop_music = df[df['genre_name']=='pop']
pop_music = pop_music[pop_music['total_play_seconds']!=0]

Задача №2

Найдите максимальное время прослушивания песни в жанре pop.

Сохраните результат в переменной pop_music_max_total_play и выведите её значение на экран.

import pandas as pd
df = pd.read_csv('music_log_upd.csv')

pop_music = df[df['genre_name']=='pop']
pop_music = pop_music[pop_music['total_play_seconds']!=0]
pop_music_max_total_play = pop_music['total_play_seconds'].max()
print (pop_music_max_total_play)

Задача №3

Получите из таблицы pop_music строку с максимальным временем прослушивания.

Результат сохраните в переменной pop_music_max_info и выведите на экран.

Закомментируйте вывод результата предыдущей задачи.

import pandas as pd
df = pd.read_csv('music_log_upd.csv')

pop_music = df[df['genre_name']=='pop']
pop_music = pop_music[pop_music['total_play_seconds']!=0]
pop_music_max_total_play = pop_music['total_play_seconds'].max()
#print (pop_music_max_total_play)
pop_music_max_info = pop_music[pop_music['total_play_seconds'] == pop_music['total_play_seconds'].max()]
print (pop_music_max_info)

Задача №4

Найдите минимальное время прослушивания композиции в жанре pop, отличное от нуля.

Сохраните его в переменной pop_music_min_total_play, значение выведите на экран.

Вывод результата предыдущей задачи закомментируйте.

import pandas as pd
df = pd.read_csv('music_log_upd.csv')

pop_music = df[df['genre_name']=='pop']
pop_music = pop_music[pop_music['total_play_seconds']!=0]
pop_music_max_total_play = pop_music['total_play_seconds'].max()
#print (pop_music_max_total_play)
pop_music_max_info = pop_music[pop_music['total_play_seconds'] == pop_music['total_play_seconds'].max()]
#print (pop_music_max_info)
pop_music_min_total_play = pop_music['total_play_seconds'].min()
print (pop_music_min_total_play)

Задача №5

Выведите на экран строку о композиции жанра pop, которую начали слушать, но выключили быстрее всех остальных. Результат сохраните в переменную pop_music_min_info и выведите на экран. Вывод результата предыдущей задачи закомментируйте.

import pandas as pd
df = pd.read_csv('music_log_upd.csv')

pop_music = df[df['genre_name']=='pop']
pop_music = pop_music[pop_music['total_play_seconds']!=0]
pop_music_max_total_play = pop_music['total_play_seconds'].max()
#print (pop_music_max_total_play)
pop_music_max_info = pop_music[pop_music['total_play_seconds'] == pop_music['total_play_seconds'].max()]
#print (pop_music_max_info)
pop_music_min_total_play = pop_music['total_play_seconds'].min()
#print (pop_music_min_total_play)
pop_music_min_info = pop_music[pop_music['total_play_seconds'] == pop_music['total_play_seconds'].min()]
print (pop_music_min_info)

Задача №6

Рассчитайте медиану времени прослушивания произведений жанра pop. Сохраните результат в переменной pop_music_median и выведите на экран. Вывод результата предыдущей задачи закомментируйте.

import pandas as pd
df = pd.read_csv('music_log_upd.csv')

pop_music = df[df['genre_name']=='pop']
pop_music = pop_music[pop_music['total_play_seconds']!=0]
pop_music_max_total_play = pop_music['total_play_seconds'].max()
#print (pop_music_max_total_play)
pop_music_max_info = pop_music[pop_music['total_play_seconds'] == pop_music['total_play_seconds'].max()]
#print (pop_music_max_info)
pop_music_min_total_play = pop_music['total_play_seconds'].min()
#print (pop_music_min_total_play)
pop_music_min_info = pop_music[pop_music['total_play_seconds'] == pop_music['total_play_seconds'].min()]
#print (pop_music_min_info)
pop_music_median = pop_music['total_play_seconds'].median()
print(pop_music_median)

Задача №7

Рассчитайте среднее арифметическое времени прослушивания произведений жанра pop. Сохраните результат в переменной pop_music_mean и выведите на экран.

Вывод результата предыдущей задачи закомментируйте.

import pandas as pd
df = pd.read_csv('music_log_upd.csv')

pop_music = df[df['genre_name']=='pop']
pop_music = pop_music[pop_music['total_play_seconds']!=0]
pop_music_max_total_play = pop_music['total_play_seconds'].max()
#print (pop_music_max_total_play)
pop_music_max_info = pop_music[pop_music['total_play_seconds'] == pop_music['total_play_seconds'].max()]
#print (pop_music_max_info)
pop_music_min_total_play = pop_music['total_play_seconds'].min()
#print (pop_music_min_total_play)
pop_music_min_info = pop_music[pop_music['total_play_seconds'] == pop_music['total_play_seconds'].min()]
#print (pop_music_min_info)
pop_music_median = pop_music['total_play_seconds'].median()
#print(pop_music_median)
pop_music_mean = pop_music['total_play_seconds'].mean()
print(pop_music_mean)

 11.10 Яндекс музыка. Решение кейса и оформление результатов

Задача №1

Рассчитайте метрику engagement после проведения эксперимента для всего набора данных. Сохраните полученный результат в переменной current_engagement и выведите на экран.

import pandas as pd
df = pd.read_csv('music_log_upd.csv')
current_engagement = df.groupby('user_id').sum().median()
print (current_engagement)

Задача №2

Внесите результат своей работы в существующую таблицу и рассчитайте разность двух значений метрики engagement. Названия столбцов:

metrics — метрика;

before_test — до эксперимента;

after_test — после эксперимента;

absolute_difference — абсолютная разница.

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

Значение метрики engagement после эксперимента: 62.344431 секунды.

Значение метрики engagement до эксперимента: 57.456 секунды.

import pandas as pd
exp = [['engagement', 57.456, 62.344431, 4.888431]]
columns = ['metrics','before_test','after_test','absolute_difference']

metrics = pd.DataFrame(data=exp,columns=columns)
print(metrics)

Задача №3

Получите выборку прослушанных композиций в жанре рок, время воспроизведения которых не равно нулю, и сохраните её в переменной genre_rock. Получите максимальное и минимальное значения времени прослушивания, сохраните соответственно в переменных genre_rock_max и genre_rock_min, выведите на экран со строками: 'Максимальное время прослушивания в жанре рок равно:' 'Минимальное время прослушивания в жанре рок равно:'

import pandas as pd
df = pd.read_csv('music_log_upd.csv')

# <введите здесь решение для поиска недостающих данных>
genre_rock = df[df['genre_name']=='rock']
genre_rock = genre_rock[genre_rock['total_play_seconds']!=0]
# максимальное время прослушивания в жанре рок
genre_rock_max = genre_rock['total_play_seconds'].max()
print ('Максимальное время прослушивания в жанре рок равно:',genre_rock_max)
# минимальное время прослушивания в жанре рок
genre_rock_min = genre_rock['total_play_seconds'].min()
print ('Минимальное время прослушивания в жанре рок равно:',genre_rock_min)

Задача №4

Соберите результаты исследования в таблицу research_genres_result, которую нужно создать конструктором DataFrame(). Его аргумент data — список с данными, аргумент columns — список названий столбцов. Выведите полученную таблицу на экран.

import pandas as pd
data = [['pop', 8663, 34.6, 1158.03, 0.000794],
       ['rock', 6828, 33.3, 1699.14882, 0.014183]]
columns = ['genre_name','total_track','skip_track','max_total_time','min_total_time']
research_genres_result = pd.DataFrame(data=data,columns=columns)
print (research_genres_result)

 11.11 Заключение

Вы нашли ответ на интересующий вопрос.

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

на иллюстрации показано, что Pandas включает в себя:

чтение данных,

предобработку данных,

анализ данных и

оформление результатов.

Теперь слово тому, чью задачу мы решали последние несколько уроков.

Менеджер Яндекс Музыки просил передать:

На иллюстрации показано сообщение менеджера Яндекс Музыки, в котором он благодарит вас за отличную работу.

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

Как видите, метрика engagement выросла. Стало быть, внедрение Радио — действительно хорошая идея. На память Чтобы ничего не забыть, скачайте шпаргалку.

 11.12 Проверочные задания. Анализ данных и оформление результатов

Проверочные задания.

Анализ данных и оформление результатов

Чтобы пройти тест нужно правильно ответить на 5 вопросов из 10. Время на прохождение: 10 минут

Задание 1 из 10 Расположите этапы группировки в правильном порядке.
Разделить 1
Применить 2
Объединить 3
 
Казалось бы, зачем запоминать стадии группировки, если можно просто знать методы в pandas. Но теперь вы понимаете, как устроена группировка. И если понадобится сгруппировать по нескольким столбцам сразу, вы не запутаетесь. До успешной группировки всего три шага: split, apply, combine.
 
Задание 2 из 10 Какой метод сгруппирует данные в датафрейме?

Правильный ответ groupby()

Анализ данных часто начинают с группировки. Так проще сравнивать значения и искать взаимосвязи. В pandas группируют методом groupby(). В аргументе метода указывают столбец, по которому нужно группировать.

Задание 3 из 10 Сколько групп получится, если сгруппировать данные в датафрейме по столбцу country? import pandas as pd

info = [ ['Москва', 'Россия'], ['Ростов-на-Дону', 'Россия'], ['Саратов', 'Россия'], ['Париж', 'Франция'], ['Рим', 'Италия'], ['Венеция', 'Италия'], ['Милан', 'Италия'], ['Мадрид', 'Испания'], ['Барселона', 'Испания'] ]

Правильный ответ 4

Это первый этап группировки — разделение. В каждой группе окажутся города одной страны. В столбце country таких стран 4, столько будет и групп.

Задание 4 из 10 Какой код отсортирует данные по возрастанию значений столбца rating? Выберите несколько вариантов.

Правильный ответ df = df.sort_values(by='rating', ascending=True)

Правильный ответ df = df.sort_values(by='rating')

Порядком сортировки в методе sort_values() управляет параметр ascending. По умолчанию его значение True. Тогда метод отсортирует данные по возрастанию. Если нужен обратный порядок, поменяйте значение на False.

Задание 5 из 10 Какой код выдаст ошибку? Выберите несколько вариантов. import pandas as pd

tracks = [ ['Mariah Carey', 'After Tonight', 254], ['Westlife', 'Soledad', 237], ['Daft Punk', 'Instant Crush', 337] ]

titles = ['artist', 'track', 'duration']

Правильный ответ music_df = music_df.sort_values(ascending=False)

Правильный ответ music_df = music_df['duration'].sort_values(by='duration')

Если нужно отсортировать таблицу по какому-либо столбцу, не забудьте указать название столбца при вызове функции. В методе sort_values() для этого есть параметр by. Но если вы применяете метод к объекту Series, то есть к одному столбцу, аргумент указывать не нужно.

Задание 6 из 10 Какой метод посчитает элементы в столбце датафрейма?

Правильный ответ count()

Метод count() вернёт количество элементов в столбце. Обратите внимание, что пропущенные значения метод не считает. Метод sum() используют для суммы. А max() и min() найдут максимальное и минимальное значения.

Задание 7 из 10 Что такое медиана в описательной статистике?

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

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

Задание 8 из 10 В описательной статистике используют несколько показателей. Какой из этих методов к ним не относится?

Правильный ответ sum()

Представьте, что вам предоставили данные о пользователях интернет-магазина. Можно разделить данные на группы и поискать отличия. А можно описать среднестатистического пользователя: сколько времени проводит на сайте, сколько тратит. В этом поможет описательная статистика. Основных показателей в описательной статистике четыре: максимальное и минимальное значения, медиана и среднее. Сумма к ним не относится. Но метод sum() можно использовать при группировке.

Задание 9 из 10 Что выведет такой код? import pandas as pd

tracks = [ ['Mariah Carey', 'After Tonight', 254], ['Westlife', 'Soledad', 237], ['Daft Punk', 'Instant Crush', 337] ]

titles = ['artist', 'track', 'duration']

music_df = pd.DataFrame(data=tracks, columns=titles) print(music_df['duration'].max())

Правильный ответ 337

Метод max() найдёт максимальное значение. Самый длинный трек в этом датафрейме у Daft Punk.

Задание 10 из 10 Что выведет такой код? import pandas as pd

tracks = [ ['Mariah Carey', 'After Tonight', 254], ['Westlife', 'Soledad', 237], ['Daft Punk', 'Instant Crush', 337] ]

titles = ['artist', 'track', 'duration']

music_df = pd.DataFrame(data=tracks, columns=titles) print(music_df['duration'].mean())

Правильный ответ 276.0

Метод mean() найдёт среднее арифметическое. Это сумма всех значений, разделённая на их количество. Медиану тоже можно найти — для этого используют метод median(). Медиана в этом случае будет меньше среднего — 254.0. Длинный трек группы Daft Punk сместил средний показатель вверх.

12 Jupyter Notebook

Вернуться в Начало статьи

 12.1 Jupyter Notebook - Тетрадь в ячейках

13. Проект: Музыка больших городов

Вернуться в Начало статьи

 13.1 Первое исследование

 13.2 Описание проекта

 13.3 Не делайте проект*

Шпаргалки

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

 13.4 Проект Базовый Python

КОНТРОЛЬНЫЙ ПРОЕКТ

Яндекс Музыка

Сравнение Москвы и Петербурга окружено мифами. Например:

  • Москва — мегаполис, подчинённый жёсткому ритму рабочей недели;
  • Петербург — культурная столица, со своими вкусами.

На данных Яндекс Музыки вы сравните поведение пользователей двух столиц.

Цель исследования — проверьте три гипотезы:

  1. Активность пользователей зависит от дня недели. Причём в Москве и Петербурге это проявляется по-разному.
  2. В понедельник утром в Москве преобладают одни жанры, а в Петербурге — другие. Так же и вечером пятницы преобладают разные жанры — в зависимости от города.
  3. Москва и Петербург предпочитают разные жанры музыки. В Москве чаще слушают поп-музыку, в Петербурге — русский рэп.

Ход исследования

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

Вы проверите данные на ошибки и оцените их влияние на исследование. Затем, на этапе предобработки вы поищете возможность исправить самые критичные ошибки данных.

Таким образом, исследование пройдёт в три этапа:

  1. Обзор данных.
  2. Предобработка данных.
  3. Проверка гипотез.
 

1 Обзор данных

Составьте первое представление о данных Яндекс Музыки.

 

Задание 1

Основной инструмент для работы с данными — pandas. Импортируйте эту библиотеку в сокращённой форме — pd.

Прочитайте файл yandex_music_project.csv из папки /datasets и сохраните его в переменной df.

# чтение файла с данными и сохранение в df
#df = pd.read_csv('/datasets/yandex_music_project.csv')
df = pd.read_csv('datasets/music_project.csv')
Задание 3

Выведите на экран первые десять строк датафрейма df.

  Unnamed: 0 userID Track artist genre City time Day
0 0 FFB692EC Kamigata To Boots The Mass Missile rock Saint-Petersburg 20:28:33 Wednesday
1 1 55204538 Delayed Because of Accident Andreas Rönnberg rock Moscow 14:07:09 Friday
2 2 20EC38 Funiculì funiculà Mario Lanza pop Saint-Petersburg 20:58:07 Wednesday
3 3 A3DD03C9 Dragons in the Sunset Fire + Ice folk Saint-Petersburg 08:37:09 Monday
4 4 E2DC1FAE Soul People Space Echo dance Moscow 08:34:34 Monday
5 5 842029A1 Преданная IMPERVTOR rusrap Saint-Petersburg 13:09:41 Friday
6 6 4CB90AA5 True Roman Messer dance Moscow 13:00:07 Wednesday
7 7 F03E1C1F Feeling This Way Polina Griffith dance Moscow 20:47:49 Wednesday
8 8 8FA1D3BE И вновь продолжается бой NaN ruspop Moscow 09:17:40 Friday
9 9 E772D5C0 Pessimist NaN dance Saint-Petersburg 21:20:49 Wednesday
В таблице семь столбцов. Тип данных во всех столбцах -abject

Согласно документации к данным:

user - индентификатор пользователя;

Track - название трека;

artist - имя исполнителя;

genre - название жанра;

City - город пользователя;

time - время начала прослушивания;

Day - день недели.

Количество значений в столбцахразличается. Значит, в данных есть пропущенные значения.

Задание 4

Одной командой получите общую информацию о таблице.

Количество значений в столбцах различается. Значит, в данных есть пропущенные значения.
 
Задание 5

Вопрос со свободной формой ответа

В названиях колонок видны три нарушения стиля:

  1. Строчные буквы сочетаются с прописными.
  2. Встречаются пробелы.

Найдите третье нарушение стиля. Напишите ваш ответ в ячейке комментарием. Не удаляйте символ #. Не меняйте тип этой ячейки на Markdown.

Это задание не будет проверено автоматически, оно предназначено для самопроверки. Просто нажмите кнопку “Проверить задание” после ввода ответа, чтобы перейти к следующему заданию.

# Напишите ваш ответ здесь комментарием. Не удаляйте символ 
#. Не меняйте тип этой ячейки на Markdown.

В каждой строке таблицы — данные о прослушанном треке. Часть колонок описывает саму композицию: название, исполнителя и жанр. Остальные данные рассказывают о пользователе: из какого он города, когда он слушал музыку.

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

Чтобы двигаться дальше, нужно устранить проблемы в данных.

2. Предобработка данных

Задание 6

Выведите на экран названия столбцов датафрейма df.

Задание 7

Приведите названия в соответствие с хорошим стилем:

  • несколько слов в названии запишите в «змеином_регистре»,

  • все символы сделайте строчными,

устраните пробелы.

Для этого переименуйте колонки так:

userID → user_id;

Track → track;

City → city;

Day → day.

Задание 8

Проверьте результат. Для этого ещё раз выведите на экран названия столбцов датафрейма df.

Index(['user_id', 'track', 'artist', 'genre', 'city', 'time', 'day'], dtype='object')
 
2.2 Обработка пропущенных значений

Задание 9

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

track      1231
artist     7203
genre      1198
city          0
time          0
day           0
dtype: int64
Не все пропущенные значения влияют на исследование. так, в track и artist пропуски не важны для работы. Достаточно заменить их явными обозначениями.

Но пропуски в genre могут помешать сравнивать музыкальные вкусы москвичей и петербуржцев. На практике было бы правильно установить причину пропусков и восстановить данные. Такой возможности нет в учебном проекте. Поэтому придется:

  • заполнить эти пропуски явными обозначениями;
  • оценить, насколько они повредят расчетам.
Задание 10

Замените пропущенные значения в столбцах trackartist и genre на строку 'unknown'. Для этого создайте список columns_to_replace, переберите его элементы циклом for и для каждого столбца выполните замену пропущенных значений.

Убедитесь, что в таблице не осталось пропусков. Для этого ещё раз посчитайте пропущенные значения.

track      0
artist     0
genre      0
city       0
time       0
day        0
dtype: int64
 

2.3 Обработка дубликатов

Задание 12

Посчитайте явные дубликаты в таблице одной командой из двух методов.

Задание 13

Вызовите специальный метод pandas, чтобы удалить явные строки-дубликаты в данных. В этой же строке вызовите метод, который создаст новые индексы и удалит старые.

Ещё раз посчитайте явные дубликаты в таблице — убедитесь, что полностью от них избавились.

Задание 15

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

  1. извлеките нужный столбец датафрейма;

  2. примените к нему метод сортировки из библиотеки pandas, используйте сортировку по возрастанию;

  3. для отсортированного столбца вызовите метод из библиотеки pandas, который вернёт уникальные значения из столбца.

       'alternative', 'alternativepunk', 'ambient', 'americana',
       'animated', 'anime', 'arabesk', 'arabic', 'arena',
       'argentinetango', 'art', 'audiobook', 'author', 'avantgarde',
       'axé', 'baile', 'balkan', 'beats', 'bigroom', 'black', 'bluegrass',
       'blues', 'bollywood', 'bossa', 'brazilian', 'breakbeat', 'breaks',
       'broadway', 'cantautori', 'cantopop', 'canzone', 'caribbean',
       'caucasian', 'celtic', 'chamber', 'chanson', 'children', 'chill',
       'chinese', 'choral', 'christian', 'christmas', 'classical',
       'classicmetal', 'club', 'colombian', 'comedy', 'conjazz',
       'contemporary', 'country', 'cuban', 'dance', 'dancehall',
       'dancepop', 'dark', 'death', 'deep', 'deutschrock', 'deutschspr',
       'dirty', 'disco', 'dnb', 'documentary', 'downbeat', 'downtempo',
       'drum', 'dub', 'dubstep', 'eastern', 'easy', 'electronic',
       'electropop', 'emo', 'entehno', 'epicmetal', 'estrada', 'ethnic',
       'eurofolk', 'european', 'experimental', 'extrememetal', 'fado',
       'fairytail', 'film', 'fitness', 'flamenco', 'folk', 'folklore',
       'folkmetal', 'folkrock', 'folktronica', 'forró', 'frankreich',
       'französisch', 'french', 'funk', 'future', 'gangsta', 'garage',
       'german', 'ghazal', 'gitarre', 'glitch', 'gospel', 'gothic',
       'grime', 'grunge', 'gypsy', 'handsup', "hard'n'heavy", 'hardcore',
       'hardstyle', 'hardtechno', 'hip', 'hiphop', 'historisch',
       'holiday', 'horror', 'house', 'hymn', 'idm', 'independent',
       'indian', 'indie', 'indipop', 'industrial', 'inspirational',
       'instrumental', 'international', 'irish', 'jam', 'japanese',
       'jazz', 'jewish', 'jpop', 'jungle', 'k-pop', 'karadeniz',
       'karaoke', 'kayokyoku', 'korean', 'laiko', 'latin', 'latino',
       'leftfield', 'local', 'lounge', 'loungeelectronic', 'lovers',
       'malaysian', 'mandopop', 'marschmusik', 'meditative',
       'mediterranean', 'melodic', 'metal', 'metalcore', 'mexican',
       'middle', 'minimal', 'miscellaneous', 'modern', 'mood', 'mpb',
       'muslim', 'native', 'neoklassik', 'neue', 'new', 'newage',
       'newwave', 'nu', 'nujazz', 'numetal', 'oceania', 'old', 'opera',
       'orchestral', 'other', 'piano', 'podcasts', 'pop', 'popdance',
       'popelectronic', 'popeurodance', 'poprussian', 'post',
       'posthardcore', 'postrock', 'power', 'progmetal', 'progressive',
       'psychedelic', 'punjabi', 'punk', 'quebecois', 'ragga', 'ram',
       'rancheras', 'rap', 'rave', 'reggae', 'reggaeton', 'regional',
       'relax', 'religious', 'retro', 'rhythm', 'rnb', 'rnr', 'rock',
       'rockabilly', 'rockalternative', 'rockindie', 'rockother',
       'romance', 'roots', 'ruspop', 'rusrap', 'rusrock', 'russian',
       'salsa', 'samba', 'scenic', 'schlager', 'self', 'sertanejo',
       'shanson', 'shoegazing', 'showtunes', 'singer', 'ska', 'skarock',
       'slow', 'smooth', 'soft', 'soul', 'soulful', 'sound', 'soundtrack',
       'southern', 'specialty', 'speech', 'spiritual', 'sport',
       'stonerrock', 'surf', 'swing', 'synthpop', 'synthrock',
       'sängerportrait', 'tango', 'tanzorchester', 'taraftar', 'tatar',
       'tech', 'techno', 'teen', 'thrash', 'top', 'traditional',
       'tradjazz', 'trance', 'tribal', 'trip', 'triphop', 'tropical',
       'türk', 'türkçe', 'ukrrock', 'unknown', 'urban', 'uzbek',
       'variété', 'vi', 'videogame', 'vocal', 'western', 'world',
       'worldbeat', 'ïîï', 'электроника'], dtype=object)
Название одного и тогоже жанра может быть записано немного по разному. Такие ощибки тоже повлияют на результат исследование.
Задание 16

Просмотрите список и найдите неявные дубликаты названия hiphop. Это могут быть названия с ошибками или альтернативные названия того же жанра.

Вы увидите следующие неявные дубликаты:

  • hip,

  • hop,

  • hip-hop.

Вам нужно исправить колонку genre в таблице df: заменить каждое значение из списка дубликатов на верное. Вместо hiphop и hip-hop в таблице должно быть значение hiphop.

Проверьте, что заменили неправильные названия:

  • hip,

  • hop,

  • hip-hop.

Выведите отсортированный по возрастанию список уникальных значений столбца genre.

       'alternative', 'alternativepunk', 'ambient', 'americana',
       'animated', 'anime', 'arabesk', 'arabic', 'arena',
       'argentinetango', 'art', 'audiobook', 'author', 'avantgarde',
       'axé', 'baile', 'balkan', 'beats', 'bigroom', 'black', 'bluegrass',
       'blues', 'bollywood', 'bossa', 'brazilian', 'breakbeat', 'breaks',
       'broadway', 'cantautori', 'cantopop', 'canzone', 'caribbean',
       'caucasian', 'celtic', 'chamber', 'chanson', 'children', 'chill',
       'chinese', 'choral', 'christian', 'christmas', 'classical',
       'classicmetal', 'club', 'colombian', 'comedy', 'conjazz',
       'contemporary', 'country', 'cuban', 'dance', 'dancehall',
       'dancepop', 'dark', 'death', 'deep', 'deutschrock', 'deutschspr',
       'dirty', 'disco', 'dnb', 'documentary', 'downbeat', 'downtempo',
       'drum', 'dub', 'dubstep', 'eastern', 'easy', 'electronic',
       'electropop', 'emo', 'entehno', 'epicmetal', 'estrada', 'ethnic',
       'eurofolk', 'european', 'experimental', 'extrememetal', 'fado',
       'fairytail', 'film', 'fitness', 'flamenco', 'folk', 'folklore',
       'folkmetal', 'folkrock', 'folktronica', 'forró', 'frankreich',
       'französisch', 'french', 'funk', 'future', 'gangsta', 'garage',
       'german', 'ghazal', 'gitarre', 'glitch', 'gospel', 'gothic',
       'grime', 'grunge', 'gypsy', 'handsup', "hard'n'heavy", 'hardcore',
       'hardstyle', 'hardtechno', 'hiphop', 'historisch', 'holiday',
       'horror', 'house', 'hymn', 'idm', 'independent', 'indian', 'indie',
       'indipop', 'industrial', 'inspirational', 'instrumental',
       'international', 'irish', 'jam', 'japanese', 'jazz', 'jewish',
       'jpop', 'jungle', 'k-pop', 'karadeniz', 'karaoke', 'kayokyoku',
       'korean', 'laiko', 'latin', 'latino', 'leftfield', 'local',
       'lounge', 'loungeelectronic', 'lovers', 'malaysian', 'mandopop',
       'marschmusik', 'meditative', 'mediterranean', 'melodic', 'metal',
       'metalcore', 'mexican', 'middle', 'minimal', 'miscellaneous',
       'modern', 'mood', 'mpb', 'muslim', 'native', 'neoklassik', 'neue',
       'new', 'newage', 'newwave', 'nu', 'nujazz', 'numetal', 'oceania',
       'old', 'opera', 'orchestral', 'other', 'piano', 'podcasts', 'pop',
       'popdance', 'popelectronic', 'popeurodance', 'poprussian', 'post',
       'posthardcore', 'postrock', 'power', 'progmetal', 'progressive',
       'psychedelic', 'punjabi', 'punk', 'quebecois', 'ragga', 'ram',
       'rancheras', 'rap', 'rave', 'reggae', 'reggaeton', 'regional',
       'relax', 'religious', 'retro', 'rhythm', 'rnb', 'rnr', 'rock',
       'rockabilly', 'rockalternative', 'rockindie', 'rockother',
       'romance', 'roots', 'ruspop', 'rusrap', 'rusrock', 'russian',
       'salsa', 'samba', 'scenic', 'schlager', 'self', 'sertanejo',
       'shanson', 'shoegazing', 'showtunes', 'singer', 'ska', 'skarock',
       'slow', 'smooth', 'soft', 'soul', 'soulful', 'sound', 'soundtrack',
       'southern', 'specialty', 'speech', 'spiritual', 'sport',
       'stonerrock', 'surf', 'swing', 'synthpop', 'synthrock',
       'sängerportrait', 'tango', 'tanzorchester', 'taraftar', 'tatar',
       'tech', 'techno', 'teen', 'thrash', 'top', 'traditional',
       'tradjazz', 'trance', 'tribal', 'trip', 'triphop', 'tropical',
       'türk', 'türkçe', 'ukrrock', 'unknown', 'urban', 'uzbek',
       'variété', 'vi', 'videogame', 'vocal', 'western', 'world',
       'worldbeat', 'ïîï', 'электроника'], dtype=object)
Выводы

Предобработка обнаружила три проблемы в данных:

  • нарушения в стиле заголовков,
  • пропущенные значения,
  • дубликаты — явные и неявные.

Вы исправили заголовки, чтобы упростить работу с таблицей. Без дубликатов исследование станет более точным.

Пропущенные значения вы заменили на 'unknown'. Ещё предстоит увидеть, не повредят ли исследованию пропуски в колонке genre.

Теперь можно перейти к проверке гипотез.

3 Проверка гипотез
3.1 Сравнение поведения пользователей двух столиц
Первая гипотеза утверждает, что пользователи по-разному слушают музыку в Москве и Санкт-Петербурге. Проверим это предположение по данным о трёх днях недели — понедельнике, среде и пятнице. Для этого:
  • Разделим пользователей Москвы и Санкт-Петербурга.
  • Сравним, сколько треков послушала каждая группа пользователей в понедельник, среду и пятницу.
Задание 18

Для тренировки сначала выполните каждый из расчётов по отдельности.

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

Moscow              42741
Saint-Petersburg    18512
Name: user_id, dtype: int64
 

Задание 19

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

Friday       21840
Monday       21354
Wednesday    18059
Name: user_id, dtype: int64
Вывод

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

Задание 20

Вы видели, как работает группировка по городу и по дням недели. Теперь напишите функцию, которая объединит два эти расчёта. Часть кода уже написана, допишите оставшиеся команды.

Создайте функцию number_tracks(), которая посчитает прослушивания для заданного дня и города. Ей понадобятся два параметра:

  • день недели,
  • название города.

В функции сохраните в переменную строки исходной таблицы, у которых значение:

в колонке day равно параметру day, в колонке city равно параметру city.

Для этого примените последовательную фильтрацию с логической индексацией.

Затем посчитайте значения в столбце user_id получившейся таблицы. Результат сохраните в новую переменную. Верните эту переменную из функции.

Вызовите number_tracks() шесть раз, меняя значение параметров — так, чтобы получить данные для каждого города в каждый из трёх дней.

Переберите следующие пары:

'Monday', 'Moscow'

'Monday', 'Saint-Petersburg'

'Wednesday', 'Moscow'

'Wednesday', 'Saint-Petersburg'

'Friday', 'Moscow'

'Friday', 'Saint-Petersburg'

# количество прослушиваний в Москве по понедельникам
number_tracks(day='Monday', city='Moscow')
15740
# количество прослушиваний в Санкт-Петербурге по понедельникам
number_tracks(day='Monday', city='Saint-Petersburg')
5614
# количество прослушиваний в Москве по средам
number_tracks(day='Wednesday', city='Moscow')
11056
# количество прослушиваний в Санкт-Петербурге по средам
number_tracks(day='Wednesday', city='Saint-Petersburg')
7003
# количество прослушиваний в Москве по пятницам
number_tracks(day='Friday', city='Moscow')
15945
# количество прослушиваний в Санкт-Петербурге по пятницам
number_tracks(day='Friday', city='Saint-Petersburg')
5895
Задание 22

С помощью конструктора pd.DataFrame создайте таблицу info, где:

  • названия колонок — ['city', 'monday', 'wednesday', 'friday'];

  • данные — результаты, которые вы получили с помощью number_tracks.

Это задание не будет проверяться. Мы просто предлагаем вам вспомнить, как создавать датафрейм с помощью конструктора.

# создание таблицы с результатами
info = info = pd.DataFrame(data=[['Москва',15750,11056,15945], ['Санкт-Петербург',5614,7003,5895]], columns=['city', 'monday','wednesday','friday'])
# вывод таблицы на экран
info()
  city monday wednesday friday
0 Москва 15750 11056 15945
1 Санкт-Петербург 5614 7003 5895
Выводы

Данные показывают разницу поведения пользователей:

  • В Москве пик прослушиваний приходится на понедельник и пятницу, а в среду заметен спад.
  • В Петербурге, наоборот, больше слушают музыку по средам. Активность в понедельник и пятницу здесь почти в равной мере уступает среде.

Значит, данные говорят в пользу первой гипотезы.

 

3.2 Музыка в начале и в конце недели

 

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

 

Задание 23

Сохраните таблицы с данными в две переменные:

  • по Москве — в moscow_general;

  • по Санкт-Петербургу — в spb_general.

# получение таблицы moscow_general из тех строк таблицы df, для которых значение в столбце 'city' равно 'Moscow'
moscow_general = df[df['city']=='Moscow']

Создайте функцию genre_weekday() с четырьмя параметрами:

  • таблица (датафрейм) с данными,

  • день недели,

  • начальная временная метка в формате 'hh:mm',

  • последняя временная метка в формате 'hh:mm'.

Функция должна вернуть информацию о топ-10 жанров тех треков, которые прослушивали в указанный день, в промежутке между двумя отметками времени.

def genre_weekday(df, day, time1, time2):
    # последовательная фильтрация
    # оставляем в genre_df только те строки df, у которых день равен day
    genre_df = df[df['day']==day]# ваш код здесь
    # оставляем в genre_df только те строки genre_df, у которых время меньше time2
    genre_df = genre_df[genre_df['time']<time2] # ваш код здесь
    # оставляем в genre_df только те строки genre_df, у которых время больше time1
    genre_df = genre_df[genre_df['time']>time1] # ваш код здесь
    # сгруппируем отфильтрованный датафрейм по столбцу с названиями жанров, возьмём столбец genre и посчитаем кол-во строк для каждого жанра методом count()
    genre_df_grouped = genre_df.groupby('genre')['genre'].count() # ваш код здесь
    # отсортируем результат по убыванию (чтобы в начале Series оказались самые популярные жанры)
    genre_df_sorted = genre_df_grouped.sort_values(ascending=False) # ваш код здесь
    # вернём Series с 10 самыми популярными жанрами в указанный отрезок времени заданного дня
    return genre_df_sorted[:10]
Задание 25

Сравните результаты функции genre_weekday() для Москвы и Санкт-Петербурга в понедельник утром (с 7:00 до 11:00) и в пятницу вечером (с 17:00 до 23:00). Объекты, хранящие время, являются строками и сравниваются как строки — оставим это как есть.

Пример вызова: genre_weekday(moscow_general, 'Monday', '07:00', '11:00')

# вызов функции для утра понедельника в Москве (вместо df — таблица moscow_general)
genre_weekday(moscow_general, 'Monday', '07:00', '11:00')
genre
pop            781
dance          549
electronic     480
rock           474
hiphop         286
ruspop         186
world          181
rusrap         175
alternative    164
unknown        161
Name: genre, dtype: int64
# вызов функции для утра понедельника в Петербурге (вместо df — таблица spb_general)
genre_weekday(spb_general, 'Monday', '07:00', '11:00')
genre
pop            218
dance          182
rock           162
electronic     147
hiphop          80
ruspop          64
alternative     58
rusrap          55
jazz            44
classical       40
Name: genre, dtype: int64
# вызов функции для вечера пятницы в Москве
genre_weekday(moscow_general, 'Friday', '17:00', '23:00')
genre
pop            713
rock           517
dance          495
electronic     482
hiphop         273
world          208
ruspop         170
alternative    163
classical      163
rusrap         142
Name: genre, dtype: int64
# вызов функции для вечера пятницы в Петербурге
genre_weekday(spb_general, 'Friday', '17:00', '23:00')
genre
pop            256
electronic     216
rock           216
dance          210
hiphop          97
alternative     63
jazz            61
classical       60
rusrap          59
world           54
Name: genre, dtype: int64
Выводы

Если сравнить топ-10 жанров в понедельник утром, можно сделать такие выводы:

  1. В Москве и Петербурге слушают похожую музыку. Единственное различие — в московский рейтинг вошёл жанр “world”, а в петербургский — джаз и классика.

  2. В Москве пропущенных значений оказалось так много, что значение 'unknown' заняло десятое место среди самых популярных жанров. Значит, пропущенные значения занимают существенную долю в данных и угрожают достоверности исследования.

Вечер пятницы не меняет эту картину. Некоторые жанры поднимаются немного выше, другие спускаются, но в целом топ-10 остаётся тем же самым.

Таким образом, вторая гипотеза подтвердилась лишь частично:

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

Однако пропуски в данных ставят под сомнение этот результат. В Москве их так много, что рейтинг топ-10 мог бы выглядеть иначе, если бы не утерянные данные о жанрах.

3.3 Жанровые предпочтения в Москве и Петербурге

Гипотеза: Петербург — столица рэпа, музыку этого жанра там слушают чаще, чем в Москве. А Москва — город контрастов, в котором, тем не менее, преобладает поп-музыка.

Задание 26

Сгруппируйте таблицу moscow_general по жанру и посчитайте прослушивания треков каждого жанра методом count(). Чтобы избежать дублирующих вычислений, выберите столбец genre . Затем отсортируйте результат в порядке убывания и сохраните его в таблице moscow_genres.

# одной строкой: группировка таблицы moscow_general по столбцу 'genre', выбор столбца `genre`, подсчёт числа значений 'genre' методом count(), сохранение в moscow_genres
# сортировка получившегося Series в порядке убывания и сохранение обратно в moscow_genres
moscow_genres = moscow_general.groupby('genre')['genre'].count().sort_values(ascending = False)
Задание 27

Выведите на экран первые десять строк moscow_genres.

# просмотр первых 10 строк moscow_genres
moscow_genres.head(10)
genre
pop            5892
dance          4435
rock           3965
electronic     3786
hiphop         2096
classical      1616
world          1432
alternative    1379
ruspop         1372
rusrap         1161
Name: genre, dtype: int64
Задание 28

Теперь повторите то же и для Петербурга.

Сгруппируйте таблицу spb_general по жанру. Посчитайте прослушивания треков каждого жанра. Результат отсортируйте в порядке убывания и сохраните в таблице spb_genres.

# одной строкой: группировка таблицы spb_general по столбцу 'genre', выбор столбца `genre`, подсчёт числа значений 'genre' методом count(), сохранение в spb_genres
# сортировка получившегося Series в порядке убывания и сохранение обратно в spb_genres
spb_genres = spb_general.groupby('genre')['genre'].count().sort_values(ascending = False)
 
Задание 29

Выведите на экран первые десять строк spb_genres.

# просмотр первых 10 строк spb_genres
spb_genres.head(10)
genre
pop            2431
dance          1932
rock           1879
electronic     1736
hiphop          960
alternative     649
classical       646
rusrap          564
ruspop          538
world           515
Name: genre, dtype: int64
Выводы
Гипотеза частично подтвердилась:
  • Поп-музыка — самый популярный жанр в Москве, как и предполагала гипотеза. Более того, в топ-10 жанров встречается близкий жанр — русская популярная музыка.
  • Вопреки ожиданиям, рэп одинаково популярен в Москве и Петербурге. `m
4 Итоги исследования
Вы проверили три гипотезы и установили:
  1. День недели по-разному влияет на активность пользователей в Москве и Петербурге.

Первая гипотеза полностью подтвердилась.

  1. Музыкальные предпочтения не сильно меняются в течение недели — будь то Москва или Петербург. Небольшие различия заметны в начале недели, по понедельникам:
  • в Москве слушают музыку жанра “world”,
  • в Петербурге — джаз и классику.

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

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

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

На практике исследования содержат проверки статистических гипотез. Из части данных одного сервиса невозможно сделать какие-то выводы о всех пользователях сервиса без методов статистики. Проверки статистических гипотез покажут, насколько они достоверны, исходя из имеющихся данных. С методами проверок гипотез вы ещё познакомитесь в следующих темах.

14. Заключение

 14.1 Заключение

 14.2 Обратная связь

Следующая тема: БPy. Переменные и типы данных.

Следующий раздел: Предобработка данных

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