diff --git a/Visualizations/Dashboard_Cancellations.ipynb b/Visualizations/Dashboard_Cancellations.ipynb deleted file mode 100644 index d280c07..0000000 --- a/Visualizations/Dashboard_Cancellations.ipynb +++ /dev/null @@ -1,1164 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "ename": "ModuleNotFoundError", - "evalue": "No module named 'geoviews'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 13\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mseaborn\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0msns\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 14\u001b[0m \u001b[0mget_ipython\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun_line_magic\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'matplotlib'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'inline'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 15\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mgeoviews\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mgv\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 16\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mwarnings\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 17\u001b[0m \u001b[0mwarnings\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfilterwarnings\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'ignore'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'geoviews'" - ] - } - ], - "source": [ - "# Imports for panel visualizations\n", - "\n", - "import panel as pn\n", - "import plotly.express as px\n", - "pn.extension('plotly')\n", - "import pandas as pd\n", - "import hvplot.pandas\n", - "import matplotlib.pyplot as plt\n", - "import os\n", - "from pathlib import Path\n", - "from dotenv import load_dotenv\n", - "import numpy as np\n", - "import seaborn as sns\n", - "%matplotlib inline\n", - "import geoviews as gv\n", - "import warnings\n", - "warnings.filterwarnings('ignore')" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
hotelis_canceledlead_timearrival_date_yeararrival_date_montharrival_date_week_numberarrival_date_day_of_monthstays_in_weekend_nightsstays_in_week_nightsadults...market_segmentdistribution_channelreserved_room_typeassigned_room_typedays_in_waiting_listcustomer_typeadrrequired_car_parking_spacestotal_of_special_requestsreservation_status_date
0Resort Hotel03422015July271002...DirectDirectCC0Transient0.0007/1/2015
1Resort Hotel07372015July271002...DirectDirectCC0Transient0.0007/1/2015
2Resort Hotel072015July271011...DirectDirectAC0Transient75.0007/2/2015
3Resort Hotel0132015July271011...CorporateCorporateAA0Transient75.0007/2/2015
4Resort Hotel0142015July271022...Online TATA/TOAA0Transient98.0017/3/2015
\n", - "

5 rows × 24 columns

\n", - "
" - ], - "text/plain": [ - " hotel is_canceled lead_time arrival_date_year arrival_date_month \\\n", - "0 Resort Hotel 0 342 2015 July \n", - "1 Resort Hotel 0 737 2015 July \n", - "2 Resort Hotel 0 7 2015 July \n", - "3 Resort Hotel 0 13 2015 July \n", - "4 Resort Hotel 0 14 2015 July \n", - "\n", - " arrival_date_week_number arrival_date_day_of_month \\\n", - "0 27 1 \n", - "1 27 1 \n", - "2 27 1 \n", - "3 27 1 \n", - "4 27 1 \n", - "\n", - " stays_in_weekend_nights stays_in_week_nights adults ... market_segment \\\n", - "0 0 0 2 ... Direct \n", - "1 0 0 2 ... Direct \n", - "2 0 1 1 ... Direct \n", - "3 0 1 1 ... Corporate \n", - "4 0 2 2 ... Online TA \n", - "\n", - " distribution_channel reserved_room_type assigned_room_type \\\n", - "0 Direct C C \n", - "1 Direct C C \n", - "2 Direct A C \n", - "3 Corporate A A \n", - "4 TA/TO A A \n", - "\n", - " days_in_waiting_list customer_type adr required_car_parking_spaces \\\n", - "0 0 Transient 0.0 0 \n", - "1 0 Transient 0.0 0 \n", - "2 0 Transient 75.0 0 \n", - "3 0 Transient 75.0 0 \n", - "4 0 Transient 98.0 0 \n", - "\n", - " total_of_special_requests reservation_status_date \n", - "0 0 7/1/2015 \n", - "1 0 7/1/2015 \n", - "2 0 7/2/2015 \n", - "3 0 7/2/2015 \n", - "4 1 7/3/2015 \n", - "\n", - "[5 rows x 24 columns]" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "file_path = Path(r'C:\\Users\\tonyh\\Desktop\\hotel_bookings1.csv')\n", - "hotel_data = pd.read_csv(file_path)\n", - "hotel_data.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# Group by hotel and year?\n", - "grouped = hotel_data.groupby([\"hotel\", \"arrival_date_year\"])" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
is_canceledlead_timearrival_date_montharrival_date_week_numberarrival_date_day_of_monthstays_in_weekend_nightsstays_in_week_nightsadultschildrenbabies...market_segmentdistribution_channelreserved_room_typeassigned_room_typedays_in_waiting_listcustomer_typeadrrequired_car_parking_spacestotal_of_special_requestsreservation_status_date
hotelarrival_date_year
City Hotel201506July2710210.00...Offline TA/TOTA/TOAA0Transient0.00007/3/2015
20161119January110120.00...DirectDirectAA0Transient74.250012/31/2015
2017126January111010.00...Online TATA/TOAA0Transient128.000212/17/2016
Resort Hotel20150342July2710020.00...DirectDirectCC0Transient0.00007/1/2015
20160109January110120.00...Online TATA/TOAD0Transient-Party59.94011/2/2016
\n", - "

5 rows × 22 columns

\n", - "
" - ], - "text/plain": [ - " is_canceled lead_time arrival_date_month \\\n", - "hotel arrival_date_year \n", - "City Hotel 2015 0 6 July \n", - " 2016 1 119 January \n", - " 2017 1 26 January \n", - "Resort Hotel 2015 0 342 July \n", - " 2016 0 109 January \n", - "\n", - " arrival_date_week_number \\\n", - "hotel arrival_date_year \n", - "City Hotel 2015 27 \n", - " 2016 1 \n", - " 2017 1 \n", - "Resort Hotel 2015 27 \n", - " 2016 1 \n", - "\n", - " arrival_date_day_of_month \\\n", - "hotel arrival_date_year \n", - "City Hotel 2015 1 \n", - " 2016 1 \n", - " 2017 1 \n", - "Resort Hotel 2015 1 \n", - " 2016 1 \n", - "\n", - " stays_in_weekend_nights stays_in_week_nights \\\n", - "hotel arrival_date_year \n", - "City Hotel 2015 0 2 \n", - " 2016 0 1 \n", - " 2017 1 0 \n", - "Resort Hotel 2015 0 0 \n", - " 2016 0 1 \n", - "\n", - " adults children babies ... market_segment \\\n", - "hotel arrival_date_year ... \n", - "City Hotel 2015 1 0.0 0 ... Offline TA/TO \n", - " 2016 2 0.0 0 ... Direct \n", - " 2017 1 0.0 0 ... Online TA \n", - "Resort Hotel 2015 2 0.0 0 ... Direct \n", - " 2016 2 0.0 0 ... Online TA \n", - "\n", - " distribution_channel reserved_room_type \\\n", - "hotel arrival_date_year \n", - "City Hotel 2015 TA/TO A \n", - " 2016 Direct A \n", - " 2017 TA/TO A \n", - "Resort Hotel 2015 Direct C \n", - " 2016 TA/TO A \n", - "\n", - " assigned_room_type days_in_waiting_list \\\n", - "hotel arrival_date_year \n", - "City Hotel 2015 A 0 \n", - " 2016 A 0 \n", - " 2017 A 0 \n", - "Resort Hotel 2015 C 0 \n", - " 2016 D 0 \n", - "\n", - " customer_type adr \\\n", - "hotel arrival_date_year \n", - "City Hotel 2015 Transient 0.00 \n", - " 2016 Transient 74.25 \n", - " 2017 Transient 128.00 \n", - "Resort Hotel 2015 Transient 0.00 \n", - " 2016 Transient-Party 59.94 \n", - "\n", - " required_car_parking_spaces \\\n", - "hotel arrival_date_year \n", - "City Hotel 2015 0 \n", - " 2016 0 \n", - " 2017 0 \n", - "Resort Hotel 2015 0 \n", - " 2016 0 \n", - "\n", - " total_of_special_requests \\\n", - "hotel arrival_date_year \n", - "City Hotel 2015 0 \n", - " 2016 0 \n", - " 2017 2 \n", - "Resort Hotel 2015 0 \n", - " 2016 1 \n", - "\n", - " reservation_status_date \n", - "hotel arrival_date_year \n", - "City Hotel 2015 7/3/2015 \n", - " 2016 12/31/2015 \n", - " 2017 12/17/2016 \n", - "Resort Hotel 2015 7/1/2015 \n", - " 2016 1/2/2016 \n", - "\n", - "[5 rows x 22 columns]" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "avg_grouped = grouped.first()\n", - "avg_grouped.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": {}, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.holoviews_exec.v0+json": "", - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
\n", - "
\n", - "" - ], - "text/plain": [ - ":DynamicMap [hotel]\n", - " :Bars [arrival_date_year] (lead_time)" - ] - }, - "execution_count": 10, - "metadata": { - "application/vnd.holoviews_exec.v0+json": { - "id": "1001" - } - }, - "output_type": "execute_result" - } - ], - "source": [ - "avg_grouped.hvplot.bar(x=\"arrival_date_year\", y=\"lead_time\", groupby=\"hotel\")" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "# Map country of origin?" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "PRT 48590\n", - "GBR 12129\n", - "FRA 10415\n", - "ESP 8568\n", - "DEU 7287\n", - " ... \n", - "BWA 1\n", - "MMR 1\n", - "MDG 1\n", - "MRT 1\n", - "VGB 1\n", - "Name: country, Length: 177, dtype: int64" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "hotel_data[\"country\"].value_counts().sort_values(ascending=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "load_dotenv()\n", - "mapbox_token = os.getenv(\"MAPBOX\")" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "px.set_mapbox_access_token(mapbox_token)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
citycity_asciilatlngcountryiso2iso3admin_namecapitalpopulationid
0TokyoTokyo35.6897139.6922JapanJPJPNTōkyōprimary37977000.01392685764
1JakartaJakarta-6.2146106.8451IndonesiaIDIDNJakartaprimary34540000.01360771077
2DelhiDelhi28.660077.2300IndiaININDDelhiadmin29617000.01356872604
3MumbaiMumbai18.966772.8333IndiaININDMahārāshtraadmin23355000.01356226629
4ManilaManila14.5958120.9772PhilippinesPHPHLManilaprimary23088000.01608618140
\n", - "
" - ], - "text/plain": [ - " city city_ascii lat lng country iso2 iso3 admin_name \\\n", - "0 Tokyo Tokyo 35.6897 139.6922 Japan JP JPN Tōkyō \n", - "1 Jakarta Jakarta -6.2146 106.8451 Indonesia ID IDN Jakarta \n", - "2 Delhi Delhi 28.6600 77.2300 India IN IND Delhi \n", - "3 Mumbai Mumbai 18.9667 72.8333 India IN IND Mahārāshtra \n", - "4 Manila Manila 14.5958 120.9772 Philippines PH PHL Manila \n", - "\n", - " capital population id \n", - "0 primary 37977000.0 1392685764 \n", - "1 primary 34540000.0 1360771077 \n", - "2 admin 29617000.0 1356872604 \n", - "3 admin 23355000.0 1356226629 \n", - "4 primary 23088000.0 1608618140 " - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "file_path = Path(r\"C:\\Users\\tonyh\\Desktop\\worldcities.csv\")\n", - "world_data = pd.read_csv(file_path)\n", - "world_data.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "world_data = world_data.drop(columns=[\"city_ascii\", \"iso2\", \"iso3\", \"iso3\", \"admin_name\", \"capital\", \"id\", \"population\"])" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
citylatlngcountry
0Tokyo35.6897139.6922Japan
1Jakarta-6.2146106.8451Indonesia
2Delhi28.660077.2300India
3Mumbai18.966772.8333India
4Manila14.5958120.9772Philippines
\n", - "
" - ], - "text/plain": [ - " city lat lng country\n", - "0 Tokyo 35.6897 139.6922 Japan\n", - "1 Jakarta -6.2146 106.8451 Indonesia\n", - "2 Delhi 28.6600 77.2300 India\n", - "3 Mumbai 18.9667 72.8333 India\n", - "4 Manila 14.5958 120.9772 Philippines" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "world_data.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# Replace with hotel data and have functions that return figures, plots, etc.\n", - "\n", - "# avg_data = pn.Row(average_gross_rent(), average_sales_price())\n", - "# yearly_data = pn.Column(\"replace with relevant hotel information\")\n", - "# column_of_ML_model_1 = pn.Column(replace with ML model 1 information)\n", - "# neighborhood_data = pn.Column(column_of_neighborhood) \n", - "# world_map_data = pn.Column(world_map()) \n", - "\n", - "\n", - "# panel = pn.Tabs(\n", - "# (\"Yearly Market\", yearly_data), \n", - "# (\"Country of Origin Map\", world_map_data),\n", - "# (\"ML model 1 Analysis\", ML_model_1_data),\n", - "# )" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Serve the Panel dashboard\n", - "\n", - "# panel.servable()" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Total bookings canceled: 44,224 (37 %)\n", - "Resort hotel bookings canceled: 11,122 (28 %)\n", - "City hotel bookings canceled: 33,102 (42 %)\n" - ] - } - ], - "source": [ - "#Hotel Cancellations\n", - "total_cancelations = hotel_data[\"is_canceled\"].sum()\n", - "rh_cancelations = hotel_data.hotel_dataloc[hotel_data[\"hotel\"] == \"Resort Hotel\"][\"is_canceled\"].sum()\n", - "ch_cancelations = hotel_data.loc[hotel_data[\"hotel\"] == \"City Hotel\"][\"is_canceled\"].sum()\n", - "\n", - "# as percent:\n", - "rel_cancel = total_cancelations / hotel_data.shape[0] * 100\n", - "rh_rel_cancel = rh_cancelations / hotel_data.loc[hotel_data[\"hotel\"] == \"Resort Hotel\"].shape[0] * 100\n", - "ch_rel_cancel = ch_cancelations / hotel_data.loc[hotel_data[\"hotel\"] == \"City Hotel\"].shape[0] * 100\n", - "\n", - "print(f\"Total bookings canceled: {total_cancelations:,} ({rel_cancel:.0f} %)\")\n", - "print(f\"Resort hotel bookings canceled: {rh_cancelations:,} ({rh_rel_cancel:.0f} %)\")\n", - "print(f\"City hotel bookings canceled: {ch_cancelations:,} ({ch_rel_cancel:.0f} %)\")" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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AqTZ2ZB9L0QCAAAAYJI5kQAAAICZ2+Pp71zQxzvhpftNbvOTn/wkT3rSk3Lcccflkpe8ZHbaaae86lWvymUuc5k84QlPyBFHHJETTzwxP/7xj3OXu9xl3s/99re/Pccff3xe97rX/fG6vfbaKy972cuy5557rvV+L3rRi/KsZz1r8vF32mmnHH/88dl+++3nXdNC0IkEAAAAbHK6O/e85z2z11575bvf/W6++c1v5kUvelF++tOf5spXvnKOOOKIJMmJJ56Yj33sY0tS04te9KIleZ4NJUQCAAAANjmf/exns+WWW+bRj370H6/bfffdc8tb3jKnnnpqrne96+Xcc8/NwQcfnMMPPzy77757Dj/88FzrWtfKGWeckSS58MILc81rXjNnnnnmej33e9/73uy666653vWul2c84xlJkoMOOih/+MMfsvvuu+fBD35wkuTd7353bnzjG2f33XfP3/3d3+WCCy5YoN9+wwiRAAAAgE3O17/+9eyxxx7r3OYSl7hEDjnkkNz//vfPiSeemPvf//55yEMeksMOOyxJ8pnPfCa77bbbGoeVrQqeVn0df/zxSZIf//jHecYznpGjjjoqJ554Yo477rh84AMfyKGHHpqtt946J554Yg477LCcfPLJOfzww/PFL34xJ554YjbffPM/Pu+sCJEAAAAA5ulhD3tY3vnOYf6mt771rTnwwAPXuN2q4GnV16q5kI477rjstdde2WGHHbLFFlvkwQ9+cD73uc9d5P5HHnlkTjjhhNzoRjfK7rvvniOPPDL/93//t3i/2DyYWBsAAADY5Fz3utf947xH6+NqV7tarnjFK+aoo47Kl7/85fXuDurueW+3//7758UvfvF617hYdCIBAAAAm5zb3va2Oeecc/Kv//qvf7zuuOOOyzHHHPNn2132spfNb37zmz+77hGPeEQe8pCH5H73u18233zz9Xrem9zkJjnmmGNy5pln5oILLsh73/ve3PrWt06SbLnlljnvvPOSJLe73e1yxBFH5Gc/+1mS5Oc//3m+//3vr/fvuZB0IgEAAAAzd8JL91vS56uqvP/978+TnvSkHHroodlqq62y00475VWvetWfbXeb29wmhx56aHbfffc885nPzP3vf//c/e53z4EHHrjWoWzrcqUrXSkvfvGLc5vb3Cbdnbvc5S7Zd999kySPetSjcv3rXz83vOENc9hhh+WFL3xh7nCHO+TCCy/Mlltumde//vW5+tWvvhC//gap+bZRLTd77rlnr5qUCgAAANi4nHzyybnOda4z6zI2yPHHH58nP/nJ+fznPz/rUi6WNf0NquqE7t5zTdvrRAIAAACYp0MPPTT//M//PPOV0mbBnEgAAAAA83TQQQfl+9//fm5xi1vMupQlJ0QCAAAAYJIQCQAAAIBJQiQAAAAAJgmRAAAAAJhkdTYAAABg5n5wyK4L+ng7HnzS5Dabb755dt1115x//vnZeeed8653vSvbbLPNgtaxyqmnnpovfelLedCDHrTG2/bZZ598/etf/+N1z3ve83KZy1wmT3va09b6mG9/+9tzhzvcIVe+8pXX+dwHHHBA9tlnn9znPvfZ8F8gQiSA9bbH09856xIu4oSX7jfrEgAAYKOz9dZb58QTT0yS7L///nn961+fZz/72Qv+POeff35OPfXUvOc971ljiLSh3v72t+d617veZIi0UAxnAwAAADZ5N7vZzfKjH/0oSfLd7343d7rTnbLHHnvklre8Zb71rW8lSd73vvflete7Xnbbbbfc6la3SpKcffbZOfDAA7PrrrvmBje4QT772c8mGQKe+973vrnb3e6WO9zhDjnooIPy+c9/Prvvvnte+cpXrldtJ554Ym5605vm+te/fu55z3vmF7/4RY444ogcf/zxefCDH5zdd989f/jDH3LCCSfk1re+dfbYY4/c8Y53zOmnn76Ae0gnEgAAALCJu+CCC3LkkUfm4Q9/eJLkUY96VN74xjfmWte6Vr785S/nsY99bI466qgccsgh+eQnP5mrXOUq+eUvf5kkef3rX58kOemkk/Ktb30rd7jDHfKd73wnSXLsscfma1/7WrbbbrscffTRednLXpaPfOQja6zhu9/9bnbfffc/Xv7JT37yx6Fs++23X1772tfm1re+dQ4++OA8//nPz6te9aq87nWvy8te9rLsueeeOe+88/L4xz8+H/zgB7PDDjvk8MMPz7Of/ey89a1vXbD9JEQCAAAANkl/+MMfsvvuu+fUU0/NHnvskb333ju//e1v86UvfSn3ve99/7jdOeeckyS5+c1vngMOOCD3u9/9cq973StJ8oUvfCGPf/zjkyTXvva1c/WrX/2PIdLee++d7bbbbl61XOMa1/jj0LpkmBMpSX71q1/ll7/8ZW5961snGYbdza1tlW9/+9v5+te/nr333jvJEIxd6UpXWo+9MU2IBAAAAGySVs2J9Ktf/Sr77LNPXv/61+eAAw7INtts82eBzipvfOMb8+Uvfzkf/ehHs/vuu+fEE09Md6/18S996UsvYvV/rrtz3eteN8cee+yiPYc5kQAAAIBN2uUud7m85jWvycte9rJsvfXW2XnnnfO+970vyRDOfPWrX00yDDm7yU1ukkMOOSTbb799fvjDH+ZWt7pVDjvssCTJd77znfzgBz/ILrvscpHnuOxlL5vf/OY3G1Tbtttum89//vNJkne9611/7Eqa+5i77LJLzjjjjD+GSOedd16+8Y1vrPfzrYtOJAAAAGDmdjz4pJk+/w1ucIPstttu+bd/+7ccdthhecxjHpMXvvCFOe+88/KABzwgu+22W57+9KfnlFNOSXfndre7XXbbbbdc+9rXzqMf/ejsuuuu2WKLLfL2t789l7zkJS/y+Ne//vWzxRZbZLfddssBBxyQJz/5yfOu7R3veEce/ehH5/e//33+6q/+Km9729uSJAcccEAe/ehHZ+utt86xxx6bI444Ik94whPyq1/9Kueff36e9KQn5brXve6C7aNaV9vVcrbnnnv28ccfP+sygE3QHk9/56xLuIgTXrrfrEsAAID1cvLJJ+c617nOrMvYpK3pb1BVJ3T3nmva3nA2AAAAACYJkQAAAACYJEQCAAAAZmJjnWJnJdiQfS9EAgAAAJbcVlttlbPOOkuQNAPdnbPOOitbbbXVet3P6mwAAADAkrvqVa+a0047LWecccasS9kkbbXVVrnqVa+6XvcRIgEAAABLbsstt8zOO+886zJYD4azAQAAADBJiAQAAADAJCESAAAAAJOESAAAAABMEiIBAAAAMMnqbADARezx9HfOuoSLOOGl+826BACATZpOJAAAAAAmCZEAAAAAmGQ4GwDLnqFVAAAwezqRAAAAAJgkRAIAAABgkhAJAAAAgElCJAAAAAAmCZEAAAAAmCREAgAAAGCSEAkAAACASUIkAAAAACYJkQAAAACYJEQCAAAAYJIQCQAAAIBJQiQAAAAAJgmRAAAAAJgkRAIAAABgkhAJAAAAgElbzLoAAAAAFsceT3/nrEu4iBNeut+sSwA2kE4kAAAAACYJkQAAAACYJEQCAAAAYJIQCQAAAIBJQiQAAAAAJgmRAAAA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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "res_book_per_month = hotel_data.loc[(hotel_data[\"hotel\"] == \"Resort Hotel\")].groupby(\"arrival_date_month\")[\"hotel\"].count()\n", - "res_cancel_per_month = hotel_data.loc[(hotel_data[\"hotel\"] == \"Resort Hotel\")].groupby(\"arrival_date_month\")[\"is_canceled\"].sum()\n", - "\n", - "cty_book_per_month = hotel_data.loc[(hotel_data[\"hotel\"] == \"City Hotel\")].groupby(\"arrival_date_month\")[\"hotel\"].count()\n", - "cty_cancel_per_month = hotel_data.loc[(hotel_data[\"hotel\"] == \"City Hotel\")].groupby(\"arrival_date_month\")[\"is_canceled\"].sum()\n", - "\n", - "res_cancel_data = pd.DataFrame({\"Hotel\": \"Resort Hotel\",\n", - " \"Month\": list(res_book_per_month.index),\n", - " \"Bookings\": list(res_book_per_month.values),\n", - " \"Cancelations\": list(res_cancel_per_month.values)})\n", - "cty_cancel_data = pd.DataFrame({\"Hotel\": \"City Hotel\",\n", - " \"Month\": list(cty_book_per_month.index),\n", - " \"Bookings\": list(cty_book_per_month.values),\n", - " \"Cancelations\": list(cty_cancel_per_month.values)})\n", - "\n", - "full_cancel_data = pd.concat([res_cancel_data, cty_cancel_data], ignore_index=True)\n", - "full_cancel_data[\"cancel_percent\"] = full_cancel_data[\"Cancelations\"] / full_cancel_data[\"Bookings\"] * 100\n", - "\n", - "# order by month:\n", - "ordered_months = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \n", - " \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"]\n", - "full_cancel_data[\"Month\"] = pd.Categorical(full_cancel_data[\"Month\"], categories=ordered_months, ordered=True)\n", - "\n", - "# show figure:\n", - "plt.figure(figsize=(20, 10))\n", - "sns.barplot(x = \"Month\", y = \"cancel_percent\" , hue=\"Hotel\",\n", - " hue_order = [\"City Hotel\", \"Resort Hotel\"], data=full_cancel_data)\n", - "plt.title(\"Cancelations per month\", fontsize=16)\n", - "plt.xlabel(\"Month\", fontsize=16)\n", - "plt.xticks(rotation=45)\n", - "plt.ylabel(\"Cancelations [%]\", fontsize=16)\n", - "plt.legend(loc=\"upper right\")\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "lead_time 0.293123\n", - "total_of_special_requests 0.234658\n", - "required_car_parking_spaces 0.195498\n", - "adults 0.060017\n", - "days_in_waiting_list 0.054186\n", - "adr 0.047557\n", - "babies 0.032491\n", - "stays_in_week_nights 0.024765\n", - "arrival_date_year 0.016660\n", - "arrival_date_week_number 0.008148\n", - "arrival_date_day_of_month 0.006130\n", - "children 0.005048\n", - "stays_in_weekend_nights 0.001791\n", - "Name: is_canceled, dtype: float64" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cancel_corr = hotel_data.corr()[\"is_canceled\"]\n", - "cancel_corr.abs().sort_values(ascending=False)[1:]" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "is_canceled reservation_status_date\n", - "0 12/8/2015 243\n", - " 6/26/2016 228\n", - " 5/29/2016 225\n", - " 2/14/2016 207\n", - " 11/22/2015 202\n", - " ... \n", - "1 4/7/2015 1\n", - " 5/15/2015 1\n", - " 6/14/2015 1\n", - " 8/23/2015 1\n", - " 9/13/2015 1\n", - "Name: reservation_status_date, Length: 1707, dtype: int64" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "hotel_data.groupby(\"is_canceled\")[\"reservation_status_date\"].value_counts()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.3" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -}