diff --git a/data_processing_pca.ipynb b/data_processing_pca.ipynb new file mode 100644 index 0000000..8a9c01f --- /dev/null +++ b/data_processing_pca.ipynb @@ -0,0 +1,3837 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "nIcCB-m7gSXW" + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n" + ] + }, + { + "cell_type": "code", + "source": [ + "census = pd.read_csv(\"/content/drive/MyDrive/pythoncode/441_data/census.csv\")\n", + "housing_information = pd.read_csv(\"/content/drive/MyDrive/pythoncode/441_data/housing_information.csv\")\n", + "realtor_housing = pd.read_csv(\"/content/drive/MyDrive/pythoncode/441_data/realtor_housing.csv\")" + ], + "metadata": { + "id": "4hX95c6FhNgd" + }, + "execution_count": 2, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "census['zip_code'] = census['NAME'].str.split(' ').str[1]" + ], + "metadata": { + "id": "2UYTaoDliEH1" + }, + "execution_count": 3, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "census['zip_code'].tail(20)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 711 + }, + "id": "ysILjEuYmo3a", + "outputId": "cc6c0ba6-8921-423a-dbaf-5e02123cc583" + }, + "execution_count": 4, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "33755 99829\n", + "33756 99830\n", + "33757 99832\n", + "33758 99833\n", + "33759 99835\n", + "33760 99836\n", + "33761 99840\n", + "33762 99841\n", + "33763 99850\n", + "33764 99901\n", + "33765 99903\n", + "33766 99918\n", + "33767 99919\n", + "33768 99921\n", + "33769 99922\n", + "33770 99923\n", + "33771 99925\n", + "33772 99926\n", + "33773 99927\n", + "33774 99929\n", + "Name: zip_code, dtype: object" + ], + "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", + "
zip_code
3375599829
3375699830
3375799832
3375899833
3375999835
3376099836
3376199840
3376299841
3376399850
3376499901
3376599903
3376699918
3376799919
3376899921
3376999922
3377099923
3377199925
3377299926
3377399927
3377499929
\n", + "

" + ] + }, + "metadata": {}, + "execution_count": 4 + } + ] + }, + { + "cell_type": "code", + "source": [ + "housing_information.head()\n", + "housing_information['zip_code'] = housing_information['postal_code']\n", + "housing_information" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 565 + }, + "id": "3OX2_tlfiwqE", + "outputId": "26dbb080-aaa3-4243-941a-10ccabb5f904" + }, + "execution_count": 5, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " month_date_yyyymm postal_code zip_name \\\n", + "0 202508 21530 flintstone, md \n", + "1 202508 83876 worley, id \n", + "2 202508 56142 ivanhoe, mn \n", + "3 202508 71857 prescott, ar \n", + "4 202508 67207 wichita, ks \n", + "... ... ... ... \n", + "3114032 201607 16740 mount jewett, pa \n", + "3114033 201607 47591 vincennes, in \n", + "3114034 201607 48464 otter lake, mi \n", + "3114035 201607 99006 deer park, wa \n", + "3114036 201607 54220 manitowoc, wi \n", + "\n", + " median_listing_price median_listing_price_mm \\\n", + "0 683250.0 -0.4481 \n", + "1 837450.0 -0.0870 \n", + "2 160500.0 -0.1145 \n", + "3 79900.0 -0.0589 \n", + "4 283450.0 -0.0071 \n", + "... ... ... \n", + "3114032 114450.0 NaN \n", + "3114033 99400.0 NaN \n", + "3114034 114900.0 NaN \n", + "3114035 235000.0 NaN \n", + "3114036 99900.0 NaN \n", + "\n", + " median_listing_price_yy active_listing_count \\\n", + "0 1.8588 4.0 \n", + "1 -0.0643 23.0 \n", + "2 3.8198 2.0 \n", + "3 -0.0600 15.0 \n", + "4 0.0128 71.0 \n", + "... ... ... \n", + "3114032 NaN 6.0 \n", + "3114033 NaN 105.0 \n", + "3114034 NaN 14.0 \n", + "3114035 NaN 62.0 \n", + "3114036 NaN 294.0 \n", + "\n", + " active_listing_count_mm active_listing_count_yy \\\n", + "0 1.0000 0.3333 \n", + "1 0.2105 0.2778 \n", + "2 0.3333 1.0000 \n", + "3 -0.1429 0.3636 \n", + "4 0.4343 0.8205 \n", + "... ... ... \n", + "3114032 NaN NaN \n", + "3114033 NaN NaN \n", + "3114034 NaN NaN \n", + "3114035 NaN NaN \n", + "3114036 NaN NaN \n", + "\n", + " median_days_on_market ... average_listing_price_mm \\\n", + "0 27.0 ... -0.3241 \n", + "1 71.0 ... -0.1156 \n", + "2 40.0 ... -0.1145 \n", + "3 136.0 ... 0.0151 \n", + "4 30.0 ... -0.0370 \n", + "... ... ... ... \n", + "3114032 115.0 ... NaN \n", + "3114033 66.0 ... NaN \n", + "3114034 52.0 ... NaN \n", + "3114035 37.0 ... NaN \n", + "3114036 79.0 ... NaN \n", + "\n", + " average_listing_price_yy total_listing_count \\\n", + "0 -0.1821 6.0 \n", + "1 0.1602 27.0 \n", + "2 3.8198 3.0 \n", + "3 -0.3684 20.0 \n", + "4 0.0077 103.0 \n", + "... ... ... \n", + "3114032 NaN 6.0 \n", + "3114033 NaN 105.0 \n", + "3114034 NaN 14.0 \n", + "3114035 NaN 106.0 \n", + "3114036 NaN 300.0 \n", + "\n", + " total_listing_count_mm total_listing_count_yy pending_ratio \\\n", + "0 1.0000 0.2000 0.5000 \n", + "1 0.2273 0.2273 0.1304 \n", + "2 0.2000 2.0000 1.0000 \n", + "3 -0.1304 0.3333 0.3333 \n", + "4 0.3733 0.5147 0.4225 \n", + "... ... ... ... \n", + "3114032 NaN NaN NaN \n", + "3114033 NaN NaN NaN \n", + "3114034 NaN NaN NaN \n", + "3114035 NaN NaN 0.7258 \n", + "3114036 NaN NaN 0.0170 \n", + "\n", + " pending_ratio_mm pending_ratio_yy quality_flag zip_code \n", + "0 0.0000 -0.5000 1.0 21530 \n", + "1 -0.0538 -0.1196 0.0 83876 \n", + "2 0.3333 NaN 1.0 56142 \n", + "3 0.0476 -0.1212 1.0 71857 \n", + "4 -0.1330 -0.3980 0.0 67207 \n", + "... ... ... ... ... \n", + "3114032 NaN NaN NaN 16740 \n", + "3114033 NaN NaN NaN 47591 \n", + "3114034 NaN NaN NaN 48464 \n", + "3114035 NaN NaN NaN 99006 \n", + "3114036 NaN NaN NaN 54220 \n", + "\n", + "[3114037 rows x 47 columns]" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
month_date_yyyymmpostal_codezip_namemedian_listing_pricemedian_listing_price_mmmedian_listing_price_yyactive_listing_countactive_listing_count_mmactive_listing_count_yymedian_days_on_market...average_listing_price_mmaverage_listing_price_yytotal_listing_counttotal_listing_count_mmtotal_listing_count_yypending_ratiopending_ratio_mmpending_ratio_yyquality_flagzip_code
020250821530flintstone, md683250.0-0.44811.85884.01.00000.333327.0...-0.3241-0.18216.01.00000.20000.50000.0000-0.50001.021530
120250883876worley, id837450.0-0.0870-0.064323.00.21050.277871.0...-0.11560.160227.00.22730.22730.1304-0.0538-0.11960.083876
220250856142ivanhoe, mn160500.0-0.11453.81982.00.33331.000040.0...-0.11453.81983.00.20002.00001.00000.3333NaN1.056142
320250871857prescott, ar79900.0-0.0589-0.060015.0-0.14290.3636136.0...0.0151-0.368420.0-0.13040.33330.33330.0476-0.12121.071857
420250867207wichita, ks283450.0-0.00710.012871.00.43430.820530.0...-0.03700.0077103.00.37330.51470.4225-0.1330-0.39800.067207
..................................................................
311403220160716740mount jewett, pa114450.0NaNNaN6.0NaNNaN115.0...NaNNaN6.0NaNNaNNaNNaNNaNNaN16740
311403320160747591vincennes, in99400.0NaNNaN105.0NaNNaN66.0...NaNNaN105.0NaNNaNNaNNaNNaNNaN47591
311403420160748464otter lake, mi114900.0NaNNaN14.0NaNNaN52.0...NaNNaN14.0NaNNaNNaNNaNNaNNaN48464
311403520160799006deer park, wa235000.0NaNNaN62.0NaNNaN37.0...NaNNaN106.0NaNNaN0.7258NaNNaNNaN99006
311403620160754220manitowoc, wi99900.0NaNNaN294.0NaNNaN79.0...NaNNaN300.0NaNNaN0.0170NaNNaNNaN54220
\n", + "

3114037 rows × 47 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + " \n", + " \n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "dataframe", + "variable_name": "housing_information" + } + }, + "metadata": {}, + "execution_count": 5 + } + ] + }, + { + "cell_type": "code", + "source": [ + "realtor_housing = pd.read_csv(\"/content/drive/MyDrive/pythoncode/441_data/realtor_housing.csv\")\n", + "realtor_housing['zip_code']" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 458 + }, + "id": "ZKjl-EXilypG", + "outputId": "2d6aabbd-9d34-4ea0-b86b-c4011044aeb2" + }, + "execution_count": 6, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0 601.0\n", + "1 601.0\n", + "2 795.0\n", + "3 731.0\n", + "4 680.0\n", + " ... \n", + "2226377 99354.0\n", + "2226378 99354.0\n", + "2226379 99354.0\n", + "2226380 99354.0\n", + "2226381 99354.0\n", + "Name: zip_code, Length: 2226382, dtype: float64" + ], + "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", + "
zip_code
0601.0
1601.0
2795.0
3731.0
4680.0
......
222637799354.0
222637899354.0
222637999354.0
222638099354.0
222638199354.0
\n", + "

2226382 rows × 1 columns

\n", + "

" + ] + }, + "metadata": {}, + "execution_count": 6 + } + ] + }, + { + "cell_type": "code", + "source": [ + "realtor_housing['zip_code'].dropna(inplace=True)\n", + "realtor_housing['zip_code']=realtor_housing['zip_code'].apply(pd.to_numeric, errors='coerce').dropna().astype(int).astype(str).str.zfill(5)" + ], + "metadata": { + "id": "Z5MxfWznizYu" + }, + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "housing_information['zip_code'] = housing_information['zip_code'].astype(str)\n", + "\n", + "\n", + "census = census.drop_duplicates(subset='zip_code')\n", + "housing_information = housing_information.drop_duplicates(subset='zip_code')\n", + "\n", + "merged_df1 = pd.merge(realtor_housing, census, on='zip_code', how='left')\n", + "merged_df1\n" + ], + "metadata": { + "id": "ZoUbFQYUi3DM", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 634 + }, + "outputId": "5c05254e-924a-44ca-8829-87f76ec16249" + }, + "execution_count": 8, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " brokered_by status price bed bath acre_lot street \\\n", + "0 103378.0 for_sale 105000.0 3.0 2.0 0.12 1962661.0 \n", + "1 52707.0 for_sale 80000.0 4.0 2.0 0.08 1902874.0 \n", + "2 103379.0 for_sale 67000.0 2.0 1.0 0.15 1404990.0 \n", + "3 31239.0 for_sale 145000.0 4.0 2.0 0.10 1947675.0 \n", + "4 34632.0 for_sale 65000.0 6.0 2.0 0.05 331151.0 \n", + "... ... ... ... ... ... ... ... \n", + "2226377 23009.0 sold 359900.0 4.0 2.0 0.33 353094.0 \n", + "2226378 18208.0 sold 350000.0 3.0 2.0 0.10 1062149.0 \n", + "2226379 76856.0 sold 440000.0 6.0 3.0 0.50 405677.0 \n", + "2226380 53618.0 sold 179900.0 2.0 1.0 0.09 761379.0 \n", + "2226381 108243.0 sold 580000.0 5.0 3.0 0.31 307704.0 \n", + "\n", + " city state zip_code house_size prev_sold_date \\\n", + "0 Adjuntas Puerto Rico 00601 920.0 NaN \n", + "1 Adjuntas Puerto Rico 00601 1527.0 NaN \n", + "2 Juana Diaz Puerto Rico 00795 748.0 NaN \n", + "3 Ponce Puerto Rico 00731 1800.0 NaN \n", + "4 Mayaguez Puerto Rico 00680 NaN NaN \n", + "... ... ... ... ... ... \n", + "2226377 Richland Washington 99354 3600.0 2022-03-25 \n", + "2226378 Richland Washington 99354 1616.0 2022-03-25 \n", + "2226379 Richland Washington 99354 3200.0 2022-03-24 \n", + "2226380 Richland Washington 99354 933.0 2022-03-24 \n", + "2226381 Richland Washington 99354 3615.0 2022-03-23 \n", + "\n", + " GEO_ID NAME H1_001N Unnamed: 3 \n", + "0 860Z200US00601 ZCTA5 00601 7605 NaN \n", + "1 860Z200US00601 ZCTA5 00601 7605 NaN \n", + "2 860Z200US00795 ZCTA5 00795 18935 NaN \n", + "3 860Z200US00731 ZCTA5 00731 5556 NaN \n", + "4 860Z200US00680 ZCTA5 00680 26075 NaN \n", + "... ... ... ... ... \n", + "2226377 860Z200US99354 ZCTA5 99354 10666 NaN \n", + "2226378 860Z200US99354 ZCTA5 99354 10666 NaN \n", + "2226379 860Z200US99354 ZCTA5 99354 10666 NaN \n", + "2226380 860Z200US99354 ZCTA5 99354 10666 NaN \n", + "2226381 860Z200US99354 ZCTA5 99354 10666 NaN \n", + "\n", + "[2226382 rows x 16 columns]" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
brokered_bystatuspricebedbathacre_lotstreetcitystatezip_codehouse_sizeprev_sold_dateGEO_IDNAMEH1_001NUnnamed: 3
0103378.0for_sale105000.03.02.00.121962661.0AdjuntasPuerto Rico00601920.0NaN860Z200US00601ZCTA5 006017605NaN
152707.0for_sale80000.04.02.00.081902874.0AdjuntasPuerto Rico006011527.0NaN860Z200US00601ZCTA5 006017605NaN
2103379.0for_sale67000.02.01.00.151404990.0Juana DiazPuerto Rico00795748.0NaN860Z200US00795ZCTA5 0079518935NaN
331239.0for_sale145000.04.02.00.101947675.0PoncePuerto Rico007311800.0NaN860Z200US00731ZCTA5 007315556NaN
434632.0for_sale65000.06.02.00.05331151.0MayaguezPuerto Rico00680NaNNaN860Z200US00680ZCTA5 0068026075NaN
...................................................
222637723009.0sold359900.04.02.00.33353094.0RichlandWashington993543600.02022-03-25860Z200US99354ZCTA5 9935410666NaN
222637818208.0sold350000.03.02.00.101062149.0RichlandWashington993541616.02022-03-25860Z200US99354ZCTA5 9935410666NaN
222637976856.0sold440000.06.03.00.50405677.0RichlandWashington993543200.02022-03-24860Z200US99354ZCTA5 9935410666NaN
222638053618.0sold179900.02.01.00.09761379.0RichlandWashington99354933.02022-03-24860Z200US99354ZCTA5 9935410666NaN
2226381108243.0sold580000.05.03.00.31307704.0RichlandWashington993543615.02022-03-23860Z200US99354ZCTA5 9935410666NaN
\n", + "

