привет! у меня есть следующее задание:
В компании существует два продукта. 
Их назначение - повышение клиентской вовлечённости в просмотр контента

“Продукт А”, разработанный отделом А
“Продукт В”, разработанный отделом В


синий уровень задания:
Показать график или таблицу с вовлечённостью 200
пользователей A и 200 пользователей B
0
▪ Сделать вывод на основе графика или таблицы в пользу друга
В Jupyter Notebook с расчётами:
▪ к исходному датафрейму должны быть добавлены столбцы
"Selection Winner A", "Selection Winner B",
0
▪ в каждом из них ровно по 400 значений «1»,
0
▪ значение «1» в "Selection Winner A" описывают выборку
200+200 пользователей для победы продукта A,
0
▪ аналогично в "Selection Winner B",
0
▪ нет ограничений на то, какие 400 человек выбирать.

красный уровень задания:
для победы A и B соответственно
Теперь нужно «доказать на основе данных» победу
дружественного продукта отдельно для каждой категории пола
и возраста 2

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

import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('https://raw.githubusercontent.com/zalig/cu-datasets/main/without_rules.csv')
df_A = df[df['Subscription'] == 'A'].sort_values(by='Videos Watched',ascending=True)
df_B = df[df['Subscription'] == 'B'].sort_values(by='Videos Watched', ascending=True)

df_A_wins = pd.concat([df_A.tail(200),
                      df_B.head(200)])
df_A_wins

df_B_wins = pd.concat([df_A.head(200),
                      df_B.tail(200)])

df_B_wins

plt.bar(df_A_wins['Subscription'], df_A_wins['Videos Watched'])
plt.title('Распределение среднего количества просмотренных видео')
plt.xlabel('Группа клиентов')
plt.ylabel('Количество видео')
plt.show()

plt.bar(df_B_wins['Subscription'], df_B_wins['Videos Watched'])
plt.title('Распределение среднего количества просмотренных видео')
plt.xlabel('Группа клиентов')
plt.ylabel('Количество видео')
plt.show()

df['Selection Winner A'] = df['Id'].isin(df_A_wins['Id']).astype(int)
df['Selection Winner B'] = df['Id'].isin(df_B_wins['Id']).astype(int)

df_A_male_l25 = df[(df['Subscription'] == 'A') & (df['Gender'] == 'Male') & (df['Age'] == '<25')].sort_values(by='Videos Watched',ascending=True)
df_A_male_h25 = df[(df['Subscription'] == 'A') & (df['Gender'] == 'Male') & (df['Age'] == '25+')].sort_values(by='Videos Watched',ascending=True)
df_A_female_l25 = df[(df['Subscription'] == 'A') & (df['Gender'] == 'Female') & (df['Age'] == '<25')].sort_values(by='Videos Watched',ascending=True)
df_A_female_h25 = df[(df['Subscription'] == 'A') & (df['Gender'] == 'Female') & (df['Age'] == '25+')].sort_values(by='Videos Watched',ascending=True)

df_B_male_l25 = df[(df['Subscription'] == 'B') & (df['Gender'] == 'Male') & (df['Age'] == '<25')].sort_values(by='Videos Watched', ascending=True)
df_B_male_h25 = df[(df['Subscription'] == 'B') & (df['Gender'] == 'Male') & (df['Age'] == '25+')].sort_values(by='Videos Watched', ascending=True)
df_B_female_l25 = df[(df['Subscription'] == 'B') & (df['Gender'] == 'Female') & (df['Age'] == '<25')].sort_values(by='Videos Watched', ascending=True)
df_B_female_h25 = df[(df['Subscription'] == 'B') & (df['Gender'] == 'Female') & (df['Age'] == '25+')].sort_values(by='Videos Watched', ascending=True)

from math import ceil
p_m_l25 = df[(df['Gender'] == 'Male') & (df['Age'] == '<25')].shape[0] / df.shape[0]
p_m_h25 = df[(df['Gender'] == 'Male') & (df['Age'] == '25+')].shape[0] / df.shape[0]

p_f_l25 = df[(df['Gender'] == 'Female') & (df['Age'] == '<25')].shape[0] / df.shape[0]
p_f_h25 = df[(df['Gender'] == 'Female') & (df['Age'] == '25+')].shape[0] / df.shape[0]

n_m_l25 = ceil(p_m_l25 * 200)
n_m_h25 = ceil(p_m_h25 * 200)
n_f_l25 = ceil(p_f_l25 * 200)
n_f_h25 = ceil(p_f_h25 * 200)

df_A_wins = pd.concat([df_A_male_l25.tail(n_m_l25), df_A_male_h25.tail(n_m_h25),
                       df_A_female_l25.tail(n_f_l25), df_A_female_h25.tail(n_f_h25),

                       df_B_male_l25.head(n_m_l25), df_B_male_h25.head(n_m_h25),
                       df_B_female_l25.head(n_f_l25), df_B_female_h25.head(n_f_h25)])



pc_m_l25 = df_A_wins[(df_A_wins['Gender'] == 'Male') & (df_A_wins['Age'] == '<25')].shape[0] / df_A_wins.shape[0]
pc_m_h25 = df_A_wins[(df_A_wins['Gender'] == 'Male') & (df_A_wins['Age'] == '25+')].shape[0] / df_A_wins.shape[0]

pc_f_l25 = df_A_wins[(df_A_wins['Gender'] == 'Female') & (df_A_wins['Age'] == '<25')].shape[0] / df_A_wins.shape[0]
pc_f_h25 = df_A_wins[(df_A_wins['Gender'] == 'Female') & (df_A_wins['Age'] == '25+')].shape[0] / df_A_wins.shape[0]

print(pc_m_l25, pc_m_h25, pc_f_l25, pc_f_h25)
print(p_m_l25, p_m_h25, p_f_l25, p_f_h25)

mean_videos_watched = df_A_wins.groupby(['Age', 'Gender', 'Subscription'])['Videos Watched'].mean()

mean_videos_watched

procent_frame = pd.DataFrame({'Male_<25' : [pc_m_l25, p_m_l25],
                              'Male_25+': [pc_m_h25, p_m_h25],
                              'Female_<25': [pc_f_l25, p_f_l25],
                              'Female_25+': [pc_f_h25, p_f_h25]},
                             index=['Выборка', 'Генеральная совокупность']).style.format('{:.2f}').set_caption("Распределение пола и возраста в каждой из четырех выборок 200 участников")
procent_frame

df_B_wins = pd.concat([df_A_male_l25.head(n_m_l25), df_A_male_h25.head(n_m_h25),
                       df_A_female_l25.head(n_f_l25), df_A_female_h25.head(n_f_h25),

                       df_B_male_l25.tail(n_m_l25), df_B_male_h25.tail(n_m_h25),
                       df_B_female_l25.tail(n_f_l25), df_B_female_h25.tail(n_f_h25)])

mean_videos_watched = df_B_wins.groupby(['Age', 'Gender', 'Subscription'])['Videos Watched'].mean()

mean_videos_watched

какие пункты (уровни: синий, красный, черный) подготовлены в этом коде?