Python — популярный язык программирования. Python можно использовать на сервере для создания веб-приложений. Он был создан Гвидо ван Россумом и выпущен в 1991 году. Он используется для:

  • веб-разработка (серверная часть),
  • разработка программного обеспечения,
  • математика,
  • системный скриптинг.

Мы можем узнать о Python по этой ссылке: Начать изучение Python сейчас» также Pyhton.

Python для анализа данных посвящен основам манипулирования, обработки, очистки и обработки данных в Python. Это также практическое современное введение в научные вычисления на Python, предназначенное для приложений, интенсивно использующих данные. Pandas (анализ данных Python) является обязательным элементом в жизненном цикле науки о данных. Это самая популярная и широко используемая библиотека Python для науки о данных, наряду с NumPy в matplotlib.

В этой статье объясняются упражнения, данные во время интенсивного анализа данных Bootcamp от MySkill. Для этих упражнений мы будем использовать Google Collab. Google Collab — это бесплатная онлайн-платформа, поддерживающая программирование на Python.

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

Вы также можете проверить мою панель инструментов для этого упражнения: ссылка

Импорт библиотек и фреймов данных

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

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import re
sns.set()

Давайте разберем то, что мы делаем выше, построчно:

  • import pandas as pd. Мы импортируем библиотеку pandas и сокращаем переменную до «pd». Pandas — это библиотека Python, используемая для анализа данных.
  • импортируйте matplotlib.pyplot как plt. Мы импортируем библиотеку Matplotlib.pyplot и сокращаем переменную до plt. Matplotlib — это библиотека визуализации данных и графического построения для Python. Pyplot — это набор функций, благодаря которым Matplotlib работает как MATLAB.
  • импортируем numpy как np.Мы импортируем библиотеку numpy и сокращаем переменную до ‘np’. Numpy — это библиотека Python, которая выполняет широкий спектр числовых вычислений.
  • импортировать seaborn как sns.Мы импортируем библиотеку seaborn и сокращаем переменную до «sns». Seaborn также представляет собой библиотеку Python для построения графиков с помощью Matplotlib, Pandas и Numpy. Но с Seaborn визуализировать данные проще, потому что он использует меньше синтаксиса. Он специализируется на визуализации статистики.
  • import re, мы импортируем библиотеку re. Re также является библиотекой Python, используемой для регулярных выражений.

Задание 1

Создайте функцию с:

  • 1 аргумент в виде кадра данных для проверки типа данных,
  • чтобы проверить количество нулевых значений,
  • проверить процентное нулевое значение,
  • также количество уникальных значений для каждого столбца в кадре данных

Ответ :

def check_values(df):
    data = []
    for col in df.columns:
        data.append([col, \
                     df[col].dtype, \
                     df[col].isna().sum(), \
                     round(100*(df[col].isna().sum()/len(df)),2), \
                     df[col].nunique()
                     ])
    return pd.DataFrame(columns=['dataFeatures', 'dataType', 'null', 'nullPct', 'unique'],data=data)
check_values(df_hotels)

Задача 2

Сколько посетителей отменили бронирование, а сколько нет? И из этой суммы сделать вывод о доле каждого!

Ответ :

df_hotels[‘is_canceled’].value_counts()
df_hotels.is_canceled.value_counts(normalize=True)
sns.countplot(data=df_hotels, x='is_canceled')
plt.title('Cancelled')
plt.show()

Вывод

Оказалось, что посетителей, отменивших бронь, довольно много, до 37% от всех посетителей.

Задача 3

A. Какой процент бронирований в City Hotel был отменен?

Б. Какой процент бронирований для курортных отелей отменяется?

Ответ :