2226382 rows × 16 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + " \n", + " \n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "dataframe", + "variable_name": "merged_df1" + } + }, + "metadata": {}, + "execution_count": 8 + } + ] + }, + { + "cell_type": "code", + "source": [ + "housing_information" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 513 + }, + "id": "vHlcoUsjk4L-", + "outputId": "804ed658-325f-4bf5-b3b9-c52112a762bf" + }, + "execution_count": 9, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " month_date_yyyymm postal_code zip_name \\\n", + "0 202508 21530 flintstone, md \n", + "1 202508 83876 worley, id \n", + "2 202508 56142 ivanhoe, mn \n", + "3 202508 71857 prescott, ar \n", + "4 202508 67207 wichita, ks \n", + "... ... ... ... \n", + "3107480 201607 30608 NaN \n", + "3108152 201607 74459 NaN \n", + "3109057 201607 28547 camp lejeune, nc \n", + "3110124 201607 72338 frenchmans bayou, ar \n", + "3113146 201607 48232 NaN \n", + "\n", + " median_listing_price median_listing_price_mm \\\n", + "0 683250.0 -0.4481 \n", + "1 837450.0 -0.0870 \n", + "2 160500.0 -0.1145 \n", + "3 79900.0 -0.0589 \n", + "4 283450.0 -0.0071 \n", + "... ... ... \n", + "3107480 599000.0 NaN \n", + "3108152 22600.0 NaN \n", + "3109057 31000.0 NaN \n", + "3110124 124900.0 NaN \n", + "3113146 389225.0 NaN \n", + "\n", + " median_listing_price_yy active_listing_count \\\n", + "0 1.8588 4.0 \n", + "1 -0.0643 23.0 \n", + "2 3.8198 2.0 \n", + "3 -0.0600 15.0 \n", + "4 0.0128 71.0 \n", + "... ... ... \n", + "3107480 NaN 1.0 \n", + "3108152 NaN 1.0 \n", + "3109057 NaN 1.0 \n", + "3110124 NaN 1.0 \n", + "3113146 NaN 1.0 \n", + "\n", + " active_listing_count_mm active_listing_count_yy \\\n", + "0 1.0000 0.3333 \n", + "1 0.2105 0.2778 \n", + "2 0.3333 1.0000 \n", + "3 -0.1429 0.3636 \n", + "4 0.4343 0.8205 \n", + "... ... ... \n", + "3107480 NaN NaN \n", + "3108152 NaN NaN \n", + "3109057 NaN NaN \n", + "3110124 NaN NaN \n", + "3113146 NaN NaN \n", + "\n", + " median_days_on_market ... average_listing_price_mm \\\n", + "0 27.0 ... -0.3241 \n", + "1 71.0 ... -0.1156 \n", + "2 40.0 ... -0.1145 \n", + "3 136.0 ... 0.0151 \n", + "4 30.0 ... -0.0370 \n", + "... ... ... ... \n", + "3107480 NaN ... NaN \n", + "3108152 47.0 ... NaN \n", + "3109057 50.0 ... NaN \n", + "3110124 4.0 ... NaN \n", + "3113146 74.0 ... NaN \n", + "\n", + " average_listing_price_yy total_listing_count \\\n", + "0 -0.1821 6.0 \n", + "1 0.1602 27.0 \n", + "2 3.8198 3.0 \n", + "3 -0.3684 20.0 \n", + "4 0.0077 103.0 \n", + "... ... ... \n", + "3107480 NaN 1.0 \n", + "3108152 NaN 1.0 \n", + "3109057 NaN 1.0 \n", + "3110124 NaN 1.0 \n", + "3113146 NaN 1.0 \n", + "\n", + " total_listing_count_mm total_listing_count_yy pending_ratio \\\n", + "0 1.0000 0.2000 0.5000 \n", + "1 0.2273 0.2273 0.1304 \n", + "2 0.2000 2.0000 1.0000 \n", + "3 -0.1304 0.3333 0.3333 \n", + "4 0.3733 0.5147 0.4225 \n", + "... ... ... ... \n", + "3107480 NaN NaN NaN \n", + "3108152 NaN NaN NaN \n", + "3109057 NaN NaN NaN \n", + "3110124 NaN NaN NaN \n", + "3113146 NaN NaN NaN \n", + "\n", + " pending_ratio_mm pending_ratio_yy quality_flag zip_code \n", + "0 0.0000 -0.5000 1.0 21530 \n", + "1 -0.0538 -0.1196 0.0 83876 \n", + "2 0.3333 NaN 1.0 56142 \n", + "3 0.0476 -0.1212 1.0 71857 \n", + "4 -0.1330 -0.3980 0.0 67207 \n", + "... ... ... ... ... \n", + "3107480 NaN NaN NaN 30608 \n", + "3108152 NaN NaN NaN 74459 \n", + "3109057 NaN NaN NaN 28547 \n", + "3110124 NaN NaN NaN 72338 \n", + "3113146 NaN NaN NaN 48232 \n", + "\n", + "[34129 rows x 47 columns]" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
month_date_yyyymmpostal_codezip_namemedian_listing_pricemedian_listing_price_mmmedian_listing_price_yyactive_listing_countactive_listing_count_mmactive_listing_count_yymedian_days_on_market...average_listing_price_mmaverage_listing_price_yytotal_listing_counttotal_listing_count_mmtotal_listing_count_yypending_ratiopending_ratio_mmpending_ratio_yyquality_flagzip_code
020250821530flintstone, md683250.0-0.44811.85884.01.00000.333327.0...-0.3241-0.18216.01.00000.20000.50000.0000-0.50001.021530
120250883876worley, id837450.0-0.0870-0.064323.00.21050.277871.0...-0.11560.160227.00.22730.22730.1304-0.0538-0.11960.083876
220250856142ivanhoe, mn160500.0-0.11453.81982.00.33331.000040.0...-0.11453.81983.00.20002.00001.00000.3333NaN1.056142
320250871857prescott, ar79900.0-0.0589-0.060015.0-0.14290.3636136.0...0.0151-0.368420.0-0.13040.33330.33330.0476-0.12121.071857
420250867207wichita, ks283450.0-0.00710.012871.00.43430.820530.0...-0.03700.0077103.00.37330.51470.4225-0.1330-0.39800.067207
..................................................................
310748020160730608NaN599000.0NaNNaN1.0NaNNaNNaN...NaNNaN1.0NaNNaNNaNNaNNaNNaN30608
310815220160774459NaN22600.0NaNNaN1.0NaNNaN47.0...NaNNaN1.0NaNNaNNaNNaNNaNNaN74459
310905720160728547camp lejeune, nc31000.0NaNNaN1.0NaNNaN50.0...NaNNaN1.0NaNNaNNaNNaNNaNNaN28547
311012420160772338frenchmans bayou, ar124900.0NaNNaN1.0NaNNaN4.0...NaNNaN1.0NaNNaNNaNNaNNaNNaN72338
311314620160748232NaN389225.0NaNNaN1.0NaNNaN74.0...NaNNaN1.0NaNNaNNaNNaNNaNNaN48232
\n", + "

