{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Chapter 09 -- Panda Time Series and Date Handling" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Topics Covered:\n", "\n", " Creating and manipulating a fixed-frequency of dates and time spans \n", "\n", "Time Series Walk-Through\n", "\n", "Returning Unique Levels of Categories\n", "\n", "Return a Row using a Minimum Value\n", "\n", "\n", "Return a Row using a Maximum Value\n", "\n", "Convert time series from one frequency to another\n", "\n", "Plotting with bokeh\n", "\n", "Resources" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Chapter 8, Understanding Date Time and TimeDelta objects provided a short introduction to Python's built-in datetime capabilities. In this chapter we illustrate pandas time series and date handling. \n", "\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from datetime import date, time, datetime, timedelta\n", "import numpy as np\n", "import pandas as pd\n", "from pandas import Series, DataFrame, Index\n", "from numpy.random import randn as rnd\n", "from IPython.display import Image" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Creating and manipulating a fixed-frequency of dates and time spans" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The pd.date_range() method generates a DateTime Index which is applied to a panda Series or DataFrame to provide datetime interval indexing. We will see examples of its construction methods. And later we will utilize indexers taking advange of the Date TimeIndex. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "rng = pd.date_range('1/1/2016', periods=30, freq='D')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2016-01-01', '2016-01-02', '2016-01-03', '2016-01-04',\n", " '2016-01-05', '2016-01-06', '2016-01-07', '2016-01-08',\n", " '2016-01-09', '2016-01-10', '2016-01-11', '2016-01-12',\n", " '2016-01-13', '2016-01-14', '2016-01-15', '2016-01-16',\n", " '2016-01-17', '2016-01-18', '2016-01-19', '2016-01-20',\n", " '2016-01-21', '2016-01-22', '2016-01-23', '2016-01-24',\n", " '2016-01-25', '2016-01-26', '2016-01-27', '2016-01-28',\n", " '2016-01-29', '2016-01-30'],\n", " dtype='datetime64[ns]', freq='D')" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rng" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Print the first 10 dates in the DateTimeIndex" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2016-01-01', '2016-01-02', '2016-01-03', '2016-01-04',\n", " '2016-01-05', '2016-01-06', '2016-01-07', '2016-01-08',\n", " '2016-01-09', '2016-01-10'],\n", " dtype='datetime64[ns]', freq='D')" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rng[:10]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Assemble a Series by using strings and integers for columns. Map the year, month, and day value into a date timestamp using the pd.to_datetime() method. Details for the pd.datetime() method are found here." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0 2014-01-01\n", "1 2015-02-02\n", "2 2016-03-03\n", "dtype: datetime64[ns]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame({'year': ['2014', '2015', '2016'],\n", " 'month': [1, 2, 3],\n", " 'day': [1,2,3,]})\n", "df1 = pd.to_datetime(df)\n", "df1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Construct the Series 'b_rng' containing only business days using the pd.bdate() method and supplying start and end date. " ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "start = datetime(2016, 1, 1)\n", "end = datetime(2016, 12, 31)\n", "b_rng = pd.bdate_range(start,end)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Series implicitly creates a DatetimeIndex object. " ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "pandas.tseries.index.DatetimeIndex" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(b_rng)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2016-01-01', '2016-01-04', '2016-01-05', '2016-01-06',\n", " '2016-01-07', '2016-01-08', '2016-01-11', '2016-01-12',\n", " '2016-01-13', '2016-01-14',\n", " ...\n", " '2016-12-19', '2016-12-20', '2016-12-21', '2016-12-22',\n", " '2016-12-23', '2016-12-26', '2016-12-27', '2016-12-28',\n", " '2016-12-29', '2016-12-30'],\n", " dtype='datetime64[ns]', length=261, freq='B')" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b_rng" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a Series containing the last business day of the month for 2016." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2016-01-29', '2016-02-29', '2016-03-31', '2016-04-29',\n", " '2016-05-31', '2016-06-30', '2016-07-29', '2016-08-31',\n", " '2016-09-30', '2016-10-31', '2016-11-30', '2016-12-30'],\n", " dtype='datetime64[ns]', freq='BM')" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rng = pd.date_range(start, end, freq='BM')\n", "ts = pd.Series(np.random.randn(len(rng)), index=rng)\n", "ts.index" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Returns the first 5 last business day of the month for 2016." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2016-01-29', '2016-02-29', '2016-03-31', '2016-04-29',\n", " '2016-05-31'],\n", " dtype='datetime64[ns]', freq='BM')" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts[:5].index" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Returns the last business day of every other month in 2016." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2016-01-29 1.246634\n", "2016-03-31 0.702623\n", "2016-05-31 0.249486\n", "2016-07-29 0.795634\n", "2016-09-30 1.502413\n", "2016-11-30 -0.820219\n", "Freq: 2BM, dtype: float64" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts[::2]" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Time Series Walk-Through\n", "\n", "We can begin combining features covered in previous chapters to conduct a walk-through of a simple time series analysis. \n", "\n", "#### The Data\n", "\n", "The data is the FHFA House Price Index (HPI) which is a broad measure of the movement of single-family house prices. It is a weighted, repeat-sales index, meaning that it measures average price changes in repeat sales or refinancing on the same properties. This information is obtained by reviewing repeat mortgage transactions on single-family properties whose mortgages have been purchased or securitized by Fannie Mae or Freddie Mac. \n", "\n", "Details about the data and how it is organized can be found here . This time series begins January 1991 and end August 2016. Both the seasonally adjusted index 'index_sa' and the non-seaonally adjusted index 'index_nsa' set the index value at 100 for January 1991. \n", "\n", "#### The Inquiry\n", "\n", "The three salient questions to answer are:\n", "\n", " 1. Have U.S. aggregate home prices recovered their value since the Great Recession of 2008-2010? \n", " 2. Where are the highest and lowest values for 'traditional', 'purchase-only' homes in the U.S. in 2016? \n", " 3. How do the highest and lowest home values market segments compare to the aggregate U.S. home prices?\n", " \n", "#### The Approach\n", "\n", "The input .csv file located here . \n", "\n", "The file is composed of two parts. Part 1, rows 2 to 3081 are records for the aggregate market groups at the Census Division level. The frequency interval is monthly. \n", "\n", "This portion of the file has 10 columns containing values for major market segments and the U.S. aggregate prices. The price indicies are both seasonally adjusted and non-seasonally adjusted values. The end-result DataFrame will be called 'df_us'.\n", "\n", "Part 2, rows 3082 to 96,243 are more granular with a quarterly frequency interval. The major U.S. market segments are broken into smaller geographics areas with just the non-seasonaly adjusted home index value. Accordingly, the 10th column 'index_sa' contains no values at this location to the end of the file. The end-result DataFrame will be called 'df_states'.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Part 1 of .csv File to Construct the 'df_us' DataFrame" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Start with a test read of the entire .csv file. The pd.read_csv method has the one required arguement, the input file name to create the DataFrame 'df_all'." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df_all = pd.read_csv(\"C:\\Data\\\\HPI_master.csv\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Inspect the first 5 rows to determine if the read_csv() method is giving the expected results." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "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", "
hpi_typehpi_flavorfrequencylevelplace_nameplace_idyrperiodindex_nsaindex_sa
0traditionalpurchase-onlymonthlyUSA or Census DivisionEast North Central DivisionDV_ENC19911100.00100.00
1traditionalpurchase-onlymonthlyUSA or Census DivisionEast North Central DivisionDV_ENC19912101.03101.11
2traditionalpurchase-onlymonthlyUSA or Census DivisionEast North Central DivisionDV_ENC19913101.40101.08
3traditionalpurchase-onlymonthlyUSA or Census DivisionEast North Central DivisionDV_ENC19914101.79101.10
4traditionalpurchase-onlymonthlyUSA or Census DivisionEast North Central DivisionDV_ENC19915102.44101.50
\n", "
" ], "text/plain": [ " hpi_type hpi_flavor frequency level \\\n", "0 traditional purchase-only monthly USA or Census Division \n", "1 traditional purchase-only monthly USA or Census Division \n", "2 traditional purchase-only monthly USA or Census Division \n", "3 traditional purchase-only monthly USA or Census Division \n", "4 traditional purchase-only monthly USA or Census Division \n", "\n", " place_name place_id yr period index_nsa index_sa \n", "0 East North Central Division DV_ENC 1991 1 100.00 100.00 \n", "1 East North Central Division DV_ENC 1991 2 101.03 101.11 \n", "2 East North Central Division DV_ENC 1991 3 101.40 101.08 \n", "3 East North Central Division DV_ENC 1991 4 101.79 101.10 \n", "4 East North Central Division DV_ENC 1991 5 102.44 101.50 " ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_all.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We need to combine the year and period fields into a datetime timetamp . The .csv file in the cell above is read without any datetime parsing for the fields, 'yr' and 'period'. We could post-process these fields to construct the appropriate date timestamp values. \n", "\n", "A better approach is below. The parse_dates= argument allows a dictionary object with the key being the arbitrary name of the new column created and the key values indicating which fields are to be read in the .csv file. Recall that Python indexes have a start position of 0. In the .csv file, these fields are the 7th and 8th column position.\n", "\n", "Sometimes, you may need to create your own date-parser, analogous to building a user-defined SAS INFORMAT to map field values into a datetime object. This is particularly true in cases where the date value is stored as component values in multiple fields. \n", "\n", "The nrows= argument value is set to 3080. " ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df_us = pd.read_csv(\"C:\\Data\\\\HPI_master.csv\",\n", " parse_dates={'date_idx': [6,7]},\n", " nrows=3080)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(3080, 9)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_us.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Validate column names and their data types. Confirm the date parser constructed the column 'date_idx' as a datetime object." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 3080 entries, 0 to 3079\n", "Data columns (total 9 columns):\n", "date_idx 3080 non-null datetime64[ns]\n", "hpi_type 3080 non-null object\n", "hpi_flavor 3080 non-null object\n", "frequency 3080 non-null object\n", "level 3080 non-null object\n", "place_name 3080 non-null object\n", "place_id 3080 non-null object\n", "index_nsa 3080 non-null float64\n", "index_sa 3080 non-null float64\n", "dtypes: datetime64[ns](1), float64(2), object(6)\n", "memory usage: 216.6+ KB\n" ] } ], "source": [ "df_us.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check for missing values." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "date_idx False\n", "hpi_type False\n", "hpi_flavor False\n", "frequency False\n", "level False\n", "place_name False\n", "place_id False\n", "index_nsa False\n", "index_sa False\n", "dtype: bool" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_us.isnull().any()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Set the 'date_idx' column as the index on the DataFrame." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df_us.set_index(\"date_idx\", inplace=True, drop=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Indexing on the datetime column 'date' creates a 'datetime-aware' DateTimeIndex. " ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['1991-01-01', '1991-02-01', '1991-03-01', '1991-04-01',\n", " '1991-05-01', '1991-06-01', '1991-07-01', '1991-08-01',\n", " '1991-09-01', '1991-10-01',\n", " ...\n", " '2015-11-01', '2015-12-01', '2016-01-01', '2016-02-01',\n", " '2016-03-01', '2016-04-01', '2016-05-01', '2016-06-01',\n", " '2016-07-01', '2016-08-01'],\n", " dtype='datetime64[ns]', name='date_idx', length=3080, freq=None)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_us.index" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Get the earlies and lastest date values in the 'df_us' DataFrame." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Earliest date is: 1991-01-01 00:00:00\n", "Latest date is: 2016-08-01 00:00:00\n" ] } ], "source": [ "print('Earliest date is:', df_us.date_idx.min())\n", "print('Latest date is:', df_us.date_idx.max())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see from the list of columns returned from the .info() attribute above we have several categorical columns. We need to understand their levels. Earlier, we saw the .describe() method used for numerical columns. In the example below specifying the 'include=' argument returns a description of string columns. \n", "\n", "Recall that dtype 'O' (not zero) indicates string values for a Series or DataFrame column." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "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", "
hpi_typehpi_flavorfrequencylevelplace_nameplace_id
count308030803080308030803080
unique11111010
toptraditionalpurchase-onlymonthlyUSA or Census DivisionNew England DivisionDV_WNC
freq3080308030803080308308
\n", "
" ], "text/plain": [ " hpi_type hpi_flavor frequency level \\\n", "count 3080 3080 3080 3080 \n", "unique 1 1 1 1 \n", "top traditional purchase-only monthly USA or Census Division \n", "freq 3080 3080 3080 3080 \n", "\n", " place_name place_id \n", "count 3080 3080 \n", "unique 10 10 \n", "top New England Division DV_WNC \n", "freq 308 308 " ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_us.describe(include=['O'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The 'place_name' column has 10 unique levels or values. We can examine these values with the .unique() attribute." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array(['East North Central Division', 'East South Central Division',\n", " 'Middle Atlantic Division', 'Mountain Division',\n", " 'New England Division', 'Pacific Division',\n", " 'South Atlantic Division', 'West North Central Division',\n", " 'West South Central Division', 'United States'], dtype=object)" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_us.place_name.unique()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Continue by setting an index on the column 'place_name'. Construct the 'df_us_plot' DataFrame with rows for 'place_name' equal to 'United States'. The .loc indexer allows row slicing which is covered in detail here. " ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df_us.set_index('place_name', inplace=True, drop=False)\n", "df_us_plot = df_us.loc['United States']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Time series data lends itself well to plotting. The bokeh package is used to plot the non-seasonal home price index for the entire U.S. using the 'df_us_plot' DataFrame created above" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " Loading BokehJS ...\n", "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", "(function(global) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " var force = \"1\";\n", "\n", " if (typeof (window._bokeh_onload_callbacks) === \"undefined\" || force !== \"\") {\n", " window._bokeh_onload_callbacks = [];\n", " window._bokeh_is_loading = undefined;\n", " }\n", "\n", "\n", " \n", " if (typeof (window._bokeh_timeout) === \"undefined\" || force !== \"\") {\n", " window._bokeh_timeout = Date.now() + 5000;\n", " window._bokeh_failed_load = false;\n", " }\n", "\n", " var NB_LOAD_WARNING = {'data': {'text/html':\n", " \"
\\n\"+\n", " \"

\\n\"+\n", " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", " \"

\\n\"+\n", " \"\\n\"+\n", " \"\\n\"+\n", " \"from bokeh.resources import INLINE\\n\"+\n", " \"output_notebook(resources=INLINE)\\n\"+\n", " \"\\n\"+\n", " \"
\"}};\n", "\n", " function display_loaded() {\n", " if (window.Bokeh !== undefined) {\n", " Bokeh.$(\"#ec781c6c-7e20-41cb-aa8a-a07f6f162ae5\").text(\"BokehJS successfully loaded.\");\n", " } else if (Date.now() < window._bokeh_timeout) {\n", " setTimeout(display_loaded, 100)\n", " }\n", " }\n", "\n", " function run_callbacks() {\n", " window._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n", " delete window._bokeh_onload_callbacks\n", " console.info(\"Bokeh: all callbacks have finished\");\n", " }\n", "\n", " function load_libs(js_urls, callback) {\n", " window._bokeh_onload_callbacks.push(callback);\n", " if (window._bokeh_is_loading > 0) {\n", " console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", " return null;\n", " }\n", " if (js_urls == null || js_urls.length === 0) {\n", " run_callbacks();\n", " return null;\n", " }\n", " console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", " window._bokeh_is_loading = js_urls.length;\n", " for (var i = 0; i < js_urls.length; i++) {\n", " var url = js_urls[i];\n", " var s = document.createElement('script');\n", " s.src = url;\n", " s.async = false;\n", " s.onreadystatechange = s.onload = function() {\n", " window._bokeh_is_loading--;\n", " if (window._bokeh_is_loading === 0) {\n", " console.log(\"Bokeh: all BokehJS libraries loaded\");\n", " run_callbacks()\n", " }\n", " };\n", " s.onerror = function() {\n", " console.warn(\"failed to load library \" + url);\n", " };\n", " console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", " }\n", " };var element = document.getElementById(\"ec781c6c-7e20-41cb-aa8a-a07f6f162ae5\");\n", " if (element == null) {\n", " console.log(\"Bokeh: ERROR: autoload.js configured with elementid 'ec781c6c-7e20-41cb-aa8a-a07f6f162ae5' but no matching script tag was found. \")\n", " return false;\n", " }\n", "\n", " var js_urls = ['https://cdn.pydata.org/bokeh/release/bokeh-0.12.2.min.js', 'https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.2.min.js', 'https://cdn.pydata.org/bokeh/release/bokeh-compiler-0.12.2.min.js'];\n", "\n", " var inline_js = [\n", " function(Bokeh) {\n", " Bokeh.set_log_level(\"info\");\n", " },\n", " \n", " function(Bokeh) {\n", " \n", " Bokeh.$(\"#ec781c6c-7e20-41cb-aa8a-a07f6f162ae5\").text(\"BokehJS is loading...\");\n", " },\n", " function(Bokeh) {\n", " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-0.12.2.min.css\");\n", " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.2.min.css\");\n", " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.2.min.css\");\n", " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.2.min.css\");\n", " }\n", " ];\n", "\n", " function run_inline_js() {\n", " \n", " if ((window.Bokeh !== undefined) || (force === \"1\")) {\n", " for (var i = 0; i < inline_js.length; i++) {\n", " inline_js[i](window.Bokeh);\n", " }if (force === \"1\") {\n", " display_loaded();\n", " }} else if (Date.now() < window._bokeh_timeout) {\n", " setTimeout(run_inline_js, 100);\n", " } else if (!window._bokeh_failed_load) {\n", " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", " window._bokeh_failed_load = true;\n", " } else if (!force) {\n", " var cell = $(\"#ec781c6c-7e20-41cb-aa8a-a07f6f162ae5\").parents('.cell').data().cell;\n", " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", " }\n", "\n", " }\n", "\n", " if (window._bokeh_is_loading === 0) {\n", " console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", " run_inline_js();\n", " } else {\n", " load_libs(js_urls, function() {\n", " console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n", " run_inline_js();\n", " });\n", " }\n", "}(this));" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import bokeh.charts\n", "import bokeh.charts.utils\n", "import bokeh.io\n", "import bokeh.models\n", "import bokeh.palettes\n", "import bokeh.plotting\n", "\n", "# Display graphics in this notebook\n", "bokeh.io.output_notebook()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot the monthly aggregate home index values for the U.S. using the earliest and latest dates from the 'df_us_plot' DataFrame." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "p = bokeh.charts.Line(df_us_plot, x='date_idx', y='index_nsa', color='firebrick', \n", " title=\"Monthly Aggregate Home Price Values in the U.S.\")\n", "\n", "# Display it\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Answer to question 1\n", " Have U.S. aggregate home prices recovered their value since the Great Recession of 2008-2010?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "During the Great Recession of 2008-2010, home prices across the U.S. declined dramatically. The aggregate U.S. home price index has recovered all of the losses since that time and have continued to experience steady growth. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create the DataFrame 'df_us_3' to select the rows with the values indicated below." ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df_us_3 = df_us.loc[['West South Central Division', 'United States', 'Pacific Division']]" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Index: 924 entries, West South Central Division to Pacific Division\n", "Data columns (total 9 columns):\n", "date_idx 924 non-null datetime64[ns]\n", "hpi_type 924 non-null object\n", "hpi_flavor 924 non-null object\n", "frequency 924 non-null object\n", "level 924 non-null object\n", "place_name 924 non-null object\n", "place_id 924 non-null object\n", "index_nsa 924 non-null float64\n", "index_sa 924 non-null float64\n", "dtypes: datetime64[ns](1), float64(2), object(6)\n", "memory usage: 72.2+ KB\n" ] } ], "source": [ "df_us_3.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot the 3 regions using the U.S. home price index for comparison. Rather than specify a color value for color=, specifying a column label produces multiple plots based on the the levels." ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "p = bokeh.charts.Line(df_us_3, x='date_idx', y='index_nsa', color='place_name', \n", " title=\"Monthly Home Price in West South Central and Pacific Division compared to U.S.\",\n", " legend=\"top_left\")\n", "\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Part 2 of .csv File to Construct the 'df_states' DataFrame" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use to 'skiprows=' argument to begin reading at row 3082. We use a tuple to specify the columns labels. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Beginning with row 3082 the values for the field 'index_sa' are missing. Begin the read at row 3082 until end of file. And since the default is to key off column names, supply column labels with a tuple of names. The usecols= argument uses a tuple of integers to indicate which fields are to be read from the .csv file. Header=None is to prevent the reader from building column names at row position nrows-1, which in our case contains data values." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df_states = pd.read_csv(\"C:\\Data\\\\HPI_master.csv\", \n", " skiprows=3082,\n", " usecols=(0, 1, 2, 3, 4, 5, 6, 7, 8),\n", " names=('hpi_type', 'hpi_flavor', 'frequency', 'level', 'place_name', 'place_id', 'yr', 'period', 'index_nsa'),\n", " header=None)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The columns 'yr' and 'period' are read as string values and need to be converted to datetime values. The operation below creates the new column 'date_str' by:\n", "\n", " 1. Concatenating 'yr' with 'Q' with 'period' to form a date string \n", " 2. The date string is passed to the pd.to_datetime function creating the dateime column 'date_idx'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " 1. String concatenation operation to form YYYYq." ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df_states[\"date_str\"] = df_states['yr'].map(str) + 'Q' + df_states['period'].map(str)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Display the 'date_str' value using the iloc indexer which returns row and column location by integer positions." ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'1986Q4'" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_states.iloc[0,-1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " 2. Convert the 'date_str' column into a panda datetime column called 'date_idx'. " ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df_states['date_idx'] = pd.to_datetime(df_states['date_str'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Inspect the first 5 records in the 'df_states' DataFrame." ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "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", "
hpi_typehpi_flavorfrequencylevelplace_nameplace_idyrperiodindex_nsadate_strdate_idx
0traditionalall-transactionsquarterlyMSAAbilene, TX101801986494.951986Q41986-10-01
1traditionalall-transactionsquarterlyMSAAbilene, TX1018019871100.911987Q11987-01-01
2traditionalall-transactionsquarterlyMSAAbilene, TX1018019872100.761987Q21987-04-01
3traditionalall-transactionsquarterlyMSAAbilene, TX101801987394.021987Q31987-07-01
4traditionalall-transactionsquarterlyMSAAbilene, TX101801987491.431987Q41987-10-01
\n", "
" ], "text/plain": [ " hpi_type hpi_flavor frequency level place_name place_id yr \\\n", "0 traditional all-transactions quarterly MSA Abilene, TX 10180 1986 \n", "1 traditional all-transactions quarterly MSA Abilene, TX 10180 1987 \n", "2 traditional all-transactions quarterly MSA Abilene, TX 10180 1987 \n", "3 traditional all-transactions quarterly MSA Abilene, TX 10180 1987 \n", "4 traditional all-transactions quarterly MSA Abilene, TX 10180 1987 \n", "\n", " period index_nsa date_str date_idx \n", "0 4 94.95 1986Q4 1986-10-01 \n", "1 1 100.91 1987Q1 1987-01-01 \n", "2 2 100.76 1987Q2 1987-04-01 \n", "3 3 94.02 1987Q3 1987-07-01 \n", "4 4 91.43 1987Q4 1987-10-01 " ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_states.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Return the number of rows and columns in the DataFrame." ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(96244, 11)" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_states.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following SAS Data Step reads the same .csv file using FIRSTOBS= to begin reading from the arbitary row position 3082." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "````\n", " /********************************/\n", " /* c09_read()_csv_df_states.sas */\n", " /********************************/\n", " data df_states;\n", " infile 'C:\\Data\\HPI_master.csv' delimiter=',' missover dsd firstobs=3082; \n", " informat hpi_type $12.\n", " hpi_flavor $16.\n", " frequency $9.\n", " level $28.\n", " place_name $33.\n", " place_id $8.\n", " yr $5.\n", " period $6.\n", " index_nsa 8.;\n", " input hpi_type $\n", " hpi_flavor $\n", " frequency $\n", " level $\n", " place_name $\n", " place_id $\n", " yr $\n", " period $\n", " index_nsa ;\n", "````" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Display the first 5 rows of the SAS data set df_states. In the SAS code example below the 'yr' and 'period' variables are combined to create the SAS datetime variable 'date_idx'." ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/jpeg": "/9j/4AAQSkZJRgABAQEAYABgAAD/4RDcRXhpZgAATU0AKgAAAAgABAE7AAIAAAAGAAAISodpAAQA\nAAABAAAIUJydAAEAAAAMAAAQyOocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJhbmR5AAAFkAMAAgAA\nABQAABCekAQAAgAAABQAABCykpEAAgAAAAMxMwAAkpIAAgAAAAMxMwAA6hwABwAACAwAAAiSAAAA\nABzqAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAMjAxNjoxMTowMyAxOTo0MToyOQAyMDE2OjExOjAzIDE5OjQxOjI5AAAAcgBhAG4A\nZAB5AAAA/+ELGGh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSfv\nu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4NCjx4OnhtcG1ldGEgeG1sbnM6eD0i\nYWRvYmU6bnM6bWV0YS8iPjxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5\nOS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6\nZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpkYz0iaHR0cDovL3B1\ncmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVp\nZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOnhtcD0iaHR0cDov\nL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+PHhtcDpDcmVhdGVEYXRlPjIwMTYtMTEtMDNUMTk6NDE6\nMjkuMTMyPC94bXA6Q3JlYXRlRGF0ZT48L3JkZjpEZXNjcmlwdGlvbj48cmRmOkRlc2NyaXB0aW9u\nIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHht\nbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+PGRjOmNyZWF0b3I+PHJk\nZjpTZXEgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgt\nbnMjIj48cmRmOmxpPnJhbmR5PC9yZGY6bGk+PC9yZGY6U2VxPg0KCQkJPC9kYzpjcmVhdG9yPjwv\ncmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCiAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0ndyc/Pv/b\nAEMABwUFBgUEBwYFBggHBwgKEQsKCQkKFQ8QDBEYFRoZGBUYFxseJyEbHSUdFxgiLiIlKCkrLCsa\nIC8zLyoyJyorKv/bAEMBBwgICgkKFAsLFCocGBwqKioqKioqKioqKioqKioqKioqKioqKioqKioq\nKioqKioqKioqKioqKioqKioqKioqKv/AABEIAJcChAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAA\nAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEU\nMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2Rl\nZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK\n0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUG\nBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS\n8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4\neXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri\n4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APoC/wBag0+6EEkM0jFA+YwuACSO5Hoarf8A\nCUW3/Prdfkn/AMVVDxF/yGh/17p/6E9eaah491Z9W1C18J+E59dg01zFd3IvEgUSgZZEDAlyO+Oc\n9uhO8YRcU2YylK7SPWv+Eotv+fW6/JP/AIqj/hKLb/n1uvyT/wCKryG4+LOiW0eiXc4MGnapHO8l\nxMxD2zRYyhjUEs2TjAP51qXfxJ8I2Oi2erXOtRLZXpIt3WN2ZyOvyBSwx3yBjj1qvZw7k+0n2PSW\n8U2qqWa1ugAMnhP/AIql/wCEotv+fW6/JP8A4quQttQtNW0VL/Tp0uLW4iLxSp0YEf547VT8Wa//\nAMIv4VvdZ+zfavsiBvJ8zZuywH3sHHX0olSjG9wjUlKyXU7v/hKLb/n1uvyT/wCKo/4Si2/59br8\nk/8Aiq83sfiH4X1Cy1C6tdWilj0xN94UR28seo+X5xx1XIqCL4leGdQstUl0bVbe7l023aeVHEka\n7R3zsJK+pUNjI45FDpwXUFUm+h6f/wAJRbf8+t1+Sf8AxVH/AAlFt/z63X5J/wDFVy1jci90+3ul\n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\nFABRRRQAUUUUAFFFFAH/2Q==\n", "text/plain": [ "" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Image(filename='Anaconda3\\\\output\\\\df_states_output.JPG') " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Inspect values for the categorical columns." ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "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", "
hpi_typehpi_flavorfrequencylevelplace_nameplace_iddate_str
count96244962449624496244962449624496244
unique4314464464166
toptraditionalall-transactionsquarterlyMSALos Angeles-Long Beach-Glendale, CA (MSAD)310842002Q3
freq90806671909624469460472472796
\n", "
" ], "text/plain": [ " hpi_type hpi_flavor frequency level \\\n", "count 96244 96244 96244 96244 \n", "unique 4 3 1 4 \n", "top traditional all-transactions quarterly MSA \n", "freq 90806 67190 96244 69460 \n", "\n", " place_name place_id date_str \n", "count 96244 96244 96244 \n", "unique 464 464 166 \n", "top Los Angeles-Long Beach-Glendale, CA (MSAD) 31084 2002Q3 \n", "freq 472 472 796 " ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_states.describe(include=['O'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Returning Unique Levels of Categories" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Get unique values for column 'level'" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array(['MSA', 'State', 'USA or Census Division', 'Puerto Rico'], dtype=object)" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_states.level.unique()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "PROC SQL used to obtain unique values from the variable 'level'." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "````\n", " /******************************************************/\n", " /* c09_select_unique_level.sas */\n", " /******************************************************/\n", " 56 proc sql;\n", " 57 select unique level\n", " 58 from df_states;\n", " 59 quit;\n", "````" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/jpeg": "/9j/4AAQSkZJRgABAQEAYABgAAD/4RDcRXhpZgAATU0AKgAAAAgABAE7AAIAAAAGAAAISodpAAQA\nAAABAAAIUJydAAEAAAAMAAAQyOocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJhbmR5AAAFkAMAAgAA\nABQAABCekAQAAgAAABQAABCykpEAAgAAAAM3OAAAkpIAAgAAAAM3OAAA6hwABwAACAwAAAiSAAAA\nABzqAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAMjAxNjoxMTowMyAxOTo1NToyNQAyMDE2OjExOjAzIDE5OjU1OjI1AAAAcgBhAG4A\nZAB5AAAA/+ELGGh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSfv\nu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4NCjx4OnhtcG1ldGEgeG1sbnM6eD0i\nYWRvYmU6bnM6bWV0YS8iPjxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5\nOS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6\nZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpkYz0iaHR0cDovL3B1\ncmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVp\nZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOnhtcD0iaHR0cDov\nL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+PHhtcDpDcmVhdGVEYXRlPjIwMTYtMTEtMDNUMTk6NTU6\nMjUuNzc2PC94bXA6Q3JlYXRlRGF0ZT48L3JkZjpEZXNjcmlwdGlvbj48cmRmOkRlc2NyaXB0aW9u\nIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHht\nbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+PGRjOmNyZWF0b3I+PHJk\nZjpTZXEgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgt\nbnMjIj48cmRmOmxpPnJhbmR5PC9yZGY6bGk+PC9yZGY6U2VxPg0KCQkJPC9kYzpjcmVhdG9yPjwv\ncmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCiAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0ndyc/Pv/b\nAEMABwUFBgUEBwYFBggHBwgKEQsKCQkKFQ8QDBEYFRoZGBUYFxseJyEbHSUdFxgiLiIlKCkrLCsa\nIC8zLyoyJyorKv/bAEMBBwgICgkKFAsLFCocGBwqKioqKioqKioqKioqKioqKioqKioqKioqKioq\nKioqKioqKioqKioqKioqKioqKioqKv/AABEIAHkAowMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAA\nAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEU\nMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2Rl\nZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK\n0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUG\nBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS\n8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4\neXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri\n4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APcNR1y9ttSnt4BBsjIA3oxJyoPZh61X/wCE\ni1H0tf8Av03/AMVVfV/+Q5ef76/+i1qpXXCnFxTaOaU5KVkaf/CRaj6Wv/fpv/iqP+Ei1H0tf+/T\nf/FVmUVXsodifaS7mn/wkWo+lr/36b/4qj/hItR9LX/v03/xVZlFHsodg9pLuaf/AAkWo+lr/wB+\nm/8AiqP+Ei1H0tf+/Tf/ABVZlFHsodg9pLuaf/CRaj6Wv/fpv/iqP+Ei1H0tf+/Tf/FV5NffEC48\nP6z4sbUT9rt7Ce0gsLYtHCN8secGQgYGeSzE4ANS6T8VItRtoJJtNjhcajHY3ghvkuEt/NB8uQSI\nCrgnCnkYOfSpUab0Xl+Nv80U5VEeqf8ACRaj6Wv/AH6b/wCKo/4SLUfS1/79N/8AFV5ZqfxTjsLC\n5uY9LWX/AImT6fZebepAlyUGXkMjgKigggdcke9QWvxCn1688LvppFol1qM9nqFsrxzruSMttEgB\nDDoQy4yDSUab28vxtb80DlUW/n+F/wDI9a/4SLUfS1/79N/8VR/wkWo+lr/36b/4qsyir9lDsT7S\n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\niikM/9k=\n", "text/plain": [ "" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Image(filename='Anaconda3\\\\output\\\\level_unique_values.JPG') " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Start by creating a list called 'lvls' using the .select_dtypes() attribute to include columns with dtype value 'O' selecting columns with string values." ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": true }, "outputs": [], "source": [ "lvls = list(df_states.select_dtypes(include=['O']).columns)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Inspect the 'lvls' list." ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['hpi_type',\n", " 'hpi_flavor',\n", " 'frequency',\n", " 'level',\n", " 'place_name',\n", " 'place_id',\n", " 'date_str']" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lvls " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we had a long list of columns needing to determine unique values the approach above becomes tedious; an iterative approach is called for using the for statement shown below." ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "hpi_type levels are: ['traditional' 'non-metro' 'distress-free' 'developmental']\n", "hpi_flavor levels are: ['all-transactions' 'expanded-data' 'purchase-only']\n", "frequency levels are: ['quarterly']\n", "level levels are: ['MSA' 'State' 'USA or Census Division' 'Puerto Rico']\n" ] } ], "source": [ "for item in lvls[:4]:\n", " print(item, 'levels are:', df_states[item].unique()) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using the levels for the categorial columns displayed above, filter the 'df_state' DataFrame to match the 'df_us' Dataframe. For this row slicing operation, create a boolean mask and combine it with the .loc indexer described here. This is a common pattern for filtering rows or column values. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a boolean mask for the filtering criteria." ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [], "source": [ "mask = (df_states['hpi_type'] == 'traditional') & (df_states['hpi_flavor'] == 'purchase-only') & \\\n", " (df_states['level'] == 'State')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Apply the mask. Notice the 'df_states' DataFrame is updated in place with this assignment. The original 'df_states' DataFrame had 96244 rows. " ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df_states = df_states.loc[mask]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The .shape attribute returns the new row and column count for the 'df_states' DataFrame." ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(5202, 11)" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_states.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Minimums and Maximums for Part 2, 'df_states' DataFrame" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Index the column 'index_nsa' in order to find the maximum and minimum for the 'df_states' DataFrame." ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df_states.set_index('index_nsa', inplace=True, drop=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Max value for index_nsa: 503.11\n", "Min value for index_nsa: 82.37\n" ] } ], "source": [ "print('Max value for index_nsa:', df_states['index_nsa'].max())\n", "print('Min value for index_nsa:', df_states['index_nsa'].min())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "PROC SQL for finding min and max for the variable 'index_nsa'." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "````\n", " /******************************************************/\n", " /* c09_min_max_index_nsa.sas */\n", " /******************************************************/\n", "37 proc sql;\n", "38 select max (index_nsa) as max_index_nsa,\n", "39 min (index_nsa) as min_index_nsa\n", "40 from df_states\n", "41 where hpi_type ='traditional' and hpi_flavor = 'purchase-only' and\n", "42 level = 'State';\n", "43 quit;\n", "````" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/jpeg": "/9j/4AAQSkZJRgABAQEAYABgAAD/4RDcRXhpZgAATU0AKgAAAAgABAE7AAIAAAAGAAAISodpAAQA\nAAABAAAIUJydAAEAAAAMAAAQyOocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJhbmR5AAAFkAMAAgAA\nABQAABCekAQAAgAAABQAABCykpEAAgAAAAM4MQAAkpIAAgAAAAM4MQAA6hwABwAACAwAAAiSAAAA\nABzqAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAMjAxNjoxMToxMCAxOToxMjoxNwAyMDE2OjExOjEwIDE5OjEyOjE3AAAAcgBhAG4A\nZAB5AAAA/+ELGGh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSfv\nu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4NCjx4OnhtcG1ldGEgeG1sbnM6eD0i\nYWRvYmU6bnM6bWV0YS8iPjxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5\nOS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6\nZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpkYz0iaHR0cDovL3B1\ncmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVp\nZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOnhtcD0iaHR0cDov\nL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+PHhtcDpDcmVhdGVEYXRlPjIwMTYtMTEtMTBUMTk6MTI6\nMTcuODA1PC94bXA6Q3JlYXRlRGF0ZT48L3JkZjpEZXNjcmlwdGlvbj48cmRmOkRlc2NyaXB0aW9u\nIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHht\nbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+PGRjOmNyZWF0b3I+PHJk\nZjpTZXEgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgt\nbnMjIj48cmRmOmxpPnJhbmR5PC9yZGY6bGk+PC9yZGY6U2VxPg0KCQkJPC9kYzpjcmVhdG9yPjwv\ncmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCiAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0ndyc/Pv/b\nAEMABwUFBgUEBwYFBggHBwgKEQsKCQkKFQ8QDBEYFRoZGBUYFxseJyEbHSUdFxgiLiIlKCkrLCsa\nIC8zLyoyJyorKv/bAEMBBwgICgkKFAsLFCocGBwqKioqKioqKioqKioqKioqKioqKioqKioqKioq\nKioqKioqKioqKioqKioqKioqKioqKv/AABEIAEAA9AMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAA\nAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEU\nMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2Rl\nZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK\n0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUG\nBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS\n8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4\neXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri\n4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APoq8vbewiWS6corNtBClsnBPQD2NU/+Eh0z\n/nu//fiT/wCJqDxR/wAeNt/18D/0B64y98QaNps5h1HVrG0lXbmOe5RGG7O3gnvg49cGtoU1JXbM\npzcXZHdf8JDpn/Pd/wDvxJ/8TR/wkOmf893/AO/En/xNcVFq2nT3VzbQ39rJPaDNxEkyloR/tjOV\n/Gq0PijQLiznvINc02W2t8efOl3GUiycDcwOBk9M1fsY9yPavsd9/wAJDpn/AD3f/vxJ/wDE0f8A\nCQ6Z/wA93/78Sf8AxNcbFqFlPdvawXcElxGiyPCkoLqp6MVByAexqLVdUh0izW5uF3I0qRAebHHy\nxwOZGUd+mcnsCaPYruHtn2O3/wCEh0z/AJ7v/wB+JP8A4mj/AISHTP8Anu//AH4k/wDia4STxHok\nV4tnLrGnpctL5Iga6QOZOPk25zu5HHXkVW8QeLtH8N2tzJf3cbT28PnmzikQzsmcZVCQSPf2peyi\nle4/aSbtY9E/4SHTP+e7/wDfiT/4mj/hIdM/57v/AN+JP/ia4dtc0uO+gsptRtYby4UPFayTqsrg\n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\ncE9GJ6CtWii7CwUUUUhhRRRQB//Z\n", "text/plain": [ "" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Image(filename='Anaconda3\\\\output\\\\max_min_index_nsa.JPG')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Filter for 2016" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For 2016, return the rows with the largest and smallest value for 'index_nsa'. \n", "\n", "In order to find the row with the lowest 'index_nsa' value, the example below uses a multi-step process:\n", " 1. Create a boolean mask filtering the rows with 'date_idx' between January 1, 2016 and December 31, 2016\n", " 2. Use the .loc indexer applying the mask to create the 'df_2016' DataFrame\n", " 3. Use the .idxmin() attribute to return the row having the minimum 'index_nsa' value\n", " 4. Use the .idxmax() attribute to return the row having the maximum 'index_nsa' value\n", " \n", "Keep in mind that the 'df_states' DataFrame has already been filtered previously." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create the boolean mask for the filtering criteria." ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [], "source": [ "mask1 = (df_states['date_idx'] >= '2016-01-01') & (df_states['date_idx'] <= '2016-12-31')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Apply the mask using the .loc indexer " ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df_2016 = df_states.loc[mask1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Return a Row using a Minimum Value" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use the .idxmin() method to return the minimum 'index_nsa' value." ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "hpi_type traditional\n", "hpi_flavor purchase-only\n", "frequency quarterly\n", "level State\n", "place_name Connecticut\n", "place_id CT\n", "yr 2016\n", "period 1\n", "index_nsa 165.81\n", "date_str 2016Q1\n", "date_idx 2016-01-01 00:00:00\n", "Name: 165.81, dtype: object" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_2016.ix[df_2016['index_nsa'].idxmin()]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Return a Row using a Maximum Value" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use the .idxmax() attribute to return the row with the maximum 'index_nsa' value." ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "hpi_type traditional\n", "hpi_flavor purchase-only\n", "frequency quarterly\n", "level State\n", "place_name District of Columbia\n", "place_id DC\n", "yr 2016\n", "period 2\n", "index_nsa 501.35\n", "date_str 2016Q2\n", "date_idx 2016-04-01 00:00:00\n", "Name: 501.35, dtype: object" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_2016.ix[df_2016['index_nsa'].idxmax()]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The .min and .max attribute return minimum and maximum respectively. The .idxmin() attribute returns the entire row as a Series. This enables the ability to use other column values, like 'place_name' or 'place_id' as further filtering and selection criteria." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The .min() and .max attributes return a scalar." ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2016 minimum value for 'index_nsa': 165.81\n", "2016 maximum value for 'index_nsa': 501.35\n" ] } ], "source": [ "print(\"2016 minimum value for 'index_nsa':\", df_2016.index_nsa.min())\n", "print(\"2016 maximum value for 'index_nsa':\", df_2016.index_nsa.max())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The SAS Data Step above used to the read .csv file does not create a SAS datetime variable. This is illustrated below. \n", "\n", "The SAS example below uses a pair of PUT functions nested inside the YYQ function to create the SAS date variable 'date_idx'. The PUT functions map the variables 'yr' and 'period' from character to numeric. The YYQ function described here returns a SAS datetime values from year and quarter values.\n", "\n", "The Data Step below is continued from the SAS Data Step example above used to read the .csv file." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "````\n", " /******************************************************/\n", " /* c09_min_max_index_nsa_for2016.sas */\n", " /******************************************************/\n", " 12 date_idx=yyq(put(yr,8.),put(period,8.));\n", " 13 format date_idx yyq10.;\n", " 14 \n", " 15 proc sql;\n", " 16 select max (index_nsa) as max_index_nsa,\n", " 17 min (index_nsa) as min_index_nsa\n", " 18 from df_states\n", " 19 where hpi_type ='traditional' and\n", " 20 hpi_flavor = 'purchase-only' and\n", " 21 level = 'State' and\n", " 22 date_idx between '01Jan2016'd and '31Dec2016'd;\n", " 23 quit;\n", "````" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/jpeg": "/9j/4AAQSkZJRgABAQEAYABgAAD/4RDcRXhpZgAATU0AKgAAAAgABAE7AAIAAAAGAAAISodpAAQA\nAAABAAAIUJydAAEAAAAMAAAQyOocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJhbmR5AAAFkAMAAgAA\nABQAABCekAQAAgAAABQAABCykpEAAgAAAAM5NwAAkpIAAgAAAAM5NwAA6hwABwAACAwAAAiSAAAA\nABzqAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAMjAxNjoxMToxMCAxOToyNDozNgAyMDE2OjExOjEwIDE5OjI0OjM2AAAAcgBhAG4A\nZAB5AAAA/+ELGGh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSfv\nu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4NCjx4OnhtcG1ldGEgeG1sbnM6eD0i\nYWRvYmU6bnM6bWV0YS8iPjxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5\nOS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6\nZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpkYz0iaHR0cDovL3B1\ncmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVp\nZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOnhtcD0iaHR0cDov\nL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+PHhtcDpDcmVhdGVEYXRlPjIwMTYtMTEtMTBUMTk6MjQ6\nMzYuOTY3PC94bXA6Q3JlYXRlRGF0ZT48L3JkZjpEZXNjcmlwdGlvbj48cmRmOkRlc2NyaXB0aW9u\nIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHht\nbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+PGRjOmNyZWF0b3I+PHJk\nZjpTZXEgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgt\nbnMjIj48cmRmOmxpPnJhbmR5PC9yZGY6bGk+PC9yZGY6U2VxPg0KCQkJPC9kYzpjcmVhdG9yPjwv\ncmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCiAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0ndyc/Pv/b\nAEMABwUFBgUEBwYFBggHBwgKEQsKCQkKFQ8QDBEYFRoZGBUYFxseJyEbHSUdFxgiLiIlKCkrLCsa\nIC8zLyoyJyorKv/bAEMBBwgICgkKFAsLFCocGBwqKioqKioqKioqKioqKioqKioqKioqKioqKioq\nKioqKioqKioqKioqKioqKioqKioqKv/AABEIAEQA9AMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAA\nAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEU\nMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2Rl\nZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK\n0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUG\nBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS\n8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4\neXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri\n4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APpGiiuM1mNH128LorHcvJGf4Fqox5nYmUuV\nXOzorz/yIf8Ankn/AHyKPIh/55J/3yK29i+5n7Zdj0CivP8AyIf+eSf98ijyIf8Ankn/AHyKPYvu\nHtl2PQKK84WbT3vXs0ktmuo0DvAGUuqnoxXqAfWp/Ih/55J/3yKXsX3D2y7HoFFecmWwW9WzZ7YX\nToZFgJXeyA4LBeuMnGam8iH/AJ5J/wB8ij2L7h7Zdj0CivP/ACIf+eSf98ijyIf+eSf98in7F9w9\nsux6BRXn/kQ/88k/75FHkQ/88k/75FHsX3D2y7HoFFef+RD/AM8k/wC+RTIYYjbxkxoSVGSVHpS9\ni+4e1XY9Dorz/wAiH/nkn/fIqCObT5rya0iktnuYAplhVlLxhuhZeoz2z1o9i+4e2XY9Horz/wAi\nH/nkn/fIqC7m0/T7cz38ltawhgpkmZUXJOAMnjJJxR7F9w9sux6PRXn/AJEP/PJP++RUVy1lZWsl\nzeNb28ES7pJZSqqg9STwBR7F9w9qux6LRXnyxQOoZI42VhkEAEEUvkQ/88k/75FP2D7i9sj0CivP\n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\ngAooooA//9k=\n", "text/plain": [ "" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Image(filename='Anaconda3\\\\output\\\\2016_min_max.JPG') " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Answer to question #2\n", "\n", " 2. Where are the highest and lowest values for 'traditional', 'purchase-only' homes in the U.S. in 2016? \n", " \n", "**Lowest home prices are in the state of Connecticut** and the **highest are in Washington, D.C.** \n", "\n", "Recall the 'df_states' DataFrame was filtered for column 'hpi_type' = 'traditional' **and** column 'hpi_flavor' = 'purchase-only' **and** level='state'. This DataFrame was subsequently filtered to create the DataFrame 'df_2016' in which we searched for the lowest and highest home index values." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Convert Time Series from one Frequency to Another" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In order to answer the last question:\n", " How do the highest and lowest home values market segments compare to the aggregate U.S. home prices?\n", " \n", "Information from the 'df_states' and 'df_us' DataFrame need to be combined. The 'df_us' monthly values need to be downsampled to quarterly. In other words, aggregated to a lower frequency. In doing so, the frequency in both DataFrames become quarterly. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In order to answer the 3rd question above, we need to conduct the following:\n", " 1. Set the index for 'df_us' DataFrame to the column 'date_idx'\n", " 2. Resample the 'df_us' DataFrame aggregating from monthly to quarterly using mean values\n", " 3. Create a column in the 'df_us' labeled 'place_name' with the value \"U.S. Aggregate\". \n", " 4. Extract rows from 'df_states' DataFrame for lowest and highest home values using the column 'place_name' \n", " 5. Merge (concatenate) the resampled 'df_us' DataFrame with the high & low value rows from the extract operation\n", " 6. Plot the resulting 'DataFrame'\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Start by examining the quarterly date values from the 'df_states' DataFrame... " ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "index_nsa\n", "100.00 1991-01-01\n", "100.72 1991-04-01\n", "101.58 1991-07-01\n", "102.48 1991-10-01\n", "Name: date_idx, dtype: datetime64[ns]" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ " df_states.iloc[0:4, -1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "...and compare with the monthly date values from the 'df_us' DataFrame." ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "place_name\n", "East North Central Division 100.00\n", "East North Central Division 101.03\n", "East North Central Division 101.40\n", "East North Central Division 101.79\n", "Name: index_nsa, dtype: float64" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_us.iloc[0:4, 7]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1. Set the index for 'df_us' DataFrame to the column 'date_idx'" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df_us.set_index('date_idx', inplace=True, drop=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2. Resample the 'df_us' DataFrame aggregating from monthly to quarterly using mean values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "pandas can perform resampling operations during frequency conversion (in this case, an aggregation of monthly values into quarterly values for the 'df_us' DataFrame). This is a common pattern in time series analysis.\n", "\n", "The .resample() method is a time-based needs a link to groupby operation, followed by a reduction method on each of its groups. Frequency conversion doc is found here. The .resample() method accepts frequency offset suffixes that are listed here. \n", " \n", "In order to align the monthly date values found in the 'df_us' DataFrame, with the quarterly date values in the 'df_states' DataFrame, use the 'QS' date offset. 'QS' sets the date value frequency to quarterly with year ending in December. The resulting DataFrame is called 'df_us_qtr'." ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df_us_qtr = df_us.resample('QS').mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 3. Create a column in the 'df_us' labeled 'place_name' with the value \"U.S. Aggregate\". " ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df_us_qtr['place_name'] = 'U.S. Aggregate'" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 4. Extract rows for the lowest and highest home values using the df_us_qtr['place_name'] column" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Set the index to the column 'place_name' and extract the rows using the .loc indexer." ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df_states.set_index('place_name', inplace=True, drop=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a boolean mask using the logical OR operator ( | )." ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "collapsed": false }, "outputs": [], "source": [ "mask = (df_states['place_name'] == 'Connecticut') | (df_states['place_name'] == 'District of Columbia')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Apply the mask using the .loc indexer to create the 'hi_lo' DataFrame." ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "collapsed": false }, "outputs": [], "source": [ "hi_lo = df_states.loc[mask]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Reset the index since the 'hi_lo' DataFrame will be concatenated (merged) with the resampled 'us_df' DataFrame." ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "collapsed": false }, "outputs": [], "source": [ "hi_lo.reset_index(drop=True, inplace=True)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 5. Merge (concatenate) the resampled 'df_us' DataFrame with the high & low value rows from the extract operation" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "Reset the index, since the 'df_us_qtr' DataFrame will be merged with the 'hi_lo' DataFrame created above. " ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df_us_qtr.reset_index(inplace=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a list of DataFrames to be included in the concatenation operation." ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "collapsed": true }, "outputs": [], "source": [ "frames = [df_us_qtr, hi_lo]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create the DataFrame 'plot_hi_low' concatenating values for the lowest home prices (Connecticut), with the highest ('District of Columbia') together with the U.S. aggregate. This is accomplished using the needs a link to concat operation." ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": false }, "outputs": [], "source": [ "plot_hi_low = pd.concat(frames)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "## Plotting with bokeh " ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "p = bokeh.charts.Line(plot_hi_low, x='date_idx', y='index_nsa', color='place_name', \n", " title= \"Comparison of lowest & highest home values with U.S. aggregate index value\")\n", "\n", "# Display it\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Answer to Question 3.\n", " 3. How do the highest and lowest home values market segments compare to the aggregate U.S. home prices?\n", "\n", "In the plot above, we see that the aggregate U.S. home price index regained its losses from the Great Recession (2008-2010) beginning around 2015. Since then it has seen steady growth and has exceeded the peak from the pre-recession values.\n", "\n", "In contrast, the home value index for Connecticut is just now recovering its value lost during the Great Recession. However, it has not recovered its pre-recession value.\n", "\n", "Since 2011, the aggregate U.S. home price index has been growing faster than that of Connecticut, but not even close to the growth rate for Washington, D.C." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Drop the values for 'District of Columbia' to compare the lowest home prices with the 'U.S. Aggregate' home price index. Notice the automatic re-scaling of the Y-axis." ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "collapsed": true }, "outputs": [], "source": [ "mask = (plot_hi_low['place_name'] != 'District of Columbia')" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "collapsed": false }, "outputs": [], "source": [ "plt_lo_us = plot_hi_low.loc[mask]" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "p = bokeh.charts.Line(plt_lo_us, x='date_idx', y='index_nsa', color='place_name', \n", " title=\"Comparison of lowest & U.S. Aggregate home values\")\n", "\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Resources \n", "\n", "pandas Time Series and Date functionality doc located here.\n", "\n", "pandas datetime Indexing doc located here.\n", "\n", "pandas cookbook for timeseries.\n", "\n", "Chapter 10, Time Series, \"Python for Data Analysis, by Wes McKinney, located here.\n", "\n", "SAS 9.4 Language Reference: Concepts, 5th ed., Dates, Times, and Intervals" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "## Navigation\n", "\n", " Return to Chapter List " ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [Root]", "language": "python", "name": "Python [Root]" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 0 }