IIS_2023_1/kurmyza_pavel_lab_5/main.py

82 lines
3.8 KiB
Python
Raw Normal View History

2023-10-28 17:58:50 +04:00
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()