df_hotels.head()
df_hotels[df_hotels.hotel=='City Hotel'].is_canceled.value_counts(normalize=True)
len(df_hotels[(df_hotels.hotel=='City Hotel')&(df_hotels.is_canceled==1)]) / len(df_hotels[(df_hotels.hotel=='City Hotel')])
df_hotels[df_hotels.hotel=='Resort Hotel'].is_canceled.value_counts(normalize=True)
len(df_hotels[(df_hotels.hotel=='Resort Hotel')&(df_hotels.is_canceled==1)]) / len(df_hotels[(df_hotels.hotel=='Resort Hotel')])

Задача 4

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

Ответ :

df_hotels[df_hotels.is_canceled==0]
df_checkout = df_hotels[df_hotels.is_canceled==0]
df_checkout.shape

Задача 5

A. Отображение количества бронирований в месяц прибытия для каждого типа отеля.

Б. Тогда в каком месяце было больше всего бронирований для каждого типа отеля? Сделайте вывод, одинакова ли тенденция в обоих типах отелей?

С. Сделайте это так же, как пункт B, но с названием месяца, которое было сопоставлено с месяцем в цифрах.

› (!) Для этого вопроса и следующего будет использоваться фрейм данных df_checkout

Отвечать :

df_checkout.is_canceled.value_counts()
df_checkout.columns
df_checkout.groupby([‘hotel’,’arrival_date_month’]).size()
df_checkout.groupby([‘hotel’,’arrival_date_month’])[‘id’].nunique()

Мелакуканское картографирование нама булан менджади булан далам ангка

import calendar

month_dict = {month: index for index, month in enumerate(calendar.month_name) if month}
month_dict
# In this step, each row of the arrival_date_month column that contains the name of the month will be mapped to the appropriate number
df_checkout['arrival_date_month_num'] = df_checkout['arrival_date_month'].map(month_dict)
df_checkout.groupby(['hotel','arrival_date_month_num']).size()
sns.countplot(data=df_checkout, x=’arrival_date_month_num’)
sns.countplot(data=df_checkout, x='arrival_date_month_num',hue='hotel')
plt.xlabel('bulan kedatangan')
plt.ylabel('jumlah reservasi')
plt.show()

Задача 6

A. Создайте новый столбец с именем arrival_date, содержащий полную информацию о годе, месяце и дате прибытия.

Б. Измените столбец на тип даты и времени.

Подсказка: объедините год, месяц и дату в формате гггг-мм-дд.

Ответ :

df_checkout[['arrival_date_month_num']].info()
# step 1: change column arrival_date_month_num to string
df_checkout['arrival_date_month_num'].astype('str')
# step 1: change column arrival_date_month_num to string
# step 2: then add zero padding, so that '1' becomes '01' --> step 2 is chained with step 1
df_checkout.arrival_date_month_num.astype('str').str.pad(2,fillchar='0')
df_checkout['arrival_date_year'].astype('str') + '-' +\
 df_checkout.arrival_date_month_num.astype('str').str.pad(2,fillchar='0') + '-' +\
 df_checkout.arrival_date_day_of_month.astype('str').str.pad(2,fillchar='0')
df_checkout['arrival_date'] = \
    df_checkout['arrival_date_year'].astype('str') + '-' +\
    df_checkout.arrival_date_month_num.astype('str').str.pad(2,fillchar='0') + '-' +\
    df_checkout.arrival_date_day_of_month.astype('str').str.pad(2,fillchar='0')
df_checkout['arrival_date']
df_checkout.arrival_date.dtype
# change arrival_date from string to datetime
df_checkout['arrival_date'] = pd.to_datetime(df_checkout['arrival_date'])
df_checkout['arrival_date']
df_checkout.arrival_date.dtype

Задача 7

Давайте поиграем с данными временных рядов, используя столбец arrival_date. Создайте 2 фрейма данных, показывающих следующее:

  1. общая дневная резервация (df_reservation_per day)
  2. среднее количество бронирований в день за каждую неделю (df_avg_reservations_daian)

(!) Остановитесь и подумайте!

В чем разница между данными, отображаемыми df_reservations_perday и df_avg_reservations_daily?

Ответ :