34129 rows × 47 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + " \n", + " \n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "dataframe", + "variable_name": "housing_information" + } + }, + "metadata": {}, + "execution_count": 9 + } + ] + }, + { + "cell_type": "code", + "source": [ + "final_merged = pd.merge(merged_df1, housing_information, on='zip_code', how='inner')\n", + "\n" + ], + "metadata": { + "id": "zB4wv9Vbmd9Z" + }, + "execution_count": 10, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "final_merged.to_csv(\"output.csv\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 287 + }, + "id": "irDVFLusk7rM", + "outputId": "349b2c74-a035-43f5-a1d0-1ba6c6a9282e" + }, + "execution_count": 11, + "outputs": [ + { + "output_type": "error", + "ename": "KeyboardInterrupt", + "evalue": "", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/tmp/ipython-input-196984361.py\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mfinal_merged\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"output.csv\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/pandas/util/_decorators.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 331\u001b[0m \u001b[0mstacklevel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfind_stack_level\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 332\u001b[0m )\n\u001b[0;32m--> 333\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 334\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 335\u001b[0m \u001b[0;31m# error: \"Callable[[VarArg(Any), KwArg(Any)], Any]\" has no\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36mto_csv\u001b[0;34m(self, path_or_buf, sep, na_rep, float_format, columns, header, index, index_label, mode, encoding, compression, quoting, quotechar, lineterminator, chunksize, date_format, doublequote, escapechar, decimal, errors, storage_options)\u001b[0m\n\u001b[1;32m 3965\u001b[0m )\n\u001b[1;32m 3966\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3967\u001b[0;31m return DataFrameRenderer(formatter).to_csv(\n\u001b[0m\u001b[1;32m 3968\u001b[0m \u001b[0mpath_or_buf\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3969\u001b[0m \u001b[0mlineterminator\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlineterminator\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/pandas/io/formats/format.py\u001b[0m in \u001b[0;36mto_csv\u001b[0;34m(self, path_or_buf, encoding, sep, columns, index_label, mode, compression, quoting, quotechar, lineterminator, chunksize, date_format, doublequote, escapechar, errors, storage_options)\u001b[0m\n\u001b[1;32m 1012\u001b[0m \u001b[0mformatter\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfmt\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1013\u001b[0m )\n\u001b[0;32m-> 1014\u001b[0;31m \u001b[0mcsv_formatter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msave\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1015\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1016\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcreated_buffer\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/pandas/io/formats/csvs.py\u001b[0m in \u001b[0;36msave\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 268\u001b[0m )\n\u001b[1;32m 269\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 270\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_save\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 271\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 272\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_save\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/pandas/io/formats/csvs.py\u001b[0m in \u001b[0;36m_save\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 273\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_need_to_save_header\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 274\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_save_header\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 275\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_save_body\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 276\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 277\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_save_header\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/pandas/io/formats/csvs.py\u001b[0m in \u001b[0;36m_save_body\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 311\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mstart_i\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0mend_i\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 312\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 313\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_save_chunk\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstart_i\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mend_i\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 314\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 315\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_save_chunk\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstart_i\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mend_i\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/pandas/io/formats/csvs.py\u001b[0m in \u001b[0;36m_save_chunk\u001b[0;34m(self, start_i, end_i)\u001b[0m\n\u001b[1;32m 318\u001b[0m \u001b[0mdf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miloc\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mslicer\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 319\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 320\u001b[0;31m \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_values_for_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_number_format\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 321\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mres\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_iter_column_arrays\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 322\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m_get_values_for_csv\u001b[0;34m(self, float_format, date_format, decimal, na_rep, quoting)\u001b[0m\n\u001b[1;32m 1408\u001b[0m ) -> Self:\n\u001b[1;32m 1409\u001b[0m \u001b[0;31m# helper used by to_csv\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1410\u001b[0;31m mgr = self._mgr.get_values_for_csv(\n\u001b[0m\u001b[1;32m 1411\u001b[0m \u001b[0mfloat_format\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfloat_format\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1412\u001b[0m \u001b[0mdate_format\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdate_format\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/pandas/core/internals/managers.py\u001b[0m in \u001b[0;36mget_values_for_csv\u001b[0;34m(self, float_format, date_format, decimal, na_rep, quoting)\u001b[0m\n\u001b[1;32m 464\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mformatting\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mrepr\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mcsv\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 465\u001b[0m \"\"\"\n\u001b[0;32m--> 466\u001b[0;31m return self.apply(\n\u001b[0m\u001b[1;32m 467\u001b[0m \u001b[0;34m\"get_values_for_csv\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 468\u001b[0m \u001b[0mna_rep\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mna_rep\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/pandas/core/internals/managers.py\u001b[0m in \u001b[0;36mapply\u001b[0;34m(self, f, align_keys, **kwargs)\u001b[0m\n\u001b[1;32m 361\u001b[0m \u001b[0mapplied\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 362\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 363\u001b[0;31m \u001b[0mapplied\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 364\u001b[0m \u001b[0mresult_blocks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mextend_blocks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mapplied\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult_blocks\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 365\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/pandas/core/internals/blocks.py\u001b[0m in \u001b[0;36mget_values_for_csv\u001b[0;34m(self, float_format, date_format, decimal, na_rep, quoting)\u001b[0m\n\u001b[1;32m 778\u001b[0m ) -> Block:\n\u001b[1;32m 779\u001b[0m \u001b[0;34m\"\"\"convert to our native types format\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 780\u001b[0;31m result = get_values_for_csv(\n\u001b[0m\u001b[1;32m 781\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 782\u001b[0m \u001b[0mna_rep\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mna_rep\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_values_for_csv\u001b[0;34m(values, date_format, na_rep, quoting, float_format, decimal)\u001b[0m\n\u001b[1;32m 7862\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7863\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 7864\u001b[0;31m \u001b[0mmask\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0misna\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7865\u001b[0m \u001b[0mitemsize\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mwriters\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mword_len\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mna_rep\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7866\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/pandas/core/dtypes/missing.py\u001b[0m in \u001b[0;36misna\u001b[0;34m(obj)\u001b[0m\n\u001b[1;32m 176\u001b[0m \u001b[0mName\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mbool\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 177\u001b[0m \"\"\"\n\u001b[0;32m--> 178\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_isna\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 179\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 180\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/pandas/core/dtypes/missing.py\u001b[0m in \u001b[0;36m_isna\u001b[0;34m(obj, inf_as_na)\u001b[0m\n\u001b[1;32m 205\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 206\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mABCExtensionArray\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 207\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_isna_array\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minf_as_na\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minf_as_na\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 208\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mABCIndex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 209\u001b[0m \u001b[0;31m# Try to use cached isna, which also short-circuits for integer dtypes\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/pandas/core/dtypes/missing.py\u001b[0m in \u001b[0;36m_isna_array\u001b[0;34m(values, inf_as_na)\u001b[0m\n\u001b[1;32m 290\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_isna_recarray_dtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minf_as_na\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minf_as_na\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 291\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mis_string_or_object_np_dtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 292\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_isna_string_dtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minf_as_na\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minf_as_na\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 293\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkind\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m\"mM\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 294\u001b[0m \u001b[0;31m# this is the NaT pattern\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/pandas/core/dtypes/missing.py\u001b[0m in \u001b[0;36m_isna_string_dtype\u001b[0;34m(values, inf_as_na)\u001b[0m\n\u001b[1;32m 311\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 312\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mvalues\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndim\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 313\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlibmissing\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misnaobj\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minf_as_na\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minf_as_na\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 314\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 315\u001b[0m \u001b[0;31m# 0-D, reached via e.g. mask_missing\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.decomposition import PCA" + ], + "metadata": { + "id": "YsweB8NLk9WE" + }, + "execution_count": 12, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "categorical_cols = final_merged.select_dtypes(include=['object', 'category']).columns\n" + ], + "metadata": { + "id": "5Xdm4zVDwbBZ" + }, + "execution_count": 23, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "categorical_cols" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "GBAmDL3LwcEA", + "outputId": "a0ef0720-de58-4d84-ef1e-3293718dfa33" + }, + "execution_count": 24, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Index(['status', 'city', 'state', 'zip_code', 'prev_sold_date', 'GEO_ID',\n", + " 'NAME', 'H1_001N', 'zip_name'],\n", + " dtype='object')" + ] + }, + "metadata": {}, + "execution_count": 24 + } + ] + }, + { + "cell_type": "code", + "source": [ + "final_merged = final_merged.fillna(final_merged.mean(numeric_only=True))\n", + "\n", + "numeric_cols = final_merged.select_dtypes(include=['int64', 'float64']).columns\n", + "\n", + "\n" + ], + "metadata": { + "id": "178Eq5glmM4A" + }, + "execution_count": 13, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "clean_data = final_merged[numeric_cols]\n", + "clean_data = clean_data.drop(columns=['Unnamed: 3'])\n", + "print(clean_data)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "bdyyNIIGtHIJ", + "outputId": "bab8b931-46bd-49e8-b4b8-a4a0c38931f3" + }, + "execution_count": 14, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " brokered_by price bed bath acre_lot street \\\n", + "0 10368.0 175000.0 3.000000 1.000000 60.000000 553526.0 \n", + "1 88024.0 18950.0 3.266342 2.496775 15.148419 1943592.0 \n", + "2 22006.0 425000.0 3.000000 2.000000 2.020000 263302.0 \n", + "3 48310.0 225000.0 4.000000 2.000000 0.240000 871278.0 \n", + "4 7797.0 419000.0 3.000000 3.000000 1.900000 286373.0 \n", + "... ... ... ... ... ... ... \n", + "2101045 23009.0 359900.0 4.000000 2.000000 0.330000 353094.0 \n", + "2101046 18208.0 350000.0 3.000000 2.000000 0.100000 1062149.0 \n", + "2101047 76856.0 440000.0 6.000000 3.000000 0.500000 405677.0 \n", + "2101048 53618.0 179900.0 2.000000 1.000000 0.090000 761379.0 \n", + "2101049 108243.0 580000.0 5.000000 3.000000 0.310000 307704.0 \n", + "\n", + " house_size month_date_yyyymm postal_code median_listing_price \\\n", + "0 1176.000000 202508 12022 240000.0 \n", + "1 2747.425997 202508 29835 459900.0 \n", + "2 1600.000000 202508 12521 995000.0 \n", + "3 1239.000000 202508 12521 995000.0 \n", + "4 1800.000000 202508 12516 502500.0 \n", + "... ... ... ... ... \n", + "2101045 3600.000000 202508 99354 509900.0 \n", + "2101046 1616.000000 202508 99354 509900.0 \n", + "2101047 3200.000000 202508 99354 509900.0 \n", + "2101048 933.000000 202508 99354 509900.0 \n", + "2101049 3615.000000 202508 99354 509900.0 \n", + "\n", + " ... average_listing_price average_listing_price_mm \\\n", + "0 ... 240000.0 0.3333 \n", + "1 ... 506725.0 -0.0460 \n", + "2 ... 1592273.0 -0.2336 \n", + "3 ... 1592273.0 -0.2336 \n", + "4 ... 1044767.0 0.0717 \n", + "... ... ... ... \n", + "2101045 ... 486394.0 -0.0546 \n", + "2101046 ... 486394.0 -0.0546 \n", + "2101047 ... 486394.0 -0.0546 \n", + "2101048 ... 486394.0 -0.0546 \n", + "2101049 ... 486394.0 -0.0546 \n", + "\n", + " average_listing_price_yy total_listing_count \\\n", + "0 0.6059 3.0 \n", + "1 0.0566 106.0 \n", + "2 0.0474 18.0 \n", + "3 0.0474 18.0 \n", + "4 -0.5470 23.0 \n", + "... ... ... \n", + "2101045 -0.1422 97.0 \n", + "2101046 -0.1422 97.0 \n", + "2101047 -0.1422 97.0 \n", + "2101048 -0.1422 97.0 \n", + "2101049 -0.1422 97.0 \n", + "\n", + " total_listing_count_mm total_listing_count_yy pending_ratio \\\n", + "0 0.0000 0.5000 3.0000 \n", + "1 0.1042 0.6061 0.2000 \n", + "2 0.1250 -0.1000 0.5833 \n", + "3 0.1250 -0.1000 0.5833 \n", + "4 0.0000 -0.0800 0.5714 \n", + "... ... ... ... \n", + "2101045 0.0211 0.3472 0.3151 \n", + "2101046 0.0211 0.3472 0.3151 \n", + "2101047 0.0211 0.3472 0.3151 \n", + "2101048 0.0211 0.3472 0.3151 \n", + "2101049 0.0211 0.3472 0.3151 \n", + "\n", + " pending_ratio_mm pending_ratio_yy quality_flag \n", + "0 1.0000 2.0000 1.0 \n", + "1 -0.0013 -0.1137 0.0 \n", + "2 -0.0833 -0.1667 1.0 \n", + "3 -0.0833 -0.1667 1.0 \n", + "4 0.1198 0.3896 1.0 \n", + "... ... ... ... \n", + "2101045 0.1696 -0.0246 1.0 \n", + "2101046 0.1696 -0.0246 1.0 \n", + "2101047 0.1696 -0.0246 1.0 \n", + "2101048 0.1696 -0.0246 1.0 \n", + "2101049 0.1696 -0.0246 1.0 \n", + "\n", + "[2101050 rows x 52 columns]\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "scaler = StandardScaler()\n", + "scaled_data = scaler.fit_transform(clean_data)\n", + "\n", + "\n", + "pca = PCA()\n", + "pca.fit(scaled_data)\n", + "plt.figure(figsize=(8,5))\n", + "plt.plot(range(1, len(pca.explained_variance_ratio_) + 1),\n", + " pca.explained_variance_ratio_, 'o-', linewidth=2)\n", + "plt.title('Plot')\n", + "plt.xlabel('Principal Component')\n", + "plt.ylabel('Explained Variance Ratio')\n", + "plt.grid(True)\n", + "plt.show()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 487 + }, + "id": "RnY-wWDptmCz", + "outputId": "079ccab2-0c62-4253-fe7a-18cce7b6e906" + }, + "execution_count": 18, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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SwMRERFR3en9aGGqmoPMHBZmEgBsaSAiIiKqLQZeAyaRSJSrvNlc4SUiIiKqFQZeA+dkW97Hey+/CIIg6LkaIiIiIuPDwGvgXOzKV3hLygTkFZXquRoiIiIi41Prh9bu3r2LpKQkAECHDh3QpEkTrRVFjzn9a2syB5nxbhBNREREpA8ar/Dm5+dj0qRJaNq0KXr37o3evXujadOmeO211zQ605jEcbbl1mREREREdaFx4A0LC8PRo0exZ88ePHjwAA8ePMDu3btx9OhRvPPOO7qosUFztuPhE0RERER1oXFLw08//YQff/wRffv2VV4bPHgwrK2t8dJLL2HdunXarK/B4168RERERHWj8QpvQUGB8iS0ilxdXdnSoAMVjxfm1mREREREmtM48AYHByM8PByFhYXKa48ePUJERASCg4O1WhyptjRkPWQPLxEREZGmNG5pWL16NUJCQtC8eXN06dIFAHDx4kXIZDIcOHBA6wU2dE4qD61xhZeIiIhIUxoHXl9fX1y7dg3fffcdEhMTAQCjR4/GmDFjYG1trfUCG7qKK7wMvERERESaq9U+vDY2Npg8ebK2ayE17K3MYWEmQUmZgCzu0kBERESkMVGBd8+ePRg0aBAsLCywZ8+eascOGzZMK4VROYlEAmdbK6TnFnIfXiIiIqJaEBV4R4wYgfT0dLi6umLEiBFVjpNIJCgrK9NWbfQPJ1vLfwJvMQRBgEQi0XdJREREREZDVOCVy+Vqv6b6oejjLSkTkFtYCkdrHi9MREREJJbG25J9/fXXKCqq/E/rxcXF+Prrr7VSFKniXrxEREREtadx4J04cSJycnIqXc/Ly8PEiRO1UhSpqrg12T3uxUtERESkEY0Db1U9pH///TccHR21UhSpqrg1GY8XJiIiItKM6G3JnnjiCUgkEkgkEjz77LMwN3/81rKyMqSkpGDgwIE6KbKhY0sDERERUe2JDryK3Rni4+MREhICOzs75WuWlpbw9PTEiy++qPUCqXyXBgW2NBARERFpRnTgDQ8PBwB4enpi1KhRkMlkOiuKVDnbVejh5QovERERkUY0PmltwoQJuqiDquGsssLLwEtERESkCY0Db1lZGT777DP88MMPSE1NRXGxagDLzs7WWnFUruJDa+zhJSIiItKMxrs0REREYOXKlRg1ahRycnIQFhaGF154AVKpFAsWLNBBiWRnZQ5Ls/KpYksDERERkWY0DrzfffcdNm7ciHfeeQfm5uYYPXo0Nm3ahPnz5+P06dO6qLHBk0gkygfX+NAaERERkWY0Drzp6eno3LkzAMDOzk55CMVzzz2Hffv2abc6UlK0NdwvKIYgCHquhoiIiMh4aBx4mzdvjrS0NABAmzZtcPDgQQDA2bNnYWVlVd1bqQ4UK7wlZQJyC0v1XA0RERGR8dA48D7//POIjo4GAEybNg3z5s1Du3btMH78eEyaNEnrBVI5Z+7FS0RERFQrGu/SsGTJEuXXo0aNQqtWrXDq1Cm0a9cOQ4cO1Wpx9FjFvXiz84vRuokeiyEiIiIyIhoH3n/r3r07unfvDgA4d+4cAgIC6lwUVVbxtLUs7sVLREREJJrGLQ0PHz7Eo0ePVK7Fx8dj6NChCAoK0lphpMqFe/ESERER1YrowHvr1i0EBwfD0dERjo6OCAsLQ0FBAcaPH4+goCDY2tri1KlTuqy1QXOyrdjSwB5eIiIiIrFEtzTMmjULhYWFWL16NX7++WesXr0ax48fR1BQEJKTk9G8eXNd1tngsaWBiIiIqHZEB95jx47h559/Rvfu3fHSSy/B3d0dY8aMwYwZM3RYHimwpYGIiIiodkS3NGRkZMDLywsA4OrqChsbGwwaNEhnhZGqiiu899jSQERERCSaRg+tSaVSla8tLS2rGU3aZGdlDkvz8t//e2xpICIiIhJNdEuDIAho3749JBIJgPLdGp544gmVEAwA2dnZ2q2QAAASiQTOtpZIyylkSwMRERGRBkQH3q+++kqXdZAIThUCryAIyv/4ICIiIqKqiQ68EyZM0GUdJILitLVSuYDcR6VwtLHQc0VEREREhk/jgydIf5wrbk3GB9eIiIiIRGHgNSIVd2pgHy8RERGROAy8RqSx7eMWhlPX76FMLuixGiIiIiLjwMBrJCIT0rDxWIry+89+v4qeSw8hMiFNj1URERERGb5aB97i4mIkJSWhtLRUm/WQGpEJaZjybRxyHpWoXE/PKcSUb+MYeomIiIiqoXHgLSgowGuvvQYbGxt06tQJqampAIBp06ZhyZIlWi+woSuTC4jYexnqmhcU1yL2XmZ7AxEREVEVNA68c+bMwcWLF3HkyBHIZDLl9X79+mHHjh1aLY6A2JRspOUUVvm6ACAtpxCxKTzwg4iIiEgd0fvwKuzatQs7duxA9+7dVQ4+6NSpE5KTk7VaHAGZeVWH3dqMIyIiImpoNF7hvXv3LlxdXStdz8/P58lfOuBqL6t5kAbjiIiIiBoajQNvQEAA9u3bp/xeEXI3bdqE4OBg7VVGAIBALyd4OMpQ1X9KSAB4OMoQ6OVUn2URERERGQ2NWxo++eQTDBo0CJcvX0ZpaSlWr16Ny5cv49SpUzh69KguamzQzKQShA/1wZRv4yABKj28JgAIH+oDMylX14mIiIjU0XiFt2fPnoiPj0dpaSk6d+6MgwcPwtXVFTExMfD399dFjQ3eQF8PrBvbDe6OldsWhvp5YKCvhx6qIiIiIjIOGq/wAkCbNm2wceNGbddC1Rjo64H+Pu6ITcnG1YxchO+5DAC4lJYLQRDYP01ERERUBY1XePfv348DBw5Uun7gwAH89ttvWimK1DOTShDcxhkTengh6J+e3b/u5uPSnVw9V0ZERERkuDQOvLNnz0ZZWVml64IgYPbs2Vopimo2vGsz5dd7Lt7RYyVEREREhk3jwHvt2jX4+PhUuu7t7Y3r169rpSiq2SBfd1iYlbcx7Im/AzlPWiMiIiJSS+PA6+joiL/++qvS9evXr8PW1lYrRVHNGttaok/7JgCA9NxCxN7gSWtERERE6mgceIcPH44ZM2aonKp2/fp1vPPOOxg2bJjGBaxduxaenp6QyWQICgpCbGxsteN37twJb29vyGQydO7cGfv376805sqVKxg2bBgcHR1ha2uLJ598EqmpqRrXZuiGVWhr2B1/W4+VEBERERkujQPvsmXLYGtrC29vb3h5ecHLywsdO3aEs7Mzli9frtG9duzYgbCwMISHhyMuLg5dunRBSEgIMjMz1Y4/deoURo8ejddeew0XLlzAiBEjMGLECCQkJCjHJCcno2fPnvD29saRI0fwxx9/YN68eZDJTO8ksv4d3WBjaQYA2P9nOopKK/dWExERETV0Gm9L5ujoiFOnTiEqKgoXL16EtbU1/Pz80Lt3b40/fOXKlZg8eTImTpwIAFi/fj327duHzZs3q30AbvXq1Rg4cCBmzZoFAFi0aBGioqKwZs0arF+/HgDw4YcfYvDgwVi2bJnyfW3atNG4NmNgbWmGkE7u+OXCbeQ8KsGxq1no7+Om77KIiIiIDEqt9uGVSCQYMGAABgwYUOsPLi4uxvnz5zFnzhzlNalUin79+iEmJkbte2JiYhAWFqZyLSQkBLt27QIAyOVy7Nu3D++99x5CQkJw4cIFeHl5Yc6cORgxYkSVtRQVFaGoqEj5fW5u+TZfJSUlKCkpqdXPp3hfbd8v1hBfV/xyobydYVfc3+jbjkcM11V9zR1pF+fNeHHujBPnzXiZytxpUn+tAm90dDSio6ORmZkJuVyu8trmzZtF3SMrKwtlZWVwc1NdkXRzc0NiYqLa96Snp6sdn56eDgDIzMzEw4cPsWTJEnz00UdYunQpIiMj8cILL+Dw4cPo06eP2vsuXrwYERERla4fPHgQNjY2on6eqkRFRdXp/TUpkwO25mbIL5Xg4OU0/Lz3b8jMdPqRDYau5450g/NmvDh3xonzZryMfe4KCgpEj9U48EZERGDhwoUICAiAh4eHQZ3wpQjfw4cPx8yZMwEAXbt2xalTp7B+/foqA++cOXNUVo5zc3PRokULDBgwAA4ODrWqpaSkBFFRUejfvz8sLCxqdQ+xzgtX8F3sLZTIJTBr0RWDuzbV6eeZuvqcO9Iezpvx4twZJ86b8TKVuVP8i7wYGgfe9evXY8uWLRg3bpymb1Xh4uICMzMzZGRkqFzPyMiAu7u72ve4u7tXO97FxQXm5uaV9gnu2LEjTpw4UWUtVlZWsLKyqnTdwsKizn8QtHGPmjzfrTm+i70FANj7Zwb+82QrnX5eQ1Efc0fax3kzXpw748R5M17GPnea1K7xLg3FxcXo0aOHpm+rxNLSEv7+/oiOjlZek8vliI6ORnBwsNr3BAcHq4wHypfjFeMtLS3x5JNPIikpSWXM1atX0aqV6YbAbi0bo1kjawDAietZyHpYVMM7iIiIiBoOjQPv66+/jm3btmnlw8PCwrBx40Zs3boVV65cwZQpU5Cfn6/ctWH8+PEqD7VNnz4dkZGRWLFiBRITE7FgwQKcO3cOoaGhyjGzZs3Cjh07sHHjRly/fh1r1qzB3r178dZbb2mlZkMklUow/J82hjK5gP1/pum5IiIiIiLDoXFLQ2FhITZs2IDff/8dfn5+lZaTV65cKfpeo0aNwt27dzF//nykp6eja9euiIyMVD6YlpqaCqn0cSbv0aMHtm3bhrlz5+KDDz5Au3btsGvXLvj6+irHPP/881i/fj0WL16Mt99+Gx06dMBPP/2Enj17avqjGpXhXZvh/46UHwayO/4Oxgd76rcgIiIiIgOhceD9448/0LVrVwBQOfABQK0eYAsNDVVZoa3oyJEjla6NHDkSI0eOrPaekyZNwqRJkzSuxZh1cLeHt7s9EtPzcP7mfdzKLkALp7rtMEFERERkCjQOvIcPH9ZFHaQFw7o2RWJkef/ynot3MPXptnquiIiIiEj/NO7hJcM11O/xdmS7429DEAQ9VkNERERkGGp18MS5c+fwww8/IDU1FcXFxSqv/fzzz1opjDTXwskGAa0a49zN+7ia8RCJ6Xno6FG7fYSJiIiITIXGK7zbt29Hjx49cOXKFfzyyy8oKSnBpUuXcOjQITg6OuqiRtLA8K4VV3nv6LESIiIiIsOgceD95JNP8Nlnn2Hv3r2wtLTE6tWrkZiYiJdeegktW7bURY2kgSF+TWEuLX94cO/FO5DL2dZAREREDZvGgTc5ORlDhgwBUH7QQ35+PiQSCWbOnIkNGzZovUDSjJOtJXq1cwEA3H7wCKujryEm+R7KGHyJiIiogdI48DZu3Bh5eXkAgGbNmim3Jnvw4AEKCgq0Wx3ViqeLrfLr1dHXMHrjafRcegiRCTyQgoiIiBoejQNv7969ERUVBaB8T9zp06dj8uTJGD16NJ599lmtF0iaiUxIw5aTNypdT88pxJRv4xh6iYiIqMHReJeGNWvWoLCwEADw4YcfwsLCAqdOncKLL76IuXPnar1AEq9MLiBi72Woa14QAEgAROy9jP4+7jCTan5ICBEREZEx0jjwOjk5Kb+WSqWYPXu2Vgui2otNyUZaTmGVrwsA0nIKEZuSjeA2zvVXGBEREZEeiQq8ubm5cHBwUH5dHcU4qn+ZeVWH3dqMIyIiIjIFogJv48aNkZaWBldXVzRq1AgSSeV/DhcEARKJBGVlZVovksRxtZdpdRwRERGRKRAVeA8dOqRsZTh8+LBOC6LaC/RygoejDOk5hWr7eAHAw1GGQC+nKl4lIiIiMj2iAm+fPn0AAKWlpTh69CgmTZqE5s2b67Qw0pyZVILwoT6Y8m0cJIDa0DtnkDcfWCMiIqIGRaNtyczNzfHpp5+itLRUV/VQHQ309cC6sd3g7qi+beHvB4/quSIiIiIi/dJ4l4ZnnnkGR48ehaenpw7KIW0Y6OuB/j7uiE3JRmZeIYpL5Xjvxz8gAPi/w8l4KaAFXOys9F0mERERUb3QOPAOGjQIs2fPxp9//gl/f3/Y2tqqvD5s2DCtFUe1ZyaVqGw9duHWA2w7k4qHRaVY9ftVfDSisx6rIyIiIqo/Ggfet956CwCwcuXKSq9xlwbDNbNfe+y+cBv5xWX4PvYWXu3hibau9voui4iIiEjnND5aWC6XV/mLYddwNbG3wpS+bQCUn8i2eH+inisiIiIiqh8aB14yXq/1bA2Pfx5mi07MxKnrWXquiIiIiEj3NG5pAID8/HwcPXoUqampKC4uVnnt7bff1kphpH3WlmaYFdIBYT9cBAB8tO8K9k7ryW3KiIiIyKRpHHgvXLiAwYMHo6CgAPn5+XByckJWVhZsbGzg6urKwGvgRnRths0nU5BwOxeX03Lxc9zfGBnQQt9lEREREemMxi0NM2fOxNChQ3H//n1YW1vj9OnTuHnzJvz9/bF8+XJd1EhaJJVK8OFgH+X3yw8moaCY+yoTERGR6dI48MbHx+Odd96BVCqFmZkZioqK0KJFCyxbtgwffPCBLmokLQtu44x+Hd0AABm5Rdh0PEXPFRERERHpjsaB18LCAlJp+dtcXV2RmpoKAHB0dMStW7e0Wx3pzJzBj48YXn80GZm5hXquiIiIiEg3NA68TzzxBM6ePQsA6NOnD+bPn4/vvvsOM2bMgK+vr9YLJN1o08QOY4JaAgAKisvw/k9/YHf8bcQk30OZXNBzdURERETaIzrwKvbY/eSTT+Dh4QEA+Pjjj9G4cWNMmTIFd+/exYYNG3RTJenE9GfbQWZe/kfgcNJdTN8ej9EbT6Pn0kOITEjTc3VERERE2iE68DZr1gyzZ8+Gg4MDnn76aQDlLQ2RkZHIzc3F+fPn0aVLF50VStp39kY2Ckvlla6n5xRiyrdxDL1ERERkEkQH3qlTp+LHH39Ex44d0atXL2zZsgUFBQW6rI10qEwuIGLvZbWvKRoaIvZeZnsDERERGT3RgXfevHm4fv06oqOj0bp1a4SGhsLDwwOTJ0/GmTNndFkj6UBsSjbScqp+UE0AkJZTiNiU7PorioiIiEgHNH5orW/fvti6dSvS09OxYsUKXLlyBcHBwejUqRNWrlypixpJBzLzxO3KIHYcERERkaHSOPAq2NnZ4fXXX8eJEyewd+9epKenY9asWdqsjXTI1V6m1XFEREREhqrWgbegoABbtmxBnz59MGzYMDg7O+Pjjz/WZm2kQ4FeTvBwlEFSzRgPRxkCvZzqrSYiIiIiXdA48J46dQqvv/46PDw8MHXqVHh6euLw4cO4evUqZs+erYsaSQfMpBKEDy0/Yriq0Bs+1Ed5OAURERGRsRIdeJctW6bcoeHPP//Ep59+ivT0dGzduhW9e/fWZY2kIwN9PbBubDe4O1ZuW7AwkyDIy1kPVRERERFpl7nYgZ9++inGjh2LnTt38kQ1EzLQ1wP9fdwRm5KNzLxC7P8zDQcuZaCkTMC22FRMfbqtvkskIiIiqhPRgffOnTuwsLDQZS2kJ2ZSCYLblK/mPtGiMaIuZ0AuAFtO3cDrvbxgZW6m5wqJiIiIak90SwPDbsPQ0tkGIZ3cAQB384qwJ/6OnisiIiIiqpta79JApuv1Xq2VX//vRAoEgaetERERkfFi4KVK/Fs1RreWjQAAiel5OHE9S78FEREREdUBAy+pVXGVd+PxFD1WQkRERFQ3oh5ay83NFX1DBweHWhdDhiOkkztaOFnjVvYjHLt6F0npeejgbq/vsoiIiIg0JirwNmrUCBKJuAMIysrK6lQQGQYzqQSTnvJCxN7LAID/nfgLy/7TRc9VEREREWlOVOA9fPiw8usbN25g9uzZePXVVxEcHAwAiImJwdatW7F48WLdVEl6MTKgBVZGXUVeYSl2XbiDd0M6wNW+8iEVRERERIZMVODt06eP8uuFCxdi5cqVGD16tPLasGHD0LlzZ2zYsAETJkzQfpWkF3ZW5nglqCW+PPoXisvk+CbmJt4Z0EHfZRERERFpROOH1mJiYhAQEFDpekBAAGJjY7VSFBmOV3t4wlxa3s7y7embeFTMlhUiIiIyLhoH3hYtWmDjxo2Vrm/atAktWrTQSlFkODwcrfGcnwcA4H5BCX6K+1vPFRERERFpRvTRwgqfffYZXnzxRfz2228ICgoCAMTGxuLatWv46aeftF4g6d/rvVpj1z8nrm0+kYJXAltCKhX3ECMRERGRvmm8wjt48GBcvXoVQ4cORXZ2NrKzszF06FBcvXoVgwcP1kWNpGe+zRwR3NoZAPBXVj4OJWbquSIiIiIi8TRe4QXK2xo++eQTbddCBuz1Xl6I+eseAGDFwSTkF5fC1V6GQC8nmHG1l4iIiAxYrU5aO378OMaOHYsePXrg9u3bAIBvvvkGJ06c0GpxZDie7uAKNwcrAMCV9DxM3x6P0RtPo+fSQ4hMSNNzdURERERV0zjw/vTTTwgJCYG1tTXi4uJQVFQEAMjJyeGqrwk7eDkdGblFla6n5xRiyrdxDL1ERERksDQOvB999BHWr1+PjRs3wsLCQnn9qaeeQlxcnFaLI8NQJheUJ679m/DP/43YexllckHtGCIiIiJ90jjwJiUloXfv3pWuOzo64sGDB9qoiQxMbEo20nIKq3xdAJCWU4jYlGyV62VyATHJ97A7/jZiku8xEBMREZFeaPzQmru7O65fvw5PT0+V6ydOnEDr1q21VRcZkMy8qsNuRV8eS4YAAU96OiH6SgYi9l5WCcoejjKED/XBQF8PXZVKREREVInGgXfy5MmYPn06Nm/eDIlEgjt37iAmJgbvvvsu5s2bp4saSc9c7WWixh1JuosjSXchs5CisERe6XVFv++6sd0YeomIiKjeaBx4Z8+eDblcjmeffRYFBQXo3bs3rKys8O6772LatGm6qJH0LNDLCR6OMqTnFEJMU4K6sAuUtz5IUN7v29/HnduZERERUb3QuIdXIpHgww8/RHZ2NhISEnD69GncvXsXixYtqnURa9euhaenJ2QyGYKCghAbG1vt+J07d8Lb2xsymQydO3fG/v37qxz75ptvQiKRYNWqVbWur6Ezk0oQPtQHQHlgrUjyz68VI/2w+uWu6NHGudp7VdXvC7Dnl4iIiHSjVgdPAIClpSV8fHzqXMCOHTsQFhaG9evXIygoCKtWrUJISAiSkpLg6upaafypU6cwevRoLF68GM899xy2bduGESNGIC4uDr6+vipjf/nlF5w+fRpNmzatc50N3UBfD6wb261SX667mr7cU8n3arzf0shEzHuuI7q1bAyJRILIhDT2/BIREZFOaBx48/PzsWTJEkRHRyMzMxNyueo/X//1118a3W/lypWYPHkyJk6cCABYv3499u3bh82bN2P27NmVxq9evRoDBw7ErFmzAACLFi1CVFQU1qxZg/Xr1yvH3b59G9OmTcOBAwcwZMgQTX9MUmOgrwf6+7gjNiUbmXmFak9aE9vvG3/rAV5cFwO/5o7o1rIRtp66Waldgj2/REREpA0aB97XX38dR48exbhx4+Dh4QGJpPZ9mMXFxTh//jzmzJmjvCaVStGvXz/ExMSofU9MTAzCwsJUroWEhGDXrl3K7+VyOcaNG4dZs2ahU6dONdZRVFSkPEADAHJzcwEAJSUlKCkp0eRHUlK8r7bvN2QBLR0AOAAA5GWlkJc9fu2J5vZwd7BCRm5Rlf2+Ugmg6Fb44+8c/PF3jtpxj3t+L6FvO2eVYF0mF3Du5n1k5hXB1d4KAa0aa60n2JTnzpRx3owX5844cd6Ml6nMnSb1axx4f/vtN+zbtw9PPfWUpm+tJCsrC2VlZXBzc1O57ubmhsTERLXvSU9PVzs+PT1d+f3SpUthbm6Ot99+W1QdixcvRkRERKXrBw8ehI2Njah7VCUqKqpO7zdGg90l2JyraA+vGELLU+64tnKUyoGj6VL8nV99SC3v+S3Cmh2RaOdY/v6L9yT4+YYUD4ofv7eRpYAXPOXo4qy9vt+GOHemgPNmvDh3xonzZryMfe4KCgpEj9U48DZu3BhOTk6avq3enD9/HqtXr0ZcXJzo1ec5c+aorBrn5uaiRYsWGDBgABwcHGpVR0lJCaKiotC/f3+VE+kagsEAul3KwEf7E5Fe4ThiD0cZPhzkjZBO5f/BIggCPj+cjDWHa26DybJphVE9W+PirRx8FXOx0upxTrEEX101wxcvd1Hev7Ya8twZM86b8eLcGSfOm/EylblT/Iu8GBoH3kWLFmH+/PnYunVrnVc/XVxcYGZmhoyMDJXrGRkZcHd3V/sed3f3ascfP34cmZmZaNmypfL1srIyvPPOO1i1ahVu3LhR6Z5WVlawsrKqdN3CwqLOfxC0cQ9j9FzX5hjk16zafl8AeKqtq6jAu/3c39h+7m+YSSVqWyUU7Q8f/5aEQX7NtNLe0FDnzthx3owX5844cd6Ml7HPnSa1axx4V6xYgeTkZLi5ucHT07PSh8XFxYm+l6WlJfz9/REdHY0RI0YAKO+/jY6ORmhoqNr3BAcHIzo6GjNmzFBei4qKQnBwMABg3Lhx6Nevn8p7QkJCMG7cOOWDcVQ/zKQSBNewTZmme/xWt1VZxS3PavpcIiIiajg0DryKYKotYWFhmDBhAgICAhAYGIhVq1YhPz9fGU7Hjx+PZs2aYfHixQCA6dOno0+fPlixYgWGDBmC7du349y5c9iwYQMAwNnZGc7OqmHHwsIC7u7u6NChg1Zrp7pT7PE75ds4SACV0KtYo31nQHsUlwnYE38bN+7V3K8j9ihkIiIiahg0Drzh4eFaLWDUqFG4e/cu5s+fj/T0dHTt2hWRkZHKB9NSU1MhlT4+H6NHjx7Ytm0b5s6diw8++ADt2rXDrl27Ku3BS8ZD7B6/wa2dMXrj6RrvJ3ZrNCIiImoYan3whDaFhoZW2cJw5MiRStdGjhyJkSNHir6/ur5dMixi9vgV0/7g4Vj+PiIiIiIFUYHXyckJV69ehYuLCxo3blzt7gfZ2ZWPjCUSo6ae3+raHxQm92qttf14iYiIyDSICryfffYZ7O3tAQCrVq3SZT1E1aqq/UHhfydS8JyfB1wd2NZARERE5UQF3gkTJqj9mkgf/t3+4CCzwPKDibh0Jw+3HzzCpK1nseONYNhaGUTHDhEREelZnRJBYWEhiouLVa7V9qAGIk38u/2hUzMHPL/2FG4/eISE27kI3RaHjeMDYG4mreYuRERE1BBonAby8/MRGhoKV1dX2NraonHjxiq/iPTB1V6GLROfhIOs/L/hDifdxbzdlyAI2jtqmIiIiIyTxoH3vffew6FDh7Bu3TpYWVlh06ZNiIiIQNOmTfH111/rokYiUdq52WPD+ABY/rOq+31sKtYdTUaZXEBM8j3sjr+NmOR71R5eQURERKZH45aGvXv34uuvv0bfvn0xceJE9OrVC23btkWrVq3w3XffYcyYMbqok0iU7q2d8elIP0zfHg8AWBaZhA1H/8KDRyXKMR7/2t+XiIiITJvGK7zZ2dlo3bo1gPJ+XcU2ZD179sSxY8e0Wx1RLQzv2gyzQh6fqlcx7AJAek4hpnwbh8iEtPoujYiIiPRA48DbunVrpKSkAAC8vb3xww8/AChf+W3UqJFWiyOqrf/2bg1rSzO1rykaGiL2XmZ7AxERUQOgceCdOHEiLl68CACYPXs21q5dC5lMhpkzZ2LWrFlaL5CoNs7euI9HxWVVvi4ASMspRGwKD0ohIiIydRr38M6cOVP5db9+/ZCYmIjz58+jbdu28PPz02pxRLWVmVf5UIq6jCMiIiLjVeed+Vu1aoVWrVppoxYirXG1F3fSmthxREREZLxEBd7PP/9c9A3ffvvtWhdDpC2BXk7wcJQhPacQVXXpejjKEOjlVK91ERERUf0TFXg/++wzUTeTSCQMvGQQzKQShA/1wZRv4yAB1IZev+aOMJNK6rs0IiIiqmeiAq9iVwYiYzLQ1wPrxnZDxN7LSMup3Kt74FIGtp66gQk9POu/OCIiIqo3derhVRzbKpFwlYwM00BfD/T3cUdsSjYy8wrhai/D1cw8hO++BABYsPcS3ByseAgFERGRCdN4WzIA+N///gdfX1/IZDLIZDL4+vpi06ZN2q6NSCvMpBIEt3HG8K7NENzGGROCPTH16TYAAEEA3t4ej7M3uD0ZERGRqdI48M6fPx/Tp0/H0KFDsXPnTuzcuRNDhw7FzJkzMX/+fF3USKR17w7ogBe6NQMAFJfK8frWc7iemYcyuYAzKdk4nyXBmZRsHkxBRERkAjRuaVi3bh02btyI0aNHK68NGzYMfn5+mDZtGhYuXKjVAol0QSKRYOmLfribV4Tj17KQ86gEL60/DXMzCTLzigCY4etr5+DhKEP4UB+2PBARERkxjVd4S0pKEBAQUOm6v78/SktLtVIUUX2wMJNi3Vh/dGrqAADILij+J+w+lp5TiCnfxiEyIU0fJRIREZEWaBx4x40bh3Xr1lW6vmHDBowZM0YrRRHVFzsrc2yaEACzKp67VDQ0ROy9zPYGIiIiI1WrXRr+97//4eDBg+jevTsA4MyZM0hNTcX48eMRFhamHLdy5UrtVEmkQzeyClBWTZYVAKTlFCI2JRvBbZzrrS4iIiLSDo0Db0JCArp16wYASE5OBgC4uLjAxcUFCQkJynHcqoyMRWZe5T166zKOiIiIDIvGgffw4cO6qINIb1ztZVodR0RERIZF4x7eu3fvVvnan3/+WadiiPQh0MsJHo4yVPdvEh6OMgR6OdVbTURERKQ9Ggfezp07Y9++fZWuL1++HIGBgVopiqg+mUklCB/qAwBVht65QzrCTMo2HSIiImOkceANCwvDiy++iClTpuDRo0e4ffs2nn32WSxbtgzbtm3TRY1EOjfQ1wPrxnaDu6P6toU/bufUc0VERESkLRoH3vfeew8xMTE4fvw4/Pz84OfnBysrK/zxxx94/vnndVEjUb0Y6OuBE+8/g28nBWB8uzLMH+Kt3K7sy6N/ITIhXb8FEhERUa1oHHgBoG3btvD19cWNGzeQm5uLUaNGwd3dXdu1EdU7M6kEQV5O8HcRMK57S8x9zkf52rs7L+Kvuw/1WB0RERHVhsaB9+TJk/Dz88O1a9fwxx9/YN26dZg2bRpGjRqF+/fv66JGIr15tYcnnvMrP1b4YVEppnwbh4JinihIRERkTDQOvM888wxGjRqF06dPo2PHjnj99ddx4cIFpKamonPnzrqokUhvJBIJlr7oh7audgCApIw8fPhLAgSBp64REREZC40D78GDB7FkyRJYWFgor7Vp0wYnT57Ef//7X60WR2QIbK3MsX6sP2wtzQAAv1y4jW/PpOq5KiIiIhJL48Dbp08f9TeSSjFv3rw6F0RkiNq62mHZf7oov1+49xLO3chGTPI97I6/jZjkeyiTc9WXiIjIEIkOvIMHD0ZOzuOtmZYsWYIHDx4ov7937x58fHzUvJPINAzx88BrPb0AACVlAl76MgajN57G9O3xGL3xNHouPYTIhDQ9V0lERET/JjrwHjhwAEVFRcrvP/nkE2RnZyu/Ly0tRVJSknarIzIwswd5o00TWwDAvxd003MKMeXbOIZeIiIiAyM68P77IR0+tEMNkVQiQV6h+l0aFH8jIvZertTeUCYX2P5ARESkJ+b6LoDImMSmZCMzr6jK1wUAaTmF+OXC33ixW3NIJBJEJqQhYu9lpOUUKsd5OMoQPtQHA3096qFqIiKihk104JVIJJBIJJWuETUkmXmFNQ8C8O7OP/DpgSR4OtviTEp2pdcV7Q/rxnZj6CUiItIx0YFXEAS8+uqrsLKyAgAUFhbizTffhK1teT9jxf5eIlPlai8TPTYjtwgZuer/XggAJChvf+jv4w4z6eP/eCyTC/+sJBfC1V6GQC8nldeJiIhIM6ID74QJE1S+Hzt2bKUx48ePr3tFRAYs0MsJHo4ypOcUoqouXAeZObq2aITTf2WjuExe5b0U7Q8bjiZjXA9P2FmZs/2BiIhIB0QH3q+++kqXdRAZBTOpBOFDfTDl2zhIAJXQq1iDXfYfPwz09cBP52/hnZ1/1HjPpQeSsDzqKlo6WSMlq6DS62x/ICIiqhuND54gaugG+npg3dhucHdUbW9wd5SphNKmjWxE37NMLqgNu0D1uz8QERFRzbhLA1EtDPT1QH8f92p7bWtqf5AAaGRjgcGdPXA4KRN3HlT9QJyi/SE2JRvBbZy1/vMQERGZMq7wEtWSmVSC4DbOGN61GYLbOFd6sEzR/gA8bndQUHy/+IXO+Pj5znh/oLeoz/z7vvpVYCIiIqoaAy+RDoltfxC7+8PH+65gx9lUZWsDD7QgIiKqGVsaiHRMG+0PCg8eleD9n/7EVydvoL+PG348/zd3dCAiIqoBV3iJ6oE22h+6NHdUXktMz8MXh66rhF3g8Y4OkQlp2v4RiIiIjBYDL5GBqK79Yf3Ybtgd2hM//DcYfs0cqrwHd3QgIiKqjC0NRAakpvaHQC8nzB7UEa9sOlPlPbijAxERkSoGXiIDo2h/qMrdh+KO8b79oAAAAy8REREDL5GREbujw5L9iTCTSjC8SzNIpRKUyYVqH5wjIiIyVQy8REZG7I4OWfnFmLnjIjYeS8GzHV25owMRETVYfGiNyMiI2dHBx+Pxg22X03K5owMRETVoDLxERqimHR32T++F714PQqem9lXegzs6EBFRQ8GWBiIjVdOODk+1dcGHg324owMRETV4DLxERkxbOzpk5hXWPIiIiMhIsaWByISJ3dHhQEI68otKld+XyQXEJN/D7vjbiEm+x5YHIiIyagYReNeuXQtPT0/IZDIEBQUhNja22vE7d+6Et7c3ZDIZOnfujP379ytfKykpwfvvv4/OnTvD1tYWTZs2xfjx43Hnzh1d/xhEBkexo0NNm4/tT0hH/5VHcfBSOiIT0tBz6SGM3nga07fHY/TG0+i59BAfbiMiIqOl98C7Y8cOhIWFITw8HHFxcejSpQtCQkKQmZmpdvypU6cwevRovPbaa7hw4QJGjBiBESNGICEhAQBQUFCAuLg4zJs3D3Fxcfj555+RlJSEYcOG1eePRWQQxOzoYP5Pz++dnEK88c15vPltnEY7OmiyGqyrsURERNXRew/vypUrMXnyZEycOBEAsH79euzbtw+bN2/G7NmzK41fvXo1Bg4ciFmzZgEAFi1ahKioKKxZswbr16+Ho6MjoqKiVN6zZs0aBAYGIjU1FS1btqx0z6KiIhQVPe51zM3NBVC+WlxSUlKrn0vxvtq+n/TH1Obu2Q4u+OLlLvhofyLScx//OXd3tMKHg7zh7WGPBXuv4MT1e1XeQ0B5QI7Yewl92zkrH4w7cCmj8n0drDB3sDdCOrmp3ENXYxVMbd4aEs6dceK8GS9TmTtN6pcIgqC3ZZPi4mLY2Njgxx9/xIgRI5TXJ0yYgAcPHmD37t2V3tOyZUuEhYVhxowZymvh4eHYtWsXLl68qPZzfv/9dwwYMAAPHjyAg4NDpdcXLFiAiIiISte3bdsGGxsbzX8wIgMkF4DkXAlySwAHC6CNgwDFQWuCAPx2S4IDt81qvM/YNmV4wkXApfsSbL6q+EeiiuvH5f+TMqm9HF2cy7++eE83Y8X8bEREZJoKCgrwyiuvICcnR22+q0ivK7xZWVkoKyuDm5vqio2bmxsSExPVvic9PV3t+PT0dLXjCwsL8f7772P06NFV/mbMmTMHYWFhyu9zc3PRokULDBgwoMbfwKqUlJQgKioK/fv3h4WFRa3uQfrRUOdO/kcaDuz8s8Zx3yab4btkQFJloCx/4edbMvj6eUMqAX6OTwSg7r/Ey8fuuWON5/v7w9Jcio/+dxZAsdqxEgC/ZdjgvTG9VVaZF2uwGlwmF3Du5n1k5hXB1d4KAa0a84hlPWuof+eMHefNeJnK3Cn+RV4Mvbc06FJJSQleeuklCIKAdevWVTnOysoKVlZWla5bWFjU+Q+CNu5B+tHQ5s6jka3osQLKV4Wr8+BRCcJ+rDlAA0DWw2IMXRsj6nPTcoqw6eRN9PdxR2J6LmZsv1jpiOWM3CJM234R68Z2Uzk6OTIhDRF7L/OIZQPV0P7OmQrOm/Ey9rnTpHa9PrTm4uICMzMzZGRkqFzPyMiAu7u72ve4u7uLGq8Iuzdv3kRUVFStV2qJGgoxOzrYWZlhSGd3tGhsXW91qbP84FWErDqG6dvjK4Vd4J9ADmDe7kvIzi+GIAiITEjDFA0fyCMiItOg18BraWkJf39/REdHK6/J5XJER0cjODhY7XuCg4NVxgNAVFSUynhF2L127Rp+//13ODvzBCmimtS0o4MEwPKRXbB2jD+W/aeLqHuO7d4SY7tXflBUnd7tXdBDy6e93c0rQrdFUWj/4W9467u4KsMxoP6IZe4qQURkGvTe0hAWFoYJEyYgICAAgYGBWLVqFfLz85W7NowfPx7NmjXD4sWLAQDTp09Hnz59sGLFCgwZMgTbt2/HuXPnsGHDBgDlYfc///kP4uLi8Ouvv6KsrEzZ3+vk5ARLS0v9/KBERmCgrwfWje1W6Z/93f/1z/6K1eD0nEK1IVLyz3sihvkCAKKvZNY49qtXAwEAPZceqnIsADSytsC44FY4nXwPZ2/eF/VzldQQPhVHLG84loxxwZ6wszLXqP2BrRJERIZN74F31KhRuHv3LubPn4/09HR07doVkZGRygfTUlNTIZU+Xoju0aMHtm3bhrlz5+KDDz5Au3btsGvXLvj6lv8/1tu3b2PPnj0AgK5du6p81uHDh9G3b996+bmIjNVAXw/093FHbEo2MvMK4WovQ6CXk8qDXYrV4CnfxkECqIRTxajwoT7K92hz7JIXO2Ogrwdiku9h9MbTNf48nZs54N7DYtzJqfn45KWRSVh+8CqaN7bGzXsFlV5XtD9U7A1WtEr8O1KrG0tERPqh98ALAKGhoQgNDVX72pEjRypdGzlyJEaOHKl2vKenJ/S40xqRSTCTShBcQ3uB2NVgXY0Vu8q8a2pPxKZkiwrHQHlrgrqwCzwO4O/8cBGX03JhL7PAmkPXq2yVKN+7+DL6+7hzJwgiIj0yiMBLRMZJzGqwrsZqsspcUzgGgMY2Fhjc2QNHkjJx+0H1q8H5xWX4PPp69b85eNwqEZuSrfIfEGVyQdTvAxERaQcDLxHViZjVYF2NFbsaLCYcL36hvFVid/xtTN8eL6pGsdYduQ6JBHjS0wlRl9PZ70tEVM8YeInIqClWg2OuZ+Lg8TMY0CsIwW1dK62Yig3HrvYyUZ/7Xkh7FBSXYc3h5BrHHruWhWPXsmBnZY6HRaWVXq+u31fT1WCuHhMRVcbAS0RGz0wqQZCXE+5dERBUTcAT0yohtjf4v33aAgB+irtdbatERerCLlB1v6+muz9wtwgiIvX0ug8vEVF9U7RKDO/aDMFtnCuF45r2IwYe9waL2bt45UtdsPrlrgj0bFxtXYp+31c2xmDt4ev49EAi3tTgoIzaHKzBvYOJqKHgCi8R0b/oageK2Bs17xt8JuU+zqRUPU4RSef8/CfsrMzhYG0BawszzN99SaPdIjRdDWarBBEZMwZeIiI1tL2rhNjeYLHuF5Rg7P9iRY1VrB5/eiAJPdo442pGHj7ad6XSuKp6idkqQUTGjoGXiKgK2txVQmxv8FevPoltsan4OuZm7YquxvqjyVh/tOqH7BR1zdt1CT3bNoGdzLxWB2twNZiIDA0DLxFRPRC7b7C3hwMG+XqICrxDuzRFI2sL3MjKx/HrWVqr9e7DIvguOAB3Bytk55fotFWCiKg+8KE1IqJ6ouj3dXdUbW9wd5SprJQqVoOrWhOVoDxErhrVFYtG+GLLpMBqxwPlB2uED/VBfx9X0fWm5xahuExe5euKVokvj17H3/cL8Nufmj84R0RUH7jCS0RUj7R9ipzY8YqDNbzdHRB1ObPGOtu62iLtQSHyi8tqHLvswFUsO3C10mcrVHfMcplcwJmUbJzPksA5JVvtHspERHXFFV4ionpW09ZogPjVYE3Hi109PjCjDzZNeFKjn6u6Tc0qHrOsEJmQhp5LD2Hs5nP4+poZxm4+h55LD3ElmIi0jiu8REQGSpOdIsSO12T1uKYH7QCgkbUFRgW2wMlrWUi4k1vjzzR9+wUM8fOAjaUZ/u9wskYPwxER1RYDLxGRAdNkpwix48XuHSwmHC95sbxVIqb9PYzeeLrG+jLzivDVyRtVvl5T+wN3fyCi2mDgJSJqgMSuHosNx2JWgy3MJCgtE2o8hrli+4MivPOgDCKqCwZeIqIGSuzqsbZaJb4Y/QSC27hg9e9XsbmaVV6FlQeTMLGnF4pK5QjbES+6/YFboxHRv/GhNSIiqpG2HrRztLZAfx93UZ959uZ9vPVdHGaqCbvA41AdsfcyyuTl3ykOyuDWaERUEVd4iYhIa8SsBotpf6hqi7N/U7Q/PLviCBrZWODyndxabY3G9gci08bAS0REWlVTq4SY9ofPR3eFo7UlNhz7CydEnCJ3414BcK/6MYpwfOhKBvp3Kl9lZm8wUcPAwEtERPVO7MNwFmZSUYHXTApUcyicije+OY9urRqjWSMZ9lys3OLA3mAi08PAS0REeqFof4i5nomDx89gQK+gSiet1dT+IEF5SD7x/jM489c9vLLpTI2fKwA4f/M+zt+s+vV/tz8oeoO5bzCRceJDa0REpDdmUgmCvJzg7yIgSE17gKL9AUCl0+H+fVBGUGvnak+RAwBbKzO0aWJbY12K9of+K4/ija/PIuyHi6IfnFMokwuISb6H3fG3EZN8r9LrRFR/uMJLREQGTZsHZawY2QUDfT3w1YkURPx6ucbP/isrH39l5Vc7Rhv7BhORbjHwEhGRwdP2QRneHg6iPlfsbhEAsOr3q8jO90RhaRneVbMizPYHIv1h4CUiIqOgzYMyxPYGH363Lw5eTsfb38fX+LlnUrJxJiW7yter2xqNiHSLPbxERGRyajooQ2xvsMzCDEM6N62xN1isiu0PRFR/GHiJiKhBEnMyHFBzOJYA+Pzlrtg6KRB92ruI+uzMvMKaBxGR1rClgYiIGixt9wZbmklx9GrN+wZHXc5A99bOcHMoD9s80IJItxh4iYioQavP3mCFX/9Iw8FLGXjRvxk6ujtg3dFknvZGpEMMvERERCLV5dhkBXOpBKVyAcVlcnwfe0vtfXjaG5F2sYeXiIhIi6rqDfZwlGH92G44NecZvNmnDWwtzaq8h/DPrwV7LikPrFCc9lYx7AKPw3FkQuVjknn4BVE5rvASERFpWU3tD7MHeSPAszFe33qu2vuk5xYh6OPf4dvMAWdv3K/ytDd1251xNZjoMa7wEhER6UBNW6PlF5WKuk9WfjGOXM1CfnFZlWMU252d/usegNqtBhOZMq7wEhER6YGrvazmQQCsLaR4VCIXNfbVr2LRwc0eyXfzNVoNBvgwHJk2Bl4iIiI9EHva2/H3nsaBS+mYuu1CjfcsKROQcCe32jEVD79QPIDH9gcydWxpICIi0gOxp72Zm0kx0NejxtPeZOZSeDrbiP78BXsuYfXv17Aq6irbH8jkMfASERHpiTZPe1v1clccmfU0tk58UtRnJ2Xk4bPfr2JV9LUq2x+A8vaHf+/uUCYXcCYlG+ezJDiTks3dH8jgsaWBiIhIj7R92lvPdk1qPPxCKgHEZFRF+8PRpEw809ENwL/bH8zw9bVzbH8gg8fAS0REpGfaPO2tusMvFKPWvtINvs0c8eWxZHx7OrXGz33t63Pwa94IbvZWOHg5o9LrVR2UAfBhODIMDLxERERGREw4FrsaPKRzU1GBVxCAi7ceVP06tLMXMMMx6QoDLxERkQkSsxpc004RAGBjaYamjjJcv5tf7ecp2h9WRiVhVEBLXLqTg7e+i6t0Xx6bTPrAh9aIiIhMVE2HX4h5GG7lS13w+zt98dEIX1GfufZwMnp/ehhTt1UOu4D6h+F4bDLpGld4iYiIGjCx7Q9tmthpdN/q8qdiNXjatjh0auaIDcf+0umxyWyVIAZeIiKiBk4b7Q8SAI1tLTGueytEXkpHUnpejZ+7PyEd+xPSqx2jCMdzf/kT3ds441Z2AZYfvFppnLZaJRiOTRMDLxEREdX4MJyY3R8+ed4XA3090L21M0ZvPK3V+r4/ewvfn71V5euKemb//Cca21iiWWNrXEh9gLe/v8A+YmIPLxEREYkj9qAMxWpwVeuiEgBN7K2w/Y3umNmvnVZrfFBQglEbTqPn0sOYpibsAuXhWACwYE/d+ojJeHCFl4iIiERTtD/EXM/EweNnMKBXEILbumq8F/Ci4Z3QvbUznvR0wvazt6rdKcLZzhLhz/ngUGImdsXf0drPkp5biCcWRqFNExtcSc/TqI9YgS0QxoGBl4iIiDRiJpUgyMsJ964ICKoi4Il9GE5MOP54RHmrRBN7majAG9LJDWk5hfjj75wax+YWluDCrerHKfqIY1OyVdo+2AJhPBh4iYiISCe0fWyymAfn3B1l+L8x/ohNyRbVR9zI2gIPHpWI+nne++kihvo1Rc92Lrj3sAhvfx8vuj+Y9IuBl4iIiHSmvo9NDh/qAzOpRHQ4PvH+Mzhx7S4mfHW2xhpvZT/C/x1Jxv8dSa5yTHUtEGx/0B8GXiIiIjII2jw2WZNw3LNdkxpPnDOXSlAq8nALdS0Q3B5Nvxh4iYiIyKhou1VCTDhe88oT6NaqMU5ez8K2M6k4e+N+jXVuP5sKFztLXM98qNNjlhmOa8bAS0REREZHm60SinFiwvHzTzSHu4O1qP7g3fF3sDv+DqQSiN4BQrE9mi7D8ZmUbJzPksA5JbvSDhumioGXiIiITJq2w3FN/cH/JuaY5YGrjqKxjSXi/86pMhwDQPieS+jX0Q3mZtI6hmMzfH3tXIPZVYKBl4iIiOgfYsKxqP7gYT4okwM/nLsl6pjla5n5APJrHJeRWwTveZFo1kiGtJyiasPxgj2Xax2OAdNqlWDgJSIiItKQ2BYIHw8HrR+zXCoXcDP7UY3j0nML0X7ub3C0tkBuYalGB2uYWh+xQRwtvHbtWnh6ekImkyEoKAixsbHVjt+5cye8vb0hk8nQuXNn7N+/X+V1QRAwf/58eHh4wNraGv369cO1a9d0+SMQERFRAzPQ1wMn3n8G30/ujtUvd8X3k7vjxPvPqARCMccsezjKcO2jQdg66UlRn9uisTVk5uIinFwA7heUKI9QVkfRVrHuyHXczy/W+JjlyIQ09Fx6CKM3nsb07fEYvfE0ei49ZFDHMes98O7YsQNhYWEIDw9HXFwcunTpgpCQEGRmZqodf+rUKYwePRqvvfYaLly4gBEjRmDEiBFISEhQjlm2bBk+//xzrF+/HmfOnIGtrS1CQkJQWFio9p5EREREtaFogRjetRmC2zhXWtVUtD8AqBR6K26PZmEuRc+2TUSF4yOznsZXEwNF1efpbAMnWwtRY5cfvIonFkUhdNuFalslIvZeVgZoTcOxvug98K5cuRKTJ0/GxIkT4ePjg/Xr18PGxgabN29WO3716tUYOHAgZs2ahY4dO2LRokXo1q0b1qxZA6B8dXfVqlWYO3cuhg8fDj8/P3z99de4c+cOdu3aVY8/GREREdHj9gd3R5nKdXdHmUrvrNhwXPFgjZrCcfQ7fbH2FX+N6q1uv2HFavCb35zH8gOJeO/HP0SHY33Saw9vcXExzp8/jzlz5iivSaVS9OvXDzExMWrfExMTg7CwMJVrISEhyjCbkpKC9PR09OvXT/m6o6MjgoKCEBMTg5dffrnSPYuKilBUVKT8Pjc3FwBQUlKCkhJxxw3+m+J9tX0/6Q/nzjhx3owX5844cd4082wHF/Rt1wvnbt5HZl4RXO2tENCqMcykEpXfw2c7uOCLl7vgo/2JSM99nE3cHa3w4SBvPNvBRTn+w0EdMG37xSofnPtwUAfIy0rxRHN7uDtYISNX/UNuANDYxgLDu3ggOvEubt2vuT846koGoq5kVDtGEY5jrmciyMupxntqSpM/e3oNvFlZWSgrK4Obm5vKdTc3NyQmJqp9T3p6utrx6enpytcV16oa82+LFy9GREREpesHDx6EjY2NuB+mClFRUXV6P+kP5844cd6MF+fOOHHeNGcG4B6AA1eqHvO+D5CcK0FuCeBgAbRxyEfZzfPYf1N13MT2Evx8Q4oHxY/Xeh0tBbzgKVcZP9hdgs25in/Yr7guXB6Bn29eiC74C3YeEqy5b1bXH1HFweNncO+K9ld5CwoKRI/lLg0A5syZo7JqnJubixYtWmDAgAFwcHCo1T1LSkoQFRWF/v37w8JCXO8MGQbOnXHivBkvzp1x4rwZhsEA3pMLaleO/z2u26WMSivHHo4yfDjIGyGdyhcKy+QCflxxrMrVYAkAF3tLrH25K87evI9PD9a8KcCAXkE6WeFV/Iu8GHoNvC4uLjAzM0NGhuqSeEZGBtzd3dW+x93dvdrxiv+bkZEBDw8PlTFdu3ZVe08rKytYWVlVum5hYVHnv8TauAfpB+fOOHHejBfnzjhx3vTPAkDP9m41jnuua3MM8muGmOuZOHj8DAb0Cqp00poFgAXDOlW7x/Ci4b4IbNME/l4u+PbMrSoP4JCgvE9ZV6e5afLnTq8PrVlaWsLf3x/R0dHKa3K5HNHR0QgODlb7nuDgYJXxQPk/pyjGe3l5wd3dXWVMbm4uzpw5U+U9iYiIiBoCM6kEQV5O8HcREFTFXrm6eMhO3/Te0hAWFoYJEyYgICAAgYGBWLVqFfLz8zFx4kQAwPjx49GsWTMsXrwYADB9+nT06dMHK1aswJAhQ7B9+3acO3cOGzZsAABIJBLMmDEDH330Edq1awcvLy/MmzcPTZs2xYgRI/T1YxIREREZDbHHLIs9gEPf9B54R40ahbt372L+/PlIT09H165dERkZqXzoLDU1FVLp44XoHj16YNu2bZg7dy4++OADtGvXDrt27YKvr69yzHvvvYf8/Hy88cYbePDgAXr27InIyEjIZLJKn09ERERElYk5ZhkQH471Se+BFwBCQ0MRGhqq9rUjR45UujZy5EiMHDmyyvtJJBIsXLgQCxcu1FaJRERERFQFseFYX/R+8AQRERERkS4x8BIRERGRSWPgJSIiIiKTxsBLRERERCaNgZeIiIiITBoDLxERERGZNAZeIiIiIjJpDLxEREREZNIYeImIiIjIpDHwEhEREZFJM4ijhQ2NIAgAgNzc3Frfo6SkBAUFBcjNzYWFhYW2SqN6wLkzTpw348W5M06cN+NlKnOnyGmK3FYdBl418vLyAAAtWrTQcyVEREREVJ28vDw4OjpWO0YiiInFDYxcLsedO3dgb28PiURSq3vk5uaiRYsWuHXrFhwcHLRcIekS5844cd6MF+fOOHHejJepzJ0gCMjLy0PTpk0hlVbfpcsVXjWkUimaN2+ulXs5ODgY9R+mhoxzZ5w4b8aLc2ecOG/GyxTmrqaVXQU+tEZEREREJo2Bl4iIiIhMGgOvjlhZWSE8PBxWVlb6LoU0xLkzTpw348W5M06cN+PVEOeOD60RERERkUnjCi8RERERmTQGXiIiIiIyaQy8RERERGTSGHiJiIiIyKQx8OrI2rVr4enpCZlMhqCgIMTGxuq7JKrg2LFjGDp0KJo2bQqJRIJdu3apvC4IAubPnw8PDw9YW1ujX79+uHbtmn6KJaXFixfjySefhL29PVxdXTFixAgkJSWpjCksLMTUqVPh7OwMOzs7vPjii8jIyNBTxaSwbt06+Pn5KTe6Dw4Oxm+//aZ8nfNmHJYsWQKJRIIZM2Yor3HuDNOCBQsgkUhUfnl7eytfb2jzxsCrAzt27EBYWBjCw8MRFxeHLl26ICQkBJmZmfoujf6Rn5+PLl26YO3atWpfX7ZsGT7//HOsX78eZ86cga2tLUJCQlBYWFjPlVJFR48exdSpU3H69GlERUWhpKQEAwYMQH5+vnLMzJkzsXfvXuzcuRNHjx7FnTt38MILL+ixagKA5s2bY8mSJTh//jzOnTuHZ555BsOHD8elS5cAcN6MwdmzZ/Hll1/Cz89P5TrnznB16tQJaWlpyl8nTpxQvtbg5k0grQsMDBSmTp2q/L6srExo2rSpsHjxYj1WRVUBIPzyyy/K7+VyueDu7i58+umnymsPHjwQrKyshO+//14PFVJVMjMzBQDC0aNHBUEonycLCwth586dyjFXrlwRAAgxMTH6KpOq0LhxY2HTpk2cNyOQl5cntGvXToiKihL69OkjTJ8+XRAE/p0zZOHh4UKXLl3UvtYQ540rvFpWXFyM8+fPo1+/fsprUqkU/fr1Q0xMjB4rI7FSUlKQnp6uMoeOjo4ICgriHBqYnJwcAICTkxMA4Pz58ygpKVGZO29vb7Rs2ZJzZ0DKysqwfft25OfnIzg4mPNmBKZOnYohQ4aozBHAv3OG7tq1a2jatClat26NMWPGIDU1FUDDnDdzfRdgarKyslBWVgY3NzeV625ubkhMTNRTVaSJ9PR0AFA7h4rXSP/kcjlmzJiBp556Cr6+vgDK587S0hKNGjVSGcu5Mwx//vkngoODUVhYCDs7O/zyyy/w8fFBfHw8582Abd++HXFxcTh79myl1/h3znAFBQVhy5Yt6NChA9LS0hAREYFevXohISGhQc4bAy8RGaWpU6ciISFBpSeNDFuHDh0QHx+PnJwc/Pjjj5gwYQKOHj2q77KoGrdu3cL06dMRFRUFmUym73JIA4MGDVJ+7efnh6CgILRq1Qo//PADrK2t9ViZfrClQctcXFxgZmZW6UnHjIwMuLu766kq0oRinjiHhis0NBS//vorDh8+jObNmyuvu7u7o7i4GA8ePFAZz7kzDJaWlmjbti38/f2xePFidOnSBatXr+a8GbDz588jMzMT3bp1g7m5OczNzXH06FF8/vnnMDc3h5ubG+fOSDRq1Ajt27fH9evXG+TfOQZeLbO0tIS/vz+io6OV1+RyOaKjoxEcHKzHykgsLy8vuLu7q8xhbm4uzpw5wznUM0EQEBoail9++QWHDh2Cl5eXyuv+/v6wsLBQmbukpCSkpqZy7gyQXC5HUVER582APfvss/jzzz8RHx+v/BUQEIAxY8Yov+bcGYeHDx8iOTkZHh4eDfLvHFsadCAsLAwTJkxAQEAAAgMDsWrVKuTn52PixIn6Lo3+8fDhQ1y/fl35fUpKCuLj4+Hk5ISWLVtixowZ+Oijj9CuXTt4eXlh3rx5aNq0KUaMGKG/oglTp07Ftm3bsHv3btjb2yt7zRwdHWFtbQ1HR0e89tprCAsLg5OTExwcHDBt2jQEBweje/fueq6+YZszZw4GDRqEli1bIi8vD9u2bcORI0dw4MABzpsBs7e3V/bIK9ja2sLZ2Vl5nXNnmN59910MHToUrVq1wp07dxAeHg4zMzOMHj26Yf6d0/c2Eabqiy++EFq2bClYWloKgYGBwunTp/VdElVw+PBhAUClXxMmTBAEoXxrsnnz5glubm6ClZWV8OyzzwpJSUn6LZrUzhkA4auvvlKOefTokfDWW28JjRs3FmxsbITnn39eSEtL01/RJAiCIEyaNElo1aqVYGlpKTRp0kR49tlnhYMHDypf57wZj4rbkgkC585QjRo1SvDw8BAsLS2FZs2aCaNGjRKuX7+ufL2hzZtEEARBT1mbiIiIiEjn2MNLRERERCaNgZeIiIiITBoDLxERERGZNAZeIiIiIjJpDLxEREREZNIYeImIiIjIpDHwEhEREZFJY+AlIiIiIpPGwEtEBMDT0xOrVq3S2v1effVVrR9FfeTIEUgkEjx48ECr9yUiMnUMvERkUl599VVIJBJIJBJYWlqibdu2WLhwIUpLS6t939mzZ/HGG29orY7Vq1djy5YtWrufJi5cuICRI0fCzc0NMpkM7dq1w+TJk3H16lW91GOotP0fOURkuBh4icjkDBw4EGlpabh27RreeecdLFiwAJ9++qnascXFxQCAJk2awMbGRms1ODo6olGjRlq7n1i//vorunfvjqKiInz33Xe4cuUKvv32Wzg6OmLevHn1Xg8RkSFg4CUik2NlZQV3d3e0atUKU6ZMQb9+/bBnzx4Aj1sNPv74YzRt2hQdOnQAUHm1TyKRYNOmTXj++edhY2ODdu3aKe+hcOnSJTz33HNwcHCAvb09evXqheTkZJXPUejbty9CQ0MRGhoKR0dHuLi4YN68eRAEQTnmm2++QUBAAOzt7eHu7o5XXnkFmZmZon/ugoICTJw4EYMHD8aePXvQr18/eHl5ISgoCMuXL8eXX36pHHv06FEEBgbCysoKHh4emD17tsoqeN++fTFt2jTMmDEDjRs3hpubGzZu3Ij8/HxMnDgR9vb2aNu2LX777TflexQtF/v27YOfnx9kMhm6d++OhIQElTp/+ukndOrUCVZWVvD09MSKFStUXvf09MQnn3yCSZMmwd7eHi1btsSGDRtUxty6dQsvvfQSGjVqBCcnJwwfPhw3btxQvq74/V++fDk8PDzg7OyMqVOnoqSkRPnz3bx5EzNnzlT+iwARmS4GXiIyedbW1sqVXACIjo5GUlISoqKi8Ouvv1b5voiICLz00kv4448/MHjwYIwZMwbZ2dkAgNu3b6N3796wsrLCoUOHcP78eUyaNKna1omtW7fC3NwcsbGxWL16NVauXIlNmzYpXy8pKcGiRYtw8eJF7Nq1Czdu3MCrr74q+uc8cOAAsrKy8N5776l9XbHifPv2bQwePBhPPvkkLl68iHXr1uF///sfPvroo0r1uri4IDY2FtOmTcOUKVMwcuRI9OjRA3FxcRgwYADGjRuHgoIClffNmjULK1aswNmzZ9GkSRMMHTpUGTTPnz+Pl156CS+//DL+/PNPLFiwAPPmzavU/rFixQoEBATgwoULeOuttzBlyhQkJSUpf59CQkJgb2+P48eP4+TJk7Czs8PAgQNV5vnw4cNITk7G4cOHsXXrVmzZskX5OT///DOaN2+OhQsXIi0tDWlpaaJ/n4nICAlERCZkwoQJwvDhwwVBEAS5XC5ERUUJVlZWwrvvvqt83c3NTSgqKlJ5X6tWrYTPPvtM+T0AYe7cucrvHz58KAAQfvvtN0EQBGHOnDmCl5eXUFxcXGMdgiAIffr0ETp27CjI5XLltffff1/o2LFjlT/L2bNnBQBCXl6eIAiCcPjwYQGAcP/+fbXjly5dKgAQsrOzq7ynIAjCBx98IHTo0EGllrVr1wp2dnZCWVmZst6ePXsqXy8tLRVsbW2FcePGKa+lpaUJAISYmBiV+rZv364cc+/ePcHa2lrYsWOHIAiC8Morrwj9+/dXqWfWrFmCj4+P8vtWrVoJY8eOVX4vl8sFV1dXYd26dYIgCMI333xTqf6ioiLB2tpaOHDggCAI5b//rVq1EkpLS5VjRo4cKYwaNUrlcyrOORGZLq7wEpHJ+fXXX2FnZweZTIZBgwZh1KhRWLBggfL1zp07w9LSssb7+Pn5Kb+2tbWFg4ODssUgPj4evXr1goWFhei6unfvrvJP58HBwbh27RrKysoAlK9+Dh06FC1btoS9vT369OkDAEhNTRV1f6FCe0R1rly5guDgYJVannrqKTx8+BB///238lrFn9/MzAzOzs7o3Lmz8pqbmxsAVGq7CA4OVn7t5OSEDh064MqVK8rPfuqpp1TGP/XUUyq/D//+bIlEAnd3d+XnXLx4EdevX4e9vT3s7OxgZ2cHJycnFBYWKltKAKBTp04wMzNTfu/h4aFRiwgRmQ5zfRdARKRtTz/9NNatWwdLS0s0bdoU5uaq/1Nna2sr6j7/DrMSiQRyuRxAeZuENuXn5yMkJAQhISH47rvv0KRJE6SmpiIkJETln+mr0759ewBAYmKiSuisLXU/f8VrisCs+D3Rpup+7x8+fAh/f3989913ld7XpEkTUfcgooaFK7xEZHJsbW3Rtm1btGzZslLY1RY/Pz8cP35c2ZsqxpkzZ1S+P336NNq1awczMzMkJibi3r17WLJkCXr16gVvb2+NVyMHDBgAFxcXLFu2TO3riv17O3bsiJiYGJUV4ZMnT8Le3h7NmzfX6DPVOX36tPLr+/fv4+rVq+jYsaPys0+ePKky/uTJk2jfvr3Kamx1unXrhmvXrsHV1RVt27ZV+eXo6Ci6TktLS5VVZSIyXQy8RES1EBoaitzcXLz88ss4d+4crl27hm+++Ub5YJU6qampCAsLQ1JSEr7//nt88cUXmD59OgCgZcuWsLS0xBdffIG//voLe/bswaJFizSqydbWFps2bcK+ffswbNgw/P7777hx4wbOnTuH9957D2+++SYA4K233sKtW7cwbdo0JCYmYvfu3QgPD0dYWBik0rr/v4WFCxciOjoaCQkJePXVV+Hi4qLcseKdd95BdHQ0Fi1ahKtXr2Lr1q1Ys2YN3n33XdH3HzNmDFxcXDB8+HAcP34cKSkpOHLkCN5++22VloyaeHp64tixY7h9+zaysrI0/TGJyIgw8BIR1YKzszMOHTqEhw8fok+fPvD398fGjRur7ekdP348Hj16hMDAQEydOhXTp09XHnbRpEkTbNmyBTt37oSPjw+WLFmC5cuXa1zX8OHDcerUKVhYWOCVV16Bt7c3Ro8ejZycHOUuDM2aNcP+/fsRGxuLLl264M0338Rrr72GuXPn1u4341+WLFmC6dOnw9/fH+np6di7d6+yZ7pbt2744YcfsH37dvj6+mL+/PlYuHChRrtR2NjY4NixY2jZsiVeeOEFdOzYEa+99hoKCwvh4OAg+j4LFy7EjRs30KZNG5VWCCIyPRJB7FMORERUa3379kXXrl1N+mSvI0eO4Omnn8b9+/f1cugGEVFVuMJLRERERCaNgZeIiIiITBpbGoiIiIjIpHGFl4iIiIhMGgMvEREREZk0Bl4iIiIiMmkMvERERERk0hh4iYiIiMikMfASERERkUlj4CUiIiIik8bAS0REREQm7f8Bwg53zx0EpRsAAAAASUVORK5CYII=\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "\n", + "original_cols = clean_data.columns.tolist()\n", + "\n", + "\n", + "scaler = StandardScaler()\n", + "scaled_data = scaler.fit_transform(clean_data)\n", + "\n", + "pca = PCA(n_components=11)\n", + "pca_results = pca.fit_transform(scaled_data)\n", + "\n", + "\n", + "loadings = pd.DataFrame(\n", + " pca.components_.T,\n", + " index=original_cols,\n", + " columns=[f'PC{i+1}' for i in range(pca.n_components_)]\n", + ")\n", + "\n", + "pca_df = pd.DataFrame(\n", + " pca_results,\n", + " columns=[f'PC{i+1}' for i in range(pca.n_components_)]\n", + ")\n", + "\n", + "pca_df" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 423 + }, + "id": "TbJfFcNOxAuE", + "outputId": "52ec37c1-672c-4caf-cc78-ec82d4fb5d29" + }, + "execution_count": 27, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " PC1 PC2 PC3 PC4 PC5 PC6 PC7 \\\n", + "0 -3.723992 2.175499 -5.383260 1.065929 0.036783 -4.908704 4.595037 \n", + "1 -1.128337 -0.236868 0.225100 0.140209 -0.022191 0.583782 0.770186 \n", + "2 -2.389770 1.702824 -0.532143 1.760444 -0.035687 2.017621 -1.348992 \n", + "3 -2.418202 1.658665 -0.520389 1.796203 -0.036110 2.025573 -1.330234 \n", + "4 -1.969372 -0.184898 0.593758 -0.613873 0.037860 -4.085190 0.063095 \n", + "... ... ... ... ... ... ... ... \n", + "2101045 -0.974288 -0.380524 0.794261 0.404978 -0.025433 -0.058525 1.139989 \n", + "2101046 -1.021527 -0.412733 0.719908 0.390706 -0.028549 -0.056192 1.185932 \n", + "2101047 -0.937448 -0.323654 0.987150 0.506737 -0.020650 -0.033201 1.101129 \n", + "2101048 -1.033260 -0.521294 0.602451 0.306990 -0.029109 -0.066948 1.242623 \n", + "2101049 -0.935129 -0.341127 0.969916 0.478948 -0.020031 -0.028237 1.132847 \n", + "\n", + " PC8 PC9 PC10 PC11 \n", + "0 -4.437244 8.249801 4.604563 25.136816 \n", + "1 -1.312394 -1.203949 0.629475 -0.212604 \n", + "2 1.683002 0.251769 -1.169499 -0.436427 \n", + "3 1.665306 0.387826 -0.726483 -0.629101 \n", + "4 0.356921 1.489301 -1.986591 -1.983543 \n", + "... ... ... ... ... \n", + "2101045 -1.691462 0.753095 -0.578761 -1.179430 \n", + "2101046 -1.785440 0.504943 -0.936178 -1.023495 \n", + "2101047 -1.583732 1.316418 0.626102 -1.733167 \n", + "2101048 -1.906180 0.070453 -1.656210 -0.612906 \n", + "2101049 -1.651293 1.088288 0.280861 -1.541376 \n", + "\n", + "[2101050 rows x 11 columns]" + ], + "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", + "
PC1PC2PC3PC4PC5PC6PC7PC8PC9PC10PC11
0-3.7239922.175499-5.3832601.0659290.036783-4.9087044.595037-4.4372448.2498014.60456325.136816
1-1.128337-0.2368680.2251000.140209-0.0221910.5837820.770186-1.312394-1.2039490.629475-0.212604
2-2.3897701.702824-0.5321431.760444-0.0356872.017621-1.3489921.6830020.251769-1.169499-0.436427
3-2.4182021.658665-0.5203891.796203-0.0361102.025573-1.3302341.6653060.387826-0.726483-0.629101
4-1.969372-0.1848980.593758-0.6138730.037860-4.0851900.0630950.3569211.489301-1.986591-1.983543
....................................
2101045-0.974288-0.3805240.7942610.404978-0.025433-0.0585251.139989-1.6914620.753095-0.578761-1.179430
2101046-1.021527-0.4127330.7199080.390706-0.028549-0.0561921.185932-1.7854400.504943-0.936178-1.023495
2101047-0.937448-0.3236540.9871500.506737-0.020650-0.0332011.101129-1.5837321.3164180.626102-1.733167
2101048-1.033260-0.5212940.6024510.306990-0.029109-0.0669481.242623-1.9061800.070453-1.656210-0.612906
2101049-0.935129-0.3411270.9699160.478948-0.020031-0.0282371.132847-1.6512931.0882880.280861-1.541376
\n", + "

2101050 rows × 11 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + " \n", + " \n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "dataframe", + "variable_name": "pca_df" + } + }, + "metadata": {}, + "execution_count": 27 + } + ] + }, + { + "cell_type": "code", + "source": [ + "pca_data_cat = pd.concat([final_merged[categorical_cols].reset_index(drop=True), pca_df], axis=1)" + ], + "metadata": { + "id": "ufSBSH_cx_bE" + }, + "execution_count": 34, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "all_pca_data = pd.concat([final_merged.reset_index(drop=True), pca_df], axis=1)" + ], + "metadata": { + "id": "lB7tm7vSybtV" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "pca_data_cat" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 634 + }, + "id": "Zio-jpO2mQhq", + "outputId": "696619c7-9723-4152-f352-7f207cd5ed2b" + }, + "execution_count": 35, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " status city state zip_code prev_sold_date \\\n", + "0 for_sale Berlin New York 12022 NaN \n", + "1 for_sale McCormick South Carolina 29835 NaN \n", + "2 for_sale Claverack New York 12521 2021-11-24 \n", + "3 for_sale Copake New York 12521 2018-02-01 \n", + "4 for_sale Copake New York 12516 NaN \n", + "... ... ... ... ... ... \n", + "2101045 sold Richland Washington 99354 2022-03-25 \n", + "2101046 sold Richland Washington 99354 2022-03-25 \n", + "2101047 sold Richland Washington 99354 2022-03-24 \n", + "2101048 sold Richland Washington 99354 2022-03-24 \n", + "2101049 sold Richland Washington 99354 2022-03-23 \n", + "\n", + " GEO_ID NAME H1_001N zip_name PC1 \\\n", + "0 860Z200US12022 ZCTA5 12022 399 berlin, ny -3.723992 \n", + "1 860Z200US29835 ZCTA5 29835 3740 mc cormick, sc -1.128337 \n", + "2 860Z200US12521 ZCTA5 12521 1115 craryville, ny -2.389770 \n", + "3 860Z200US12521 ZCTA5 12521 1115 craryville, ny -2.418202 \n", + "4 860Z200US12516 ZCTA5 12516 1026 copake, ny -1.969372 \n", + "... ... ... ... ... ... \n", + "2101045 860Z200US99354 ZCTA5 99354 10666 richland, wa -0.974288 \n", + "2101046 860Z200US99354 ZCTA5 99354 10666 richland, wa -1.021527 \n", + "2101047 860Z200US99354 ZCTA5 99354 10666 richland, wa -0.937448 \n", + "2101048 860Z200US99354 ZCTA5 99354 10666 richland, wa -1.033260 \n", + "2101049 860Z200US99354 ZCTA5 99354 10666 richland, wa -0.935129 \n", + "\n", + " PC2 PC3 PC4 PC5 PC6 PC7 PC8 \\\n", + "0 2.175499 -5.383260 1.065929 0.036783 -4.908704 4.595037 -4.437244 \n", + "1 -0.236868 0.225100 0.140209 -0.022191 0.583782 0.770186 -1.312394 \n", + "2 1.702824 -0.532143 1.760444 -0.035687 2.017621 -1.348992 1.683002 \n", + "3 1.658665 -0.520389 1.796203 -0.036110 2.025573 -1.330234 1.665306 \n", + "4 -0.184898 0.593758 -0.613873 0.037860 -4.085190 0.063095 0.356921 \n", + "... ... ... ... ... ... ... ... \n", + "2101045 -0.380524 0.794261 0.404978 -0.025433 -0.058525 1.139989 -1.691462 \n", + "2101046 -0.412733 0.719908 0.390706 -0.028549 -0.056192 1.185932 -1.785440 \n", + "2101047 -0.323654 0.987150 0.506737 -0.020650 -0.033201 1.101129 -1.583732 \n", + "2101048 -0.521294 0.602451 0.306990 -0.029109 -0.066948 1.242623 -1.906180 \n", + "2101049 -0.341127 0.969916 0.478948 -0.020031 -0.028237 1.132847 -1.651293 \n", + "\n", + " PC9 PC10 PC11 \n", + "0 8.249801 4.604563 25.136816 \n", + "1 -1.203949 0.629475 -0.212604 \n", + "2 0.251769 -1.169499 -0.436427 \n", + "3 0.387826 -0.726483 -0.629101 \n", + "4 1.489301 -1.986591 -1.983543 \n", + "... ... ... ... \n", + "2101045 0.753095 -0.578761 -1.179430 \n", + "2101046 0.504943 -0.936178 -1.023495 \n", + "2101047 1.316418 0.626102 -1.733167 \n", + "2101048 0.070453 -1.656210 -0.612906 \n", + "2101049 1.088288 0.280861 -1.541376 \n", + "\n", + "[2101050 rows x 20 columns]" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
statuscitystatezip_codeprev_sold_dateGEO_IDNAMEH1_001Nzip_namePC1PC2PC3PC4PC5PC6PC7PC8PC9PC10PC11
0for_saleBerlinNew York12022NaN860Z200US12022ZCTA5 12022399berlin, ny-3.7239922.175499-5.3832601.0659290.036783-4.9087044.595037-4.4372448.2498014.60456325.136816
1for_saleMcCormickSouth Carolina29835NaN860Z200US29835ZCTA5 298353740mc cormick, sc-1.128337-0.2368680.2251000.140209-0.0221910.5837820.770186-1.312394-1.2039490.629475-0.212604
2for_saleClaverackNew York125212021-11-24860Z200US12521ZCTA5 125211115craryville, ny-2.3897701.702824-0.5321431.760444-0.0356872.017621-1.3489921.6830020.251769-1.169499-0.436427
3for_saleCopakeNew York125212018-02-01860Z200US12521ZCTA5 125211115craryville, ny-2.4182021.658665-0.5203891.796203-0.0361102.025573-1.3302341.6653060.387826-0.726483-0.629101
4for_saleCopakeNew York12516NaN860Z200US12516ZCTA5 125161026copake, ny-1.969372-0.1848980.593758-0.6138730.037860-4.0851900.0630950.3569211.489301-1.986591-1.983543
...............................................................
2101045soldRichlandWashington993542022-03-25860Z200US99354ZCTA5 9935410666richland, wa-0.974288-0.3805240.7942610.404978-0.025433-0.0585251.139989-1.6914620.753095-0.578761-1.179430
2101046soldRichlandWashington993542022-03-25860Z200US99354ZCTA5 9935410666richland, wa-1.021527-0.4127330.7199080.390706-0.028549-0.0561921.185932-1.7854400.504943-0.936178-1.023495
2101047soldRichlandWashington993542022-03-24860Z200US99354ZCTA5 9935410666richland, wa-0.937448-0.3236540.9871500.506737-0.020650-0.0332011.101129-1.5837321.3164180.626102-1.733167
2101048soldRichlandWashington993542022-03-24860Z200US99354ZCTA5 9935410666richland, wa-1.033260-0.5212940.6024510.306990-0.029109-0.0669481.242623-1.9061800.070453-1.656210-0.612906
2101049soldRichlandWashington993542022-03-23860Z200US99354ZCTA5 9935410666richland, wa-0.935129-0.3411270.9699160.478948-0.020031-0.0282371.132847-1.6512931.0882880.280861-1.541376
\n", + "

2101050 rows × 20 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + " \n", + " \n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "dataframe", + "variable_name": "pca_data_cat" + } + }, + "metadata": {}, + "execution_count": 35 + } + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "itSDkipKxm4h" + }, + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file