diff --git a/samples/04_gis_analysts_data_scientists/finding_a_new_home.ipynb b/samples/04_gis_analysts_data_scientists/finding_a_new_home.ipynb index 64c7fa7886..a2ab4a0165 100644 --- a/samples/04_gis_analysts_data_scientists/finding_a_new_home.ipynb +++ b/samples/04_gis_analysts_data_scientists/finding_a_new_home.ipynb @@ -25,7 +25,7 @@ "The notebook is divided into two parts. In the first part, we will calculate the following:\n", "- Percentage of decrease/increase in house price since Mark and Lisa bought their home.\n", "- Suggested selling price for their home.\n", - "- Whether their zip code is a buyer’s market or seller’s market.\n", + "- Whether their zip code is a buyer market or seller market.\n", "- Average number of days it takes for homes to sell in their neighbourhood.\n", "\n", "In the second part of the notebook, we will explore the investment potential of homes close to their work places. Based on how much a person is willing to spend commuting to work, we will create a drive-time buffer. This will narrow down the search areas. Zillow also provides data for market health and projected home value appreciation. Visualizing the zip codes by their market health will help them focus only on areas with good market health. Hence they will get a list of areas to choose from, for buying their new home." @@ -61,22 +61,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Selling your home\n", - "\n", - "Execute the following command to install the openpyxl library if not already. This package is used to read from any Excel or CSV files.\n", - "```\n", - "!pip install openpyxl\n", - "```" + "## Selling your home" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Also, when `matplotlib` is not present, run the following command to have it installed or upgraded:\n", + "Execute the following command to install the `openpyxl` library if not already. This package is used to read from any Excel or CSV files.\n", "```\n", - "import sys \n", - "!{sys.executable} -m pip install matplotlib\n", + "!pip install openpyxl\n", "```" ] }, @@ -84,98 +78,23 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Determine an appropriate selling price" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "1) Download home sales time series data from Zillow at www.zillow.com/research/data.\n", - "> Mark and Lisa have a 3-bedroom home, so we will select the **ZHVI 3-Bedroom time-series ($) ** data set at the ZIP Code level." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "2) Prepare the Excel data as follows:\n", - "\n", - "> a) Using Excel, open the **.csv** file.\n", - "\n", - "> Notice that the **RegionName** field has ZIP Codes as numbers (if we sort the **RegionName** field we will notice the ZIP Codes for Massachusetts, for example, don't have leading zeros; 01001 is 1001). Also, notice the median home value columns are named using the year and month. The first data available is for April 1996 (**1996-04**).\n", - "> b) Copy all the column headings and the one record with data for their ZIP Code to a new Excel sheet." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "> Apply a filter to the **RegionName** field. Mark and Lisa live in Crestline, California, so we will apply a filter for the 92325 ZIP Code." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "> c) Select (highlight) fields starting with the month and year when they bought their home and continuing to the last month and year column in the Excel table. So, for example, since Mark and Lisa bought their home in December 2007, they highlight the the two rows from column **2007-01** to column **2018-08**.\n", - "\n", - "> d) Copy (press Ctrl+C) the selected data and paste it, along with the column headings, to a new Excel sheet using **Paste Transposed** (right-click in the first cell of the new sheet to see the paste options; select **Paste Transposed**).\n", - "This gives two columns of data.\n", - "\n", - "> e) The first column has date values but only includes the year and month. In column **C**, create a proper date field.\n", - "\n", - "> * Right-click column C and format the cells to be category **date**.\n", - "> * In the first cell of column C, enter the following formula: **= DATEVALUE(CONCATENATE(A1, \"-01\"))**\n", - "> * Drag the Autofill handle down to the last data cell in the column.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "> f) Insert a top row and type the column headings:\n", - "\n", - "> **YYYYMM, Value, and date**." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "> g) Rename the Excel sheet (probably called Sheet2 at present) something like AveSellingPrice and delete the other sheets (the first sheet contains a large amount of data that we won't be using further in the workflow).\n", - " \n", - "> Mark and Lisa named their price Excel sheet **CrestlineAveSellingPrice**.\n", - "\n", - "> h) Save this new sheet as an Excel workbook.\n", - "\n", - "> Mark and Lisa named their Excel file **Crestline3BdrmAveSellingPrice.xlsx**." + "Also, when `matplotlib` is not present, run the following command to have it installed or upgraded:\n", + "```\n", + "import sys \n", + "!{sys.executable} -m pip install matplotlib\n", + "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "3) Connect to your ArcGIS Online organization." + "Then, connect to your ArcGIS Online organization, and import necessary libraries." ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -199,19 +118,19 @@ "metadata": {}, "outputs": [], "source": [ - "gis = GIS('home')" + "gis = GIS(profile=\"your_online_profile\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Use the boolean `has_arcpy` to flag whether `arcpy` is present on the local environement:" + "Use the boolean `has_arcpy` to flag whether `arcpy` is present on the local environement." ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -220,7 +139,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -244,12 +163,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "4) Load the excel file for analysis." + "Load the csv collection from ArcGIS Online for analysis, and download it as a zip file to the temporary folder. We will explain how these files created in the following sections." ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -265,9 +184,9 @@ "
\n", " finding_a_new_home\n", " \n", - "
CSV Collection by api_data_owner\n", + "

