IIS_2023_1/kurmyza_pavel_lab_5/main.py

82 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import pandas as pd
from sklearn.model_selection import train_test_split
import datetime as dt
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import LabelEncoder
import sklearn.cluster as cluster
# Чтение данных датасета
df = pd.read_csv('hotel_bookings.csv')
# Удаление строк, содержащих отсутствующие значения
df = df[df['children'].notna()]
df = df[df['country'].notna()]
# Объединение столбцов 'arrival_date_year', 'arrival_date_month', 'arrival date day_of_month' в столбец
# 'arrival_date', содержащий день, месяц и год приезда клиента в формате datetime
df["arrival_date_month"] = pd.to_datetime(df['arrival_date_month'], format='%B').dt.month
df["arrival_date"] = pd.to_datetime({"year": df["arrival_date_year"].values,
"month": df["arrival_date_month"].values,
"day": df["arrival_date_day_of_month"].values})
df = df.drop(columns=['arrival_date_year', 'arrival_date_month', 'arrival_date_day_of_month'])
# Преобразование типа столбца reservation_status_date в datetime
df["reservation_status_date"] = pd.to_datetime(df["reservation_status_date"], format='%Y-%m-%d')
# Заполнение нулевых значений в столбцах средним значением каждого столбца
for column in ['agent', 'company', 'arrival_date']:
df[column] = df[column].fillna(df[column].mean())
# Удаляем повторяющиеся значения
df.drop_duplicates(inplace=True)
# Преобразование категориальных переменных в числовые переменные для того, чтобы модель могла с ними работать
categoricalV = ["hotel", "meal", "country", "market_segment", "distribution_channel", "reserved_room_type",
"assigned_room_type", "deposit_type", "customer_type"]
df[categoricalV[1:11]] = df[categoricalV[1:11]].astype('category')
df[categoricalV[1:11]] = df[categoricalV[1:11]].apply(lambda x: LabelEncoder().fit_transform(x))
df['hotel_Num'] = LabelEncoder().fit_transform(df['hotel'])
df['numerical_larrival_date'] = df['arrival_date'].map(dt.datetime.toordinal)
df['numerical_reservation_status_date'] = df['reservation_status_date'].map(dt.datetime.toordinal)
df["is_canceled"].replace({'not canceled': 0, 'canceled': 1}, inplace=True)
df["reservation_status"].replace({'Canceled': 0, 'Check-Out': 1, 'No-Show': 2}, inplace=True)
# Определение входных и выходных значений
usefull_columns = df.columns.difference(['hotel', 'hotel_Num', 'arrival_date', 'reservation_status_date'])
X = df[usefull_columns]
Y = df["hotel_Num"].astype(int)
# Деление данных на тестовую и обучающую выборки
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=150)
# Определение оптимального количества кластеров
df_Short = df[['lead_time', 'adr']]
K = range(1, 12)
wss = []
for k in K:
kmeans = cluster.KMeans(n_clusters=k, init="k-means++")
kmeans = kmeans.fit(df_Short)
wss_iter = kmeans.inertia_
wss.append(wss_iter)
mycenters = pd.DataFrame({'Clusters': K, 'WSS': wss})
sns.scatterplot(x='Clusters', y='WSS', data=mycenters, marker="+")
# Решение задачи кластеризации с использованием K-Means
kmeans = cluster.KMeans(n_clusters=4, init="k-means++")
kmeans = kmeans.fit(df[['lead_time', 'adr']])
df['Clusters'] = kmeans.labels_
# Визуализируем кластеры
sns.lmplot(x="lead_time", y="adr", hue='Clusters', data=df)
plt.ylim(0, 600)
plt.xlim(0, 800)
plt.show()