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 1144788a2..692edb019 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,14 +118,14 @@ "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." ] }, { @@ -227,7 +146,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "arcpy present\n" + "arcpy not present\n" ] } ], @@ -244,7 +163,7 @@ "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." ] }, { @@ -257,17 +176,17 @@ "text/html": [ "
\n", "
\n", - " \n", + " \n", " \n", " \n", "
\n", "\n", "
\n", - " finding_a_new_home\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, 141 views\n", + "
0 comments, 147 views\n", "
\n", "
\n", " " @@ -318,7 +237,7 @@ { "data": { "text/plain": [ - "WindowsPath('C:/Users/Neh13173/AppData/Local/Temp/finding_a_new_home')" + "WindowsPath('C:/Users/shu12142/AppData/Local/Temp/1/finding_a_new_home')" ] }, "execution_count": 9, @@ -339,10 +258,10 @@ { "data": { "text/plain": [ - "['C:\\\\Users\\\\Neh13173\\\\AppData\\\\Local\\\\Temp\\\\finding_a_new_home\\\\BuyerSellerIndex.xlsx',\n", - " 'C:\\\\Users\\\\Neh13173\\\\AppData\\\\Local\\\\Temp\\\\finding_a_new_home\\\\Crestline3BdrmAveSellingPrice.xlsx',\n", - " 'C:\\\\Users\\\\Neh13173\\\\AppData\\\\Local\\\\Temp\\\\finding_a_new_home\\\\ImportantPlaces.xlsx',\n", - " 'C:\\\\Users\\\\Neh13173\\\\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": 10, @@ -355,6 +274,107 @@ "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": [ + "5) Read the **Crestline3BdrmAveSellingPrice** excel data from local `datapath`, and restructure it as a Dataframe." + ] + }, { "cell_type": "code", "execution_count": 11, @@ -553,6 +573,13 @@ "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": 15, @@ -665,6 +692,13 @@ "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": 17, @@ -704,8 +738,65 @@ "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": 19, @@ -714,14 +805,14 @@ } ], "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." + "6) Create a graph using `matplotlib` library to show how average home prices have changed since they bought their home." ] }, { @@ -892,7 +983,7 @@ }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "
" ] @@ -1039,7 +1130,7 @@ } ], "source": [ - "(price_initial.value + 100000)*house_worth" + "(price_initial.value + 100000) * house_worth" ] }, { @@ -1053,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:" ] }, { @@ -1097,7 +1188,7 @@ "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." ] }, { @@ -1998,7 +2089,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\Neh13173\\AppData\\Local\\Temp\\ipykernel_30180\\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", @@ -2089,7 +2180,7 @@ "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`." ] }, { @@ -2098,8 +2189,7 @@ "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)" ] }, { @@ -2121,17 +2211,17 @@ "text/html": [ "
\n", "
\n", - " \n", + " \n", " \n", " \n", "
\n", "\n", "
\n", - " USA ZIP Code Boundaries\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: August 20, 2024\n", - "
0 comments, 21,68,30,203 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", " " @@ -2148,17 +2238,17 @@ "text/html": [ "
\n", "
\n", - " \n", + " \n", " \n", " \n", "
\n", "\n", "
\n", - " United States ZIP Code Boundaries 2021\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", + "
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, 1,19,300 views\n", + "
2 comments, 119769 views\n", "
\n", "
\n", " " @@ -2175,17 +2265,17 @@ "text/html": [ "
\n", "
\n", - " \n", + " \n", " \n", " \n", "
\n", "\n", "
\n", - " USA ZIP Code Areas\n", + " USA ZIP Code Areas\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: December 21, 2023\n", - "
0 comments, 2,27,520 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", " " @@ -2202,17 +2292,17 @@ "text/html": [ "
\n", "
\n", - " \n", + " \n", " \n", " \n", "
\n", "\n", "
\n", - " USA ZIP Code Three-Digit Areas\n", + " USA ZIP Code Three-Digit Areas\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 21, 2023\n", - "
0 comments, 24,756 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", " " @@ -2229,23 +2319,23 @@ "text/html": [ "
\n", " \n", "\n", "
\n", - " United States Tract Boundaries 2021\n", + " United States County 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", + "
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, 861 views\n", + "
0 comments, 17478 views\n", "
\n", "
\n", " " ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2256,23 +2346,23 @@ "text/html": [ "
\n", " \n", "\n", "
\n", - " United States County Boundaries 2021\n", + " United States Tract 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", + "
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, 17,442 views\n", + "
0 comments, 863 views\n", "
\n", "
\n", " " ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2283,17 +2373,17 @@ "text/html": [ "
\n", "
\n", - " \n", + " \n", " \n", " \n", "
\n", "\n", "
\n", - " United States Boundaries 2021\n", + " United States Boundaries 2021\n", " \n", - "
United States Boundaries 2021 provides boundaries for several layers of administrative divisions.
Feature Layer Collection by esri_dm\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, 13,104 views\n", + "
0 comments, 13105 views\n", "
\n", "
\n", " " @@ -2310,17 +2400,17 @@ "text/html": [ "
\n", "
\n", - " \n", + " \n", " \n", " \n", "
\n", "\n", "
\n", - " United States State Boundaries 2021\n", + " United States State Boundaries 2021\n", " \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", + "
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, 96,147 views\n", + "
0 comments, 96405 views\n", "
\n", "
\n", " " @@ -2337,17 +2427,17 @@ "text/html": [ "
\n", "
\n", - " \n", + " \n", " \n", " \n", "
\n", "\n", "
\n", - " United States Block Group Boundaries 2021\n", + " United States Block Group Boundaries 2021\n", " \n", - "
This layer shows the Block Group boundaries of United States in 2021.
Feature Layer Collection by esri_dm\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, 4,324 views\n", + "
0 comments, 4326 views\n", "
\n", "
\n", " " @@ -2364,17 +2454,17 @@ "text/html": [ "
\n", "
\n", - " \n", + " \n", " \n", " \n", "
\n", "\n", "
\n", - " United States Country Boundary 2021\n", + " United States Country Boundary 2021\n", " \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", + "
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, 1,01,163 views\n", + "
0 comments, 102403 views\n", "
\n", "
\n", " " @@ -2420,17 +2510,17 @@ "text/html": [ "
\n", "
\n", - " \n", + " \n", " \n", " \n", "
\n", "\n", "
\n", - " United States ZIP Code Boundaries 2021\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", + "
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, 1,19,300 views\n", + "
2 comments, 119769 views\n", "
\n", "
\n", " " @@ -2482,7 +2572,7 @@ "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." ] }, { @@ -2494,6 +2584,13 @@ "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": 60, @@ -2505,7 +2602,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 69, "metadata": { "scrolled": true }, @@ -2546,7 +2643,7 @@ " \n", " 0\n", " 1\n", - " 00001\n", + " 1\n", " N Dillingham Census Area\n", " AK\n", " <NA>\n", @@ -2558,7 +2655,7 @@ " \n", " 1\n", " 2\n", - " 00002\n", + " 2\n", " Yukon Flats Nat Wildlife\n", " AK\n", " <NA>\n", @@ -2570,7 +2667,7 @@ " \n", " 2\n", " 3\n", - " 00003\n", + " 3\n", " Alaska Peninsula NWR\n", " AK\n", " <NA>\n", @@ -2582,7 +2679,7 @@ " \n", " 3\n", " 4\n", - " 00004\n", + " 4\n", " W Kenai Peninsula Borough\n", " AK\n", " <NA>\n", @@ -2594,7 +2691,7 @@ " \n", " 4\n", " 5\n", - " 00005\n", + " 5\n", " N Lake and Peninsula Borough\n", " AK\n", " <NA>\n", @@ -2608,12 +2705,12 @@ "" ], "text/plain": [ - " OBJECTID ZIP_CODE PO_NAME STATE POPULATION \\\n", - "0 1 00001 N Dillingham Census Area AK \n", - "1 2 00002 Yukon Flats Nat Wildlife AK \n", - "2 3 00003 Alaska Peninsula NWR AK \n", - "3 4 00004 W Kenai Peninsula Borough AK \n", - "4 5 00005 N Lake and Peninsula Borough AK \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", " SQMI Shape__Area Shape__Length \\\n", "0 16019.53 6.657141 24.677454 \n", @@ -2630,7 +2727,7 @@ "4 {\"rings\": [[[-156.0002144, 60.9074352], [-155.... " ] }, - "execution_count": 61, + "execution_count": 69, "metadata": {}, "output_type": "execute_result" } @@ -2726,6 +2823,13 @@ "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": 66, @@ -2737,7 +2841,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 70, "metadata": {}, "outputs": [ { @@ -2746,7 +2850,7 @@ "(7548, 11)" ] }, - "execution_count": 67, + "execution_count": 70, "metadata": {}, "output_type": "execute_result" } @@ -2755,6 +2859,13 @@ "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": 68, @@ -2766,30 +2877,20 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 71, "metadata": {}, "outputs": [ { - "ename": "FolderException", - "evalue": "The item could not be added: {'error': {'code': 403, 'messageCode': 'SB_0003', 'message': 'Subscription is expired', 'details': []}}", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mFolderException\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[77], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m mergd_lyr \u001b[38;5;241m=\u001b[39m gis2\u001b[38;5;241m.\u001b[39mcontent\u001b[38;5;241m.\u001b[39mimport_data(merged_df,\n\u001b[0;32m 2\u001b[0m title\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mMergedLayer_2024\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[0;32m 3\u001b[0m tags\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdatascience, dlpk\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", - "File \u001b[1;32m~\\AppData\\Local\\ESRI\\conda\\envs\\dl\\Lib\\site-packages\\arcgis\\gis\\__init__.py:8566\u001b[0m, in \u001b[0;36mContentManager.import_data\u001b[1;34m(self, df, address_fields, folder, item_id, **kwargs)\u001b[0m\n\u001b[0;32m 8563\u001b[0m overwrite \u001b[38;5;241m=\u001b[39m kwargs\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moverwrite\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[0;32m 8564\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m _geo\u001b[38;5;241m.\u001b[39m_is_geoenabled(df) \u001b[38;5;129;01mor\u001b[39;00m overwrite:\n\u001b[0;32m 8565\u001b[0m \u001b[38;5;66;03m# Item Workflow\u001b[39;00m\n\u001b[1;32m-> 8566\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _cm_helper\u001b[38;5;241m.\u001b[39mimport_as_item(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_gis, df, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 8567\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 8568\u001b[0m \u001b[38;5;66;03m# Feature Collection Workflow\u001b[39;00m\n\u001b[0;32m 8569\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _cm_helper\u001b[38;5;241m.\u001b[39mimport_as_fc(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_gis, df, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", - "File \u001b[1;32m~\\AppData\\Local\\ESRI\\conda\\envs\\dl\\Lib\\site-packages\\arcgis\\gis\\_impl\\_content_manager\\_import_data.py:273\u001b[0m, in \u001b[0;36mimport_as_item\u001b[1;34m(gis, df, **kwargs)\u001b[0m\n\u001b[0;32m 271\u001b[0m \u001b[38;5;66;03m# Create the file\u001b[39;00m\n\u001b[0;32m 272\u001b[0m file \u001b[38;5;241m=\u001b[39m _create_file(df, file_type, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m--> 273\u001b[0m file_item, new_item \u001b[38;5;241m=\u001b[39m _create_items(gis, file, file_type, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 274\u001b[0m \u001b[38;5;66;03m# normal workflow, simply create file item and new item\u001b[39;00m\n\u001b[0;32m 275\u001b[0m \u001b[38;5;66;03m# If not overwrite or insert, return the new item\u001b[39;00m\n\u001b[0;32m 276\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m overwrite:\n", - "File \u001b[1;32m~\\AppData\\Local\\ESRI\\conda\\envs\\dl\\Lib\\site-packages\\arcgis\\gis\\_impl\\_content_manager\\_import_data.py:160\u001b[0m, in \u001b[0;36m_create_items\u001b[1;34m(gis, file, file_type, **kwargs)\u001b[0m\n\u001b[0;32m 150\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 151\u001b[0m \u001b[38;5;66;03m# Get the root folder\u001b[39;00m\n\u001b[0;32m 152\u001b[0m folder \u001b[38;5;241m=\u001b[39m gis\u001b[38;5;241m.\u001b[39mcontent\u001b[38;5;241m.\u001b[39mfolders\u001b[38;5;241m.\u001b[39mget()\n\u001b[0;32m 153\u001b[0m file_item \u001b[38;5;241m=\u001b[39m folder\u001b[38;5;241m.\u001b[39madd(\n\u001b[0;32m 154\u001b[0m item_properties\u001b[38;5;241m=\u001b[39m{\n\u001b[0;32m 155\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtitle\u001b[39m\u001b[38;5;124m\"\u001b[39m: title,\n\u001b[0;32m 156\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtype\u001b[39m\u001b[38;5;124m\"\u001b[39m: file_type,\n\u001b[0;32m 157\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtags\u001b[39m\u001b[38;5;124m\"\u001b[39m: tags,\n\u001b[0;32m 158\u001b[0m },\n\u001b[0;32m 159\u001b[0m file\u001b[38;5;241m=\u001b[39mfile,\n\u001b[1;32m--> 160\u001b[0m )\u001b[38;5;241m.\u001b[39mresult()\n\u001b[0;32m 162\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m file_type \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCSV\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m 163\u001b[0m \u001b[38;5;66;03m# analyze the csv for publish params\u001b[39;00m\n\u001b[0;32m 164\u001b[0m publish_parameters \u001b[38;5;241m=\u001b[39m gis\u001b[38;5;241m.\u001b[39mcontent\u001b[38;5;241m.\u001b[39manalyze(item\u001b[38;5;241m=\u001b[39mfile_item, file_type\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcsv\u001b[39m\u001b[38;5;124m\"\u001b[39m)[\n\u001b[0;32m 165\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpublishParameters\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 166\u001b[0m ]\n", - "File \u001b[1;32m~\\AppData\\Local\\ESRI\\conda\\envs\\dl\\Lib\\concurrent\\futures\\_base.py:449\u001b[0m, in \u001b[0;36mFuture.result\u001b[1;34m(self, timeout)\u001b[0m\n\u001b[0;32m 447\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m CancelledError()\n\u001b[0;32m 448\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_state \u001b[38;5;241m==\u001b[39m FINISHED:\n\u001b[1;32m--> 449\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__get_result()\n\u001b[0;32m 451\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_condition\u001b[38;5;241m.\u001b[39mwait(timeout)\n\u001b[0;32m 453\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_state \u001b[38;5;129;01min\u001b[39;00m [CANCELLED, CANCELLED_AND_NOTIFIED]:\n", - "File \u001b[1;32m~\\AppData\\Local\\ESRI\\conda\\envs\\dl\\Lib\\concurrent\\futures\\_base.py:401\u001b[0m, in \u001b[0;36mFuture.__get_result\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 399\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exception:\n\u001b[0;32m 400\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 401\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exception\n\u001b[0;32m 402\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 403\u001b[0m \u001b[38;5;66;03m# Break a reference cycle with the exception in self._exception\u001b[39;00m\n\u001b[0;32m 404\u001b[0m \u001b[38;5;28mself\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "File \u001b[1;32m~\\AppData\\Local\\ESRI\\conda\\envs\\dl\\Lib\\concurrent\\futures\\thread.py:58\u001b[0m, in \u001b[0;36m_WorkItem.run\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 55\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[0;32m 57\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m---> 58\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfn(\u001b[38;5;241m*\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mkwargs)\n\u001b[0;32m 59\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[0;32m 60\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfuture\u001b[38;5;241m.\u001b[39mset_exception(exc)\n", - "File \u001b[1;32m~\\AppData\\Local\\ESRI\\conda\\envs\\dl\\Lib\\site-packages\\arcgis\\gis\\_impl\\_content_manager\\folder\\core.py:405\u001b[0m, in \u001b[0;36mFolder._add_async_streaming\u001b[1;34m(self, url, params, upload_size, file_list)\u001b[0m\n\u001b[0;32m 403\u001b[0m itemid \u001b[38;5;241m=\u001b[39m data\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mid\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m) \u001b[38;5;129;01mor\u001b[39;00m data\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mitemId\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[0;32m 404\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m itemid \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m--> 405\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m FolderException(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mThe item could not be added: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mstr\u001b[39m(data)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 406\u001b[0m parts_url: \u001b[38;5;28mstr\u001b[39m \u001b[38;5;241m=\u001b[39m url\u001b[38;5;241m.\u001b[39mreplace(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m/addItem\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m/items/\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mitemid\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m/addPart\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 407\u001b[0m commit_url: \u001b[38;5;28mstr\u001b[39m \u001b[38;5;241m=\u001b[39m url\u001b[38;5;241m.\u001b[39mreplace(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m/addItem\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m/items/\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mitemid\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m/commit\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "\u001b[1;31mFolderException\u001b[0m: The item could not be added: {'error': {'code': 403, 'messageCode': 'SB_0003', 'message': 'Subscription is expired', 'details': []}}" + "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 = gis2.content.import_data(merged_df,\n", + "mergd_lyr = gis.content.import_data(merged_df,\n", " title='MergedLayer_2024',\n", " tags='datascience, dlpk')" ] @@ -2800,75 +2901,141 @@ "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": null, + "execution_count": 81, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "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": null, + "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": null, + "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.content.add(mergd_lyr)\n", "sm = m1.content.renderer(0).smart_mapping()\n", "sm.class_breaks_renderer(\n", - " break_type=\"color\",\n", - " field = cur_field_name,\n", - ")\n", - "\n", - "m1.zoom_to_layer(mergd_lyr)" + " 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": null, + "execution_count": 85, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "m2 = gis.map('Redlands, CA')\n", "m2" @@ -2876,21 +3043,23 @@ }, { "cell_type": "code", - "execution_count": null, + "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": null, + "execution_count": 84, "metadata": {}, "outputs": [], "source": [ @@ -2898,10 +3067,8 @@ "sm = m2.content.renderer(0).smart_mapping()\n", "sm.class_breaks_renderer(\n", " break_type=\"size\",\n", - " field = cur_field_name,\n", - ")\n", - "\n", - "m2.zoom_to_layer(mergd_lyr)" + " field = \"days_on_ma\",\n", + ")" ] }, { @@ -2915,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**." ] }, @@ -2925,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": null, + "execution_count": 86, "metadata": {}, "outputs": [], "source": [ @@ -2940,16 +3118,76 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 87, "metadata": {}, - "outputs": [], + "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", + "
PlaceStreetCityStateZip
0Lisa's job380 New York StreetRedlandsCA92373
1Mark's job4511 E Guasti RoadOntarioCA91761
\n", + "
" + ], + "text/plain": [ + " Place Street City State Zip\n", + "0 Lisa's job 380 New York Street Redlands CA 92373\n", + "1 Mark's job 4511 E Guasti Road Ontario CA 91761" + ] + }, + "execution_count": 87, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "data3.head()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 88, "metadata": {}, "outputs": [], "source": [ @@ -2958,9 +3196,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 89, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "0 380 New York Street Redlands CA\n", + "1 4511 E Guasti Road Ontario CA\n", + "Name: Address, dtype: object" + ] + }, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "data3['Address']" ] @@ -2969,22 +3220,52 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "3) Draw the address on map" + "3) Draw the addresses on map" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 95, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 95, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m3_1 = gis.map('Redlands, CA')\n", + "m3_1" + ] + }, + { + "cell_type": "code", + "execution_count": 91, "metadata": {}, "outputs": [], "source": [ - "m3 = gis.map('Redlands, CA', 10)\n", - "m3" + "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": null, + "execution_count": 93, "metadata": {}, "outputs": [], "source": [ @@ -2992,7 +3273,7 @@ "from arcgis.map.popups import PopupInfo\n", "from arcgis.map.symbols import PictureMarkerSymbolEsriPMS\n", "\n", - "sr = m3.extent['spatialReference']['latestWkid']\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", @@ -3008,12 +3289,12 @@ " url=\"https://static.arcgis.com/images/Symbols/PeoplePlaces/School.png\",\n", ")\n", "\n", - "m3.content.draw(data3_addr1['location'], popup = popup, symbol = symbol)" + "m3_1.content.draw(data3_addr1['location'], popup = popup, symbol = symbol)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 94, "metadata": {}, "outputs": [], "source": [ @@ -3032,7 +3313,7 @@ " url=\"https://static.arcgis.com/images/Symbols/PeoplePlaces/School.png\",\n", ")\n", "\n", - "m3.content.draw(data3_addr2['location'], popup = popup, symbol = symbol)" + "m3_1.content.draw(data3_addr2['location'], popup = popup, symbol = symbol)" ] }, { @@ -3044,7 +3325,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 96, "metadata": {}, "outputs": [], "source": [ @@ -3053,7 +3334,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 97, "metadata": {}, "outputs": [], "source": [ @@ -3069,12 +3350,12 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 98, "metadata": {}, "outputs": [], "source": [ "drive_time_lyr = gis.content.import_data(drive_time_df,\n", - " title=\"DriveTimeLayer\")" + " title=\"DriveTimeLayer_2024\")" ] }, { @@ -3086,7 +3367,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 99, "metadata": {}, "outputs": [], "source": [ @@ -3106,26 +3387,56 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 105, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 105, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m3_2 = gis.map('Redlands, CA')\n", + "m3_2" + ] + }, + { + "cell_type": "code", + "execution_count": 102, "metadata": {}, "outputs": [], "source": [ - "m_3 = gis.map('Redlands, CA', 9)\n", - "m_3" + "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": null, + "execution_count": 103, "metadata": {}, "outputs": [], "source": [ - "m_3.content.add(dissolved_lyr)" + "m3_2.content.add(dissolved_lyr)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 104, "metadata": {}, "outputs": [], "source": [ @@ -3140,8 +3451,8 @@ " url=\"https://static.arcgis.com/images/Symbols/PeoplePlaces/School.png\",\n", ")\n", "\n", - "m_3.content.draw(data3_addr1['location'], popup = popup, symbol = symbol)\n", - "m_3.content.draw(data3_addr2['location'], popup = popup, symbol = symbol)" + "m3_2.content.draw(data3_addr1['location'], popup = popup, symbol = symbol)\n", + "m3_2.content.draw(data3_addr2['location'], popup = popup, symbol = symbol)" ] }, { @@ -3151,6 +3462,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": {}, @@ -3170,12 +3488,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": null, + "execution_count": 106, "metadata": {}, "outputs": [], "source": [ @@ -3185,414 +3503,1479 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "data4" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "3) Select **City, MarketHealthIndex, ZHVI, ForecastYoYPctChange**, and **zipstring** fields." - ] - }, - { - "cell_type": "code", - "execution_count": null, + "execution_count": 107, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
RegionTypeRegionNameCityStateMetroCBSATitleSizeRankMarketHealthIndexSellForGainPrevForeclosed...ZHVIMoMYoYForecastYoYPctChangeStockOfREOsNegativeEquityDelinquencyDaysOnMarketUnnamed: 19zipstring
0Zip1001AgawamMASpringfield, MA, MASpringfield, MANaN1.62236575.000.0500...214000.00.2811625.2631580.047047NaN0.0690280.06806381.0NaN1001
1Zip1002AmherstMASpringfield, MA, MASpringfield, MANaN5.49134192.310.0000...331400.00.4851436.9722400.046192NaN0.0454150.03846287.5NaN1002
2Zip1007BelchertownMASpringfield, MA, MASpringfield, MANaN4.664384100.000.0000...277400.00.3254974.6792450.054387NaN0.0463030.04838794.5NaN1007
3Zip1008BlandfordMASpringfield, MA, MASpringfield, MANaN2.5412810.00NaN...224000.00.2237148.8435370.061817NaN0.0601090.09090973.0NaN1008
4Zip1010BrimfieldMASpringfield, MA, MASpringfield, MANaN3.103101100.00NaN...255700.00.4715132.6083470.060555NaN0.0667780.07500073.0NaN1010
..................................................................
14893Zip75033FriscoTXDallas-Fort Worth, TX, TXDallas-Fort Worth, TXNaN9.095852100.000.0000...395800.0-0.0757381.0467190.066809NaNNaNNaN74.0NaN75033
14894Zip84009South JordanUTSalt Lake City, UT, UTSalt Lake City, UTNaN6.135052NaN0.0000...409200.00.5405419.1200000.040208NaNNaNNaN48.0NaN84009
14895Zip97003BeavertonORPortland, OR, ORPortland, ORNaN6.806954100.000.0000...346900.00.1732605.3766710.037766NaNNaNNaN44.0NaN97003
14896Zip97703BendORBend, OR, ORBend, ORNaN6.566653100.00NaN...590700.00.2886256.489995-0.011788NaNNaNNaN77.0NaN97703
14897Zip29486SummervilleSCCharleston, SC, SCCharleston, SCNaN6.81500991.300.0196...192200.00.4179737.3143500.019964NaNNaNNaN83.5NaN29486
\n", + "

14898 rows × 21 columns

\n", + "
" + ], + "text/plain": [ + " RegionType RegionName City State Metro \\\n", + "0 Zip 1001 Agawam MA Springfield, MA, MA \n", + "1 Zip 1002 Amherst MA Springfield, MA, MA \n", + "2 Zip 1007 Belchertown MA Springfield, MA, MA \n", + "3 Zip 1008 Blandford MA Springfield, MA, MA \n", + "4 Zip 1010 Brimfield MA Springfield, MA, MA \n", + "... ... ... ... ... ... \n", + "14893 Zip 75033 Frisco TX Dallas-Fort Worth, TX, TX \n", + "14894 Zip 84009 South Jordan UT Salt Lake City, UT, UT \n", + "14895 Zip 97003 Beaverton OR Portland, OR, OR \n", + "14896 Zip 97703 Bend OR Bend, OR, OR \n", + "14897 Zip 29486 Summerville SC Charleston, SC, SC \n", + "\n", + " CBSATitle SizeRank MarketHealthIndex SellForGain \\\n", + "0 Springfield, MA NaN 1.622365 75.00 \n", + "1 Springfield, MA NaN 5.491341 92.31 \n", + "2 Springfield, MA NaN 4.664384 100.00 \n", + "3 Springfield, MA NaN 2.541281 0.00 \n", + "4 Springfield, MA NaN 3.103101 100.00 \n", + "... ... ... ... ... \n", + "14893 Dallas-Fort Worth, TX NaN 9.095852 100.00 \n", + "14894 Salt Lake City, UT NaN 6.135052 NaN \n", + "14895 Portland, OR NaN 6.806954 100.00 \n", + "14896 Bend, OR NaN 6.566653 100.00 \n", + "14897 Charleston, SC NaN 6.815009 91.30 \n", + "\n", + " PrevForeclosed ... ZHVI MoM YoY \\\n", + "0 0.0500 ... 214000.0 0.281162 5.263158 \n", + "1 0.0000 ... 331400.0 0.485143 6.972240 \n", + "2 0.0000 ... 277400.0 0.325497 4.679245 \n", + "3 NaN ... 224000.0 0.223714 8.843537 \n", + "4 NaN ... 255700.0 0.471513 2.608347 \n", + "... ... ... ... ... ... \n", + "14893 0.0000 ... 395800.0 -0.075738 1.046719 \n", + "14894 0.0000 ... 409200.0 0.540541 9.120000 \n", + "14895 0.0000 ... 346900.0 0.173260 5.376671 \n", + "14896 NaN ... 590700.0 0.288625 6.489995 \n", + "14897 0.0196 ... 192200.0 0.417973 7.314350 \n", + "\n", + " ForecastYoYPctChange StockOfREOs NegativeEquity Delinquency \\\n", + "0 0.047047 NaN 0.069028 0.068063 \n", + "1 0.046192 NaN 0.045415 0.038462 \n", + "2 0.054387 NaN 0.046303 0.048387 \n", + "3 0.061817 NaN 0.060109 0.090909 \n", + "4 0.060555 NaN 0.066778 0.075000 \n", + "... ... ... ... ... \n", + "14893 0.066809 NaN NaN NaN \n", + "14894 0.040208 NaN NaN NaN \n", + "14895 0.037766 NaN NaN NaN \n", + "14896 -0.011788 NaN NaN NaN \n", + "14897 0.019964 NaN NaN NaN \n", + "\n", + " DaysOnMarket Unnamed: 19 zipstring \n", + "0 81.0 NaN 1001 \n", + "1 87.5 NaN 1002 \n", + "2 94.5 NaN 1007 \n", + "3 73.0 NaN 1008 \n", + "4 73.0 NaN 1010 \n", + "... ... ... ... \n", + "14893 74.0 NaN 75033 \n", + "14894 48.0 NaN 84009 \n", + "14895 44.0 NaN 97003 \n", + "14896 77.0 NaN 97703 \n", + "14897 83.5 NaN 29486 \n", + "\n", + "[14898 rows x 21 columns]" + ] + }, + "execution_count": 107, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data4" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "3) Select **City, MarketHealthIndex, ZHVI, ForecastYoYPctChange**, and **zipstring** fields." + ] + }, + { + "cell_type": "code", + "execution_count": 108, "metadata": {}, "outputs": [], "source": [ - "col = ['City', 'MarketHealthIndex', 'ZHVI', 'ForecastYoYPctChange', 'zipstring']" + "col = ['City', 'MarketHealthIndex', 'ZHVI', 'ForecastYoYPctChange', 'zipstring']" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": {}, + "outputs": [], + "source": [ + "matket_health_index = data4[col]" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CityMarketHealthIndexZHVIForecastYoYPctChangezipstring
0Agawam1.622365214000.00.0470471001
1Amherst5.491341331400.00.0461921002
2Belchertown4.664384277400.00.0543871007
3Blandford2.541281224000.00.0618171008
4Brimfield3.103101255700.00.0605551010
\n", + "
" + ], + "text/plain": [ + " City MarketHealthIndex ZHVI ForecastYoYPctChange zipstring\n", + "0 Agawam 1.622365 214000.0 0.047047 1001\n", + "1 Amherst 5.491341 331400.0 0.046192 1002\n", + "2 Belchertown 4.664384 277400.0 0.054387 1007\n", + "3 Blandford 2.541281 224000.0 0.061817 1008\n", + "4 Brimfield 3.103101 255700.0 0.060555 1010" + ] + }, + "execution_count": 110, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "matket_health_index.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "City object\n", + "MarketHealthIndex float64\n", + "ZHVI float64\n", + "ForecastYoYPctChange float64\n", + "zipstring int64\n", + "dtype: object" + ] + }, + "execution_count": 111, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "matket_health_index.dtypes" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.000671231" + ] + }, + "execution_count": 112, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "matket_health_index['MarketHealthIndex'].min()" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "10.0" + ] + }, + "execution_count": 113, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "matket_health_index['MarketHealthIndex'].max()" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "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", + " matket_health_index.rename(columns={\"zipstring\": \"ZIP_CODE\"},\n" + ] + } + ], + "source": [ + "matket_health_index.rename(columns={\"zipstring\": \"ZIP_CODE\"},\n", + " inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "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", + "
CityMarketHealthIndexZHVIForecastYoYPctChangeZIP_CODE
13351Crestline9.944288205600.00.06808492322
13353Crestline2.882937228900.00.06729692325
\n", + "
" + ], + "text/plain": [ + " City MarketHealthIndex ZHVI ForecastYoYPctChange ZIP_CODE\n", + "13351 Crestline 9.944288 205600.0 0.068084 92322\n", + "13353 Crestline 2.882937 228900.0 0.067296 92325" + ] + }, + "execution_count": 115, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "matket_health_index[matket_health_index['City']=='Crestline']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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": 116, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
OBJECTIDZIP_CODEPO_NAMESTATEPOPULATIONSQMIShape__AreaShape__LengthSHAPE
011N Dillingham Census AreaAK<NA>16019.536.65714124.677454{\"rings\": [[[-160.431152, 58.689351], [-160.43...
122Yukon Flats Nat WildlifeAK<NA>95862.8548.948815131.77645{\"rings\": [[[-160.038452, 61.947605], [-160.03...
233Alaska Peninsula NWRAK<NA>14572.95.65540541.564165{\"rings\": [[[-159.900745, 56.439047], [-159.90...
344W Kenai Peninsula BoroughAK<NA>6510.852.72876420.553203{\"rings\": [[[-154.748861, 59.259518], [-154.70...
455N Lake and Peninsula BoroughAK<NA>3760.071.5937229.571684{\"rings\": [[[-156.0002144, 60.9074352], [-155....
\n", + "
" + ], + "text/plain": [ + " 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", + " 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 \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": 116, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "zip_df.head()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 117, "metadata": {}, "outputs": [], "source": [ - "matket_health_index = data4[col]" + "zip_df = zip_df.astype({\"ZIP_CODE\": int})" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 118, "metadata": {}, "outputs": [], "source": [ - "matket_health_index.head()" + "health_df = pd.merge(zip_df, matket_health_index, on='ZIP_CODE')" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 119, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
OBJECTIDZIP_CODEPO_NAMESTATEPOPULATIONSQMIShape__AreaShape__LengthSHAPECityMarketHealthIndexZHVIForecastYoYPctChange
02451001AgawamMA1697912.080.0034040.318991{\"rings\": [[[-72.66152, 42.052804], [-72.66099...Agawam1.622365214000.00.047047
12461002AmherstMA3570358.030.0164290.932599{\"rings\": [[[-72.546763, 42.399994], [-72.5467...Amherst5.491341331400.00.046192
22491007BelchertownMA1561655.850.0157860.70547{\"rings\": [[[-72.471439, 42.346695], [-72.4713...Belchertown4.664384277400.00.054387
32501008BlandfordMA161860.520.0170820.68638{\"rings\": [[[-73.06734, 42.236958], [-73.06329...Blandford2.541281224000.00.061817
42521010BrimfieldMA398537.360.0105370.601482{\"rings\": [[[-72.274433, 42.140342], [-72.2742...Brimfield3.103101255700.00.060555
\n", + "
" + ], + "text/plain": [ + " 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__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", + " 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": 119, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "matket_health_index.dtypes" + "health_df.head()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 120, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(14894, 13)" + ] + }, + "execution_count": 120, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "matket_health_index['MarketHealthIndex'].min()" + "health_df.shape" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 121, "metadata": {}, "outputs": [], "source": [ - "matket_health_index['MarketHealthIndex'].max()" + "health_df.spatial.set_geometry('SHAPE')" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, + "execution_count": 122, + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ - "matket_health_index.rename(columns={\"zipstring\": \"ZIP_CODE\"},\n", - " inplace=True)" + "hlth_lyr = gis.content.import_data(health_df,\n", + " title=\"MarketHealthLayer_2024\")" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "matket_health_index[matket_health_index['City']=='Crestline']" + "5) Create a map on **MarketHealthIndex** field" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 127, "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 127, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "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." + "m4 = gis.map('Redlands, CA')\n", + "m4" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": true - }, + "execution_count": 125, + "metadata": {}, "outputs": [], "source": [ - "zip_df.head()" + "m4.zoom = 8" ] }, { "cell_type": "code", - "execution_count": null, + "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": [ - "zip_df = zip_df.astype({\"ZIP_CODE\": int})" + "field_names = hlth_lyr.layers[0].properties['fields']\n", + "for field in field_names:\n", + " print(field['name'])" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "health_df = pd.merge(zip_df, matket_health_index, on='ZIP_CODE')" + "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": null, - "metadata": {}, + "execution_count": 126, + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ - "health_df.head()" + "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": null, + "execution_count": 128, "metadata": {}, "outputs": [], "source": [ - "health_df.shape" + "market_hlth_lyr = hlth_lyr.layers[0]" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 129, "metadata": {}, "outputs": [], "source": [ - "health_df.spatial.set_geometry('SHAPE')" + "from arcgis.features.manage_data import overlay_layers" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": true - }, - "outputs": [], + "execution_count": 130, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "{\"cost\": 14.896}\n" + ] + } + ], "source": [ - "hlth_lyr = gis.content.import_data(health_df,\n", - " title=\"MarketHealthLayer\")" + "zip_intersect = overlay_layers(drive_time_lyr, \n", + " market_hlth_lyr, \n", + " output_name=\"Market Health Data Within drive time Buffer\" + str(dt.now().microsecond))" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 131, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "
\n", + " \n", + " \n", + " \n", + "
\n", + "\n", + "
\n", + " Market_Health_Data_Within_drive_time_Buffer488424\n", + " \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": 131, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "m4 = gis.map('United States')\n", - "m4" + "zip_intersect" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 132, "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\"" + "zip_hlth_intersect = zip_intersect.layers[0]" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": true - }, + "execution_count": 133, + "metadata": {}, "outputs": [], "source": [ - "m4.content.add(hlth_lyr)\n", - "sm = m4.content.renderer(0).smart_mapping()\n", - "sm.class_breaks_renderer(\n", - " break_type=\"color\",\n", - " field = cur_field_name,\n", - " classification_method = quantile\n", - " opacity = 0.7\n", - " \n", - ")\n", - "\n", - "m4.zoom_to_layer(hlth_lyr)" + "overlay_df = pd.DataFrame.spatial.from_layer(zip_hlth_intersect)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 134, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(360, 65)" + ] + }, + "execution_count": 134, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "market_hlth_lyr = hlth_lyr.layers[0]" + "overlay_df.shape" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "from arcgis.features.find_locations import find_centroids" + "6) 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": null, + "execution_count": 140, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 140, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "poly_to_point = find_centroids(market_hlth_lyr, output_name=\"HealthLyrPolygonToPoint\" + str(dt.now().microsecond))" + "m5 = gis.map('Redlands, CA')\n", + "m5" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 136, "metadata": {}, "outputs": [], "source": [ - "from arcgis.features.manage_data import overlay_layers" + "m5.zoom = 8" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 138, "metadata": {}, "outputs": [], "source": [ - "zip_intersect = overlay_layers(drive_time_lyr, \n", - " market_hlth_lyr, \n", - " output_name=\"Market Health Data Within drive time Buffer\" + str(dt.now().microsecond))" + "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": null, + "execution_count": 139, "metadata": {}, "outputs": [], "source": [ - "zip_intersect" + "m5.content.add(drive_time_lyr)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "5) Notice how many ZIP Codes intersect the drive time buffer." + "The larger the index, the darker the color, and the healthier the housing market is. They want to buy their new home in an area with a healthy housing market (rather than a location where there are vacancies, homes that aren't selling, and numerous foreclosures)." ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "zip_hlth_intersect = zip_intersect.layers[0]" + "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": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "overlay_df = pd.DataFrame.spatial.from_layer(zip_hlth_intersect)" + "7) 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": null, + "execution_count": 146, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 146, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "overlay_df.shape" + "m6 = gis.map('Redlands, CA')\n", + "m6" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 143, "metadata": {}, "outputs": [], "source": [ - "m5 = gis.map('Redlands, CA', 9)\n", - "m5" + "m6.zoom = 8" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 144, "metadata": {}, "outputs": [], "source": [ - "m5.content.add(hlth_lyr, {\"renderer\":\"ClassedColorRenderer\",\n", - " \"field_name\":cur_field_name,\n", - " \"classificationMethod\":'quantile',\n", - " \"opacity\":0.7\n", - " })\n", - "m5.content.add(drive_time_lyr)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The larger the index, the darker the color, and the healthier the housing market is. They want to buy their new home in an area with a healthy housing market (rather than a location where there are vacancies, homes that aren't selling, and numerous foreclosures)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "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." + "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": null, + "execution_count": 145, "metadata": {}, "outputs": [], "source": [ - "m6 = gis.map('Redlands, CA', 9)\n", - "m6" + "m6.content.add(drive_time_lyr)" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "m6.content.add(hlth_lyr, { \"renderer\":\"ClassedColorRenderer\",\n", - " \"field_name\":\"ZHVI\",\n", - " \"classificationMethod\":'quantile',\n", - " \"opacity\":0.7\n", - " })\n", - "m6.content.add(drive_time_lyr)" + "The dark ZIP Codes have the most expensive average home value estimates." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "The dark ZIP Codes have the most expensive average home value estimates." + "8) Create a map that displays the overlap by adding both `hlth_lyr` (classified by **ForecastYoYPctChange** field) and `drive_time_lyr`." ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 151, "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 151, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "Similarly plot for the field **ForecastYoYPctChange**" + "m7 = gis.map('Redlands, CA')\n", + "m7" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 148, "metadata": {}, "outputs": [], "source": [ - "m7 = gis.map('Redlands, CA', 9)\n", - "m7" + "m7.zoom = 8" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 149, "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.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": null, + "execution_count": 150, "metadata": {}, "outputs": [], "source": [ - "m7.content.add(hlth_lyr, {\"renderer\":\"ClassedColorRenderer\",\n", - " \"field_name\":cur_field_name2,\n", - " \"classificationMethod\":'quantile',\n", - " \"opacity\":0.7\n", - " })\n", "m7.content.add(drive_time_lyr)" ] }, @@ -3633,11 +5016,422 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 152, "metadata": {}, "outputs": [], "source": [ - "query_str = '((ZHVI > 350000) AND (ZHVI < 600000) AND (' + cur_field_name + ' > 8) AND (' + cur_field_name2 + '> 0.06)) AND (1=1)'\n", + "field_name = \"market_hea\"\n", + "field_name2 = \"forecast_y\"" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
OBJECTID_1FID_DRIVETIMELAYER_20242_DRIVETsource_couxyarea_typebuffer_unibuffer_u_1buffer_radaggregatio...sqmishape_lengcitymarket_heazhviforecast_yShape__Area_1Shape__Length_1AnalysisAreaSHAPE
021USA-117.55286634.064359NetworkServiceAreaMinutesDrive Time Minutes45.0BlockApportionment:US.BlockGroups;PointsLayer:......4.20.214615Los Angeles9.055578408100.00.0914715880559.8437525687.2786160.482092{\"rings\": [[[-13157517.9452, 4032773.4488], [-...
141USA-117.55286634.064359NetworkServiceAreaMinutesDrive Time Minutes45.0BlockApportionment:US.BlockGroups;PointsLayer:......3.010.147502Los Angeles9.930192472000.00.0768911375466.69531217800.6852791.779017{\"rings\": [[[-13157514.1907, 4037443.2303], [-...
2141USA-117.55286634.064359NetworkServiceAreaMinutesDrive Time Minutes45.0BlockApportionment:US.BlockGroups;PointsLayer:......3.740.183214West Whittier-Los Nietos8.272251485500.00.07237514136917.11718822634.2607538.36099{\"rings\": [[[-13143194.2534, 4028915.1404], [-...
3181USA-117.55286634.064359NetworkServiceAreaMinutesDrive Time Minutes45.0BlockApportionment:US.BlockGroups;PointsLayer:......8.230.28339Montebello8.167539538500.00.06180731089924.61328134373.96235513.017801{\"rings\": [[[-13143598.3654, 4032788.2902], [-...
4201USA-117.55286634.064359NetworkServiceAreaMinutesDrive Time Minutes45.0BlockApportionment:US.BlockGroups;PointsLayer:......8.530.438871Santa Fe Springs9.151564494500.00.06348232164136.52343853469.0633082.26762{\"rings\": [[[-13143509.5925, 4023388.3935], [-...
5351USA-117.55286634.064359NetworkServiceAreaMinutesDrive Time Minutes45.0BlockApportionment:US.BlockGroups;PointsLayer:......69.991.187015Azusa9.138139457600.00.0863265860978.933594144989.85688723.94345{\"rings\": [[[-13123457.5912, 4048674.4978], [-...
6361USA-117.55286634.064359NetworkServiceAreaMinutesDrive Time Minutes45.0BlockApportionment:US.BlockGroups;PointsLayer:......15.370.381127Baldwin Park9.215331460300.00.08817358195009.00781246203.38321639.805003{\"rings\": [[[-13129355.916, 4047201.7934], [-1...
7451USA-117.55286634.064359NetworkServiceAreaMinutesDrive Time Minutes45.0BlockApportionment:US.BlockGroups;PointsLayer:......4.80.210419El Monte9.203249506500.00.06529918149214.55859425938.50756612.421541{\"rings\": [[[-13135851.7534, 4040662.4451], [-...
8461USA-117.55286634.064359NetworkServiceAreaMinutesDrive Time Minutes45.0BlockApportionment:US.BlockGroups;PointsLayer:......6.990.228549South El Monte9.615385501700.00.09325526450814.41406227596.20578318.114647{\"rings\": [[[-13139099.6109, 4037245.849], [-1...
92131USA-117.55286634.064359NetworkServiceAreaMinutesDrive Time Minutes45.0BlockApportionment:US.BlockGroups;PointsLayer:......15.190.305009Eastvale8.270909503800.00.06450857390709.25390638277.20405539.349068{\"rings\": [[[-13082747.7254, 4033299.2511], [-...
102142USA-117.1947934.057265NetworkServiceAreaMinutesDrive Time Minutes45.0BlockApportionment:US.BlockGroups;PointsLayer:......15.190.305009Eastvale8.270909503800.00.06450857390709.25390638277.20405539.349068{\"rings\": [[[-13082747.7254, 4033299.2511], [-...
\n", + "

11 rows × 65 columns

\n", + "
" + ], + "text/plain": [ + " 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", + " 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", + " 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", + " 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__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", + "[11 rows x 65 columns]" + ] + }, + "execution_count": 153, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "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" @@ -3645,9 +5439,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 160, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 160, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "m9 = gis.map('United States')\n", "m9" @@ -3655,14 +5463,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 158, + "metadata": {}, + "outputs": [], + "source": [ + "m9.content.add(zip_hlth_intersect_df)" + ] + }, + { + "cell_type": "code", + "execution_count": 159, "metadata": {}, "outputs": [], "source": [ - "m9.content.add(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)" ] }, { @@ -3685,13 +5499,6 @@ "source": [ "The results show possible cities and ZIP Codes where they can explore homes for sale. We can use real estate websites such as Zillow.com or Realtor.com to see if they can find a home in their price range with the characteristics and qualities they're are looking for." ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -3700,9 +5507,9 @@ "notebookRuntimeVersion": "9.0" }, "kernelspec": { - "display_name": "Python [conda env:conda-dl] *", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": "conda-env-conda-dl-py" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -3714,7 +5521,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.10" + "version": "3.11.0" } }, "nbformat": 4,