CSV Collection by api_data_owner\n", "
Last Modified: March 17, 2021\n", - "
0 comments, 46 views\n", + "
0 comments, 147 views\n", "
\n", " \n", " " @@ -276,19 +195,19 @@ "" ] }, - "execution_count": 4, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "data = gis.content.search('finding_a_new_home owner:api_data_owner type: csv collection')[0]\n", + "data = gis.content.search('finding_a_new_home owner:api_data_owner type: csv collection', outside_org= True)[0]\n", "data" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -297,7 +216,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": { "scrolled": true }, @@ -312,16 +231,16 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "WindowsPath('C:/Users/pri10421/AppData/Local/Temp/finding_a_new_home')" + "WindowsPath('C:/Users/shu12142/AppData/Local/Temp/1/finding_a_new_home')" ] }, - "execution_count": 7, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -333,19 +252,19 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "['C:\\\\Users\\\\pri10421\\\\AppData\\\\Local\\\\Temp\\\\finding_a_new_home\\\\BuyerSellerIndex.xlsx',\n", - " 'C:\\\\Users\\\\pri10421\\\\AppData\\\\Local\\\\Temp\\\\finding_a_new_home\\\\Crestline3BdrmAveSellingPrice.xlsx',\n", - " 'C:\\\\Users\\\\pri10421\\\\AppData\\\\Local\\\\Temp\\\\finding_a_new_home\\\\ImportantPlaces.xlsx',\n", - " 'C:\\\\Users\\\\pri10421\\\\AppData\\\\Local\\\\Temp\\\\finding_a_new_home\\\\MarketHealthIndex.xlsx']" + "['C:\\\\Users\\\\shu12142\\\\AppData\\\\Local\\\\Temp\\\\1\\\\finding_a_new_home\\\\BuyerSellerIndex.xlsx',\n", + " 'C:\\\\Users\\\\shu12142\\\\AppData\\\\Local\\\\Temp\\\\1\\\\finding_a_new_home\\\\Crestline3BdrmAveSellingPrice.xlsx',\n", + " 'C:\\\\Users\\\\shu12142\\\\AppData\\\\Local\\\\Temp\\\\1\\\\finding_a_new_home\\\\ImportantPlaces.xlsx',\n", + " 'C:\\\\Users\\\\shu12142\\\\AppData\\\\Local\\\\Temp\\\\1\\\\finding_a_new_home\\\\MarketHealthIndex.xlsx']" ] }, - "execution_count": 8, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -355,9 +274,110 @@ "datapath" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Determine an appropriate selling price" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this section, we will use **Crestline3BdrmAveSellingPrice.xlsx** for selling price analysis. The folloing steps are how we get **Crestline3BdrmAveSellingPrice.xlsx** prepared from open source:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1) Download home sales time series data from Zillow at www.zillow.com/research/data.\n", + "> Mark and Lisa have a 3-bedroom home, so we will select the **ZHVI 3-Bedroom time-series ($) ** data set at the ZIP Code level." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2) Prepare the Excel data:\n", + "\n", + "> a) Using Excel, open the **.csv** file.\n", + "\n", + "> Notice that the **RegionName** field has ZIP Codes as numbers (if we sort the **RegionName** field we will notice the ZIP Codes for Massachusetts, for example, don't have leading zeros; 01001 is 1001). Also, notice the median home value columns are named using the year and month. The first data available is for April 1996 (**1996-04**).\n", + "\n", + "> b) Copy all the column headings and the one record with data for their ZIP Code to a new Excel sheet." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> Apply a filter to the **RegionName** field. Mark and Lisa live in Crestline, California, so we will apply a filter for the 92325 ZIP Code." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> c) Select (highlight) fields starting with the month and year when they bought their home and continuing to the last month and year column in the Excel table. So, for example, since Mark and Lisa bought their home in December 2007, they highlight the the two rows from column **2007-01** to column **2018-08**.\n", + "\n", + "> d) Copy (press Ctrl+C) the selected data and paste it, along with the column headings, to a new Excel sheet using **Paste Transposed** (right-click in the first cell of the new sheet to see the paste options; select **Paste Transposed**).\n", + "This gives two columns of data.\n", + "\n", + "> e) The first column has date values but only includes the year and month. In column **C**, create a proper date field.\n", + "\n", + "> * Right-click column C and format the cells to be category **date**.\n", + "> * In the first cell of column C, enter the following formula: **= DATEVALUE(CONCATENATE(A1, \"-01\"))**\n", + "> * Drag the Autofill handle down to the last data cell in the column.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> f) Insert a top row and type the column headings:\n", + "\n", + "> **YYYYMM, Value, and date**." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> g) Rename the Excel sheet (probably called Sheet2 at present) something like AveSellingPrice and delete the other sheets (the first sheet contains a large amount of data that we won't be using further in the workflow).\n", + " \n", + "> Mark and Lisa named their price Excel sheet **CrestlineAveSellingPrice**.\n", + "\n", + "> h) Save this new sheet as an Excel workbook.\n", + "\n", + "> Mark and Lisa named their Excel file **Crestline3BdrmAveSellingPrice.xlsx**." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "3) Read the **Crestline3BdrmAveSellingPrice** excel data from local `datapath`, and restructure it as a Dataframe." + ] + }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -367,7 +387,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -440,7 +460,7 @@ "4 2007-05 284000 2007-05-01" ] }, - "execution_count": 10, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -451,7 +471,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -524,7 +544,7 @@ "139 2018-08 254900 2018-08-01" ] }, - "execution_count": 11, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -535,7 +555,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -544,7 +564,7 @@ "(140, 3)" ] }, - "execution_count": 12, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -553,9 +573,16 @@ "data1.shape" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following line of code adds three columns (year, month, day) by applying `lambda` function to each row. The `lambda` function creates `pandas Series` for each row to store the year, month, day separately. " + ] + }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -565,7 +592,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -656,7 +683,7 @@ "4 2007-05 284000 2007-05-01 2007 05 01" ] }, - "execution_count": 14, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -665,45 +692,132 @@ "data1.head()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will also use `unique()` method to check the unique years, and create a new pandas Dataframe by calling `groupby` method that groups `data1` house **value** column by year and performs mean operation. The new Dataframe will illustrate the mean house value of each year." + ] + }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 17, "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014',\n", + " '2015', '2016', '2017', '2018'], dtype=object)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data1.year.unique()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ - "grpby_data1 = data1.groupby(['year']).mean()" + "grpby_data1 = data1.groupby(['year']).mean(numeric_only=True)" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 19, "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
value
year
2007276616.666667
2008221875.000000
2009188391.666667
2010176216.666667
2011154766.666667
\n", + "
" + ], "text/plain": [ - "pandas.core.frame.DataFrame" + " value\n", + "year \n", + "2007 276616.666667\n", + "2008 221875.000000\n", + "2009 188391.666667\n", + "2010 176216.666667\n", + "2011 154766.666667" ] }, - "execution_count": 16, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "type(grpby_data1)" + "grpby_data1.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "5) We will Create a graph showing how average home prices have changed since they bought their home." + "4) Create a graph using `matplotlib` library to show how average home prices have changed since they bought their home." ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -712,7 +826,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -779,7 +893,7 @@ "4 2011 154766.666667" ] }, - "execution_count": 18, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -790,7 +904,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -811,7 +925,7 @@ "Name: value, dtype: float64" ] }, - "execution_count": 19, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -822,7 +936,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -843,7 +957,7 @@ "Name: year, dtype: object" ] }, - "execution_count": 20, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -854,7 +968,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -863,13 +977,13 @@ "Text(0, 0.5, 'average house price')" ] }, - "execution_count": 21, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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pAkePnyI6OhoSKVS7N2792V+fFqMjY2xcuVKTJw4Eb1798bo0aO55RaaNm2KuXPnvvJ7VFiwYAH27NmDN998E++99x58fX1RWFiIK1eu4LfffsO9e/deeAqmZcuWmDx5Ms6fPw97e3v8/PPPyMjIwKZNm14qk1QqxZdffokpU6agc+fOGDNmDBo1aoRLly6hqKgImzdvrvafRX5+PpydnfHWW2/Bx8cHFhYWOHLkCM6fP681ulqVZs2aoU2bNjhy5AgmTZrEbT937hzGjx+Pxo0bo1+/fti6davW67p168b9jvn5+eHtt9/G4sWLkZmZCQ8PD2zevBn37t2rNJL62WefoVu3bujduzemTZuGBw8eYO3atejfvz8GDBhQKd/OnTuhUqmqPA34PLWV//Lly9w/Tm7fvg25XI7/+7//A1A+t3LQoEEAgJCQEGzatAmDBg3CBx98ADc3N8TExGD79u14/fXX4efnp3XcyMhIuLq60lILhoqnqxEJ0Xu5ubls4sSJzMbGhllYWLDAwEB248YN5ubmxiZMmFCp/tatW9xl1idPnqzymBkZGSw4OJi5uLgwY2Nj5uDgwPr168e+//57ruZ5q5mXlJSw+fPnM0dHR2Zqasq6d+/OYmNjWe/evVnv3r21au/evcuCgoKYqakps7W1ZfPnz2e///47A8DOnDmjVRsfH8+GDx/OGjduzCQSCXNzc2MjR45kR48efe7P6FlZk5OTGQC2adMmre07d+5kHTp0YBKJhFlbW7OxY8eyBw8eaNVMmDCBmZubV3qv3r17s9atW1fa7ubmxoKCgrS25efns8WLFzMPDw8mFouZjY0N69atG1uzZg23kvazVBzv0KFDrF27dkwikTAvL69Kn7FiSYXz589XOsbTyy1U2LNnD+vWrRszNTVlUqmUdenShW3fvl2r5kV/FqWlpWzBggXMx8eHWVpaMnNzc+bj41PtpQm++OILZmFhobWUR0XeZz2e/nMsLi5mH374IXNwcGASiYR17tyZHTx4sMr3O3HiBOvWrRszMTFhtra2LDg4mCkUiipru3btyuzs7CotX/EitZX/ecd9+u+AGzdusLfeeov7b9vNzY19+OGHrLCwUKtOrVYzR0dHtmTJEp0+I6k/BIy95OxSQki9s27dOsydOxcPHjxAkyZN+I6jl5o2bYo2bdporZhvSORyOZo1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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -889,14 +1003,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "7) Determine an appropriate selling price based on home sales trends as follows:\n", + "5) Determine an appropriate selling price based on home sales trends as follows:\n", "\n", "> a) Determine the current average selling price and the average selling price when they bought their home. Divide the current average price by the beginning average price to see how much homes in their ZIP Code have appreciated or depreciated. When Mark and Lisa bought their home in December of 2007, 3-bedroom homes were selling for \\$276,617. " ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -905,7 +1019,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -916,7 +1030,7 @@ "Name: 0, dtype: object" ] }, - "execution_count": 23, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -927,7 +1041,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ @@ -936,7 +1050,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -947,7 +1061,7 @@ "Name: 11, dtype: object" ] }, - "execution_count": 25, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -958,7 +1072,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 29, "metadata": {}, "outputs": [], "source": [ @@ -967,7 +1081,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -976,7 +1090,7 @@ "0.9110983912755316" ] }, - "execution_count": 27, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -1001,7 +1115,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 31, "metadata": {}, "outputs": [ { @@ -1010,13 +1124,13 @@ "343134.83912755316" ] }, - "execution_count": 28, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "(price_initial.value + 100000)*house_worth" + "(price_initial.value + 100000) * house_worth" ] }, { @@ -1030,7 +1144,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "If their home is part of a seller's market, they are more likely to get their asking price." + "If their home is part of a seller's market, they are more likely to get their asking price. In this section, **BuyerSellerIndex.xlsx** data is being used for local real estate market analysis. The folloing steps are how we get **BuyerSellerIndex.xlsx** prepared from open source data:" ] }, { @@ -1074,12 +1188,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "3) Load the excel file for analysis" + "3) Read the **BuyerSellerIndex** excel data from local `datapath`, and restructure it as Dataframe." ] }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 32, "metadata": {}, "outputs": [], "source": [ @@ -1224,7 +1338,7 @@ "4 1020 " ] }, - "execution_count": 30, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -1235,7 +1349,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 34, "metadata": {}, "outputs": [ { @@ -1255,7 +1369,7 @@ "dtype: object" ] }, - "execution_count": 31, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } @@ -1266,7 +1380,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 35, "metadata": {}, "outputs": [ { @@ -1278,7 +1392,7 @@ " dtype='object')" ] }, - "execution_count": 32, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -1296,7 +1410,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 36, "metadata": {}, "outputs": [], "source": [ @@ -1305,7 +1419,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 37, "metadata": {}, "outputs": [], "source": [ @@ -1322,7 +1436,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 38, "metadata": {}, "outputs": [], "source": [ @@ -1331,7 +1445,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 39, "metadata": {}, "outputs": [ { @@ -1340,7 +1454,7 @@ "35.0" ] }, - "execution_count": 36, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } @@ -1351,7 +1465,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 40, "metadata": {}, "outputs": [ { @@ -1360,7 +1474,7 @@ "294.5" ] }, - "execution_count": 37, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } @@ -1371,7 +1485,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 41, "metadata": {}, "outputs": [ { @@ -1444,7 +1558,7 @@ "7399 0.080000 35.0 98043" ] }, - "execution_count": 38, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } @@ -1455,7 +1569,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 42, "metadata": {}, "outputs": [ { @@ -1528,7 +1642,7 @@ "753 6.000000 294.5 8403" ] }, - "execution_count": 39, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" } @@ -1546,7 +1660,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 43, "metadata": {}, "outputs": [], "source": [ @@ -1555,8 +1669,10 @@ }, { "cell_type": "code", - "execution_count": 41, - "metadata": {}, + "execution_count": 44, + "metadata": { + "scrolled": true + }, "outputs": [ { "data": { @@ -1697,7 +1813,7 @@ "1609 9.150552 19152 " ] }, - "execution_count": 41, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } @@ -1708,7 +1824,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 45, "metadata": {}, "outputs": [ { @@ -1843,7 +1959,7 @@ "1224 10.0 9.033149 13104 " ] }, - "execution_count": 42, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } @@ -1854,7 +1970,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 46, "metadata": {}, "outputs": [ { @@ -1863,7 +1979,7 @@ "0.017123288" ] }, - "execution_count": 43, + "execution_count": 46, "metadata": {}, "output_type": "execute_result" } @@ -1874,7 +1990,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 47, "metadata": {}, "outputs": [ { @@ -1883,7 +1999,7 @@ "10.0" ] }, - "execution_count": 44, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } @@ -1901,7 +2017,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 48, "metadata": {}, "outputs": [ { @@ -1946,7 +2062,7 @@ "6888 9.622642 79.0 92325" ] }, - "execution_count": 45, + "execution_count": 48, "metadata": {}, "output_type": "execute_result" } @@ -1964,7 +2080,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 49, "metadata": { "scrolled": true }, @@ -1973,7 +2089,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\pri10421\\AppData\\Local\\Temp\\ipykernel_17192\\3169181311.py:1: SettingWithCopyWarning: \n", + "C:\\Users\\shu12142\\AppData\\Local\\Temp\\1\\ipykernel_26008\\3169181311.py:1: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", @@ -1987,7 +2103,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 50, "metadata": {}, "outputs": [ { @@ -1996,7 +2112,7 @@ "(7548, 3)" ] }, - "execution_count": 47, + "execution_count": 50, "metadata": {}, "output_type": "execute_result" } @@ -2007,7 +2123,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 51, "metadata": {}, "outputs": [ { @@ -2019,7 +2135,7 @@ "dtype: object" ] }, - "execution_count": 48, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" } @@ -2030,7 +2146,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 52, "metadata": {}, "outputs": [], "source": [ @@ -2039,7 +2155,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 53, "metadata": {}, "outputs": [ { @@ -2051,7 +2167,7 @@ "dtype: object" ] }, - "execution_count": 50, + "execution_count": 53, "metadata": {}, "output_type": "execute_result" } @@ -2064,17 +2180,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "6) Search for the **United States ZIP Code Boundaries 2017** layer. We can specify the owner's name to get more specific results. To search for content from the Living Atlas, or content shared by other users on ArcGIS Online, set outside_org=True" + "6) Search for the **United States ZIP Code Boundaries 2017** layer. We can specify the owner's name to get more specific results. To search for content from the Living Atlas, or content shared by other users on ArcGIS Online, set `outside_org=True`." ] }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 54, "metadata": {}, "outputs": [], "source": [ - "items = gis.content.search('United States ZIP Code Boundaries 2021 owner: esri_dm',\n", - " outside_org=True)" + "items = gis.content.search('United States ZIP Code Boundaries 2021 owner: esri_dm', outside_org=True)" ] }, { @@ -2086,7 +2201,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 55, "metadata": { "scrolled": true }, @@ -2097,16 +2212,16 @@ "
\n", " \n", "\n", "
\n", " USA ZIP Code Boundaries\n", " \n", - "
U.S. ZIP Code Boundaries provides ZIP Code, postal district name, population, and area for the ZIP Code areas in the United States.Feature Layer Collection by esri_dm\n", - "
Last Modified: October 14, 2022\n", - "
0 comments, 215574910 views\n", + "
U.S. ZIP Code Boundaries provides ZIP Code, postal district name, population, and area for the ZIP Code areas in the United States.
Feature Layer Collection by esri_dm\n", + "
Last Modified: August 19, 2024\n", + "
0 comments, 216842598 views\n", "
\n", "
\n", " " @@ -2131,9 +2246,9 @@ "
\n", " United States ZIP Code Boundaries 2021\n", " \n", - "
This layer shows the ZIP Code level boundaries of United States in 2021, designed to be used in Data Enrichment analysis.Feature Layer Collection by esri_dm\n", - "
Last Modified: September 14, 2022\n", - "
2 comments, 27023 views\n", + "
This layer shows the ZIP Code level boundaries of United States in 2021, designed to be used in Data Enrichment analysis.
Feature Layer Collection by esri_dm\n", + "
Last Modified: May 30, 2023\n", + "
2 comments, 119769 views\n", "
\n", " \n", " " @@ -2150,23 +2265,23 @@ "text/html": [ "
\n", " \n", "\n", "
\n", - " United States County Boundaries 2018\n", + " USA ZIP Code Areas\n", " \n", - "
This layer shows the County level boundaries of United States in 2018. The boundaries are optimized to improve Data Enrichment analysis performance.Feature Layer Collection by esri_dm\n", - "
Last Modified: August 17, 2021\n", - "
0 comments, 16998 views\n", + "
U.S. ZIP Code Areas provides ZIP Code, postal district name, population, and area for the ZIP Code areas in the United States.
Layer Package by esri_dm\n", + "
Last Modified: December 20, 2023\n", + "
0 comments, 227691 views\n", "
\n", "
\n", " " ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2177,23 +2292,23 @@ "text/html": [ "
\n", " \n", "\n", "
\n", - " United States State Boundaries 2018\n", + " USA ZIP Code Three-Digit Areas\n", " \n", - "
This layer shows the State level boundaries of United States in 2018. The boundaries are optimized to improve Data Enrichment analysis performance.Feature Layer Collection by esri_dm\n", - "
Last Modified: August 17, 2021\n", - "
1 comments, 1978667 views\n", + "
USA ZIP Code Three-Digit Areas provides the three-digit ZIP Code areas in the United States.
Layer Package by esri_dm\n", + "
Last Modified: December 20, 2023\n", + "
0 comments, 24768 views\n", "
\n", "
\n", " " ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2204,23 +2319,23 @@ "text/html": [ "
\n", " \n", "\n", "
\n", - " USA ZIP Code Areas\n", + " United States County Boundaries 2021\n", " \n", - "
U.S. ZIP Code Areas provides ZIP Code, postal district name, population, and area for the ZIP Code areas in the United States.Layer Package by esri_dm\n", - "
Last Modified: October 15, 2022\n", - "
3 comments, 193024 views\n", + "
This layer shows the County level boundaries of United States in 2021, designed to be used in Data Enrichment analysis.
Feature Layer Collection by esri_dm\n", + "
Last Modified: May 30, 2023\n", + "
0 comments, 17478 views\n", "
\n", "
\n", " " ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2231,23 +2346,23 @@ "text/html": [ "
\n", " \n", "\n", "
\n", - " USA ZIP Code Three-Digit Areas\n", + " United States Tract Boundaries 2021\n", " \n", - "
USA ZIP Code Three-Digit Areas provides the three-digit ZIP Code areas in the United States.Layer Package by esri_dm\n", - "
Last Modified: December 08, 2022\n", - "
0 comments, 22135 views\n", + "
This layer shows the Tract level boundaries of United States in 2021, designed to be used in Data Enrichment analysis.
Feature Layer Collection by esri_dm\n", + "
Last Modified: May 30, 2023\n", + "
0 comments, 863 views\n", "
\n", "
\n", " " ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2258,23 +2373,23 @@ "text/html": [ "
\n", " \n", "\n", "
\n", - " United States Tract Boundaries 2021\n", + " United States Boundaries 2021\n", " \n", - "
This layer shows the Tract level boundaries of United States in 2021, designed to be used in Data Enrichment analysis.Feature Layer Collection by esri_dm\n", - "
Last Modified: September 14, 2022\n", - "
0 comments, 390 views\n", + "
United States Boundaries 2021 provides boundaries for several layers of administrative divisions.
Feature Layer Collection by esri_dm\n", + "
Last Modified: May 30, 2023\n", + "
0 comments, 13105 views\n", "
\n", "
\n", " " ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2285,23 +2400,23 @@ "text/html": [ "
\n", " \n", "\n", "
\n", - " United States County Boundaries 2021\n", + " United States State Boundaries 2021\n", " \n", - "
This layer shows the County level boundaries of United States in 2021, designed to be used in Data Enrichment analysis.Feature Layer Collection by esri_dm\n", - "
Last Modified: September 14, 2022\n", - "
0 comments, 7412 views\n", + "
This layer shows the State level boundaries of United States in 2021, designed to be used in Data Enrichment analysis.
Feature Layer Collection by esri_dm\n", + "
Last Modified: May 30, 2023\n", + "
0 comments, 96405 views\n", "
\n", "
\n", " " ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2312,23 +2427,23 @@ "text/html": [ "
\n", " \n", "\n", "
\n", - " United States ZIP Code Boundaries 2018\n", + " United States Block Group Boundaries 2021\n", " \n", - "
This layer shows the ZIP Code level boundaries of United States in 2018. The boundaries are optimized to improve Data Enrichment analysis performance.Feature Layer Collection by esri_dm\n", - "
Last Modified: August 17, 2021\n", - "
3 comments, 214544 views\n", + "
This layer shows the Block Group boundaries of United States in 2021.
Feature Layer Collection by esri_dm\n", + "
Last Modified: May 30, 2023\n", + "
0 comments, 4326 views\n", "
\n", "
\n", " " ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2339,23 +2454,23 @@ "text/html": [ "
\n", " \n", "\n", "
\n", - " United States Boundaries 2021\n", + " United States Country Boundary 2021\n", " \n", - "
United States Boundaries 2021 provides boundaries for several layers of administrative divisions.Feature Layer Collection by esri_dm\n", - "
Last Modified: September 14, 2022\n", - "
0 comments, 4103 views\n", + "
This layer shows the Country boundary of United States in 2021, designed to be used in Data Enrichment analysis.
Feature Layer Collection by esri_dm\n", + "
Last Modified: May 30, 2023\n", + "
0 comments, 102403 views\n", "
\n", "
\n", " " ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2378,7 +2493,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 56, "metadata": {}, "outputs": [], "source": [ @@ -2387,7 +2502,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 57, "metadata": {}, "outputs": [ { @@ -2403,9 +2518,9 @@ "
\n", " United States ZIP Code Boundaries 2021\n", " \n", - "
This layer shows the ZIP Code level boundaries of United States in 2021, designed to be used in Data Enrichment analysis.Feature Layer Collection by esri_dm\n", - "
Last Modified: September 14, 2022\n", - "
2 comments, 27023 views\n", + "
This layer shows the ZIP Code level boundaries of United States in 2021, designed to be used in Data Enrichment analysis.
Feature Layer Collection by esri_dm\n", + "
Last Modified: May 30, 2023\n", + "
2 comments, 119769 views\n", "
\n", " \n", " " @@ -2414,7 +2529,7 @@ "" ] }, - "execution_count": 54, + "execution_count": 57, "metadata": {}, "output_type": "execute_result" } @@ -2432,7 +2547,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 58, "metadata": {}, "outputs": [ { @@ -2457,21 +2572,28 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "7) We want to merge the zip_code layer with data2 to visualize the result on the map." + "7) We want to merge the `zip_code` layer with `data2` to visualize the result on the map." ] }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "us_zip_lyr = us_zip.layers[3]" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `from_layer()` method helps convert feature layer to pandas Dataframe." + ] + }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 60, "metadata": {}, "outputs": [], "source": [ @@ -2480,7 +2602,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 69, "metadata": { "scrolled": true }, @@ -2507,105 +2629,105 @@ " \n", " \n", " OBJECTID\n", - " POPULATION\n", + " ZIP_CODE\n", " PO_NAME\n", - " SHAPE\n", - " SQMI\n", " STATE\n", + " POPULATION\n", + " SQMI\n", " Shape__Area\n", " Shape__Length\n", - " ZIP_CODE\n", + " SHAPE\n", " \n", " \n", " \n", " \n", " 0\n", " 1\n", - " <NA>\n", + " 1\n", " N Dillingham Census Area\n", - " {\"rings\": [[[-160.431152, 58.689351], [-160.43...\n", - " 16019.53\n", " AK\n", + " <NA>\n", + " 16019.53\n", " 6.657141\n", " 24.677454\n", - " 00001\n", + " {\"rings\": [[[-160.431152, 58.689351], [-160.43...\n", " \n", " \n", " 1\n", " 2\n", - " <NA>\n", + " 2\n", " Yukon Flats Nat Wildlife\n", - " {\"rings\": [[[-160.038452, 61.947605], [-160.03...\n", - " 95862.85\n", " AK\n", + " <NA>\n", + " 95862.85\n", " 48.948815\n", " 131.77645\n", - " 00002\n", + " {\"rings\": [[[-160.038452, 61.947605], [-160.03...\n", " \n", " \n", " 2\n", " 3\n", + " 3\n", + " Alaska Peninsula NWR\n", + " AK\n", " <NA>\n", - " Alaska Peninsula NWR\n", - " {\"rings\": [[[-159.900745, 56.439047], [-159.90...\n", " 14572.9\n", - " AK\n", " 5.655405\n", " 41.564165\n", - " 00003\n", + " {\"rings\": [[[-159.900745, 56.439047], [-159.90...\n", " \n", " \n", " 3\n", " 4\n", - " <NA>\n", + " 4\n", " W Kenai Peninsula Borough\n", - " {\"rings\": [[[-154.748861, 59.259518], [-154.70...\n", - " 6510.85\n", " AK\n", + " <NA>\n", + " 6510.85\n", " 2.728764\n", " 20.553203\n", - " 00004\n", + " {\"rings\": [[[-154.748861, 59.259518], [-154.70...\n", " \n", " \n", " 4\n", " 5\n", - " <NA>\n", + " 5\n", " N Lake and Peninsula Borough\n", - " {\"rings\": [[[-156.0002144, 60.9074352], [-155....\n", - " 3760.07\n", " AK\n", + " <NA>\n", + " 3760.07\n", " 1.593722\n", " 9.571684\n", - " 00005\n", + " {\"rings\": [[[-156.0002144, 60.9074352], [-155....\n", " \n", " \n", "\n", "" ], "text/plain": [ - " OBJECTID POPULATION PO_NAME \\\n", - "0 1 N Dillingham Census Area \n", - "1 2 Yukon Flats Nat Wildlife \n", - "2 3 Alaska Peninsula NWR \n", - "3 4 W Kenai Peninsula Borough \n", - "4 5 N Lake and Peninsula Borough \n", + " OBJECTID ZIP_CODE PO_NAME STATE POPULATION \\\n", + "0 1 1 N Dillingham Census Area AK \n", + "1 2 2 Yukon Flats Nat Wildlife AK \n", + "2 3 3 Alaska Peninsula NWR AK \n", + "3 4 4 W Kenai Peninsula Borough AK \n", + "4 5 5 N Lake and Peninsula Borough AK \n", "\n", - " SHAPE SQMI STATE \\\n", - "0 {\"rings\": [[[-160.431152, 58.689351], [-160.43... 16019.53 AK \n", - "1 {\"rings\": [[[-160.038452, 61.947605], [-160.03... 95862.85 AK \n", - "2 {\"rings\": [[[-159.900745, 56.439047], [-159.90... 14572.9 AK \n", - "3 {\"rings\": [[[-154.748861, 59.259518], [-154.70... 6510.85 AK \n", - "4 {\"rings\": [[[-156.0002144, 60.9074352], [-155.... 3760.07 AK \n", + " SQMI Shape__Area Shape__Length \\\n", + "0 16019.53 6.657141 24.677454 \n", + "1 95862.85 48.948815 131.77645 \n", + "2 14572.9 5.655405 41.564165 \n", + "3 6510.85 2.728764 20.553203 \n", + "4 3760.07 1.593722 9.571684 \n", "\n", - " Shape__Area Shape__Length ZIP_CODE \n", - "0 6.657141 24.677454 00001 \n", - "1 48.948815 131.77645 00002 \n", - "2 5.655405 41.564165 00003 \n", - "3 2.728764 20.553203 00004 \n", - "4 1.593722 9.571684 00005 " + " SHAPE \n", + "0 {\"rings\": [[[-160.431152, 58.689351], [-160.43... \n", + "1 {\"rings\": [[[-160.038452, 61.947605], [-160.03... \n", + "2 {\"rings\": [[[-159.900745, 56.439047], [-159.90... \n", + "3 {\"rings\": [[[-154.748861, 59.259518], [-154.70... \n", + "4 {\"rings\": [[[-156.0002144, 60.9074352], [-155.... " ] }, - "execution_count": 58, + "execution_count": 69, "metadata": {}, "output_type": "execute_result" } @@ -2616,7 +2738,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 62, "metadata": {}, "outputs": [ { @@ -2625,7 +2747,7 @@ "(32201, 9)" ] }, - "execution_count": 59, + "execution_count": 62, "metadata": {}, "output_type": "execute_result" } @@ -2636,25 +2758,25 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "OBJECTID Int64\n", - "POPULATION Int32\n", - "PO_NAME string\n", - "SHAPE geometry\n", - "SQMI Float64\n", - "STATE string\n", - "Shape__Area Float64\n", - "Shape__Length Float64\n", - "ZIP_CODE string\n", + "OBJECTID Int64\n", + "ZIP_CODE string[python]\n", + "PO_NAME string[python]\n", + "STATE string[python]\n", + "POPULATION Int32\n", + "SQMI Float64\n", + "Shape__Area Float64\n", + "Shape__Length Float64\n", + "SHAPE geometry\n", "dtype: object" ] }, - "execution_count": 60, + "execution_count": 63, "metadata": {}, "output_type": "execute_result" } @@ -2665,7 +2787,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 64, "metadata": {}, "outputs": [], "source": [ @@ -2674,25 +2796,25 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "OBJECTID Int64\n", - "POPULATION Int32\n", - "PO_NAME string\n", - "SHAPE geometry\n", - "SQMI Float64\n", - "STATE string\n", - "Shape__Area Float64\n", - "Shape__Length Float64\n", - "ZIP_CODE int32\n", + "OBJECTID Int64\n", + "ZIP_CODE int32\n", + "PO_NAME string[python]\n", + "STATE string[python]\n", + "POPULATION Int32\n", + "SQMI Float64\n", + "Shape__Area Float64\n", + "Shape__Length Float64\n", + "SHAPE geometry\n", "dtype: object" ] }, - "execution_count": 62, + "execution_count": 65, "metadata": {}, "output_type": "execute_result" } @@ -2701,9 +2823,16 @@ "zip_df.dtypes" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We use the `merge()` method from pandas library to join `zip_df` and `selected_data2` Dataframes." + ] + }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 66, "metadata": {}, "outputs": [], "source": [ @@ -2712,7 +2841,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 70, "metadata": {}, "outputs": [ { @@ -2721,7 +2850,7 @@ "(7548, 11)" ] }, - "execution_count": 64, + "execution_count": 70, "metadata": {}, "output_type": "execute_result" } @@ -2730,9 +2859,16 @@ "merged_df.shape" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `import_data()` method helps us import the Dataframe `merged_df` with geometry namespace into ArcGIS Online." + ] + }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 68, "metadata": {}, "outputs": [], "source": [ @@ -2741,13 +2877,22 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 71, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\shu12142\\AppData\\Local\\anaconda3\\envs\\geosaurus_dev_env\\Lib\\site-packages\\urllib3\\connectionpool.py:1099: InsecureRequestWarning: Unverified HTTPS request is being made to host 'geosaurus.maps.arcgis.com'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + } + ], "source": [ "mergd_lyr = gis.content.import_data(merged_df,\n", - " title='MergedLayer',\n", - " tags='datascience')" + " title='MergedLayer_2024',\n", + " tags='datascience, dlpk')" ] }, { @@ -2756,97 +2901,137 @@ "source": [ "When arcpy is present, the `import_data` will upload the local SeDF (Spatially Enabled DataFrame) as a FGDB (File geodatabase) to your organization, and publish to a hosted feature layer; On the other hand, when arcpy is not present, then the `import_data` method would have the local SeDF upload to your organization as a shapefile, and then publish as a hosted Feature Layer. This minor difference will result in column/property name differences from what's defined in the original SeDF.\n", "\n", - "The `has_arcpy` flag is to be used in determine which naming convention the newly created Feature Layer would be conforming to, when we are adding the Feature Layer for display based on variables." + "To get accurate field names from imported layers, we will double check the field names before drawing them on maps in the following sections." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "8) Create a map of the BuyerSellerIndex field using the following steps:" + "### Visualize Results" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Visualize Results" + "1) Create a map of the **BuyerSellerIndex** field" ] }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "" + "" ], "text/plain": [ "" ] }, - "execution_count": 67, + "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "m1 = gis.map('United States', 8)\n", + "m1 = gis.map('Redlands, CA')\n", "m1" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 78, "metadata": {}, "outputs": [], "source": [ - "cur_field_name = \"BuyerSellerIndex\"\n", - "if has_arcpy:\n", - " if cur_field_name not in mergd_lyr.layers[0].properties.fields:\n", - " cur_field_name = \"buyer_seller_index\"\n", - "else:\n", - " cur_field_name = \"BuyerSelle\"" + "m1.zoom = 8" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To get the accurate column name, let's check the layer properties and display all field names from the imported `mergd_lyr` data." ] }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 79, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "FID\n", + "objectid\n", + "zip_code\n", + "po_name\n", + "state\n", + "population\n", + "sqmi\n", + "shape_area\n", + "shape_leng\n", + "buyer_sell\n", + "days_on_ma\n", + "Shape__Area\n", + "Shape__Length\n" + ] + } + ], + "source": [ + "field_names = mergd_lyr.layers[0].properties['fields']\n", + "for field in field_names:\n", + " print(field['name'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will use the `smart mapping` capability to render merged layer with colors that varies based on **buyer_sell** (buyer_seller_index) field. The code below shows that a `SmartMappingManager` is created first by calling `content.renderer(0).smart_mapping()`. Then, we will call the `class_breaks_renderer` method to classify zip code boundary areas in colors. Please refer to [smart mapping](https://developers.arcgis.com/python/latest/guide/smart-mapping/) for more details." + ] + }, + { + "cell_type": "code", + "execution_count": 80, "metadata": {}, "outputs": [], "source": [ - "m1.add_layer(mergd_lyr, {\"renderer\":\"ClassedColorRenderer\",\n", - " \"field_name\":cur_field_name,\n", - " \"opacity\":0.7\n", - " })" + "m1.content.add(mergd_lyr)\n", + "sm = m1.content.renderer(0).smart_mapping()\n", + "sm.class_breaks_renderer(\n", + " break_type = \"color\",\n", + " field = \"buyer_sell\",\n", + ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "9) Create a map on DaysOnMarket field as follows:" + "2) Create a map on **DaysOnMarket** field" ] }, { "cell_type": "code", - "execution_count": 69, - "metadata": { - "scrolled": true - }, + "execution_count": 85, + "metadata": {}, "outputs": [ { "data": { "text/html": [ - "" + "" ], "text/plain": [ "" ] }, - "execution_count": 69, + "execution_count": 85, "metadata": {}, "output_type": "execute_result" } @@ -2858,28 +3043,32 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 83, "metadata": {}, "outputs": [], "source": [ - "cur_field_name = \"DaysOnMarket\"\n", - "if has_arcpy:\n", - " if cur_field_name not in mergd_lyr.layers[0].properties.fields:\n", - " cur_field_name = \"days_on_market\"\n", - "else:\n", - " cur_field_name = \"DaysOnMark\"" + "m2.zoom = 8" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Similar to m1, we will use `smart mapping` again to visualize zip code boundaries that classified by size based on **days_on_ma** (days_on_market) index." ] }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 84, "metadata": {}, "outputs": [], "source": [ - "m2.add_layer(mergd_lyr, {\"renderer\":\"ClassedSizeRenderer\",\n", - " \"field_name\":cur_field_name,\n", - " \"opacity\":0.7\n", - " })" + "m2.content.add(mergd_lyr)\n", + "sm = m2.content.renderer(0).smart_mapping()\n", + "sm.class_breaks_renderer(\n", + " break_type=\"size\",\n", + " field = \"days_on_ma\",\n", + ")" ] }, { @@ -2893,9 +3082,20 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Find all ZIP Codes within a specified drive time of important places\n", - "\n", - "\n", + "### Find all ZIP Codes within a specified drive time of important places" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this section, we will use **ImportantPlaces.xlsx** data for selling price analysis. The folloing steps are how we get **ImportantPlaces.xlsx** downloaded from open source and prepared." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "1) Create an Excel table with columns for **Street, City, State**, and **Zip**. Add addresses for the locations you want to access from your new home. Mark and Lisa's table below has their current job addresses. They named their Excel file **ImportantPlaces.xlsx** and the Excel sheet **WorkLocations**." ] }, @@ -2903,12 +3103,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "2) Load the excel file for analysis" + "2) Load the **ImportantPlaces.xlsx** excel data from local `datapath` as a Dataframe, and merge the `street`, `city`, `state` colomns as `address` column" ] }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 86, "metadata": {}, "outputs": [], "source": [ @@ -2918,7 +3118,7 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 87, "metadata": {}, "outputs": [ { @@ -2976,7 +3176,7 @@ "1 Mark's job 4511 E Guasti Road Ontario CA 91761" ] }, - "execution_count": 72, + "execution_count": 87, "metadata": {}, "output_type": "execute_result" } @@ -2987,7 +3187,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 88, "metadata": {}, "outputs": [], "source": [ @@ -2996,7 +3196,7 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 89, "metadata": {}, "outputs": [ { @@ -3007,7 +3207,7 @@ "Name: Address, dtype: object" ] }, - "execution_count": 74, + "execution_count": 89, "metadata": {}, "output_type": "execute_result" } @@ -3020,67 +3220,100 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "3) Draw the address on map" + "3) Draw the addresses on map" ] }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 95, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "" + "" ], "text/plain": [ "" ] }, - "execution_count": 75, + "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "m3 = gis.map('Redlands, CA', 10)\n", - "m3" + "m3_1 = gis.map('Redlands, CA')\n", + "m3_1" ] }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 91, "metadata": {}, "outputs": [], "source": [ - "from arcgis.geocoding import geocode\n", - "data3_addr1 = geocode(data3.Address[0])[0]\n", - "popup = { \n", - " \"title\" : \"Lisa's job\", \n", - " \"content\" : data3_addr1['address']\n", - " }\n", - "m3.draw(data3_addr1['location'], popup,\n", - " symbol = {\"angle\":0,\"xoffset\":0,\"yoffset\":0,\n", - " \"type\":\"esriPMS\", \"url\":\"https://static.arcgis.com/images/Symbols/PeoplePlaces/School.png\",\n", - " \"contentType\":\"image/png\",\"width\":24,\"height\":24})" + "m3_1.zoom = 9" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To visualize popup address info and red house symbols of Lisa and Mark's job locations, we will create the `PopupInfo` and `PictureMarkerSymbolEsriPMS` objects and passing them as parameters when calling `content.draw()` method. " ] }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 93, "metadata": {}, "outputs": [], "source": [ "from arcgis.geocoding import geocode\n", - "data3_addr2 = geocode(data3.Address[1])[0]\n", - "popup = { \n", - " \"title\" : \"Mark's job\", \n", - " \"content\" : data3_addr2['address']\n", - " }\n", - "m3.draw(data3_addr2['location'], popup,\n", - " symbol = {\"angle\":0,\"xoffset\":0,\"yoffset\":0,\n", - " \"type\":\"esriPMS\", \"url\":\"https://static.arcgis.com/images/Symbols/PeoplePlaces/School.png\",\n", - " \"contentType\":\"image/png\",\"width\":24,\"height\":24})" + "from arcgis.map.popups import PopupInfo\n", + "from arcgis.map.symbols import PictureMarkerSymbolEsriPMS\n", + "\n", + "sr = m3_1.extent['spatialReference']['latestWkid']\n", + "data3_addr1 = geocode(data3.Address[0], out_sr=sr)[0]\n", + "\n", + "popup = PopupInfo(title = \"Lisa's job\", description = data3_addr1['address'])\n", + "\n", + "symbol = PictureMarkerSymbolEsriPMS(\n", + " angle=0,\n", + " xoffset=0,\n", + " yoffset=0,\n", + " content_type=\"image/png\",\n", + " width=24,\n", + " height=25,\n", + " type=\"esriPMS\",\n", + " url=\"https://static.arcgis.com/images/Symbols/PeoplePlaces/School.png\",\n", + ")\n", + "\n", + "m3_1.content.draw(data3_addr1['location'], popup = popup, symbol = symbol)" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": {}, + "outputs": [], + "source": [ + "data3_addr2 = geocode(data3.Address[1], out_sr=sr)[0]\n", + "\n", + "popup = PopupInfo(title = \"Mark's job\", description = data3_addr2['address'])\n", + "\n", + "symbol = PictureMarkerSymbolEsriPMS(\n", + " angle=0,\n", + " xoffset=0,\n", + " yoffset=0,\n", + " content_type=\"image/png\",\n", + " width=24,\n", + " height=25,\n", + " type=\"esriPMS\",\n", + " url=\"https://static.arcgis.com/images/Symbols/PeoplePlaces/School.png\",\n", + ")\n", + "\n", + "m3_1.content.draw(data3_addr2['location'], popup = popup, symbol = symbol)" ] }, { @@ -3092,7 +3325,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 96, "metadata": {}, "outputs": [], "source": [ @@ -3108,7 +3341,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 97, "metadata": {}, "outputs": [], "source": [ @@ -3124,12 +3357,12 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": 98, "metadata": {}, "outputs": [], "source": [ "drive_time_lyr = gis.content.import_data(drive_time_df,\n", - " title=\"DriveTimeLayer\")" + " title=\"DriveTimeLayer_2024\")" ] }, { @@ -3141,7 +3374,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 99, "metadata": {}, "outputs": [], "source": [ @@ -3150,8 +3383,10 @@ }, { "cell_type": "code", - "execution_count": 82, - "metadata": {}, + "execution_count": null, + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ "dissolved_lyr = dissolve_boundaries(drive_time_lyr)" @@ -3159,51 +3394,72 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 105, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "" + "" ], "text/plain": [ "" ] }, - "execution_count": 83, + "execution_count": 105, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "m_3 = gis.map('Redlands, CA', 9)\n", - "m_3" + "m3_2 = gis.map('Redlands, CA')\n", + "m3_2" ] }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 102, + "metadata": {}, + "outputs": [], + "source": [ + "m3_2.zoom = 8" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this map, we are going to display Lisa and mark's job locations, as well as the dissolved 45 minutes' drive time layer." + ] + }, + { + "cell_type": "code", + "execution_count": 103, "metadata": {}, "outputs": [], "source": [ - "m_3.add_layer(dissolved_lyr)" + "m3_2.content.add(dissolved_lyr)" ] }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 104, "metadata": {}, "outputs": [], "source": [ - "m_3.draw(data3_addr1['location'], popup,\n", - " symbol = {\"angle\":0,\"xoffset\":0,\"yoffset\":0,\n", - " \"type\":\"esriPMS\", \"url\":\"https://static.arcgis.com/images/Symbols/PeoplePlaces/School.png\",\n", - " \"contentType\":\"image/png\",\"width\":24,\"height\":24})\n", - "m_3.draw(data3_addr2['location'], popup,\n", - " symbol = {\"angle\":0,\"xoffset\":0,\"yoffset\":0,\n", - " \"type\":\"esriPMS\", \"url\":\"https://static.arcgis.com/images/Symbols/PeoplePlaces/School.png\",\n", - " \"contentType\":\"image/png\",\"width\":24,\"height\":24})" + "symbol = PictureMarkerSymbolEsriPMS(\n", + " angle=0,\n", + " xoffset=0,\n", + " yoffset=0,\n", + " content_type=\"image/png\",\n", + " width=24,\n", + " height=25,\n", + " type=\"esriPMS\",\n", + " url=\"https://static.arcgis.com/images/Symbols/PeoplePlaces/School.png\",\n", + ")\n", + "\n", + "m3_2.content.draw(data3_addr1['location'], popup = popup, symbol = symbol)\n", + "m3_2.content.draw(data3_addr2['location'], popup = popup, symbol = symbol)" ] }, { @@ -3213,6 +3469,13 @@ "### Map market health, home values, and projected appreciation" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this section, we will use **MarketHealthIndex.xlsx** for market health, home values, and projected appreciation analysis. The folloing steps are how we get **MarketHealthIndex.xlsx** downloaded from open source and prepared. " + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -3232,12 +3495,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "2) Load th Excel file for analysis." + "2) Load th **MarketHealthIndex.xlsx** excel data from local `datapath`, and restructure it as Dataframe." ] }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 106, "metadata": {}, "outputs": [], "source": [ @@ -3247,7 +3510,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 107, "metadata": {}, "outputs": [ { @@ -3561,7 +3824,7 @@ " \n", " \n", "\n", - "