df_reservasi_perhari = df_checkout.resample('D',on='arrival_date').size().reset_index().rename(columns={0:'total_reservasi'})
df_reservasi_perhari
df_avg_reservasi_harian = df_checkout.resample('D',on='arrival_date').size().reset_index().rename(columns={0:'total_reservasi'}).\
resample('W',on='arrival_date')['total_reservasi'].mean().reset_index()
df_avg_reservasi_harian
plt.figure(figsize=(10,4))
sns.lineplot(data=df_reservasi_perhari, x='arrival_date', y='total_reservasi')
plt.title('Reservasi Harian', fontsize='x-large')
plt.show()
plt.figure(figsize=(10,4))
sns.lineplot(data=df_avg_reservasi_harian, x='arrival_date', y='total_reservasi')
plt.title('Rata-Rata Reservasi Harian', fontsize='x-large')
plt.show()

Задача 8

А. Каков средний показатель ADR в зависимости от типа отеля и типа клиента (customer_type)?

Б. Какой тип клиентов имеет самый большой ADR в каждом типе отеля?

Отвечать :

df_checkout.groupby(['hotel','customer_type'])['adr'].mean()
df_checkout.groupby(['hotel','customer_type'])['adr'].max()
plt.figure(figsize=(8,6))
sns.boxplot(data=df_checkout, x='adr', y='hotel',hue='customer_type')
plt.show()

Задание 9 (Бонус)

Используя фрейм данных df_country, который содержит информацию о названиях и кодах стран, отобразите 10 стран с наибольшим количеством бронирований!

Шаг:

  1. Объедините фреймы данных df_checkout и df_country. Используйте поле кода Alpha-3, чтобы получить название страны.
  2. Показать 10 стран (по названию, а не по коду страны) с наибольшим количеством бронирований

Ответ :

df_country = pd.read_csv('https://gist.githubusercontent.com/tadast/8827699/raw/f5cac3d42d16b78348610fc4ec301e9234f82821/countries_codes_and_coordinates.csv')
df_country.head()

(!) Остановитесь и подумайте!

Можем ли мы напрямую использовать столбец кода Alpha-3 в качестве ключа соединения с нашим набором данных об отелях?
Можно ли найти все коды стран в столбце страны нашего набора данных об отелях в df_country?

df_country['code'] = df_country['Alpha-3 code'].str.replace('"','').str.strip()
df_merged = pd.merge(df_checkout[['id','country']],
                     df_country[['Country','code']],
                     left_on='country',
                     right_on='code',
                     indicator=True,
                     how='left')
df_merged.head()

Проверяем, сколько строк наших данных можно объединить с df_country

df_merged._merge.value_counts()
df_merged[df_merged._merge=='left_only']['country'].unique()
set(df_checkout.country) - set(df_country['code'])

Было обнаружено, что только 3 страны не могут быть сопоставлены с df_country, и эти три страны не входили в Топ-10 стран, из которых было сделано бронирование, поэтому нам было достаточно использовать df_merged.

df_merged.Country.value_counts().head(10)
df_merged.Country.value_counts().head(10).sort_values(ascending=True).plot.barh()
plt.show()

Задание 10 (Бонус)

А. Сколько гостей останавливается на каждое бронирование?

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

Ответ :

df_checkout.columns
df_checkout['total_guest'] = df_checkout.adults + df_checkout.children + df_checkout.babies
df_checkout.total_guest.describe()
df_checkout.total_guest.max()
df_checkout[df_checkout.total_guest==df_checkout.total_guest.max()].T

На этом объяснение относительно учебных заданий, данных MySkill в Intensive Bootcamp Data Analysis, для оттачивания навыков работы с Python с помощью Google Colab. Спасибо, я надеюсь, что каждое объяснение будет полезным. Если вы хотите перейти к другим частям, перейдите сюда:

Часть 1: SQL для анализа данных
Часть 3: Визуализация данных с помощью Google Data Studio