14898 rows × 21 columns

\n", + "

14898 rows × 21 columns

\n", "" ], "text/plain": [ @@ -3633,7 +3896,7 @@ "[14898 rows x 21 columns]" ] }, - "execution_count": 87, + "execution_count": 107, "metadata": {}, "output_type": "execute_result" } @@ -3651,7 +3914,7 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 108, "metadata": {}, "outputs": [], "source": [ @@ -3660,7 +3923,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 109, "metadata": {}, "outputs": [], "source": [ @@ -3669,7 +3932,7 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 110, "metadata": {}, "outputs": [ { @@ -3754,7 +4017,7 @@ "4 Brimfield 3.103101 255700.0 0.060555 1010" ] }, - "execution_count": 90, + "execution_count": 110, "metadata": {}, "output_type": "execute_result" } @@ -3765,7 +4028,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 111, "metadata": {}, "outputs": [ { @@ -3779,7 +4042,7 @@ "dtype: object" ] }, - "execution_count": 91, + "execution_count": 111, "metadata": {}, "output_type": "execute_result" } @@ -3790,7 +4053,7 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": 112, "metadata": {}, "outputs": [ { @@ -3799,7 +4062,7 @@ "0.000671231" ] }, - "execution_count": 92, + "execution_count": 112, "metadata": {}, "output_type": "execute_result" } @@ -3810,7 +4073,7 @@ }, { "cell_type": "code", - "execution_count": 93, + "execution_count": 113, "metadata": {}, "outputs": [ { @@ -3819,7 +4082,7 @@ "10.0" ] }, - "execution_count": 93, + "execution_count": 113, "metadata": {}, "output_type": "execute_result" } @@ -3830,18 +4093,18 @@ }, { "cell_type": "code", - "execution_count": 94, + "execution_count": 114, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\shi10484\\AppData\\Local\\ESRI\\conda\\envs\\dl_testing2\\lib\\site-packages\\pandas\\core\\frame.py:4301: SettingWithCopyWarning: \n", + "C:\\Users\\shu12142\\AppData\\Local\\Temp\\1\\ipykernel_26008\\1442553068.py:1: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " errors=errors,\n" + " matket_health_index.rename(columns={\"zipstring\": \"ZIP_CODE\"},\n" ] } ], @@ -3852,7 +4115,7 @@ }, { "cell_type": "code", - "execution_count": 95, + "execution_count": 115, "metadata": {}, "outputs": [ { @@ -3910,7 +4173,7 @@ "13353 Crestline 2.882937 228900.0 0.067296 92325" ] }, - "execution_count": 95, + "execution_count": 115, "metadata": {}, "output_type": "execute_result" } @@ -3926,9 +4189,16 @@ "4) Sort the table on the ZIP_CODE field so we can locate their ZIP Code. Make a note of the values for MarketHealthIndex, ZHVI, and ForecastYoYPctChange. In Crestline, for example, the market health index is fair: 6.4 on a scale that ranges from 0 to 10. The median home value for all homes (not just 3-bedroom homes) is $214,100. Homes are expected to appreciate 4.8 percent." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We also want to merge the zip_code layer with market_health_index layer to visualize the result on map." + ] + }, { "cell_type": "code", - "execution_count": 96, + "execution_count": 116, "metadata": { "scrolled": true }, @@ -3955,105 +4225,105 @@ " \n", " \n", " OBJECTID\n", - " POPULATION\n", + " ZIP_CODE\n", " PO_NAME\n", - " SHAPE\n", - " SQMI\n", " STATE\n", + " POPULATION\n", + " SQMI\n", " Shape__Area\n", " Shape__Length\n", - " ZIP_CODE\n", + " SHAPE\n", " \n", " \n", " \n", " \n", " 0\n", " 1\n", - " -99\n", + " 1\n", " N Dillingham Census Area\n", - " {\"rings\": [[[-160.186183929443, 58.82004642486...\n", - " 16279.47\n", " AK\n", - " 6.765048\n", - " 24.602921\n", - " 1\n", + " <NA>\n", + " 16019.53\n", + " 6.657141\n", + " 24.677454\n", + " {\"rings\": [[[-160.431152, 58.689351], [-160.43...\n", " \n", " \n", " 1\n", " 2\n", - " -99\n", + " 2\n", " Yukon Flats Nat Wildlife\n", - " {\"rings\": [[[-159.971336364746, 64.42843627929...\n", - " 95704.72\n", " AK\n", - " 48.867324\n", - " 130.944574\n", - " 2\n", + " <NA>\n", + " 95862.85\n", + " 48.948815\n", + " 131.77645\n", + " {\"rings\": [[[-160.038452, 61.947605], [-160.03...\n", " \n", " \n", " 2\n", " 3\n", - " -99\n", + " 3\n", " Alaska Peninsula NWR\n", - " {\"rings\": [[[-159.347519999648, 55.77196200034...\n", - " 14491.70\n", " AK\n", - " 5.622721\n", - " 41.443107\n", - " 3\n", + " <NA>\n", + " 14572.9\n", + " 5.655405\n", + " 41.564165\n", + " {\"rings\": [[[-159.900745, 56.439047], [-159.90...\n", " \n", " \n", " 3\n", " 4\n", - " -99\n", - " W Kenai Peninsula Boroug\n", - " {\"rings\": [[[-153.309794000393, 58.85487400023...\n", - " 6568.13\n", - " AK\n", - " 2.751546\n", - " 20.460970\n", " 4\n", + " W Kenai Peninsula Borough\n", + " AK\n", + " <NA>\n", + " 6510.85\n", + " 2.728764\n", + " 20.553203\n", + " {\"rings\": [[[-154.748861, 59.259518], [-154.70...\n", " \n", " \n", " 4\n", " 5\n", - " -99\n", - " N Lake and Peninsula Bor\n", - " {\"rings\": [[[-153.436194999999, 60.90853799962...\n", - " 3713.14\n", - " AK\n", - " 1.573790\n", - " 9.474710\n", " 5\n", + " N Lake and Peninsula Borough\n", + " AK\n", + " <NA>\n", + " 3760.07\n", + " 1.593722\n", + " 9.571684\n", + " {\"rings\": [[[-156.0002144, 60.9074352], [-155....\n", " \n", " \n", "\n", "" ], "text/plain": [ - " OBJECTID POPULATION PO_NAME \\\n", - "0 1 -99 N Dillingham Census Area \n", - "1 2 -99 Yukon Flats Nat Wildlife \n", - "2 3 -99 Alaska Peninsula NWR \n", - "3 4 -99 W Kenai Peninsula Boroug \n", - "4 5 -99 N Lake and Peninsula Bor \n", + " OBJECTID ZIP_CODE PO_NAME STATE POPULATION \\\n", + "0 1 1 N Dillingham Census Area AK \n", + "1 2 2 Yukon Flats Nat Wildlife AK \n", + "2 3 3 Alaska Peninsula NWR AK \n", + "3 4 4 W Kenai Peninsula Borough AK \n", + "4 5 5 N Lake and Peninsula Borough AK \n", "\n", - " SHAPE SQMI STATE \\\n", - "0 {\"rings\": [[[-160.186183929443, 58.82004642486... 16279.47 AK \n", - "1 {\"rings\": [[[-159.971336364746, 64.42843627929... 95704.72 AK \n", - "2 {\"rings\": [[[-159.347519999648, 55.77196200034... 14491.70 AK \n", - "3 {\"rings\": [[[-153.309794000393, 58.85487400023... 6568.13 AK \n", - "4 {\"rings\": [[[-153.436194999999, 60.90853799962... 3713.14 AK \n", + " SQMI Shape__Area Shape__Length \\\n", + "0 16019.53 6.657141 24.677454 \n", + "1 95862.85 48.948815 131.77645 \n", + "2 14572.9 5.655405 41.564165 \n", + "3 6510.85 2.728764 20.553203 \n", + "4 3760.07 1.593722 9.571684 \n", "\n", - " Shape__Area Shape__Length ZIP_CODE \n", - "0 6.765048 24.602921 1 \n", - "1 48.867324 130.944574 2 \n", - "2 5.622721 41.443107 3 \n", - "3 2.751546 20.460970 4 \n", - "4 1.573790 9.474710 5 " + " SHAPE \n", + "0 {\"rings\": [[[-160.431152, 58.689351], [-160.43... \n", + "1 {\"rings\": [[[-160.038452, 61.947605], [-160.03... \n", + "2 {\"rings\": [[[-159.900745, 56.439047], [-159.90... \n", + "3 {\"rings\": [[[-154.748861, 59.259518], [-154.70... \n", + "4 {\"rings\": [[[-156.0002144, 60.9074352], [-155.... " ] }, - "execution_count": 96, + "execution_count": 116, "metadata": {}, "output_type": "execute_result" } @@ -4064,7 +4334,7 @@ }, { "cell_type": "code", - "execution_count": 97, + "execution_count": 117, "metadata": {}, "outputs": [], "source": [ @@ -4073,7 +4343,7 @@ }, { "cell_type": "code", - "execution_count": 98, + "execution_count": 118, "metadata": {}, "outputs": [], "source": [ @@ -4082,7 +4352,7 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 119, "metadata": {}, "outputs": [ { @@ -4107,14 +4377,14 @@ " \n", " \n", " OBJECTID\n", - " POPULATION\n", + " ZIP_CODE\n", " PO_NAME\n", - " SHAPE\n", - " SQMI\n", " STATE\n", + " POPULATION\n", + " SQMI\n", " Shape__Area\n", " Shape__Length\n", - " ZIP_CODE\n", + " SHAPE\n", " City\n", " MarketHealthIndex\n", " ZHVI\n", @@ -4124,15 +4394,15 @@ " \n", " \n", " 0\n", - " 241\n", - " 17332\n", + " 245\n", + " 1001\n", " Agawam\n", - " {'rings': [[[-72.6304370002673, 42.09945499964...\n", - " 12.08\n", " MA\n", + " 16979\n", + " 12.08\n", " 0.003404\n", - " 0.317209\n", - " 1001\n", + " 0.318991\n", + " {\"rings\": [[[-72.66152, 42.052804], [-72.66099...\n", " Agawam\n", " 1.622365\n", " 214000.0\n", @@ -4140,15 +4410,15 @@ " \n", " \n", " 1\n", - " 242\n", - " 29871\n", + " 246\n", + " 1002\n", " Amherst\n", - " {'rings': [[[-72.4439000000849, 42.42276600025...\n", - " 58.03\n", " MA\n", - " 0.016425\n", - " 0.926367\n", - " 1002\n", + " 35703\n", + " 58.03\n", + " 0.016429\n", + " 0.932599\n", + " {\"rings\": [[[-72.546763, 42.399994], [-72.5467...\n", " Amherst\n", " 5.491341\n", " 331400.0\n", @@ -4156,15 +4426,15 @@ " \n", " \n", " 2\n", - " 245\n", - " 15242\n", + " 249\n", + " 1007\n", " Belchertown\n", - " {'rings': [[[-72.4083589996681, 42.35153699983...\n", - " 55.85\n", " MA\n", + " 15616\n", + " 55.85\n", " 0.015786\n", - " 0.698673\n", - " 1007\n", + " 0.70547\n", + " {\"rings\": [[[-72.471439, 42.346695], [-72.4713...\n", " Belchertown\n", " 4.664384\n", " 277400.0\n", @@ -4172,15 +4442,15 @@ " \n", " \n", " 3\n", - " 246\n", - " 1749\n", + " 250\n", + " 1008\n", " Blandford\n", - " {'rings': [[[-72.9898204997162, 42.24787710014...\n", - " 60.62\n", " MA\n", - " 0.017112\n", - " 0.676175\n", - " 1008\n", + " 1618\n", + " 60.52\n", + " 0.017082\n", + " 0.68638\n", + " {\"rings\": [[[-73.06734, 42.236958], [-73.06329...\n", " Blandford\n", " 2.541281\n", " 224000.0\n", @@ -4188,15 +4458,15 @@ " \n", " \n", " 4\n", - " 247\n", - " 4398\n", + " 252\n", + " 1010\n", " Brimfield\n", - " {'rings': [[[-72.2559969998616, 42.18105099970...\n", - " 37.28\n", " MA\n", - " 0.010515\n", - " 0.587340\n", - " 1010\n", + " 3985\n", + " 37.36\n", + " 0.010537\n", + " 0.601482\n", + " {\"rings\": [[[-72.274433, 42.140342], [-72.2742...\n", " Brimfield\n", " 3.103101\n", " 255700.0\n", @@ -4207,36 +4477,29 @@ "" ], "text/plain": [ - " OBJECTID POPULATION PO_NAME \\\n", - "0 241 17332 Agawam \n", - "1 242 29871 Amherst \n", - "2 245 15242 Belchertown \n", - "3 246 1749 Blandford \n", - "4 247 4398 Brimfield \n", - "\n", - " SHAPE SQMI STATE \\\n", - "0 {'rings': [[[-72.6304370002673, 42.09945499964... 12.08 MA \n", - "1 {'rings': [[[-72.4439000000849, 42.42276600025... 58.03 MA \n", - "2 {'rings': [[[-72.4083589996681, 42.35153699983... 55.85 MA \n", - "3 {'rings': [[[-72.9898204997162, 42.24787710014... 60.62 MA \n", - "4 {'rings': [[[-72.2559969998616, 42.18105099970... 37.28 MA \n", + " OBJECTID ZIP_CODE PO_NAME STATE POPULATION SQMI Shape__Area \\\n", + "0 245 1001 Agawam MA 16979 12.08 0.003404 \n", + "1 246 1002 Amherst MA 35703 58.03 0.016429 \n", + "2 249 1007 Belchertown MA 15616 55.85 0.015786 \n", + "3 250 1008 Blandford MA 1618 60.52 0.017082 \n", + "4 252 1010 Brimfield MA 3985 37.36 0.010537 \n", "\n", - " Shape__Area Shape__Length ZIP_CODE City MarketHealthIndex \\\n", - "0 0.003404 0.317209 1001 Agawam 1.622365 \n", - "1 0.016425 0.926367 1002 Amherst 5.491341 \n", - "2 0.015786 0.698673 1007 Belchertown 4.664384 \n", - "3 0.017112 0.676175 1008 Blandford 2.541281 \n", - "4 0.010515 0.587340 1010 Brimfield 3.103101 \n", + " Shape__Length SHAPE \\\n", + "0 0.318991 {\"rings\": [[[-72.66152, 42.052804], [-72.66099... \n", + "1 0.932599 {\"rings\": [[[-72.546763, 42.399994], [-72.5467... \n", + "2 0.70547 {\"rings\": [[[-72.471439, 42.346695], [-72.4713... \n", + "3 0.68638 {\"rings\": [[[-73.06734, 42.236958], [-73.06329... \n", + "4 0.601482 {\"rings\": [[[-72.274433, 42.140342], [-72.2742... \n", "\n", - " ZHVI ForecastYoYPctChange \n", - "0 214000.0 0.047047 \n", - "1 331400.0 0.046192 \n", - "2 277400.0 0.054387 \n", - "3 224000.0 0.061817 \n", - "4 255700.0 0.060555 " + " City MarketHealthIndex ZHVI ForecastYoYPctChange \n", + "0 Agawam 1.622365 214000.0 0.047047 \n", + "1 Amherst 5.491341 331400.0 0.046192 \n", + "2 Belchertown 4.664384 277400.0 0.054387 \n", + "3 Blandford 2.541281 224000.0 0.061817 \n", + "4 Brimfield 3.103101 255700.0 0.060555 " ] }, - "execution_count": 99, + "execution_count": 119, "metadata": {}, "output_type": "execute_result" } @@ -4247,16 +4510,16 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 120, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(14890, 13)" + "(14894, 13)" ] }, - "execution_count": 100, + "execution_count": 120, "metadata": {}, "output_type": "execute_result" } @@ -4267,7 +4530,7 @@ }, { "cell_type": "code", - "execution_count": 101, + "execution_count": 121, "metadata": {}, "outputs": [], "source": [ @@ -4276,106 +4539,158 @@ }, { "cell_type": "code", - "execution_count": 102, - "metadata": {}, + "execution_count": 122, + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ "hlth_lyr = gis.content.import_data(health_df,\n", - " title=\"MarketHealthLayer\")" + " title=\"MarketHealthLayer_2024\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "5) Create a map on **MarketHealthIndex** field" ] }, { "cell_type": "code", - "execution_count": 103, + "execution_count": 127, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "" + "" ], "text/plain": [ "" ] }, - "execution_count": 103, + "execution_count": 127, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "m4 = gis.map('United States', 5)\n", + "m4 = gis.map('Redlands, CA')\n", "m4" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 125, "metadata": {}, "outputs": [], "source": [ - "cur_field_name = \"MarketHealthIndex\"\n", - "if cur_field_name not in hlth_lyr.layers[0].properties.fields:\n", - " if has_arcpy:\n", - " cur_field_name = \"market_health_index\"\n", - " else:\n", - " cur_field_name = \"MarketHeal\"" + "m4.zoom = 8" ] }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 141, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "FID\n", + "objectid\n", + "zip_code\n", + "po_name\n", + "state\n", + "population\n", + "sqmi\n", + "shape_area\n", + "shape_leng\n", + "city\n", + "market_hea\n", + "zhvi\n", + "forecast_y\n", + "Shape__Area\n", + "Shape__Length\n" + ] + } + ], "source": [ - "m4.add_layer(hlth_lyr, {\"renderer\":\"ClassedColorRenderer\",\n", - " \"field_name\":cur_field_name,\n", - " \"classificationMethod\":'quantile',\n", - " \"opacity\":0.7\n", - " })" + "field_names = hlth_lyr.layers[0].properties['fields']\n", + "for field in field_names:\n", + " print(field['name'])" ] }, { - "cell_type": "code", - "execution_count": 105, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "market_hlth_lyr = hlth_lyr.layers[0]" + "Similarly, we will still use `class_breaks_renderer` method to map the zip code areas out and classify it based on **market_hea** (market_health_index) field. In this case, we are also passing `quantile` as parameter to generate class breaks that the total number of data values in each class is the same." ] }, { "cell_type": "code", - "execution_count": 106, - "metadata": {}, + "execution_count": 126, + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ - "from arcgis.features.find_locations import find_centroids" + "m4.content.add(hlth_lyr)\n", + "sm = m4.content.renderer(0).smart_mapping()\n", + "sm.class_breaks_renderer(\n", + " break_type=\"color\",\n", + " field = \"market_hea\",\n", + " classification_method = \"quantile\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "6) Notice how many ZIP Codes intersect the drive time buffer." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will utilize `overlay_layers` method from Python API's feature analysis functionality to create a feature layer of intersect zip code boundaries." ] }, { "cell_type": "code", - "execution_count": 107, + "execution_count": 128, "metadata": {}, "outputs": [], "source": [ - "poly_to_point = find_centroids(market_hlth_lyr, output_name=\"HealthLyrPolygonToPoint\" + str(dt.now().microsecond))" + "market_hlth_lyr = hlth_lyr.layers[0]" ] }, { "cell_type": "code", - "execution_count": 108, + "execution_count": 129, "metadata": {}, "outputs": [], "source": [ - "from arcgis.features.manage_data import overlay_layers" + "from arcgis.features.manage_data import overlay_layers" ] }, { "cell_type": "code", - "execution_count": 109, + "execution_count": 130, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "{\"cost\": 14.896}\n" + ] + } + ], "source": [ "zip_intersect = overlay_layers(drive_time_lyr, \n", " market_hlth_lyr, \n", @@ -4384,7 +4699,7 @@ }, { "cell_type": "code", - "execution_count": 110, + "execution_count": 131, "metadata": {}, "outputs": [ { @@ -4392,26 +4707,26 @@ "text/html": [ "
\n", "
\n", - " \n", + " \n", " \n", " \n", "
\n", "\n", "
\n", - " Market Health Data Within drive time Buffer556026\n", + " Market_Health_Data_Within_drive_time_Buffer488424\n", " \n", - "
Feature Layer Collection by arcgis_python\n", - "
Last Modified: March 16, 2021\n", + "

Feature Layer Collection by arcgis_python\n", + "
Last Modified: December 05, 2024\n", "
0 comments, 0 views\n", "
\n", "
\n", " " ], "text/plain": [ - "" + "" ] }, - "execution_count": 110, + "execution_count": 131, "metadata": {}, "output_type": "execute_result" } @@ -4420,16 +4735,9 @@ "zip_intersect" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "5) Notice how many ZIP Codes intersect the drive time buffer." - ] - }, { "cell_type": "code", - "execution_count": 111, + "execution_count": 132, "metadata": {}, "outputs": [], "source": [ @@ -4438,7 +4746,7 @@ }, { "cell_type": "code", - "execution_count": 112, + "execution_count": 133, "metadata": {}, "outputs": [], "source": [ @@ -4447,16 +4755,16 @@ }, { "cell_type": "code", - "execution_count": 113, + "execution_count": 134, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(326, 66)" + "(360, 65)" ] }, - "execution_count": 113, + "execution_count": 134, "metadata": {}, "output_type": "execute_result" } @@ -4465,42 +4773,68 @@ "overlay_df.shape" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "7) Create a map that displays the overlap by adding both `hlth_lyr` (classified by **MarketHealthIndex** field) and `drive_time_lyr`." + ] + }, { "cell_type": "code", - "execution_count": 114, + "execution_count": 140, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "" + "" ], "text/plain": [ "" ] }, - "execution_count": 114, + "execution_count": 140, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "m5 = gis.map('Redlands, CA', 9)\n", + "m5 = gis.map('Redlands, CA')\n", "m5" ] }, { "cell_type": "code", - "execution_count": 115, + "execution_count": 136, + "metadata": {}, + "outputs": [], + "source": [ + "m5.zoom = 8" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "metadata": {}, + "outputs": [], + "source": [ + "m5.content.add(hlth_lyr)\n", + "sm5 = m5.content.renderer(0).smart_mapping()\n", + "sm5.class_breaks_renderer(\n", + " break_type=\"color\",\n", + " field=\"market_hea\",\n", + " classification_method=\"quantile\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 139, "metadata": {}, "outputs": [], "source": [ - "m5.add_layer(hlth_lyr, {\"renderer\":\"ClassedColorRenderer\",\n", - " \"field_name\":cur_field_name,\n", - " \"classificationMethod\":'quantile',\n", - " \"opacity\":0.7\n", - " })\n", - "m5.add_layer(drive_time_lyr)" + "m5.content.add(drive_time_lyr)" ] }, { @@ -4517,42 +4851,68 @@ "This result has all the variables one should be interested in mapping, narrowed down to the ZIP Codes that are within an acceptable drive time to their work." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "8) Create a map that displays the overlap by adding both `hlth_lyr` (classified by **ZHVI** field) and `drive_time_lyr`." + ] + }, { "cell_type": "code", - "execution_count": 116, + "execution_count": 146, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "" + "" ], "text/plain": [ "" ] }, - "execution_count": 116, + "execution_count": 146, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "m6 = gis.map('Redlands, CA', 9)\n", + "m6 = gis.map('Redlands, CA')\n", "m6" ] }, { "cell_type": "code", - "execution_count": 117, + "execution_count": 143, + "metadata": {}, + "outputs": [], + "source": [ + "m6.zoom = 8" + ] + }, + { + "cell_type": "code", + "execution_count": 144, + "metadata": {}, + "outputs": [], + "source": [ + "m6.content.add(hlth_lyr)\n", + "sm6 = m6.content.renderer(0).smart_mapping()\n", + "sm6.class_breaks_renderer(\n", + " break_type=\"color\",\n", + " field=\"zhvi\",\n", + " classification_method=\"quantile\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 145, "metadata": {}, "outputs": [], "source": [ - "m6.add_layer(hlth_lyr, { \"renderer\":\"ClassedColorRenderer\",\n", - " \"field_name\":\"ZHVI\",\n", - " \"classificationMethod\":'quantile',\n", - " \"opacity\":0.7\n", - " })\n", - "m6.add_layer(drive_time_lyr)" + "m6.content.add(drive_time_lyr)" ] }, { @@ -4566,59 +4926,64 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Similarly plot for the field **ForecastYoYPctChange**" + "9) Create a map that displays the overlap by adding both `hlth_lyr` (classified by **ForecastYoYPctChange** field) and `drive_time_lyr`." ] }, { "cell_type": "code", - "execution_count": 118, + "execution_count": 151, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "" + "" ], "text/plain": [ "" ] }, - "execution_count": 118, + "execution_count": 151, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "m7 = gis.map('Redlands, CA', 9)\n", + "m7 = gis.map('Redlands, CA')\n", "m7" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 148, "metadata": {}, "outputs": [], "source": [ - "cur_field_name2 = \"ForecastYoYPctChange\"\n", - "if cur_field_name2 not in hlth_lyr.layers[0].properties.fields:\n", - " if has_arcpy:\n", - " cur_field_name2 = \"forecast_yo_y_pct_change\"\n", - " else:\n", - " cur_field_name2 = \"ForecastYo\"" + "m7.zoom = 8" ] }, { "cell_type": "code", - "execution_count": 119, + "execution_count": 149, + "metadata": {}, + "outputs": [], + "source": [ + "m7.content.add(hlth_lyr)\n", + "sm7 = m7.content.renderer(0).smart_mapping()\n", + "sm7.class_breaks_renderer(\n", + " break_type=\"color\",\n", + " field=\"forecast_y\",\n", + " classification_method=\"quantile\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 150, "metadata": {}, "outputs": [], "source": [ - "m7.add_layer(hlth_lyr, {\"renderer\":\"ClassedColorRenderer\",\n", - " \"field_name\":cur_field_name2,\n", - " \"classificationMethod\":'quantile',\n", - " \"opacity\":0.7\n", - " })\n", - "m7.add_layer(drive_time_lyr)" + "m7.content.add(drive_time_lyr)" ] }, { @@ -4658,7 +5023,17 @@ }, { "cell_type": "code", - "execution_count": 120, + "execution_count": 152, + "metadata": {}, + "outputs": [], + "source": [ + "field_name = \"market_hea\"\n", + "field_name2 = \"forecast_y\"" + ] + }, + { + "cell_type": "code", + "execution_count": 153, "metadata": {}, "outputs": [ { @@ -4682,23 +5057,23 @@ " \n", " \n", " \n", - " OBJECTID\n", - " FID_AC9111_A7E54F7D\n", - " id\n", - " source_country\n", + " OBJECTID_1\n", + " FID_DRIVETIMELAYER_20242_DRIVET\n", + " source_cou\n", " x\n", " y\n", " area_type\n", - " buffer_units\n", - " buffer_units_alias\n", - " buffer_radii\n", + " buffer_uni\n", + " buffer_u_1\n", + " buffer_rad\n", + " aggregatio\n", " ...\n", - " state\n", - " zip_code\n", + " sqmi\n", + " shape_leng\n", " city\n", - " market_health_index\n", + " market_hea\n", " zhvi\n", - " forecast_yo_y_pct_change\n", + " forecast_y\n", " Shape__Area_1\n", " Shape__Length_1\n", " AnalysisArea\n", @@ -4708,262 +5083,362 @@ " \n", " \n", " 0\n", - " 6\n", + " 2\n", " 1\n", - " 0\n", - " US\n", - " -117.552830\n", - " 34.064356\n", + " USA\n", + " -117.552866\n", + " 34.064359\n", " NetworkServiceArea\n", " Minutes\n", " Drive Time Minutes\n", - " 45\n", + " 45.0\n", + " BlockApportionment:US.BlockGroups;PointsLayer:...\n", " ...\n", - " CA\n", - " 90606\n", + " 4.2\n", + " 0.214615\n", + " Los Angeles\n", + " 9.055578\n", + " 408100.0\n", + " 0.09147\n", + " 15880559.84375\n", + " 25687.278616\n", + " 0.482092\n", + " {\"rings\": [[[-13157517.9452, 4032773.4488], [-...\n", + " \n", + " \n", + " 1\n", + " 4\n", + " 1\n", + " USA\n", + " -117.552866\n", + " 34.064359\n", + " NetworkServiceArea\n", + " Minutes\n", + " Drive Time Minutes\n", + " 45.0\n", + " BlockApportionment:US.BlockGroups;PointsLayer:...\n", + " ...\n", + " 3.01\n", + " 0.147502\n", + " Los Angeles\n", + " 9.930192\n", + " 472000.0\n", + " 0.07689\n", + " 11375466.695312\n", + " 17800.685279\n", + " 1.779017\n", + " {\"rings\": [[[-13157514.1907, 4037443.2303], [-...\n", + " \n", + " \n", + " 2\n", + " 14\n", + " 1\n", + " USA\n", + " -117.552866\n", + " 34.064359\n", + " NetworkServiceArea\n", + " Minutes\n", + " Drive Time Minutes\n", + " 45.0\n", + " BlockApportionment:US.BlockGroups;PointsLayer:...\n", + " ...\n", + " 3.74\n", + " 0.183214\n", " West Whittier-Los Nietos\n", " 8.272251\n", - " 485500\n", + " 485500.0\n", " 0.072375\n", - " 1.417656e+07\n", - " 22316.323033\n", - " 2.240247\n", + " 14136917.117188\n", + " 22634.260753\n", + " 8.36099\n", " {\"rings\": [[[-13143194.2534, 4028915.1404], [-...\n", " \n", " \n", - " 1\n", - " 9\n", + " 3\n", + " 18\n", " 1\n", - " 0\n", - " US\n", - " -117.552830\n", - " 34.064356\n", + " USA\n", + " -117.552866\n", + " 34.064359\n", " NetworkServiceArea\n", " Minutes\n", " Drive Time Minutes\n", - " 45\n", + " 45.0\n", + " BlockApportionment:US.BlockGroups;PointsLayer:...\n", " ...\n", - " CA\n", - " 90640\n", + " 8.23\n", + " 0.28339\n", " Montebello\n", " 8.167539\n", - " 538500\n", + " 538500.0\n", " 0.061807\n", - " 3.105525e+07\n", - " 34167.878635\n", - " 1.995545\n", + " 31089924.613281\n", + " 34373.962355\n", + " 13.017801\n", " {\"rings\": [[[-13143598.3654, 4032788.2902], [-...\n", " \n", " \n", - " 2\n", - " 19\n", + " 4\n", + " 20\n", " 1\n", - " 0\n", - " US\n", - " -117.552830\n", - " 34.064356\n", + " USA\n", + " -117.552866\n", + " 34.064359\n", " NetworkServiceArea\n", " Minutes\n", " Drive Time Minutes\n", - " 45\n", + " 45.0\n", + " BlockApportionment:US.BlockGroups;PointsLayer:...\n", " ...\n", - " CA\n", - " 91702\n", + " 8.53\n", + " 0.438871\n", + " Santa Fe Springs\n", + " 9.151564\n", + " 494500.0\n", + " 0.063482\n", + " 32164136.523438\n", + " 53469.063308\n", + " 2.26762\n", + " {\"rings\": [[[-13143509.5925, 4023388.3935], [-...\n", + " \n", + " \n", + " 5\n", + " 35\n", + " 1\n", + " USA\n", + " -117.552866\n", + " 34.064359\n", + " NetworkServiceArea\n", + " Minutes\n", + " Drive Time Minutes\n", + " 45.0\n", + " BlockApportionment:US.BlockGroups;PointsLayer:...\n", + " ...\n", + " 69.99\n", + " 1.187015\n", " Azusa\n", " 9.138139\n", - " 457600\n", - " 0.086300\n", - " 2.658000e+08\n", - " 142848.234839\n", - " 22.824592\n", - " {\"rings\": [[[-13123459.7947, 4048654.942], [-1...\n", + " 457600.0\n", + " 0.0863\n", + " 265860978.933594\n", + " 144989.856887\n", + " 23.94345\n", + " {\"rings\": [[[-13123457.5912, 4048674.4978], [-...\n", " \n", " \n", - " 3\n", - " 20\n", + " 6\n", + " 36\n", " 1\n", - " 0\n", - " US\n", - " -117.552830\n", - " 34.064356\n", + " USA\n", + " -117.552866\n", + " 34.064359\n", " NetworkServiceArea\n", " Minutes\n", " Drive Time Minutes\n", - " 45\n", + " 45.0\n", + " BlockApportionment:US.BlockGroups;PointsLayer:...\n", " ...\n", - " CA\n", - " 91706\n", + " 15.37\n", + " 0.381127\n", " Baldwin Park\n", " 9.215331\n", - " 460300\n", + " 460300.0\n", " 0.088173\n", - " 5.812360e+07\n", - " 45215.156466\n", - " 39.756145\n", - " {\"rings\": [[[-13129357.7083, 4047200.0046], [-...\n", + " 58195009.007812\n", + " 46203.383216\n", + " 39.805003\n", + " {\"rings\": [[[-13129355.916, 4047201.7934], [-1...\n", " \n", " \n", - " 4\n", - " 29\n", + " 7\n", + " 45\n", " 1\n", - " 0\n", - " US\n", - " -117.552830\n", - " 34.064356\n", + " USA\n", + " -117.552866\n", + " 34.064359\n", " NetworkServiceArea\n", " Minutes\n", " Drive Time Minutes\n", - " 45\n", + " 45.0\n", + " BlockApportionment:US.BlockGroups;PointsLayer:...\n", " ...\n", - " CA\n", - " 91732\n", + " 4.8\n", + " 0.210419\n", " El Monte\n", " 9.203249\n", - " 506500\n", + " 506500.0\n", " 0.065299\n", - " 1.813936e+07\n", - " 25827.620558\n", - " 12.414794\n", + " 18149214.558594\n", + " 25938.507566\n", + " 12.421541\n", " {\"rings\": [[[-13135851.7534, 4040662.4451], [-...\n", " \n", " \n", - " 5\n", - " 30\n", + " 8\n", + " 46\n", " 1\n", - " 0\n", - " US\n", - " -117.552830\n", - " 34.064356\n", + " USA\n", + " -117.552866\n", + " 34.064359\n", " NetworkServiceArea\n", " Minutes\n", " Drive Time Minutes\n", - " 45\n", + " 45.0\n", + " BlockApportionment:US.BlockGroups;PointsLayer:...\n", " ...\n", - " CA\n", - " 91733\n", + " 6.99\n", + " 0.228549\n", " South El Monte\n", " 9.615385\n", - " 501700\n", + " 501700.0\n", " 0.093255\n", - " 2.645891e+07\n", - " 27366.704306\n", - " 17.640998\n", + " 26450814.414062\n", + " 27596.205783\n", + " 18.114647\n", " {\"rings\": [[[-13139099.6109, 4037245.849], [-1...\n", " \n", " \n", - " 6\n", - " 179\n", + " 9\n", + " 213\n", " 1\n", - " 0\n", - " US\n", - " -117.552830\n", - " 34.064356\n", + " USA\n", + " -117.552866\n", + " 34.064359\n", " NetworkServiceArea\n", " Minutes\n", " Drive Time Minutes\n", - " 45\n", + " 45.0\n", + " BlockApportionment:US.BlockGroups;PointsLayer:...\n", " ...\n", - " CA\n", - " 91752\n", + " 15.19\n", + " 0.305009\n", " Eastvale\n", " 8.270909\n", - " 503800\n", + " 503800.0\n", " 0.064508\n", - " 5.733285e+07\n", - " 37863.197705\n", - " 39.309396\n", + " 57390709.253906\n", + " 38277.204055\n", + " 39.349068\n", " {\"rings\": [[[-13082747.7254, 4033299.2511], [-...\n", " \n", " \n", - " 7\n", - " 180\n", + " 10\n", + " 214\n", " 2\n", - " 1\n", - " US\n", - " -117.194872\n", - " 34.057237\n", + " USA\n", + " -117.19479\n", + " 34.057265\n", " NetworkServiceArea\n", " Minutes\n", " Drive Time Minutes\n", - " 45\n", + " 45.0\n", + " BlockApportionment:US.BlockGroups;PointsLayer:...\n", " ...\n", - " CA\n", - " 91752\n", + " 15.19\n", + " 0.305009\n", " Eastvale\n", " 8.270909\n", - " 503800\n", + " 503800.0\n", " 0.064508\n", - " 5.733285e+07\n", - " 37863.197705\n", - " 39.309396\n", + " 57390709.253906\n", + " 38277.204055\n", + " 39.349068\n", " {\"rings\": [[[-13082747.7254, 4033299.2511], [-...\n", " \n", " \n", "\n", - "

8 rows × 66 columns

\n", + "

11 rows × 65 columns

\n", "" ], "text/plain": [ - " OBJECTID FID_AC9111_A7E54F7D id source_country x y \\\n", - "0 6 1 0 US -117.552830 34.064356 \n", - "1 9 1 0 US -117.552830 34.064356 \n", - "2 19 1 0 US -117.552830 34.064356 \n", - "3 20 1 0 US -117.552830 34.064356 \n", - "4 29 1 0 US -117.552830 34.064356 \n", - "5 30 1 0 US -117.552830 34.064356 \n", - "6 179 1 0 US -117.552830 34.064356 \n", - "7 180 2 1 US -117.194872 34.057237 \n", + " OBJECTID_1 FID_DRIVETIMELAYER_20242_DRIVET source_cou x \\\n", + "0 2 1 USA -117.552866 \n", + "1 4 1 USA -117.552866 \n", + "2 14 1 USA -117.552866 \n", + "3 18 1 USA -117.552866 \n", + "4 20 1 USA -117.552866 \n", + "5 35 1 USA -117.552866 \n", + "6 36 1 USA -117.552866 \n", + "7 45 1 USA -117.552866 \n", + "8 46 1 USA -117.552866 \n", + "9 213 1 USA -117.552866 \n", + "10 214 2 USA -117.19479 \n", "\n", - " area_type buffer_units buffer_units_alias buffer_radii ... \\\n", - "0 NetworkServiceArea Minutes Drive Time Minutes 45 ... \n", - "1 NetworkServiceArea Minutes Drive Time Minutes 45 ... \n", - "2 NetworkServiceArea Minutes Drive Time Minutes 45 ... \n", - "3 NetworkServiceArea Minutes Drive Time Minutes 45 ... \n", - "4 NetworkServiceArea Minutes Drive Time Minutes 45 ... \n", - "5 NetworkServiceArea Minutes Drive Time Minutes 45 ... \n", - "6 NetworkServiceArea Minutes Drive Time Minutes 45 ... \n", - "7 NetworkServiceArea Minutes Drive Time Minutes 45 ... \n", + " y area_type buffer_uni buffer_u_1 buffer_rad \\\n", + "0 34.064359 NetworkServiceArea Minutes Drive Time Minutes 45.0 \n", + "1 34.064359 NetworkServiceArea Minutes Drive Time Minutes 45.0 \n", + "2 34.064359 NetworkServiceArea Minutes Drive Time Minutes 45.0 \n", + "3 34.064359 NetworkServiceArea Minutes Drive Time Minutes 45.0 \n", + "4 34.064359 NetworkServiceArea Minutes Drive Time Minutes 45.0 \n", + "5 34.064359 NetworkServiceArea Minutes Drive Time Minutes 45.0 \n", + "6 34.064359 NetworkServiceArea Minutes Drive Time Minutes 45.0 \n", + "7 34.064359 NetworkServiceArea Minutes Drive Time Minutes 45.0 \n", + "8 34.064359 NetworkServiceArea Minutes Drive Time Minutes 45.0 \n", + "9 34.064359 NetworkServiceArea Minutes Drive Time Minutes 45.0 \n", + "10 34.057265 NetworkServiceArea Minutes Drive Time Minutes 45.0 \n", "\n", - " state zip_code city market_health_index zhvi \\\n", - "0 CA 90606 West Whittier-Los Nietos 8.272251 485500 \n", - "1 CA 90640 Montebello 8.167539 538500 \n", - "2 CA 91702 Azusa 9.138139 457600 \n", - "3 CA 91706 Baldwin Park 9.215331 460300 \n", - "4 CA 91732 El Monte 9.203249 506500 \n", - "5 CA 91733 South El Monte 9.615385 501700 \n", - "6 CA 91752 Eastvale 8.270909 503800 \n", - "7 CA 91752 Eastvale 8.270909 503800 \n", + " aggregatio ... sqmi shape_leng \\\n", + "0 BlockApportionment:US.BlockGroups;PointsLayer:... ... 4.2 0.214615 \n", + "1 BlockApportionment:US.BlockGroups;PointsLayer:... ... 3.01 0.147502 \n", + "2 BlockApportionment:US.BlockGroups;PointsLayer:... ... 3.74 0.183214 \n", + "3 BlockApportionment:US.BlockGroups;PointsLayer:... ... 8.23 0.28339 \n", + "4 BlockApportionment:US.BlockGroups;PointsLayer:... ... 8.53 0.438871 \n", + "5 BlockApportionment:US.BlockGroups;PointsLayer:... ... 69.99 1.187015 \n", + "6 BlockApportionment:US.BlockGroups;PointsLayer:... ... 15.37 0.381127 \n", + "7 BlockApportionment:US.BlockGroups;PointsLayer:... ... 4.8 0.210419 \n", + "8 BlockApportionment:US.BlockGroups;PointsLayer:... ... 6.99 0.228549 \n", + "9 BlockApportionment:US.BlockGroups;PointsLayer:... ... 15.19 0.305009 \n", + "10 BlockApportionment:US.BlockGroups;PointsLayer:... ... 15.19 0.305009 \n", "\n", - " forecast_yo_y_pct_change Shape__Area_1 Shape__Length_1 AnalysisArea \\\n", - "0 0.072375 1.417656e+07 22316.323033 2.240247 \n", - "1 0.061807 3.105525e+07 34167.878635 1.995545 \n", - "2 0.086300 2.658000e+08 142848.234839 22.824592 \n", - "3 0.088173 5.812360e+07 45215.156466 39.756145 \n", - "4 0.065299 1.813936e+07 25827.620558 12.414794 \n", - "5 0.093255 2.645891e+07 27366.704306 17.640998 \n", - "6 0.064508 5.733285e+07 37863.197705 39.309396 \n", - "7 0.064508 5.733285e+07 37863.197705 39.309396 \n", + " city market_hea zhvi forecast_y \\\n", + "0 Los Angeles 9.055578 408100.0 0.09147 \n", + "1 Los Angeles 9.930192 472000.0 0.07689 \n", + "2 West Whittier-Los Nietos 8.272251 485500.0 0.072375 \n", + "3 Montebello 8.167539 538500.0 0.061807 \n", + "4 Santa Fe Springs 9.151564 494500.0 0.063482 \n", + "5 Azusa 9.138139 457600.0 0.0863 \n", + "6 Baldwin Park 9.215331 460300.0 0.088173 \n", + "7 El Monte 9.203249 506500.0 0.065299 \n", + "8 South El Monte 9.615385 501700.0 0.093255 \n", + "9 Eastvale 8.270909 503800.0 0.064508 \n", + "10 Eastvale 8.270909 503800.0 0.064508 \n", "\n", - " SHAPE \n", - "0 {\"rings\": [[[-13143194.2534, 4028915.1404], [-... \n", - "1 {\"rings\": [[[-13143598.3654, 4032788.2902], [-... \n", - "2 {\"rings\": [[[-13123459.7947, 4048654.942], [-1... \n", - "3 {\"rings\": [[[-13129357.7083, 4047200.0046], [-... \n", - "4 {\"rings\": [[[-13135851.7534, 4040662.4451], [-... \n", - "5 {\"rings\": [[[-13139099.6109, 4037245.849], [-1... \n", - "6 {\"rings\": [[[-13082747.7254, 4033299.2511], [-... \n", - "7 {\"rings\": [[[-13082747.7254, 4033299.2511], [-... \n", + " Shape__Area_1 Shape__Length_1 AnalysisArea \\\n", + "0 15880559.84375 25687.278616 0.482092 \n", + "1 11375466.695312 17800.685279 1.779017 \n", + "2 14136917.117188 22634.260753 8.36099 \n", + "3 31089924.613281 34373.962355 13.017801 \n", + "4 32164136.523438 53469.063308 2.26762 \n", + "5 265860978.933594 144989.856887 23.94345 \n", + "6 58195009.007812 46203.383216 39.805003 \n", + "7 18149214.558594 25938.507566 12.421541 \n", + "8 26450814.414062 27596.205783 18.114647 \n", + "9 57390709.253906 38277.204055 39.349068 \n", + "10 57390709.253906 38277.204055 39.349068 \n", + "\n", + " SHAPE \n", + "0 {\"rings\": [[[-13157517.9452, 4032773.4488], [-... \n", + "1 {\"rings\": [[[-13157514.1907, 4037443.2303], [-... \n", + "2 {\"rings\": [[[-13143194.2534, 4028915.1404], [-... \n", + "3 {\"rings\": [[[-13143598.3654, 4032788.2902], [-... \n", + "4 {\"rings\": [[[-13143509.5925, 4023388.3935], [-... \n", + "5 {\"rings\": [[[-13123457.5912, 4048674.4978], [-... \n", + "6 {\"rings\": [[[-13129355.916, 4047201.7934], [-1... \n", + "7 {\"rings\": [[[-13135851.7534, 4040662.4451], [-... \n", + "8 {\"rings\": [[[-13139099.6109, 4037245.849], [-1... \n", + "9 {\"rings\": [[[-13082747.7254, 4033299.2511], [-... \n", + "10 {\"rings\": [[[-13082747.7254, 4033299.2511], [-... \n", "\n", - "[8 rows x 66 columns]" + "[11 rows x 65 columns]" ] }, - "execution_count": 120, + "execution_count": 153, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "query_str = '((ZHVI > 350000) AND (ZHVI < 600000) AND (' + cur_field_name + ' > 8) AND (' + cur_field_name2 + '> 0.06)) AND (1=1)'\n", + "query_str = '((ZHVI > 350000) AND (ZHVI < 600000) AND (' + field_name + ' > 8) AND (' + field_name2 + '> 0.06)) AND (1=1)'\n", "\n", "zip_hlth_intersect_df = zip_hlth_intersect.query(where=query_str).sdf\n", "zip_hlth_intersect_df" @@ -4971,19 +5446,19 @@ }, { "cell_type": "code", - "execution_count": 117, + "execution_count": 160, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "" + "" ], "text/plain": [ "" ] }, - "execution_count": 117, + "execution_count": 160, "metadata": {}, "output_type": "execute_result" } @@ -4995,14 +5470,20 @@ }, { "cell_type": "code", - "execution_count": 122, + "execution_count": 158, + "metadata": {}, + "outputs": [], + "source": [ + "m9.content.add(zip_hlth_intersect_df)" + ] + }, + { + "cell_type": "code", + "execution_count": 159, "metadata": {}, "outputs": [], "source": [ - "m9.add_layer(zip_hlth_intersect,\n", - " {\"definition_expression\": query_str,\n", - " \"classificationMethod\":'quantile'})\n", - "m9.zoom_to_layer(zip_hlth_intersect)" + "m9.zoom_to_layer(zip_hlth_intersect_df)" ] }, { @@ -5047,7 +5528,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.0" + "version": "3.11.11" } }, "nbformat": 4,