mirror of
https://github.com/elastic/eland.git
synced 2025-07-11 00:02:14 +08:00
* Fix test setup to match pandas 2.0 demands * Use the now deprecated _append method (Better solution might exist) * Deal with numeric_only being removed in metrics test * Skip mad metric for other pandas versions * Account for differences between pandas versions in describe methods * Run black * Check Pandas version first * Mirror behaviour of installed Pandas version when running value_counts * Allow passing arguments to the individual asserters * Fix for method _construct_axes_from_arguments no longer existing * Skip mad metric if it does not exist * Account for pandas 2.0 timestamp default behaviour * Deal with empty vs other inferred data types * Account for default datetime precision change * Run Black * Solution for differences in inferred_type only * Fix csv and json issues * Skip two doctests * Passing a set as indexer is no longer allowed * Don't validate output where it differs between Pandas versions in the environment * Update test matrix and packaging metadata * Update version of Python in the docs * Update Python version in demo notebook * Match noxfile * Symmetry * Fix trailing comma in JSON * Revert some changes in setup.py to fix building the documentation * Revert "Revert some changes in setup.py to fix building the documentation" This reverts commit ea9879753129d8d8390b3cbbce57155a8b4fb346. * Use PANDAS_VERSION from eland.common * Still skip the doctest, but make the output pandas 2 instead of 1 * Still skip doctest, but switch to pandas 2 output * Prepare for pandas 3 * Reference the right column * Ignore output in tests but switch to pandas 2 output * Add line comment about NBVAL_IGNORE_OUTPUT * Restore missing line and add stderr cell * Use non-private method instead * Fix indentation and parameter issues * If index is not specified, and pandas 1 is present, set it to True From pandas 2 and upwards, index is set to None by default * Run black * Newer version of black might have different opinions? * Add line comment * Remove unused import * Add reason for ignore statement * Add reason for skip --------- Co-authored-by: Quentin Pradet <quentin.pradet@elastic.co>
3517 lines
243 KiB
Plaintext
3517 lines
243 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Eland Demo Notebook"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import eland as ed\n",
|
||
"import pandas as pd\n",
|
||
"import numpy as np\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"\n",
|
||
"from elasticsearch import Elasticsearch\n",
|
||
"\n",
|
||
"# Import standard test settings for consistent results\n",
|
||
"from eland.conftest import *\n",
|
||
"\n",
|
||
"# Remove pandas/matplotlib deprecation warning\n",
|
||
"import warnings\n",
|
||
"import matplotlib\n",
|
||
"warnings.filterwarnings(\"ignore\",category=matplotlib.MatplotlibDeprecationWarning )"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Compare Eland DataFrame vs pandas DataFrame"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Create an eland.DataFrame from a `flights` index"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"ed_flights = ed.DataFrame('http://localhost:9200', 'flights')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"eland.dataframe.DataFrame"
|
||
]
|
||
},
|
||
"execution_count": 3,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"type(ed_flights)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Compare to pandas DataFrame (created from the same data)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"pd_flights = ed.eland_to_pandas(ed_flights)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"pandas.core.frame.DataFrame"
|
||
]
|
||
},
|
||
"execution_count": 5,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"type(pd_flights)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Attributes and underlying data"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### DataFrame.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['AvgTicketPrice', 'Cancelled', 'Carrier', 'Cities', 'Dest', 'DestAirportID', 'DestCityName',\n",
|
||
" 'DestCountry', 'DestLocation', 'DestRegion', 'DestWeather', 'DistanceKilometers',\n",
|
||
" 'DistanceMiles', 'FlightDelay', 'FlightDelayMin', 'FlightDelayType', 'FlightNum',\n",
|
||
" 'FlightTimeHour', 'FlightTimeMin', 'Origin', 'OriginAirportID', 'OriginCityName',\n",
|
||
" 'OriginCountry', 'OriginLocation', 'OriginRegion', 'OriginWeather', 'dayOfWeek',\n",
|
||
" 'timestamp'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 6,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['AvgTicketPrice', 'Cancelled', 'Carrier', 'Cities', 'Dest', 'DestAirportID', 'DestCityName',\n",
|
||
" 'DestCountry', 'DestLocation', 'DestRegion', 'DestWeather', 'DistanceKilometers',\n",
|
||
" 'DistanceMiles', 'FlightDelay', 'FlightDelayMin', 'FlightDelayType', 'FlightNum',\n",
|
||
" 'FlightTimeHour', 'FlightTimeMin', 'Origin', 'OriginAirportID', 'OriginCityName',\n",
|
||
" 'OriginCountry', 'OriginLocation', 'OriginRegion', 'OriginWeather', 'dayOfWeek',\n",
|
||
" 'timestamp'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 7,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ed_flights.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### DataFrame.dtypes"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"AvgTicketPrice float64\n",
|
||
"Cancelled bool\n",
|
||
"Carrier object\n",
|
||
"Cities object\n",
|
||
"Dest object\n",
|
||
" ... \n",
|
||
"OriginLocation object\n",
|
||
"OriginRegion object\n",
|
||
"OriginWeather object\n",
|
||
"dayOfWeek int64\n",
|
||
"timestamp datetime64[ns]\n",
|
||
"Length: 28, dtype: object"
|
||
]
|
||
},
|
||
"execution_count": 8,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights.dtypes"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"AvgTicketPrice float64\n",
|
||
"Cancelled bool\n",
|
||
"Carrier object\n",
|
||
"Cities object\n",
|
||
"Dest object\n",
|
||
" ... \n",
|
||
"OriginLocation object\n",
|
||
"OriginRegion object\n",
|
||
"OriginWeather object\n",
|
||
"dayOfWeek int64\n",
|
||
"timestamp datetime64[ns]\n",
|
||
"Length: 28, dtype: object"
|
||
]
|
||
},
|
||
"execution_count": 9,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ed_flights.dtypes"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### DataFrame.select_dtypes"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>AvgTicketPrice</th>\n",
|
||
" <th>DistanceKilometers</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>FlightTimeMin</th>\n",
|
||
" <th>dayOfWeek</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>841.265642</td>\n",
|
||
" <td>16492.326654</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>1030.770416</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>882.982662</td>\n",
|
||
" <td>8823.400140</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>464.389481</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>190.636904</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>181.694216</td>\n",
|
||
" <td>555.737767</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>222.749059</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>730.041778</td>\n",
|
||
" <td>13358.244200</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>785.779071</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13054</th>\n",
|
||
" <td>1080.446279</td>\n",
|
||
" <td>8058.581753</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>402.929088</td>\n",
|
||
" <td>6</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13055</th>\n",
|
||
" <td>646.612941</td>\n",
|
||
" <td>7088.598322</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>644.418029</td>\n",
|
||
" <td>6</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13056</th>\n",
|
||
" <td>997.751876</td>\n",
|
||
" <td>10920.652972</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>937.540811</td>\n",
|
||
" <td>6</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13057</th>\n",
|
||
" <td>1102.814465</td>\n",
|
||
" <td>18748.859647</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>1697.404971</td>\n",
|
||
" <td>6</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13058</th>\n",
|
||
" <td>858.144337</td>\n",
|
||
" <td>16809.141923</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>1610.761827</td>\n",
|
||
" <td>6</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>13059 rows × 7 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" AvgTicketPrice DistanceKilometers ... FlightTimeMin dayOfWeek\n",
|
||
"0 841.265642 16492.326654 ... 1030.770416 0\n",
|
||
"1 882.982662 8823.400140 ... 464.389481 0\n",
|
||
"2 190.636904 0.000000 ... 0.000000 0\n",
|
||
"3 181.694216 555.737767 ... 222.749059 0\n",
|
||
"4 730.041778 13358.244200 ... 785.779071 0\n",
|
||
"... ... ... ... ... ...\n",
|
||
"13054 1080.446279 8058.581753 ... 402.929088 6\n",
|
||
"13055 646.612941 7088.598322 ... 644.418029 6\n",
|
||
"13056 997.751876 10920.652972 ... 937.540811 6\n",
|
||
"13057 1102.814465 18748.859647 ... 1697.404971 6\n",
|
||
"13058 858.144337 16809.141923 ... 1610.761827 6\n",
|
||
"\n",
|
||
"[13059 rows x 7 columns]"
|
||
]
|
||
},
|
||
"execution_count": 10,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights.select_dtypes(include=np.number)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>AvgTicketPrice</th>\n",
|
||
" <th>DistanceKilometers</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>FlightTimeMin</th>\n",
|
||
" <th>dayOfWeek</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>841.265642</td>\n",
|
||
" <td>16492.326654</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>1030.770416</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>882.982662</td>\n",
|
||
" <td>8823.400140</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>464.389481</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>190.636904</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>181.694216</td>\n",
|
||
" <td>555.737767</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>222.749059</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>730.041778</td>\n",
|
||
" <td>13358.244200</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>785.779071</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13054</th>\n",
|
||
" <td>1080.446279</td>\n",
|
||
" <td>8058.581753</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>402.929088</td>\n",
|
||
" <td>6</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13055</th>\n",
|
||
" <td>646.612941</td>\n",
|
||
" <td>7088.598322</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>644.418029</td>\n",
|
||
" <td>6</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13056</th>\n",
|
||
" <td>997.751876</td>\n",
|
||
" <td>10920.652972</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>937.540811</td>\n",
|
||
" <td>6</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13057</th>\n",
|
||
" <td>1102.814465</td>\n",
|
||
" <td>18748.859647</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>1697.404971</td>\n",
|
||
" <td>6</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13058</th>\n",
|
||
" <td>858.144337</td>\n",
|
||
" <td>16809.141923</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>1610.761827</td>\n",
|
||
" <td>6</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>\n",
|
||
"<p>13059 rows × 7 columns</p>"
|
||
],
|
||
"text/plain": [
|
||
" AvgTicketPrice DistanceKilometers ... FlightTimeMin dayOfWeek\n",
|
||
"0 841.265642 16492.326654 ... 1030.770416 0\n",
|
||
"1 882.982662 8823.400140 ... 464.389481 0\n",
|
||
"2 190.636904 0.000000 ... 0.000000 0\n",
|
||
"3 181.694216 555.737767 ... 222.749059 0\n",
|
||
"4 730.041778 13358.244200 ... 785.779071 0\n",
|
||
"... ... ... ... ... ...\n",
|
||
"13054 1080.446279 8058.581753 ... 402.929088 6\n",
|
||
"13055 646.612941 7088.598322 ... 644.418029 6\n",
|
||
"13056 997.751876 10920.652972 ... 937.540811 6\n",
|
||
"13057 1102.814465 18748.859647 ... 1697.404971 6\n",
|
||
"13058 858.144337 16809.141923 ... 1610.761827 6\n",
|
||
"\n",
|
||
"[13059 rows x 7 columns]"
|
||
]
|
||
},
|
||
"execution_count": 11,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ed_flights.select_dtypes(include=np.number)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### DataFrame.empty"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"False"
|
||
]
|
||
},
|
||
"execution_count": 12,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights.empty"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"False"
|
||
]
|
||
},
|
||
"execution_count": 13,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ed_flights.empty"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### DataFrame.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(13059, 28)"
|
||
]
|
||
},
|
||
"execution_count": 14,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(13059, 28)"
|
||
]
|
||
},
|
||
"execution_count": 15,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ed_flights.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### DataFrame.index\n",
|
||
"\n",
|
||
"Note, `eland.DataFrame.index` does not mirror `pandas.DataFrame.index`. "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 16,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n",
|
||
" ...\n",
|
||
" '13049', '13050', '13051', '13052', '13053', '13054', '13055', '13056', '13057', '13058'],\n",
|
||
" dtype='object', length=13059)"
|
||
]
|
||
},
|
||
"execution_count": 16,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights.index"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 17,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<eland.index.Index at 0x796bfb49ce80>"
|
||
]
|
||
},
|
||
"execution_count": 17,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# NBVAL_IGNORE_OUTPUT\n",
|
||
"ed_flights.index"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 18,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'_id'"
|
||
]
|
||
},
|
||
"execution_count": 18,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ed_flights.index.es_index_field"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### DataFrame.values\n",
|
||
"\n",
|
||
"Note, `eland.DataFrame.values` is not supported."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 19,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[841.2656419677076, False, 'Kibana Airlines', ..., 'Sunny', 0,\n",
|
||
" Timestamp('2018-01-01 00:00:00')],\n",
|
||
" [882.9826615595518, False, 'Logstash Airways', ..., 'Clear', 0,\n",
|
||
" Timestamp('2018-01-01 18:27:00')],\n",
|
||
" [190.6369038508356, False, 'Logstash Airways', ..., 'Rain', 0,\n",
|
||
" Timestamp('2018-01-01 17:11:14')],\n",
|
||
" ...,\n",
|
||
" [997.7518761454494, False, 'Logstash Airways', ..., 'Sunny', 6,\n",
|
||
" Timestamp('2018-02-11 04:09:27')],\n",
|
||
" [1102.8144645388556, False, 'JetBeats', ..., 'Hail', 6,\n",
|
||
" Timestamp('2018-02-11 08:28:21')],\n",
|
||
" [858.1443369038839, False, 'JetBeats', ..., 'Rain', 6,\n",
|
||
" Timestamp('2018-02-11 14:54:34')]], dtype=object)"
|
||
]
|
||
},
|
||
"execution_count": 19,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights.values"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 20,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"This method would scan/scroll the entire Elasticsearch index(s) into memory. If this is explicitly required, and there is sufficient memory, call `ed.eland_to_pandas(ed_df).values`\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"try:\n",
|
||
" ed_flights.values\n",
|
||
"except AttributeError as e:\n",
|
||
" print(e)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Indexing, iteration"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### DataFrame.head"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 21,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>AvgTicketPrice</th>\n",
|
||
" <th>Cancelled</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>dayOfWeek</th>\n",
|
||
" <th>timestamp</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>841.265642</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 00:00:00</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>882.982662</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 18:27:00</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>190.636904</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 17:11:14</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>181.694216</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 10:33:28</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>730.041778</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 05:13:00</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>5 rows × 28 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" AvgTicketPrice Cancelled ... dayOfWeek timestamp\n",
|
||
"0 841.265642 False ... 0 2018-01-01 00:00:00\n",
|
||
"1 882.982662 False ... 0 2018-01-01 18:27:00\n",
|
||
"2 190.636904 False ... 0 2018-01-01 17:11:14\n",
|
||
"3 181.694216 True ... 0 2018-01-01 10:33:28\n",
|
||
"4 730.041778 False ... 0 2018-01-01 05:13:00\n",
|
||
"\n",
|
||
"[5 rows x 28 columns]"
|
||
]
|
||
},
|
||
"execution_count": 21,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 22,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>AvgTicketPrice</th>\n",
|
||
" <th>Cancelled</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>dayOfWeek</th>\n",
|
||
" <th>timestamp</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>841.265642</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 00:00:00</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>882.982662</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 18:27:00</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>190.636904</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 17:11:14</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>181.694216</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 10:33:28</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>730.041778</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 05:13:00</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>\n",
|
||
"<p>5 rows × 28 columns</p>"
|
||
],
|
||
"text/plain": [
|
||
" AvgTicketPrice Cancelled ... dayOfWeek timestamp\n",
|
||
"0 841.265642 False ... 0 2018-01-01 00:00:00\n",
|
||
"1 882.982662 False ... 0 2018-01-01 18:27:00\n",
|
||
"2 190.636904 False ... 0 2018-01-01 17:11:14\n",
|
||
"3 181.694216 True ... 0 2018-01-01 10:33:28\n",
|
||
"4 730.041778 False ... 0 2018-01-01 05:13:00\n",
|
||
"\n",
|
||
"[5 rows x 28 columns]"
|
||
]
|
||
},
|
||
"execution_count": 22,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ed_flights.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### DataFrame.tail"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 23,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>AvgTicketPrice</th>\n",
|
||
" <th>Cancelled</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>dayOfWeek</th>\n",
|
||
" <th>timestamp</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>13054</th>\n",
|
||
" <td>1080.446279</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 20:42:25</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13055</th>\n",
|
||
" <td>646.612941</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 01:41:57</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13056</th>\n",
|
||
" <td>997.751876</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 04:09:27</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13057</th>\n",
|
||
" <td>1102.814465</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 08:28:21</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13058</th>\n",
|
||
" <td>858.144337</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 14:54:34</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>5 rows × 28 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" AvgTicketPrice Cancelled ... dayOfWeek timestamp\n",
|
||
"13054 1080.446279 False ... 6 2018-02-11 20:42:25\n",
|
||
"13055 646.612941 False ... 6 2018-02-11 01:41:57\n",
|
||
"13056 997.751876 False ... 6 2018-02-11 04:09:27\n",
|
||
"13057 1102.814465 False ... 6 2018-02-11 08:28:21\n",
|
||
"13058 858.144337 False ... 6 2018-02-11 14:54:34\n",
|
||
"\n",
|
||
"[5 rows x 28 columns]"
|
||
]
|
||
},
|
||
"execution_count": 23,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights.tail()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 24,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>AvgTicketPrice</th>\n",
|
||
" <th>Cancelled</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>dayOfWeek</th>\n",
|
||
" <th>timestamp</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>13054</th>\n",
|
||
" <td>1080.446279</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 20:42:25</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13055</th>\n",
|
||
" <td>646.612941</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 01:41:57</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13056</th>\n",
|
||
" <td>997.751876</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 04:09:27</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13057</th>\n",
|
||
" <td>1102.814465</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 08:28:21</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13058</th>\n",
|
||
" <td>858.144337</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 14:54:34</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>\n",
|
||
"<p>5 rows × 28 columns</p>"
|
||
],
|
||
"text/plain": [
|
||
" AvgTicketPrice Cancelled ... dayOfWeek timestamp\n",
|
||
"13054 1080.446279 False ... 6 2018-02-11 20:42:25\n",
|
||
"13055 646.612941 False ... 6 2018-02-11 01:41:57\n",
|
||
"13056 997.751876 False ... 6 2018-02-11 04:09:27\n",
|
||
"13057 1102.814465 False ... 6 2018-02-11 08:28:21\n",
|
||
"13058 858.144337 False ... 6 2018-02-11 14:54:34\n",
|
||
"\n",
|
||
"[5 rows x 28 columns]"
|
||
]
|
||
},
|
||
"execution_count": 24,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ed_flights.tail()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### DataFrame.keys"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 25,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['AvgTicketPrice', 'Cancelled', 'Carrier', 'Cities', 'Dest', 'DestAirportID', 'DestCityName',\n",
|
||
" 'DestCountry', 'DestLocation', 'DestRegion', 'DestWeather', 'DistanceKilometers',\n",
|
||
" 'DistanceMiles', 'FlightDelay', 'FlightDelayMin', 'FlightDelayType', 'FlightNum',\n",
|
||
" 'FlightTimeHour', 'FlightTimeMin', 'Origin', 'OriginAirportID', 'OriginCityName',\n",
|
||
" 'OriginCountry', 'OriginLocation', 'OriginRegion', 'OriginWeather', 'dayOfWeek',\n",
|
||
" 'timestamp'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 25,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights.keys()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 26,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['AvgTicketPrice', 'Cancelled', 'Carrier', 'Cities', 'Dest', 'DestAirportID', 'DestCityName',\n",
|
||
" 'DestCountry', 'DestLocation', 'DestRegion', 'DestWeather', 'DistanceKilometers',\n",
|
||
" 'DistanceMiles', 'FlightDelay', 'FlightDelayMin', 'FlightDelayType', 'FlightNum',\n",
|
||
" 'FlightTimeHour', 'FlightTimeMin', 'Origin', 'OriginAirportID', 'OriginCityName',\n",
|
||
" 'OriginCountry', 'OriginLocation', 'OriginRegion', 'OriginWeather', 'dayOfWeek',\n",
|
||
" 'timestamp'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 26,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ed_flights.keys()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### DataFrame.get"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 27,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"0 Kibana Airlines\n",
|
||
"1 Logstash Airways\n",
|
||
"2 Logstash Airways\n",
|
||
"3 Kibana Airlines\n",
|
||
"4 Kibana Airlines\n",
|
||
" ... \n",
|
||
"13054 Logstash Airways\n",
|
||
"13055 Logstash Airways\n",
|
||
"13056 Logstash Airways\n",
|
||
"13057 JetBeats\n",
|
||
"13058 JetBeats\n",
|
||
"Name: Carrier, Length: 13059, dtype: object"
|
||
]
|
||
},
|
||
"execution_count": 27,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights.get('Carrier')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 28,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"0 Kibana Airlines\n",
|
||
"1 Logstash Airways\n",
|
||
"2 Logstash Airways\n",
|
||
"3 Kibana Airlines\n",
|
||
"4 Kibana Airlines\n",
|
||
" ... \n",
|
||
"13054 Logstash Airways\n",
|
||
"13055 Logstash Airways\n",
|
||
"13056 Logstash Airways\n",
|
||
"13057 JetBeats\n",
|
||
"13058 JetBeats\n",
|
||
"Name: Carrier, Length: 13059, dtype: object"
|
||
]
|
||
},
|
||
"execution_count": 28,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ed_flights.get('Carrier')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 29,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Carrier</th>\n",
|
||
" <th>Origin</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>Kibana Airlines</td>\n",
|
||
" <td>Frankfurt am Main Airport</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>Logstash Airways</td>\n",
|
||
" <td>Cape Town International Airport</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>Logstash Airways</td>\n",
|
||
" <td>Venice Marco Polo Airport</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>Kibana Airlines</td>\n",
|
||
" <td>Naples International Airport</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>Kibana Airlines</td>\n",
|
||
" <td>Licenciado Benito Juarez International Airport</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13054</th>\n",
|
||
" <td>Logstash Airways</td>\n",
|
||
" <td>Pisa International Airport</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13055</th>\n",
|
||
" <td>Logstash Airways</td>\n",
|
||
" <td>Winnipeg / James Armstrong Richardson Internat...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13056</th>\n",
|
||
" <td>Logstash Airways</td>\n",
|
||
" <td>Licenciado Benito Juarez International Airport</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13057</th>\n",
|
||
" <td>JetBeats</td>\n",
|
||
" <td>Itami Airport</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13058</th>\n",
|
||
" <td>JetBeats</td>\n",
|
||
" <td>Adelaide International Airport</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>13059 rows × 2 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Carrier Origin\n",
|
||
"0 Kibana Airlines Frankfurt am Main Airport\n",
|
||
"1 Logstash Airways Cape Town International Airport\n",
|
||
"2 Logstash Airways Venice Marco Polo Airport\n",
|
||
"3 Kibana Airlines Naples International Airport\n",
|
||
"4 Kibana Airlines Licenciado Benito Juarez International Airport\n",
|
||
"... ... ...\n",
|
||
"13054 Logstash Airways Pisa International Airport\n",
|
||
"13055 Logstash Airways Winnipeg / James Armstrong Richardson Internat...\n",
|
||
"13056 Logstash Airways Licenciado Benito Juarez International Airport\n",
|
||
"13057 JetBeats Itami Airport\n",
|
||
"13058 JetBeats Adelaide International Airport\n",
|
||
"\n",
|
||
"[13059 rows x 2 columns]"
|
||
]
|
||
},
|
||
"execution_count": 29,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights.get(['Carrier', 'Origin'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"List input not currently supported by `eland.DataFrame.get`"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 30,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"unhashable type: 'list'\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"try:\n",
|
||
" ed_flights.get(['Carrier', 'Origin'])\n",
|
||
"except TypeError as e:\n",
|
||
" print(e)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### DataFrame.query"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 31,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>AvgTicketPrice</th>\n",
|
||
" <th>Cancelled</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>dayOfWeek</th>\n",
|
||
" <th>timestamp</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>8</th>\n",
|
||
" <td>960.869736</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 12:09:35</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>26</th>\n",
|
||
" <td>975.812632</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 15:38:32</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>311</th>\n",
|
||
" <td>946.358410</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 11:51:12</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>651</th>\n",
|
||
" <td>975.383864</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>2018-01-03 21:13:17</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>950</th>\n",
|
||
" <td>907.836523</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>2018-01-03 05:14:51</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12820</th>\n",
|
||
" <td>909.973606</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>2018-02-10 05:11:35</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12906</th>\n",
|
||
" <td>983.429244</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 06:19:58</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12918</th>\n",
|
||
" <td>1136.678150</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 16:03:10</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12919</th>\n",
|
||
" <td>1105.211803</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 05:36:05</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13013</th>\n",
|
||
" <td>1055.350213</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 13:20:16</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>68 rows × 28 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" AvgTicketPrice Cancelled ... dayOfWeek timestamp\n",
|
||
"8 960.869736 True ... 0 2018-01-01 12:09:35\n",
|
||
"26 975.812632 True ... 0 2018-01-01 15:38:32\n",
|
||
"311 946.358410 True ... 0 2018-01-01 11:51:12\n",
|
||
"651 975.383864 True ... 2 2018-01-03 21:13:17\n",
|
||
"950 907.836523 True ... 2 2018-01-03 05:14:51\n",
|
||
"... ... ... ... ... ...\n",
|
||
"12820 909.973606 True ... 5 2018-02-10 05:11:35\n",
|
||
"12906 983.429244 True ... 6 2018-02-11 06:19:58\n",
|
||
"12918 1136.678150 True ... 6 2018-02-11 16:03:10\n",
|
||
"12919 1105.211803 True ... 6 2018-02-11 05:36:05\n",
|
||
"13013 1055.350213 True ... 6 2018-02-11 13:20:16\n",
|
||
"\n",
|
||
"[68 rows x 28 columns]"
|
||
]
|
||
},
|
||
"execution_count": 31,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights.query('Carrier == \"Kibana Airlines\" & AvgTicketPrice > 900.0 & Cancelled == True')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"`eland.DataFrame.query` requires qualifier on bool i.e.\n",
|
||
"\n",
|
||
"`ed_flights.query('Carrier == \"Kibana Airlines\" & AvgTicketPrice > 900.0 & Cancelled')` fails"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 32,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/code/eland/.nox/test-3-12-pandas_version-2-2-3/lib/python3.12/site-packages/eland/series.py:464: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n",
|
||
" return self._query_compiler.dtypes[0]\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>AvgTicketPrice</th>\n",
|
||
" <th>Cancelled</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>dayOfWeek</th>\n",
|
||
" <th>timestamp</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>8</th>\n",
|
||
" <td>960.869736</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 12:09:35</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>26</th>\n",
|
||
" <td>975.812632</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 15:38:32</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>311</th>\n",
|
||
" <td>946.358410</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 11:51:12</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>651</th>\n",
|
||
" <td>975.383864</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>2018-01-03 21:13:17</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>950</th>\n",
|
||
" <td>907.836523</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>2018-01-03 05:14:51</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12820</th>\n",
|
||
" <td>909.973606</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>2018-02-10 05:11:35</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12906</th>\n",
|
||
" <td>983.429244</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 06:19:58</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12918</th>\n",
|
||
" <td>1136.678150</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 16:03:10</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12919</th>\n",
|
||
" <td>1105.211803</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 05:36:05</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13013</th>\n",
|
||
" <td>1055.350213</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 13:20:16</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>\n",
|
||
"<p>68 rows × 28 columns</p>"
|
||
],
|
||
"text/plain": [
|
||
" AvgTicketPrice Cancelled ... dayOfWeek timestamp\n",
|
||
"8 960.869736 True ... 0 2018-01-01 12:09:35\n",
|
||
"26 975.812632 True ... 0 2018-01-01 15:38:32\n",
|
||
"311 946.358410 True ... 0 2018-01-01 11:51:12\n",
|
||
"651 975.383864 True ... 2 2018-01-03 21:13:17\n",
|
||
"950 907.836523 True ... 2 2018-01-03 05:14:51\n",
|
||
"... ... ... ... ... ...\n",
|
||
"12820 909.973606 True ... 5 2018-02-10 05:11:35\n",
|
||
"12906 983.429244 True ... 6 2018-02-11 06:19:58\n",
|
||
"12918 1136.678150 True ... 6 2018-02-11 16:03:10\n",
|
||
"12919 1105.211803 True ... 6 2018-02-11 05:36:05\n",
|
||
"13013 1055.350213 True ... 6 2018-02-11 13:20:16\n",
|
||
"\n",
|
||
"[68 rows x 28 columns]"
|
||
]
|
||
},
|
||
"execution_count": 32,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# NBVAL_IGNORE_OUTPUT\n",
|
||
"# The ignore statement above is because of output difference between Pandas 1 and 2\n",
|
||
"# and can be removed once Pandas 1 support is dropped\n",
|
||
"ed_flights.query('Carrier == \"Kibana Airlines\" & AvgTicketPrice > 900.0 & Cancelled == True')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### Boolean indexing query"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 33,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>AvgTicketPrice</th>\n",
|
||
" <th>Cancelled</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>dayOfWeek</th>\n",
|
||
" <th>timestamp</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>8</th>\n",
|
||
" <td>960.869736</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 12:09:35</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>26</th>\n",
|
||
" <td>975.812632</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 15:38:32</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>311</th>\n",
|
||
" <td>946.358410</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 11:51:12</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>651</th>\n",
|
||
" <td>975.383864</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>2018-01-03 21:13:17</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>950</th>\n",
|
||
" <td>907.836523</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>2018-01-03 05:14:51</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12820</th>\n",
|
||
" <td>909.973606</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>2018-02-10 05:11:35</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12906</th>\n",
|
||
" <td>983.429244</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 06:19:58</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12918</th>\n",
|
||
" <td>1136.678150</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 16:03:10</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12919</th>\n",
|
||
" <td>1105.211803</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 05:36:05</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13013</th>\n",
|
||
" <td>1055.350213</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 13:20:16</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>68 rows × 28 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" AvgTicketPrice Cancelled ... dayOfWeek timestamp\n",
|
||
"8 960.869736 True ... 0 2018-01-01 12:09:35\n",
|
||
"26 975.812632 True ... 0 2018-01-01 15:38:32\n",
|
||
"311 946.358410 True ... 0 2018-01-01 11:51:12\n",
|
||
"651 975.383864 True ... 2 2018-01-03 21:13:17\n",
|
||
"950 907.836523 True ... 2 2018-01-03 05:14:51\n",
|
||
"... ... ... ... ... ...\n",
|
||
"12820 909.973606 True ... 5 2018-02-10 05:11:35\n",
|
||
"12906 983.429244 True ... 6 2018-02-11 06:19:58\n",
|
||
"12918 1136.678150 True ... 6 2018-02-11 16:03:10\n",
|
||
"12919 1105.211803 True ... 6 2018-02-11 05:36:05\n",
|
||
"13013 1055.350213 True ... 6 2018-02-11 13:20:16\n",
|
||
"\n",
|
||
"[68 rows x 28 columns]"
|
||
]
|
||
},
|
||
"execution_count": 33,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights[(pd_flights.Carrier==\"Kibana Airlines\") & \n",
|
||
" (pd_flights.AvgTicketPrice > 900.0) &\n",
|
||
" (pd_flights.Cancelled == True)]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 34,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>AvgTicketPrice</th>\n",
|
||
" <th>Cancelled</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>dayOfWeek</th>\n",
|
||
" <th>timestamp</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>8</th>\n",
|
||
" <td>960.869736</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 12:09:35</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>26</th>\n",
|
||
" <td>975.812632</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 15:38:32</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>311</th>\n",
|
||
" <td>946.358410</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 11:51:12</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>651</th>\n",
|
||
" <td>975.383864</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>2018-01-03 21:13:17</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>950</th>\n",
|
||
" <td>907.836523</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>2018-01-03 05:14:51</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12820</th>\n",
|
||
" <td>909.973606</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>2018-02-10 05:11:35</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12906</th>\n",
|
||
" <td>983.429244</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 06:19:58</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12918</th>\n",
|
||
" <td>1136.678150</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 16:03:10</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12919</th>\n",
|
||
" <td>1105.211803</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 05:36:05</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13013</th>\n",
|
||
" <td>1055.350213</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 13:20:16</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>\n",
|
||
"<p>68 rows × 28 columns</p>"
|
||
],
|
||
"text/plain": [
|
||
" AvgTicketPrice Cancelled ... dayOfWeek timestamp\n",
|
||
"8 960.869736 True ... 0 2018-01-01 12:09:35\n",
|
||
"26 975.812632 True ... 0 2018-01-01 15:38:32\n",
|
||
"311 946.358410 True ... 0 2018-01-01 11:51:12\n",
|
||
"651 975.383864 True ... 2 2018-01-03 21:13:17\n",
|
||
"950 907.836523 True ... 2 2018-01-03 05:14:51\n",
|
||
"... ... ... ... ... ...\n",
|
||
"12820 909.973606 True ... 5 2018-02-10 05:11:35\n",
|
||
"12906 983.429244 True ... 6 2018-02-11 06:19:58\n",
|
||
"12918 1136.678150 True ... 6 2018-02-11 16:03:10\n",
|
||
"12919 1105.211803 True ... 6 2018-02-11 05:36:05\n",
|
||
"13013 1055.350213 True ... 6 2018-02-11 13:20:16\n",
|
||
"\n",
|
||
"[68 rows x 28 columns]"
|
||
]
|
||
},
|
||
"execution_count": 34,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ed_flights[(ed_flights.Carrier==\"Kibana Airlines\") & \n",
|
||
" (ed_flights.AvgTicketPrice > 900.0) &\n",
|
||
" (ed_flights.Cancelled == True)]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Function application, GroupBy & window"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### DataFrame.aggs"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 35,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>DistanceKilometers</th>\n",
|
||
" <th>AvgTicketPrice</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>sum</th>\n",
|
||
" <td>9.261629e+07</td>\n",
|
||
" <td>8.204365e+06</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>min</th>\n",
|
||
" <td>0.000000e+00</td>\n",
|
||
" <td>1.000205e+02</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>std</th>\n",
|
||
" <td>4.578438e+03</td>\n",
|
||
" <td>2.663969e+02</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" DistanceKilometers AvgTicketPrice\n",
|
||
"sum 9.261629e+07 8.204365e+06\n",
|
||
"min 0.000000e+00 1.000205e+02\n",
|
||
"std 4.578438e+03 2.663969e+02"
|
||
]
|
||
},
|
||
"execution_count": 35,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights[['DistanceKilometers', 'AvgTicketPrice']].aggregate(['sum', 'min', 'std'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"`eland.DataFrame.aggregate` currently only supported numeric columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 36,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>DistanceKilometers</th>\n",
|
||
" <th>AvgTicketPrice</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>sum</th>\n",
|
||
" <td>9.261629e+07</td>\n",
|
||
" <td>8.204365e+06</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>min</th>\n",
|
||
" <td>0.000000e+00</td>\n",
|
||
" <td>1.000205e+02</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>std</th>\n",
|
||
" <td>4.578614e+03</td>\n",
|
||
" <td>2.664071e+02</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" DistanceKilometers AvgTicketPrice\n",
|
||
"sum 9.261629e+07 8.204365e+06\n",
|
||
"min 0.000000e+00 1.000205e+02\n",
|
||
"std 4.578614e+03 2.664071e+02"
|
||
]
|
||
},
|
||
"execution_count": 36,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ed_flights[['DistanceKilometers', 'AvgTicketPrice']].aggregate(['sum', 'min', 'std'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Computations / descriptive stats"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### DataFrame.count"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 37,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"AvgTicketPrice 13059\n",
|
||
"Cancelled 13059\n",
|
||
"Carrier 13059\n",
|
||
"Cities 13059\n",
|
||
"Dest 13059\n",
|
||
" ... \n",
|
||
"OriginLocation 13059\n",
|
||
"OriginRegion 13059\n",
|
||
"OriginWeather 13059\n",
|
||
"dayOfWeek 13059\n",
|
||
"timestamp 13059\n",
|
||
"Length: 28, dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 37,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights.count()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 38,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"AvgTicketPrice 13059\n",
|
||
"Cancelled 13059\n",
|
||
"Carrier 13059\n",
|
||
"Cities 13059\n",
|
||
"Dest 13059\n",
|
||
" ... \n",
|
||
"OriginLocation 13059\n",
|
||
"OriginRegion 13059\n",
|
||
"OriginWeather 13059\n",
|
||
"dayOfWeek 13059\n",
|
||
"timestamp 13059\n",
|
||
"Length: 28, dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 38,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ed_flights.count()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### DataFrame.describe"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 39,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>AvgTicketPrice</th>\n",
|
||
" <th>DistanceKilometers</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>dayOfWeek</th>\n",
|
||
" <th>timestamp</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>count</th>\n",
|
||
" <td>13059.000000</td>\n",
|
||
" <td>13059.000000</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>13059.000000</td>\n",
|
||
" <td>13059</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>mean</th>\n",
|
||
" <td>628.253689</td>\n",
|
||
" <td>7092.142455</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2.835975</td>\n",
|
||
" <td>2018-01-21 19:20:45.564438016</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>min</th>\n",
|
||
" <td>100.020528</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>2018-01-01 00:00:00</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>25%</th>\n",
|
||
" <td>409.893816</td>\n",
|
||
" <td>2459.705673</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>2018-01-11 05:16:25.500000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>50%</th>\n",
|
||
" <td>640.556668</td>\n",
|
||
" <td>7610.330866</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>3.000000</td>\n",
|
||
" <td>2018-01-22 00:32:11</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>75%</th>\n",
|
||
" <td>842.185470</td>\n",
|
||
" <td>9736.637600</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>4.000000</td>\n",
|
||
" <td>2018-02-01 04:51:18</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>max</th>\n",
|
||
" <td>1199.729053</td>\n",
|
||
" <td>19881.482315</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6.000000</td>\n",
|
||
" <td>2018-02-11 23:50:12</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>std</th>\n",
|
||
" <td>266.396861</td>\n",
|
||
" <td>4578.438497</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>1.939439</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>8 rows × 8 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" AvgTicketPrice DistanceKilometers ... dayOfWeek timestamp\n",
|
||
"count 13059.000000 13059.000000 ... 13059.000000 13059\n",
|
||
"mean 628.253689 7092.142455 ... 2.835975 2018-01-21 19:20:45.564438016\n",
|
||
"min 100.020528 0.000000 ... 0.000000 2018-01-01 00:00:00\n",
|
||
"25% 409.893816 2459.705673 ... 1.000000 2018-01-11 05:16:25.500000\n",
|
||
"50% 640.556668 7610.330866 ... 3.000000 2018-01-22 00:32:11\n",
|
||
"75% 842.185470 9736.637600 ... 4.000000 2018-02-01 04:51:18\n",
|
||
"max 1199.729053 19881.482315 ... 6.000000 2018-02-11 23:50:12\n",
|
||
"std 266.396861 4578.438497 ... 1.939439 NaN\n",
|
||
"\n",
|
||
"[8 rows x 8 columns]"
|
||
]
|
||
},
|
||
"execution_count": 39,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# NBVAL_IGNORE_OUTPUT\n",
|
||
"# Once support for pandas <2 is dropped, this and the line above can be removed\n",
|
||
"pd_flights.describe()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Values returned from `eland.DataFrame.describe` may vary due to results of Elasticsearch aggregations."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 40,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>AvgTicketPrice</th>\n",
|
||
" <th>Cancelled</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>FlightTimeMin</th>\n",
|
||
" <th>dayOfWeek</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>count</th>\n",
|
||
" <td>13059.000000</td>\n",
|
||
" <td>13059.000000</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>13059.000000</td>\n",
|
||
" <td>13059.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>mean</th>\n",
|
||
" <td>628.253689</td>\n",
|
||
" <td>0.128494</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>511.127842</td>\n",
|
||
" <td>2.835975</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>std</th>\n",
|
||
" <td>266.407061</td>\n",
|
||
" <td>0.334664</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>334.766770</td>\n",
|
||
" <td>1.939513</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>min</th>\n",
|
||
" <td>100.020531</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>25%</th>\n",
|
||
" <td>411.154491</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>250.428538</td>\n",
|
||
" <td>1.058527</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>50%</th>\n",
|
||
" <td>639.433214</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>502.777975</td>\n",
|
||
" <td>2.935777</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>75%</th>\n",
|
||
" <td>842.336195</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>721.351220</td>\n",
|
||
" <td>4.427843</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>max</th>\n",
|
||
" <td>1199.729004</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>1902.901978</td>\n",
|
||
" <td>6.000000</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>8 rows × 9 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" AvgTicketPrice Cancelled ... FlightTimeMin dayOfWeek\n",
|
||
"count 13059.000000 13059.000000 ... 13059.000000 13059.000000\n",
|
||
"mean 628.253689 0.128494 ... 511.127842 2.835975\n",
|
||
"std 266.407061 0.334664 ... 334.766770 1.939513\n",
|
||
"min 100.020531 0.000000 ... 0.000000 0.000000\n",
|
||
"25% 411.154491 0.000000 ... 250.428538 1.058527\n",
|
||
"50% 639.433214 0.000000 ... 502.777975 2.935777\n",
|
||
"75% 842.336195 0.000000 ... 721.351220 4.427843\n",
|
||
"max 1199.729004 1.000000 ... 1902.901978 6.000000\n",
|
||
"\n",
|
||
"[8 rows x 9 columns]"
|
||
]
|
||
},
|
||
"execution_count": 40,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# NBVAL_IGNORE_OUTPUT\n",
|
||
"ed_flights.describe()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### DataFrame.info"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 41,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"<class 'pandas.core.frame.DataFrame'>\n",
|
||
"Index: 13059 entries, 0 to 13058\n",
|
||
"Data columns (total 28 columns):\n",
|
||
" # Column Non-Null Count Dtype \n",
|
||
"--- ------ -------------- ----- \n",
|
||
" 0 AvgTicketPrice 13059 non-null float64 \n",
|
||
" 1 Cancelled 13059 non-null bool \n",
|
||
" 2 Carrier 13059 non-null object \n",
|
||
" 3 Cities 13059 non-null object \n",
|
||
" 4 Dest 13059 non-null object \n",
|
||
" 5 DestAirportID 13059 non-null object \n",
|
||
" 6 DestCityName 13059 non-null object \n",
|
||
" 7 DestCountry 13059 non-null object \n",
|
||
" 8 DestLocation 13059 non-null object \n",
|
||
" 9 DestRegion 13059 non-null object \n",
|
||
" 10 DestWeather 13059 non-null object \n",
|
||
" 11 DistanceKilometers 13059 non-null float64 \n",
|
||
" 12 DistanceMiles 13059 non-null float64 \n",
|
||
" 13 FlightDelay 13059 non-null bool \n",
|
||
" 14 FlightDelayMin 13059 non-null int64 \n",
|
||
" 15 FlightDelayType 13059 non-null object \n",
|
||
" 16 FlightNum 13059 non-null object \n",
|
||
" 17 FlightTimeHour 13059 non-null float64 \n",
|
||
" 18 FlightTimeMin 13059 non-null float64 \n",
|
||
" 19 Origin 13059 non-null object \n",
|
||
" 20 OriginAirportID 13059 non-null object \n",
|
||
" 21 OriginCityName 13059 non-null object \n",
|
||
" 22 OriginCountry 13059 non-null object \n",
|
||
" 23 OriginLocation 13059 non-null object \n",
|
||
" 24 OriginRegion 13059 non-null object \n",
|
||
" 25 OriginWeather 13059 non-null object \n",
|
||
" 26 dayOfWeek 13059 non-null int64 \n",
|
||
" 27 timestamp 13059 non-null datetime64[ns]\n",
|
||
"dtypes: bool(2), datetime64[ns](1), float64(5), int64(2), object(18)\n",
|
||
"memory usage: 3.2+ MB\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights.info()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 42,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"<class 'eland.dataframe.DataFrame'>\n",
|
||
"Index: 13059 entries, 0 to 13058\n",
|
||
"Data columns (total 28 columns):\n",
|
||
" # Column Non-Null Count Dtype \n",
|
||
"--- ------ -------------- ----- \n",
|
||
" 0 AvgTicketPrice 13059 non-null float64 \n",
|
||
" 1 Cancelled 13059 non-null bool \n",
|
||
" 2 Carrier 13059 non-null object \n",
|
||
" 3 Cities 13059 non-null object \n",
|
||
" 4 Dest 13059 non-null object \n",
|
||
" 5 DestAirportID 13059 non-null object \n",
|
||
" 6 DestCityName 13059 non-null object \n",
|
||
" 7 DestCountry 13059 non-null object \n",
|
||
" 8 DestLocation 13059 non-null object \n",
|
||
" 9 DestRegion 13059 non-null object \n",
|
||
" 10 DestWeather 13059 non-null object \n",
|
||
" 11 DistanceKilometers 13059 non-null float64 \n",
|
||
" 12 DistanceMiles 13059 non-null float64 \n",
|
||
" 13 FlightDelay 13059 non-null bool \n",
|
||
" 14 FlightDelayMin 13059 non-null int64 \n",
|
||
" 15 FlightDelayType 13059 non-null object \n",
|
||
" 16 FlightNum 13059 non-null object \n",
|
||
" 17 FlightTimeHour 13059 non-null float64 \n",
|
||
" 18 FlightTimeMin 13059 non-null float64 \n",
|
||
" 19 Origin 13059 non-null object \n",
|
||
" 20 OriginAirportID 13059 non-null object \n",
|
||
" 21 OriginCityName 13059 non-null object \n",
|
||
" 22 OriginCountry 13059 non-null object \n",
|
||
" 23 OriginLocation 13059 non-null object \n",
|
||
" 24 OriginRegion 13059 non-null object \n",
|
||
" 25 OriginWeather 13059 non-null object \n",
|
||
" 26 dayOfWeek 13059 non-null int64 \n",
|
||
" 27 timestamp 13059 non-null datetime64[ns]\n",
|
||
"dtypes: bool(2), datetime64[ns](1), float64(5), int64(2), object(18)\n",
|
||
"memory usage: 64.000 bytes\n",
|
||
"Elasticsearch storage usage: 5.455 MB\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# NBVAL_IGNORE_OUTPUT\n",
|
||
"ed_flights.info()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### DataFrame.max, DataFrame.min, DataFrame.mean, DataFrame.sum"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### max"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 43,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"AvgTicketPrice 1199.729053\n",
|
||
"Cancelled 1.000000\n",
|
||
"DistanceKilometers 19881.482315\n",
|
||
"DistanceMiles 12353.780369\n",
|
||
"FlightDelay 1.000000\n",
|
||
"FlightDelayMin 360.000000\n",
|
||
"FlightTimeHour 31.715034\n",
|
||
"FlightTimeMin 1902.902032\n",
|
||
"dayOfWeek 6.000000\n",
|
||
"dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 43,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights.max(numeric_only=True).astype(float)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"`eland.DataFrame.max,min,mean,sum` only aggregate numeric columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 44,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"AvgTicketPrice 1199.729004\n",
|
||
"Cancelled 1.000000\n",
|
||
"DistanceKilometers 19881.482422\n",
|
||
"DistanceMiles 12353.780273\n",
|
||
"FlightDelay 1.000000\n",
|
||
"FlightDelayMin 360.000000\n",
|
||
"FlightTimeHour 31.715034\n",
|
||
"FlightTimeMin 1902.901978\n",
|
||
"dayOfWeek 6.000000\n",
|
||
"dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 44,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ed_flights.max(numeric_only=True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### min"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 45,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"AvgTicketPrice 100.020528\n",
|
||
"Cancelled 0.000000\n",
|
||
"DistanceKilometers 0.000000\n",
|
||
"DistanceMiles 0.000000\n",
|
||
"FlightDelay 0.000000\n",
|
||
"FlightDelayMin 0.000000\n",
|
||
"FlightTimeHour 0.000000\n",
|
||
"FlightTimeMin 0.000000\n",
|
||
"dayOfWeek 0.000000\n",
|
||
"dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 45,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights.min(numeric_only=True).astype(float)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 46,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"AvgTicketPrice 100.020531\n",
|
||
"Cancelled 0.000000\n",
|
||
"DistanceKilometers 0.000000\n",
|
||
"DistanceMiles 0.000000\n",
|
||
"FlightDelay 0.000000\n",
|
||
"FlightDelayMin 0.000000\n",
|
||
"FlightTimeHour 0.000000\n",
|
||
"FlightTimeMin 0.000000\n",
|
||
"dayOfWeek 0.000000\n",
|
||
"dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 46,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ed_flights.min(numeric_only=True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### mean"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 47,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"AvgTicketPrice 628.253689\n",
|
||
"Cancelled 0.128494\n",
|
||
"DistanceKilometers 7092.142455\n",
|
||
"DistanceMiles 4406.853013\n",
|
||
"FlightDelay 0.251168\n",
|
||
"FlightDelayMin 47.335171\n",
|
||
"FlightTimeHour 8.518797\n",
|
||
"FlightTimeMin 511.127842\n",
|
||
"dayOfWeek 2.835975\n",
|
||
"dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 47,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights.mean(numeric_only=True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 48,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"AvgTicketPrice 628.253689\n",
|
||
"Cancelled 0.128494\n",
|
||
"DistanceKilometers 7092.142457\n",
|
||
"DistanceMiles 4406.853010\n",
|
||
"FlightDelay 0.251168\n",
|
||
"FlightDelayMin 47.335171\n",
|
||
"FlightTimeHour 8.518797\n",
|
||
"FlightTimeMin 511.127842\n",
|
||
"dayOfWeek 2.835975\n",
|
||
"dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 48,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ed_flights.mean(numeric_only=True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"#### sum"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 49,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"AvgTicketPrice 8.204365e+06\n",
|
||
"Cancelled 1.678000e+03\n",
|
||
"DistanceKilometers 9.261629e+07\n",
|
||
"DistanceMiles 5.754909e+07\n",
|
||
"FlightDelay 3.280000e+03\n",
|
||
"FlightDelayMin 6.181500e+05\n",
|
||
"FlightTimeHour 1.112470e+05\n",
|
||
"FlightTimeMin 6.674818e+06\n",
|
||
"dayOfWeek 3.703500e+04\n",
|
||
"dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 49,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights.sum(numeric_only=True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 50,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"AvgTicketPrice 8.204365e+06\n",
|
||
"Cancelled 1.678000e+03\n",
|
||
"DistanceKilometers 9.261629e+07\n",
|
||
"DistanceMiles 5.754909e+07\n",
|
||
"FlightDelay 3.280000e+03\n",
|
||
"FlightDelayMin 6.181500e+05\n",
|
||
"FlightTimeHour 1.112470e+05\n",
|
||
"FlightTimeMin 6.674818e+06\n",
|
||
"dayOfWeek 3.703500e+04\n",
|
||
"dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 50,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ed_flights.sum(numeric_only=True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### DataFrame.nunique"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 51,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Carrier 4\n",
|
||
"Origin 156\n",
|
||
"Dest 156\n",
|
||
"dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 51,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights[['Carrier', 'Origin', 'Dest']].nunique()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 52,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Carrier 4\n",
|
||
"Origin 156\n",
|
||
"Dest 156\n",
|
||
"dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 52,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ed_flights[['Carrier', 'Origin', 'Dest']].nunique()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### DataFrame.drop"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 53,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Carrier</th>\n",
|
||
" <th>Cities</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>dayOfWeek</th>\n",
|
||
" <th>timestamp</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>Kibana Airlines</td>\n",
|
||
" <td>[Frankfurt am Main, Sydney]</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 00:00:00</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>Logstash Airways</td>\n",
|
||
" <td>[Cape Town, Venice]</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 18:27:00</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>Logstash Airways</td>\n",
|
||
" <td>[Venice, Venice]</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 17:11:14</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>Kibana Airlines</td>\n",
|
||
" <td>[Naples, Treviso]</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 10:33:28</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>Kibana Airlines</td>\n",
|
||
" <td>[Mexico City, Xi'an]</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 05:13:00</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13054</th>\n",
|
||
" <td>Logstash Airways</td>\n",
|
||
" <td>[Pisa, Xi'an]</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 20:42:25</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13055</th>\n",
|
||
" <td>Logstash Airways</td>\n",
|
||
" <td>[Winnipeg, Zurich]</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 01:41:57</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13056</th>\n",
|
||
" <td>Logstash Airways</td>\n",
|
||
" <td>[Belogorsk, Mexico City]</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 04:09:27</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13057</th>\n",
|
||
" <td>JetBeats</td>\n",
|
||
" <td>[Buenos Aires, Osaka]</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 08:28:21</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13058</th>\n",
|
||
" <td>JetBeats</td>\n",
|
||
" <td>[Adelaide, Washington]</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 14:54:34</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>13059 rows × 21 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Carrier Cities ... dayOfWeek timestamp\n",
|
||
"0 Kibana Airlines [Frankfurt am Main, Sydney] ... 0 2018-01-01 00:00:00\n",
|
||
"1 Logstash Airways [Cape Town, Venice] ... 0 2018-01-01 18:27:00\n",
|
||
"2 Logstash Airways [Venice, Venice] ... 0 2018-01-01 17:11:14\n",
|
||
"3 Kibana Airlines [Naples, Treviso] ... 0 2018-01-01 10:33:28\n",
|
||
"4 Kibana Airlines [Mexico City, Xi'an] ... 0 2018-01-01 05:13:00\n",
|
||
"... ... ... ... ... ...\n",
|
||
"13054 Logstash Airways [Pisa, Xi'an] ... 6 2018-02-11 20:42:25\n",
|
||
"13055 Logstash Airways [Winnipeg, Zurich] ... 6 2018-02-11 01:41:57\n",
|
||
"13056 Logstash Airways [Belogorsk, Mexico City] ... 6 2018-02-11 04:09:27\n",
|
||
"13057 JetBeats [Buenos Aires, Osaka] ... 6 2018-02-11 08:28:21\n",
|
||
"13058 JetBeats [Adelaide, Washington] ... 6 2018-02-11 14:54:34\n",
|
||
"\n",
|
||
"[13059 rows x 21 columns]"
|
||
]
|
||
},
|
||
"execution_count": 53,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights.drop(columns=['AvgTicketPrice', \n",
|
||
" 'Cancelled', \n",
|
||
" 'DestLocation',\n",
|
||
" 'Dest', \n",
|
||
" 'DestAirportID', \n",
|
||
" 'DestCityName', \n",
|
||
" 'DestCountry'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 54,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Carrier</th>\n",
|
||
" <th>Cities</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>dayOfWeek</th>\n",
|
||
" <th>timestamp</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>Kibana Airlines</td>\n",
|
||
" <td>[Frankfurt am Main, Sydney]</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 00:00:00</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>Logstash Airways</td>\n",
|
||
" <td>[Cape Town, Venice]</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 18:27:00</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>Logstash Airways</td>\n",
|
||
" <td>[Venice, Venice]</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 17:11:14</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>Kibana Airlines</td>\n",
|
||
" <td>[Naples, Treviso]</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 10:33:28</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>Kibana Airlines</td>\n",
|
||
" <td>[Mexico City, Xi'an]</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>2018-01-01 05:13:00</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13054</th>\n",
|
||
" <td>Logstash Airways</td>\n",
|
||
" <td>[Pisa, Xi'an]</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 20:42:25</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13055</th>\n",
|
||
" <td>Logstash Airways</td>\n",
|
||
" <td>[Winnipeg, Zurich]</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 01:41:57</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13056</th>\n",
|
||
" <td>Logstash Airways</td>\n",
|
||
" <td>[Belogorsk, Mexico City]</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 04:09:27</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13057</th>\n",
|
||
" <td>JetBeats</td>\n",
|
||
" <td>[Buenos Aires, Osaka]</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 08:28:21</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13058</th>\n",
|
||
" <td>JetBeats</td>\n",
|
||
" <td>[Adelaide, Washington]</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2018-02-11 14:54:34</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>\n",
|
||
"<p>13059 rows × 21 columns</p>"
|
||
],
|
||
"text/plain": [
|
||
" Carrier Cities ... dayOfWeek timestamp\n",
|
||
"0 Kibana Airlines [Frankfurt am Main, Sydney] ... 0 2018-01-01 00:00:00\n",
|
||
"1 Logstash Airways [Cape Town, Venice] ... 0 2018-01-01 18:27:00\n",
|
||
"2 Logstash Airways [Venice, Venice] ... 0 2018-01-01 17:11:14\n",
|
||
"3 Kibana Airlines [Naples, Treviso] ... 0 2018-01-01 10:33:28\n",
|
||
"4 Kibana Airlines [Mexico City, Xi'an] ... 0 2018-01-01 05:13:00\n",
|
||
"... ... ... ... ... ...\n",
|
||
"13054 Logstash Airways [Pisa, Xi'an] ... 6 2018-02-11 20:42:25\n",
|
||
"13055 Logstash Airways [Winnipeg, Zurich] ... 6 2018-02-11 01:41:57\n",
|
||
"13056 Logstash Airways [Belogorsk, Mexico City] ... 6 2018-02-11 04:09:27\n",
|
||
"13057 JetBeats [Buenos Aires, Osaka] ... 6 2018-02-11 08:28:21\n",
|
||
"13058 JetBeats [Adelaide, Washington] ... 6 2018-02-11 14:54:34\n",
|
||
"\n",
|
||
"[13059 rows x 21 columns]"
|
||
]
|
||
},
|
||
"execution_count": 54,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ed_flights.drop(columns=['AvgTicketPrice', \n",
|
||
" 'Cancelled', \n",
|
||
" 'DestLocation',\n",
|
||
" 'Dest', \n",
|
||
" 'DestAirportID', \n",
|
||
" 'DestCityName', \n",
|
||
" 'DestCountry'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Plotting"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 55,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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CAgIMJofEhICJycnbN26VZp28uRJXLhwAWFhYQCAsLAwHD16FJcuXZLGaDQaqNVqBAUFSWMeXIZhjGEZRFT5sL4QkVzcA0VEdiMuLg5paWn48ccfUaNGDemcAnd3d7i4uMDd3R3Dhw/H+PHj4enpCbVajTfffBNhYWFo3749ACAiIgJBQUEYPHgwZs+ejdzcXEyZMgVxcXHSr7yjR4/GJ598gokTJ2LYsGHYtm0bVq1ahQ0bSr4FARHZP9YXIpKLe6CIyG4sXboUBQUF6NKlC+rWrSv9W7lypTRm3rx5eP7559GvXz907twZPj4+WLNmjTTf0dER69evh6OjI8LCwvDqq69iyJAhSEpKksYEBARgw4YN0Gg0aNmyJebMmYPPPvuMlxgmqsRYX4hILu6BIiK7IcSjLynr7OyMxYsXY/HixaWO8ff3f+RVkbp06YLDhw+XO0Yisk+sL0QkF/dAERERERERycQGioiIiIiISCY2UERERERERDKxgSIiIiIiIpKJDRQREREREZFMbKCIiIiIiIhkYgNFREREREQkExsoIiIiIiIimdhAERERERERycQGioiIiIiISCY2UERERERERDKxgSIiIiIiIpKJDRQREREREZFMbKCIiIiIiIhkMnkDtXPnTvTq1Qu+vr5QKBRYu3at0XwhBKZNm4a6devCxcUF4eHhOHXqlNGYq1evYtCgQVCr1fDw8MDw4cNx48YNozFHjhxBp06d4OzsDD8/P8yePdvUqRARERERERkxeQN18+ZNtGzZEosXLy5x/uzZs7Fw4UIsW7YM+/fvh5ubGyIjI3Hnzh1pzKBBg5CTkwONRoP169dj586dGDVqlDS/sLAQERER8Pf3R1ZWFj766CMkJCTg008/NXU6REREREREkmqmXmBUVBSioqJKnCeEwPz58zFlyhT07t0bAPDVV1/B29sba9euRUxMDE6cOIFNmzbh4MGDaNOmDQBg0aJF6NmzJz7++GP4+voiNTUVd+/exRdffAGlUolmzZohOzsbc+fONWq0iIiIiIiITMnkDVRZzp49i9zcXISHh0vT3N3dERoaiszMTMTExCAzMxMeHh5S8wQA4eHhcHBwwP79+/Hiiy8iMzMTnTt3hlKplMZERkZi1qxZuHbtGmrWrFni+rVaLbRarfS4sLAQAKDT6aDT6UydbqlUjqLk6Q7C6L/2wN5itpd4H3w/Gv7fku/Rx2EvcRIRERFVhEUbqNzcXACAt7e30XRvb29pXm5uLry8vIzmV6tWDZ6enkZjAgICii3DMK+0Bio5ORmJiYnFpqenp8PV1bUCGVXM7HZlz5/RRm+ZQEzI3mK29Xg3btxYbJpGo7FCJERERET0IIs2UNY2efJkjB8/XnpcWFgIPz8/REREQK1WWyyO5gmbS5yuchCY0UaPqYccoNUrLBbP47C3mO0l3mMJkdL/63Q6aDQadO/eHU5OTlaMSh6dTocff/zR2mEQERERmYVFGygfHx8AQF5eHurWrStNz8vLQ6tWraQxly5dMnrevXv3cPXqVen5Pj4+yMvLMxpjeGwYUxKVSgWVSlVsupOTk0W/mGqLyv7irtUrHjnG1thbzLYeb0nvR0u/T4mIiIioOIveByogIAA+Pj7YunWrNK2wsBD79+9HWFgYACAsLAz5+fnIysqSxmzbtg16vR6hoaHSmJ07dxqda6HRaNC4ceNSD98jIiIiIiJ6XCZvoG7cuIHs7GxkZ2cDuH/hiOzsbFy4cAEKhQJjx47F+++/j3Xr1uHo0aMYMmQIfH190adPHwBA06ZN0aNHD4wcORIHDhzAnj17EB8fj5iYGPj6+gIABg4cCKVSieHDhyMnJwcrV67EggULjA7PIyIiIiIiMjWTN1CHDh1C69at0bp1awDA+PHj0bp1a0ybNg0AMHHiRLz55psYNWoU2rZtixs3bmDTpk1wdnaWlpGamoomTZqgW7du6NmzJzp27Gh0jyd3d3ekp6fj7NmzCAkJwb///W9MmzaNlzAnquQedaPuoUOHQqFQGP3r0aOH0RjeqJuISsL6QkRymfwcqC5dukCI0i8RrVAokJSUhKSkpFLHeHp6Ii0trcz1tGjRArt27apwnERkfww36h42bBj69u1b4pgePXpg+fLl0uOHz3scNGgQLl68CI1GA51Oh9deew2jRo2Sao7hRt3h4eFYtmwZjh49imHDhsHDw4M/0hBVYqwvRCRXlboKHxHZt7Ju1G2gUqlKvZgMb9RNRKVhfSEiuSx6EQkiInPLyMiAl5cXGjdujDFjxuDKlSvSvEfdqNswpqQbdZ88eRLXrl2zXCJEZHNYX4gI4B4oIqpEevTogb59+yIgIABnzpzBu+++i6ioKGRmZsLR0dFsN+rWarXQarXS48LCQgD374n14NVCH2aYp3Io/bDn8iprfeZgWJ+c9aocTZenqZUnD1tVVXKwVn6sL7b93jJlfTFsM1NtO1vebuZgz7VIbsxsoIio0oiJiZH+Pzg4GC1atEBgYCAyMjLQrVs3s603OTkZiYmJxaanp6fD1dX1kc+f0UZvslg2btxosmWVh0ajeeSY2e0sEEgFGeKXk4etq+w53Lp1y4KR/B/WF+vVFznMUV9Mte1sebuZkz3WIrn1hQ0UEVVaDRs2RO3atXH69Gl069bNbDfqnjx5stFtFAoLC+Hn54eIiAio1epS49PpdNBoNJh6yAFavWlu7HwsIdIky5HLkEP37t0feaPn5gmbLRRV+R1+r6vsPGxVeV4LWyUnB8MeGGtjfbEtpqwvKgeBGW30Jtt2trzdzMGea5Hc+sIGiogqrT///BNXrlxB3bp1ARjfqDskJARAyTfqfu+996DT6aTC/6gbdatUqmJX4wIAJycnWX88tHoFtEWm+YJjrT9WcnI1VY7mYIhd7mtmyyp7DraSG+uLbTFHfTHVtrPl7WZO9liL5MbLi0gQkd0o60bdN27cwIQJE7Bv3z6cO3cOW7duRe/evdGoUSNERt7/9Y836iai0rC+EJFcbKCIyG6UdaNuR0dHHDlyBC+88AKeeuopDB8+HCEhIdi1a5fRr7e8UTcRlYT1hYjk4iF8RGQ3HnWj7s2bH30MPG/UTUQlYX0hIrm4B4qIiIiIiEgmNlBEREREREQysYEiIiIiIiKSiQ0UERERERGRTLyIhAwN3tlg7RCIiIiIiMgGcA8UERERERGRTNwDRUREVV7zhM2Y3e7+f7VFisde3rmZ0SaIiogqA1MfycT6Yn3cA0VERERERCQTGygiIiIiIiKZ2EARERERERHJxAaKiIiIiIhIJjZQREREREREMrGBIiIiIiIikokNFBERERERkUxsoIiIiIiIiGRiA0VERERERCRTNWsHQETFPXjXcpWjwOx2QPOEzdAWKSq0PN61nIiIiMg0uAeKiIiIiIhIJjZQREREREREMrGBIiIiIiIikokNFBERERERkUxsoIiIiIiIiGRiA0VERERERCQTGygiIiIiIiKZ2EARkd3YuXMnevXqBV9fXygUCqxdu9ZovhAC06ZNQ926deHi4oLw8HCcOnXKaMzVq1cxaNAgqNVqeHh4YPjw4bhx44bRmCNHjqBTp05wdnaGn58fZs+ebe7UiMjKWF+ISC42UERkN27evImWLVti8eLFJc6fPXs2Fi5ciGXLlmH//v1wc3NDZGQk7ty5I40ZNGgQcnJyoNFosH79euzcuROjRo2S5hcWFiIiIgL+/v7IysrCRx99hISEBHz66admz4+IrIf1hYjkqmbtAIiI5IqKikJUVFSJ84QQmD9/PqZMmYLevXsDAL766it4e3tj7dq1iImJwYkTJ7Bp0yYcPHgQbdq0AQAsWrQIPXv2xMcffwxfX1+kpqbi7t27+OKLL6BUKtGsWTNkZ2dj7ty5Rl+EiKhyYX0hIrnYQBFRpXD27Fnk5uYiPDxcmubu7o7Q0FBkZmYiJiYGmZmZ8PDwkL7cAEB4eDgcHBywf/9+vPjii8jMzETnzp2hVCqlMZGRkZg1axauXbuGmjVrFlu3VquFVquVHhcWFgIAdDoddDpdqTEb5qkcRMUTL2WZlmJYn5z1qhxNl6epGV4DU70Wln4dHlynNdZtKnJysEZ+rC/Gy7RFpqwvpq4HpmbLrwNg37VIbsxsoIioUsjNzQUAeHt7G0339vaW5uXm5sLLy8tofrVq1eDp6Wk0JiAgoNgyDPNK+oKTnJyMxMTEYtPT09Ph6ur6yNhntNE/coxcGzduNNmyykOj0TxyzOx2FgjkMZnqtbDW6wDIey1sXVk53Lp1y4KR3Mf6cp8139ePYo76YsptZ0q2/Do8yB5rkdz6wgaKiOgxTZ48GePHj5ceFxYWws/PDxEREVCr1aU+T6fTQaPRYOohB2j1CpPEciwh0iTLkcuQQ/fu3eHk5FTm2OYJmy0UVfmpHARmtNGb7LWw9OsAlO+1sFVycjDsgakqqnJ9KQ9T1hdT1wNTs+XXAbDvWiS3vrCBIqJKwcfHBwCQl5eHunXrStPz8vLQqlUracylS5eMnnfv3j1cvXpVer6Pjw/y8vKMxhgeG8Y8TKVSQaVSFZvu5OQk64+HVq+Atsg0f6St9cdKTq6mytGcTPVaWPNLg9z3nS0rKwdr5Mb68n/rtFXmqC+m3HamZMuvw4PssRbJjZdX4SOiSiEgIAA+Pj7YunWrNK2wsBD79+9HWFgYACAsLAz5+fnIysqSxmzbtg16vR6hoaHSmJ07dxodB63RaNC4ceMSD68hosqP9YWIHsQGiojsxo0bN5CdnY3s7GwA90/szs7OxoULF6BQKDB27Fi8//77WLduHY4ePYohQ4bA19cXffr0AQA0bdoUPXr0wMiRI3HgwAHs2bMH8fHxiImJga+vLwBg4MCBUCqVGD58OHJycrBy5UosWLDA6BAaIqp8WF+ISC4ewkdEduPQoUN47rnnpMeGLx2xsbFISUnBxIkTcfPmTYwaNQr5+fno2LEjNm3aBGdnZ+k5qampiI+PR7du3eDg4IB+/fph4cKF0nx3d3ekp6cjLi4OISEhqF27NqZNm8ZLDBNVcqwvRCQXGygishtdunSBEKVfVlahUCApKQlJSUmljvH09ERaWlqZ62nRogV27dpV4TiJyP6wvhCRXDyEj4iIiIiISCarNFAJCQlQKBRG/5o0aSLNv3PnDuLi4lCrVi1Ur14d/fr1K3bVmgsXLiA6Ohqurq7w8vLChAkTcO/ePUunQkREREREVYjVDuFr1qwZtmzZ8n+BVPu/UMaNG4cNGzZg9erVcHd3R3x8PPr27Ys9e/YAAIqKihAdHQ0fHx/s3bsXFy9exJAhQ+Dk5IQPP/zQ4rkQEREREVHVYLUGqlq1aiXe86CgoACff/450tLS0LVrVwDA8uXL0bRpU+zbtw/t27dHeno6jh8/ji1btsDb2xutWrXCjBkzMGnSJCQkJECpVFo6HSIiIiIiqgKsdg7UqVOn4Ovri4YNG2LQoEG4cOECACArKws6nQ7h4eHS2CZNmqB+/frIzMwEAGRmZiI4OBje3t7SmMjISBQWFiInJ8eyiRARERERUZVhlT1QoaGhSElJQePGjXHx4kUkJiaiU6dOOHbsGHJzc6FUKuHh4WH0HG9vb+Tm5gIAcnNzjZonw3zDvNJotVpotVrpcWFhIQBAp9MZ3dTuYSrH0q/KY0oqB2H0X3tgbzHbW7yAaWIu6/1tapZcFxEREZGlWaWBioqKkv6/RYsWCA0Nhb+/P1atWgUXFxezrTc5ORmJiYnFpqenp8PV1bXU581uZ7aQSjSjjd6yKzQBe4vZ3uIFHi/mjRs3mjASIiIioqrLJu4D5eHhgaeeegqnT59G9+7dcffuXeTn5xvthcrLy5POmfLx8cGBAweMlmG4Sl9J51UZTJ482ehu34WFhfDz80NERATUanWpz2uesLkiaZWbykFgRhs9ph5ygFavsMg6H5e9xWxv8QKmiflYQqSJoyqdTqfDjz/+aLH1EREREVmSTTRQN27cwJkzZzB48GCEhITAyckJW7duRb9+/QAAJ0+exIULFxAWFgYACAsLwwcffIBLly7By8sLAKDRaKBWqxEUFFTqelQqFVQqVbHpTk5OcHJyKvV52iLLftHW6hUWX+fjsreY7S1e4PFiLuv9TURERETyWaWBevvtt9GrVy/4+/vj77//xvTp0+Ho6IgBAwbA3d0dw4cPx/jx4+Hp6Qm1Wo0333wTYWFhaN++PQAgIiICQUFBGDx4MGbPno3c3FxMmTIFcXFxJTZIRERVRYN3NphsWedmRptsWURk/1hfiO6zSgP1559/YsCAAbhy5Qrq1KmDjh07Yt++fahTpw4AYN68eXBwcEC/fv2g1WoRGRmJJUuWSM93dHTE+vXrMWbMGISFhcHNzQ2xsbFISkqyRjpERERERFRFWKWBWrFiRZnznZ2dsXjxYixevLjUMf7+/jwxnoiIiIiILMpq94EiIiIiIiKyNzZxEQkiIrI9cs53UDkKzG53/2ql9nZhFiKyHlOeT0VkaWygiKoAnvhLREREZBo8hI+IiIiIiEgmNlBEREREREQysYEiIiIiIiKSiedAERERmRjPOyQic2F9sT7ugSIiIiIiIpKJDRQREREREZFMbKCIiIiIiIhkYgNFREREREQkExsoIqpUEhISoFAojP41adJEmn/nzh3ExcWhVq1aqF69Ovr164e8vDyjZVy4cAHR0dFwdXWFl5cXJkyYgHv37lk6FSKyIawtRGTAq/ARUaXTrFkzbNmyRXpcrdr/lbpx48Zhw4YNWL16Ndzd3REfH4++fftiz549AICioiJER0fDx8cHe/fuxcWLFzFkyBA4OTnhww8/tHguRGQ7WFuICGADRUSVULVq1eDj41NsekFBAT7//HOkpaWha9euAIDly5ejadOm2LdvH9q3b4/09HQcP34cW7Zsgbe3N1q1aoUZM2Zg0qRJSEhIgFKptHQ6RGQjWFuICGADRUSV0KlTp+Dr6wtnZ2eEhYUhOTkZ9evXR1ZWFnQ6HcLDw6WxTZo0Qf369ZGZmYn27dsjMzMTwcHB8Pb2lsZERkZizJgxyMnJQevWra2RElVhcu/5onIUmN0OaJ6wGdoiRanjeN+XimNtocrGlPeUAqpOfWEDRUSVSmhoKFJSUtC4cWNcvHgRiYmJ6NSpE44dO4bc3FwolUp4eHgYPcfb2xu5ubkAgNzcXKMvOIb5hnkl0Wq10Gq10uPCwkIAgE6ng06nKzVWwzyVgyhfkjbEELs95wBUjjzk5lDWe9LaDLHJ+dxYmjVqC1C164u1VIZ6YC0Pvi9tudaURm7MbKCIqFKJioqS/r9FixYIDQ2Fv78/Vq1aBRcXF7OsMzk5GYmJicWmp6enw9XV9ZHPn9FGb46wLKoy5ABUjjwelcPGjRstFEnFaTSaUufdunXLgpH8H2vUFoD1xZq47crvwfpS1ufYVsmtL2ygiKhS8/DwwFNPPYXTp0+je/fuuHv3LvLz841+Kc7Ly5POa/Dx8cGBAweMlmG4klZJ5z4AwOTJkzF+/HjpcWFhIfz8/BAREQG1Wl1qbDqdDhqNBlMPOUCrL/2QK1umchCY0UZv1zkAlSMPuTkcS4i0YFTlY/hMdO/eHU5OTiWOMeyBsTZL1BagatcXa6kM9cBajiVEyvoc2yq59YUNFBFVajdu3MCZM2cwePBghISEwMnJCVu3bkW/fv0AACdPnsSFCxcQFhYGAAgLC8MHH3yAS5cuwcvLC8D9X9HUajWCgoJKXIdKpYJKpSo23cnJSdYfD61eUeY5K/agMuQAVI48HpWDPXyhKeuzYyvxW6K2AKwv1sRtV34Pviflvkdtidx42UARUaXy9ttvo1evXvD398fff/+N6dOnw9HREQMGDIC7uzuGDx+O8ePHw9PTE2q1Gm+++SbCwsLQvn17AEBERASCgoIwePBgzJ49G7m5uZgyZQri4uJK/BJDRFUDawsRGbCBIqJK5c8//8SAAQNw5coV1KlTBx07dsS+fftQp04dAMC8efPg4OCAfv36QavVIjIyEkuWLJGe7+joiPXr12PMmDEICwuDm5sbYmNjkZSUZK2UiMgGsLYQkQEbKCKqVFasWFHmfGdnZyxevBiLFy8udYy/v79dnGhPVBGmvGxxVblkMcDaQiRHg3c2yL6lwqPYcn1xsHYARERERERE9oINFBERERERkUxsoIiIiIiIiGRiA0VERERERCQTGygiIiIiIiKZ2EARERERERHJxAaKiIiIiIhIJjZQREREREREMrGBIiIiIiIikokNFBERERERkUxsoIiIiIiIiGRiA0VERERERCQTGygiIiIiIiKZ2EARERERERHJxAaKiIiIiIhIJjZQREREREREMrGBIiIiIiIikokNFBERERERkUxsoIiIiIiIiGRiA0VERERERCQTGygiIiIiIiKZqlk7ACIiIrJPDd7ZYNLlnZoRYdLlEZH9MnV9OTcz2mTL4h4oIiIiIiIimdhAERERERERyWT3DdTixYvRoEEDODs7IzQ0FAcOHLB2SERUSbC+EJG5sL4Q2S+7bqBWrlyJ8ePHY/r06fjll1/QsmVLREZG4tKlS9YOjYjsHOsLEZkL6wuRfbPrBmru3LkYOXIkXnvtNQQFBWHZsmVwdXXFF198Ye3QiMjOsb4QkbmwvhDZN7u9Ct/du3eRlZWFyZMnS9McHBwQHh6OzMzMEp+j1Wqh1WqlxwUFBQCAq1evQqfTlbquavdumijqslXTC9y6pUc1nQOK9AqLrPNx2VvM9hYvYHsxX7lypcz5Op0Ot27dAgAIISwRksmVt75UtLYYtpWtvLYVYWvvz4qqDHlUhhyuXLmCW7du4cqVK3BycipxzPXr1wGwvlSF+mItleGzZE22uv0e9f0FkF9f7LaBunz5MoqKiuDt7W003dvbG7/99luJz0lOTkZiYmKx6QEBAWaJsSIGWjuACrC3mO0tXsC2Yq49R/7Y69evw93d3XzBmEl564s91BZzsqX35+OoDHnYew51WV+Kja/q9cVa7P2zZG22uP1M+f3Fbhuoipg8eTLGjx8vPdbr9bh69Spq1aoFhcL6HXJhYSH8/Pzwv//9D2q12trhyGJvMdtbvID9xWyI9/jx4/D19bV2OBZR0dpib69tSSpDDkDlyKOq5CCEwPXr11lfqkB9sRZuu8djz9tPbn2x2waqdu3acHR0RF5entH0vLw8+Pj4lPgclUoFlUplNM3Dw8NcIVaYWq22uzecvcVsb/EC9hfzE088AQcH+zzNsrz15XFri729tiWpDDkAlSOPqpCDPe55MmB9sR/cdo/HXrefnPpin99uACiVSoSEhGDr1q3SNL1ej61btyIsLMyKkRGRvWN9ISJzYX0hsn92uwcKAMaPH4/Y2Fi0adMG7dq1w/z583Hz5k289tpr1g6NiOwc6wsRmQvrC5F9s+sG6pVXXsE///yDadOmITc3F61atcKmTZuKnZhpL1QqFaZPn15sV70ts7eY7S1ewP5itrd4S2OJ+lIZtlVlyAGoHHkwB/vB+mLbuO0eT1XYfgphr9cBJSIiIiIisjC7PQeKiIiIiIjI0thAERERERERycQGioiIiIiISCY2UERERERERDKxgTKz5ORktG3bFjVq1ICXlxf69OmDkydPGo3p0qULFAqF0b/Ro0cbjblw4QKio6Ph6uoKLy8vTJgwAffu3TNLzAkJCcXiadKkiTT/zp07iIuLQ61atVC9enX069ev2A0BLRlvgwYNisWrUCgQFxcHwDa2786dO9GrVy/4+vpCoVBg7dq1RvOFEJg2bRrq1q0LFxcXhIeH49SpU0Zjrl69ikGDBkGtVsPDwwPDhw/HjRs3jMYcOXIEnTp1grOzM/z8/DB79myTx6vT6TBp0iQEBwfDzc0Nvr6+GDJkCP7++2+jZZT0usycOdMs8dqrxYsXo0GDBnB2dkZoaCgOHDhglTgs9ZnPyMjA008/DZVKhUaNGiElJaXCMdvSZ2r16tVo0qQJnJ2dERwcjI0bN5osj6FDhxZ7bXr06GEzecj5G2fJ94+tfKZsQVXfFvZY16ylstRTixJkVpGRkWL58uXi2LFjIjs7W/Ts2VPUr19f3LhxQxrz7LPPipEjR4qLFy9K/woKCqT59+7dE82bNxfh4eHi8OHDYuPGjaJ27dpi8uTJZol5+vTpolmzZkbx/PPPP9L80aNHCz8/P7F161Zx6NAh0b59e/HMM89YLd5Lly4ZxarRaAQAsX37diGEbWzfjRs3ivfee0+sWbNGABA//PCD0fyZM2cKd3d3sXbtWvHrr7+KF154QQQEBIjbt29LY3r06CFatmwp9u3bJ3bt2iUaNWokBgwYIM0vKCgQ3t7eYtCgQeLYsWPi22+/FS4uLuI///mPSePNz88X4eHhYuXKleK3334TmZmZol27diIkJMRoGf7+/iIpKclouz/4vjdlvPZoxYoVQqlUii+++ELk5OSIkSNHCg8PD5GXl2fxWCzxmf/jjz+Eq6urGD9+vDh+/LhYtGiRcHR0FJs2bapQzLbymdqzZ49wdHQUs2fPFsePHxdTpkwRTk5O4ujRoybJIzY2VvTo0cPotbl69arRGGvmIedvnKXeP7b0mbI2bgv7rGvWUlnqqSWxgbKwS5cuCQBix44d0rRnn31W/Otf/yr1ORs3bhQODg4iNzdXmrZ06VKhVquFVqs1eYzTp08XLVu2LHFefn6+cHJyEqtXr5amnThxQgAQmZmZVon3Yf/6179EYGCg0Ov1Qgjb274PFye9Xi98fHzERx99JE3Lz88XKpVKfPvtt0IIIY4fPy4AiIMHD0pjfv75Z6FQKMRff/0lhBBiyZIlombNmkYxT5o0STRu3Nik8ZbkwIEDAoA4f/68NM3f31/Mmzev1OeYK1570a5dOxEXFyc9LioqEr6+viI5OdnisVjiMz9x4kTRrFkzo2W/8sorIjIy8rHjt+Znqn///iI6OtoontDQUPH6668/dh5C3G+gevfuXepzbC2Ph//GWfL9Y0ufKWvjtrD/umYtlaWemhsP4bOwgoICAICnp6fR9NTUVNSuXRvNmzfH5MmTcevWLWleZmYmgoODjW6wFxkZicLCQuTk5JglzlOnTsHX1xcNGzbEoEGDcOHCBQBAVlYWdDodwsPDpbFNmjRB/fr1kZmZabV4De7evYtvvvkGw4YNg0KhkKbb2vZ90NmzZ5Gbm2u0Td3d3REaGmq0TT08PNCmTRtpTHh4OBwcHLB//35pTOfOnaFUKo3yOHnyJK5du2bWHAoKCqBQKODh4WE0febMmahVqxZat26Njz76yOjQB2vGa213795FVlaW0Wvu4OCA8PBw6TW3NHN/5jMzM42WYRhjjnwt+ZmyRF4ZGRnw8vJC48aNMWbMGFy5ckWaZ2t5PPw3zlLvH1v8TFkLt8X/qUx1zVoqWz01lWrWDqAq0ev1GDt2LDp06IDmzZtL0wcOHAh/f3/4+vriyJEjmDRpEk6ePIk1a9YAAHJzc4vdndzwODc31+RxhoaGIiUlBY0bN8bFixeRmJiITp064dixY8jNzYVSqSz2Rdnb21uKxdLxPmjt2rXIz8/H0KFDpWm2tn0fZlhHSTE8uE29vLyM5lerVg2enp5GYwICAootwzCvZs2aZon/zp07mDRpEgYMGAC1Wi1Nf+utt/D000/D09MTe/fuxeTJk3Hx4kXMnTvXqvHagsuXL6OoqKjE1/y3336zeDyW+MyXNqawsBC3b9+Gi4uLyfKx5GeqtLxMVTt69OiBvn37IiAgAGfOnMG7776LqKgoZGZmwtHR0abyKOlvnKXeP9euXbOpz5Q12Vp9sZbKVtespTLVU1NiA2VBcXFxOHbsGHbv3m00fdSoUdL/BwcHo27duujWrRvOnDmDwMBAS4eJqKgo6f9btGiB0NBQ+Pv7Y9WqVTZfDD7//HNERUXB19dXmmZr27cy0el06N+/P4QQWLp0qdG88ePHS//fokULKJVKvP7660hOToZKpbJ0qFQGe/7MV3YxMTHS/wcHB6NFixYIDAxERkYGunXrZsXIiivtbxyRNbCukTnxED4LiY+Px/r167F9+3bUq1evzLGhoaEAgNOnTwMAfHx8il0ZxvDYx8fHDNEa8/DwwFNPPYXTp0/Dx8cHd+/eRX5+frF4DLFYK97z589jy5YtGDFiRJnjbG37GtZRUgwPbtNLly4Zzb937x6uXr1qte1uaJ7Onz8PjUZjtPepJKGhobh37x7OnTtnlXhtSe3ateHo6Fjma25N5vjMlzZGrVab/MuMJT9TpY0x1+vYsGFD1K5d26h+2UIepf2Ns9T7x9Y/U5bEbVEye69r1lKZ6+njYANlZkIIxMfH44cffsC2bduK7b4sSXZ2NgCgbt26AICwsDAcPXrU6M1p+MIaFBRklrgfdOPGDZw5cwZ169ZFSEgInJycsHXrVmn+yZMnceHCBYSFhVk13uXLl8PLywvR0dFljrO17RsQEAAfHx+jbVpYWIj9+/cbbdP8/HxkZWVJY7Zt2wa9Xi81hGFhYdi5cyd0Op1RHo0bNzb54XCG5unUqVPYsmULatWq9cjnZGdnw8HBQdrNb8l4bY1SqURISIjRa67X67F161bpNbcmc3zmw8LCjJZhGGOOfC35mbJkXgDw559/4sqVK0b1y5p5POpvnKXeP7b+mbIkbouS2Xtds5bKXE8fi5UvYlHpjRkzRri7u4uMjAyjS2neunVLCCHE6dOnRVJSkjh06JA4e/as+PHHH0XDhg1F586dpWUYLqUZEREhsrOzxaZNm0SdOnXMdlnwf//73yIjI0OcPXtW7NmzR4SHh4vatWuLS5cuCSHuX/qzfv36Ytu2beLQoUMiLCxMhIWFWS1eIe5fYah+/fpi0qRJRtNtZftev35dHD58WBw+fFgAEHPnzhWHDx+Wrlo3c+ZM4eHhIX788Udx5MgR0bt37xIvEdq6dWuxf/9+sXv3bvHkk08aXSI0Pz9feHt7i8GDB4tjx46JFStWCFdX1wpdFryseO/evSteeOEFUa9ePZGdnW30vjZcXWfv3r1i3rx5Ijs7W5w5c0Z88803ok6dOmLIkCFmidcerVixQqhUKpGSkiKOHz8uRo0aJTw8PIyu+GQplvjMGy73O2HCBHHixAmxePHix7rcr618pvbs2SOqVasmPv74Y3HixAkxffr0cl12t6w8rl+/Lt5++22RmZkpzp49K7Zs2SKefvpp8eSTT4o7d+7YRB6P+hsnhOXeP7b0mbI2bgv7rGvWUlnqqSWxgTIzACX+W758uRBCiAsXLojOnTsLT09PoVKpRKNGjcSECROM7lMkhBDnzp0TUVFRwsXFRdSuXVv8+9//Fjqdziwxv/LKK6Ju3bpCqVSKJ554Qrzyyivi9OnT0vzbt2+LN954Q9SsWVO4urqKF198UVy8eNFq8QohxObNmwUAcfLkSaPptrJ9t2/fXuL7IDY2Vghx/zKhU6dOFd7e3kKlUolu3boVy+XKlStiwIABonr16kKtVovXXntNXL9+3WjMr7/+Kjp27ChUKpV44oknxMyZM00e79mzZ0t9XxvuvZWVlSVCQ0OFu7u7cHZ2Fk2bNhUffvih0Zc+U8ZrrxYtWiTq168vlEqlaNeundi3b59V4rDUZ3779u2iVatWQqlUioYNG0p1sCJs6TO1atUq8dRTTwmlUimaNWsmNmzYYJI8bt26JSIiIkSdOnWEk5OT8Pf3FyNHjiz2JdiaeTzqb5wQln3/2MpnyhZU9W1hj3XNWipLPbUkhRBCmHy3FhERERERUSXEc6CIiIiIiIhkYgNFREREREQkExsoIiIiIiIimdhAERERERERycQGioiIiIiISCY2UERERERERDKxgSIiIiIiIpKJDRQREREREZFMbKCIiIiIiIhkYgNFREREREQkExsoIiIiIiIimdhAERERERERycQGioiIiIiISCY2UERERERERDKxgSIiIiIiIpKJDRQREREREZFMbKCIiIiIiIhkYgNFREREREQkExsoIiIiIiIimdhAERERERERycQGqpJr0KABhg4dKj3OyMiAQqFARkZGuZdleO53331nugBNTKFQICEhwdphlMiWYyMqD3utKykpKVAoFDh37pzZ10VEpsOaY1kPb28qjg2UHTN8MEv6984771g1trS0NMyfP7/Y9HPnzhnF6eTkhNq1a+OZZ57Bu+++iwsXLlg+2HJ4cJvv3r272HwhBPz8/KBQKPD8889bIUKix2NvdaVLly6lxvvgP2v/ePGoL21Dhw5F9erVLRwVkfWx5piHoeYoFAp88803JY7p0KEDFAoFmjdvbuHo7F81awdAjy8pKQkBAQFG00r7MHTu3Bm3b9+GUqk0a0xpaWk4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VVZWav369erQoYP+8pe/qEePHurUqZP+8pe/6C9/+Yt69uypgQMHKigoSNu2bTOfu337drVs2VIDBgxQYmKiS4Cq+XdNgDpw4IAGDhyoTz/9VI888ojmz5+vli1basyYMS774Ny5c/rxj3+sv/71r5o4caIWLVqkwYMHa8aMGcrIyKi3j6qqKt1999164403tHLlSt122231jgUAAIAPMdAsjRkzxggNDTX+7//+z1z2ySefGIGBgcb3fyzOnTtX67mpqalG165dzcdVVVVGp06djDvuuMNl3IIFCwybzWZ8/vnnhmEYxvTp0w1Jxp49e+qt6+OPPzYkGRkZGeayH//4x8Y111xTa+yAAQOMK6+80nz8P//zP8YNN9xgGIZhPPzww8aAAQPMdT/72c+MsLAww+l0GoZhGCNGjDB69+5tnD9/3hxTXV1tDBo0yLjqqqvMZXPnzjVatmxp/Pvf/3Z57UceecQIDAw0CgsLDcMwjCNHjhiSjKeeespwOp3GHXfcYbRo0cLYsGFDvb0CAADA93AEqhmqqqrShg0bNGbMGHXu3Nlc3rNnT6WmprqMbdGihfnvkpISnThxQj/+8Y/1+eefq6SkRJIUEBCg8ePHa/Xq1Tpz5ow5/s0339SgQYMUHx8vSea61q1b11tbzbrS0tIL9jFkyBCXc522b9+uQYMGSZIGDx6sPXv26Ny5c+a6pKQkBQUF6dSpU9q4caNuv/12nTlzRidOnNCJEyd08uRJpaam6tChQ/rPf/4jSXr77bc1dOhQtWnTxhx34sQJJScnq6qqSlu2bHGpqaKiQj//+c+1Zs0arVu3TikpKRfsAwAAAL6DANUMff311/r222911VVX1VpXc75Sje3btys5OVktW7ZUZGSkOnTooN///veSZAYo6buP3n377bfmx98OHjyo/Px8TZgwwRxTE46+H7J+yErIqvH986BOnz6tAwcOmBeJGDRokCorK7Vr1y4dOXJEx44dM8cfPnxYhmHoD3/4gzp06ODyNWvWLEnfXbhCkg4dOmR+nPD7X8nJyS7jamRmZmrVqlX6+9//ruHDh1+wBwAAAPgWLmOOen322WcaMWKEevTooQULFiguLk4hISFat26dFi5c6HIRhV69eikhIcE8V+ivf/2rQkJCdPvtt5tjevbsKUnau3ev+vXrV+dr7t2719zehdQEom3b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rMHX6dOnj7Zu3XrJdQIAAADAxfLoOVAAAAAA4MsIUAAAAABgEQEKAAAAACwiQAEAAACARQQoAAAAALCIAAUAAAAAFhGgAAAAAMAiAhQAAAAAWESAAgAAAACLCFAAAAAAYBEBCgAAAAAsIkABAAAAgEUEKAAAAACwiAAFAAAAABYRoAAAAADAIgIUAAAAAFhEgAIAAAAAiwhQAAAAAGARAQoAAAAALCJAAQAAAIBFBCgAAAAAsIgABQAAAAAWEaAAAAAAwCICFAAAAABYRIACAAAAAIsIUAAAAABgEQEKAAAAACwiQAEAAACARQQoAAAAALCIAAUAAAAAFhGgAAAAAMAiAhQAAAAAWESAAgAAAACLCFAAAAAAYBEBCgAAAAAsIkABAAAAgEUEKAAAAACwiAAFAAAAABYRoAAAAADAIq8EqNmzZ8tms7l89ejRw1x//vx5paenq127dmrVqpXGjh2r4uJil20UFhYqLS1NYWFhioqK0kMPPaTKykpPtwIAAACgGQny1gtfc801ev/99/9bSNB/S3nggQe0du1avf3224qIiNC0adN02223afv27ZKkqqoqpaWlKSYmRh9++KGOHTumiRMnKjg4WH/605883gsAAACA5sFrASooKEgxMTG1lpeUlOjVV1/VsmXLdOONN0qSlixZop49e2rHjh0aOHCgsrOz9cknn+j9999XdHS0+vXrp7lz5+p3v/udZs+erZCQEE+3AwAAAKAZ8FqAOnTokGJjYxUaGiqHw6HMzEx17txZ+fn5cjqdSk5ONsf26NFDnTt3Vl5engYOHKi8vDz17t1b0dHR5pjU1FRNnTpVBw4cUP/+/et8zfLycpWXl5uPS0tLJUlOp1NOp7PO59QstwcYl91zY6mv9kthD6y7z5r+L3Y/eKI2T2loH7izT8n7vdanpvcL9evu/QEAANBUeCVAJSUlaenSperevbuOHTumOXPmaOjQodq/f7+KiooUEhKiyMhIl+dER0erqKhIklRUVOQSnmrW16yrT2ZmpubMmVNreXZ2tsLCwhqseW5itZXWvGLdunVu29a86xtef7H7wZO1eUpd+8CdfUpNp9f65OTkNLj+3LlzHqoEAADAs7wSoEaPHm3+u0+fPkpKSlKXLl301ltvqUWLFo32ujNmzFBGRob5uLS0VHFxcUpJSVF4eHidz3E6ncrJydEf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",
|
||
"text/plain": [
|
||
"<Figure size 1000x1000 with 9 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd_flights.select_dtypes(include=np.number).hist(figsize=[10,10])\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 56,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA1AAAANECAYAAAC+XM68AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAADRcElEQVR4nOzdeVhUdfs/8PeAzLDogKiAJCJiqSguoSK5ZIogkmlahppibmlQj/qkZrkAVqjlnsvTU0kL5FJmpqaMC664kaSimZrLUwnmAriOI/P5/eFvzteRxQPOCu/XdXnVnPOZc+77zMzN3HM2hRBCgIiIiIiIiB7JwdoBEBERERER2Qs2UERERERERDKxgSIiIiIiIpKJDRQREREREZFMbKCIiIiIiIhkYgNFREREREQkExsoIiIiIiIimdhAERERERERycQGioiIiIiISCY2UGRWDRo0wNChQ8v1nIyMDCgUCnz33XfmCcqEEhISoFAorB0GUYXw/Vu6Ll26oEuXLtLjc+fOQaFQICUlxWoxEdF9rF3yGL5PZWRkSNOGDh2KBg0aWC2myoINVCWyZMkSKBQKhIaGmm0dhg+jnH+2YsmSJSV+6Xk4FycnJzRs2BBDhgzBH3/8YflAiR5TSkqK0Xva2dkZvr6+iIyMxMKFC3H9+vXHXsfff/+NhIQEZGdnP37AFjZ06FBUr1692PQjR46gdu3aaNCgAc6dO2f5wEzoww8/xNq1a60dBlG5sHaVbejQoVAoFFCr1bh9+3ax+adOnZK23ccff2yFCKueatYOgEwnNTUVDRo0wIEDB3D69Gk0atTI5Oto2rQpvv76a6NpkydPRvXq1fHee+8VG3/y5Ek4OFi3T1+yZAlq165d6p6wt956C23btoVOp8Mvv/yCTz/9FBs2bMDRo0fh6+tb5rKnTJmCd955xwxRE1VcUlISAgICoNPpkJubi4yMDIwdOxZz587FunXr0KJFCwAVe//+/fffSExMRIMGDdCqVSszRG9Zx44dQ7du3eDm5obt27dLv8ymp6dbN7AK+vDDD/HSSy+hT58+1g6FqNxYu0pXrVo13Lp1Cz/99BP69+9vNC81NRXOzs64c+eO0fTOnTvj9u3bUCqVlgy1SmADVUmcPXsWe/fuxZo1a/D6668jNTUV06dPN/l6vL298eqrrxpNmzlzJmrXrl1sOgCoVCqTx2BqnTp1wksvvQQAeO211/DUU0/hrbfewpdffonJkyeX+JybN2/Czc0N1apVQ7Vq/BiRbYmKikKbNm2kx5MnT8a2bdvw/PPP44UXXsCJEyfg4uJS5d+/OTk56Nq1K1xcXLB9+3YEBARI8/iF4//cuXMHSqXS6j+GUeXH2lU6lUqFDh064Ntvvy3WQKWlpSE6Ohrff/+90XQHBwc4OztbMswqg9WwkkhNTUXNmjURHR2Nl156CampqQAAnU4HT09PvPbaa8WeU1hYCGdnZ7z99tvStPPnz+OFF16Am5sbvLy8MG7cOGzevLnYMbRylXQOVH5+PsaNG4cGDRpApVKhXr16GDJkCC5fvlzqcrRaLZ5//nm4u7tj7969AAC9Xo/58+ejWbNmcHZ2hre3N15//XVcu3bNaP05OTnYsWOHtHv7wfMaStK1a1cA95tS4P+OtT5+/DgGDhyImjVromPHjkbzHvbNN9+gXbt2cHV1Rc2aNdG5c+div2j//PPP6NSpE9zc3FCjRg1ER0cjJyenzNiIKqpr166YOnUqzp8/j2+++QZAye9fjUaDjh07wsPDA9WrV0fjxo3x7rvvArh/2Gvbtm0B3P+xwfCZMhwiu2vXLrz88suoX78+VCoV/Pz8MG7cuGKHnBgOpfvrr7/Qp08fVK9eHXXq1MHbb7+NoqIio7F6vR4LFixAcHAwnJ2dUadOHfTo0QOHDh0yGvfNN98gJCQELi4u8PT0RExMDP73v/+Vuj1OnDiBbt26QaVSYfv27WjYsKHR/IfPgSrNtm3bpM+xh4cHevfujRMnThiNMWzn33//Ha+++irc3d1Rp04dTJ06FUII/O9//0Pv3r2hVqvh4+ODOXPmFFuPVqvF9OnT0ahRI2nbTpw4EVqtVhqjUChw8+ZNfPnll9Jr82D9/euvvzBs2DB4e3tDpVKhWbNm+OKLL4zWYzi0ecWKFZgyZQqeeOIJuLq6orCwEDqdDomJiXjyySfh7OyMWrVqoWPHjtBoNI/cTkQVxdr1fwYOHIiff/4Z+fn50rSDBw/i1KlTGDhwYLHxJZ0DVRI536cA4NChQ4iMjETt2rXh4uKCgIAADBs2rMxlV1ZVq32vxFJTU9G3b18olUoMGDAAS5cuxcGDB9G2bVu8+OKLWLNmDf7zn/8Y/aq6du1aaLVaxMTEALi/V6Vr1664ePEi/vWvf8HHxwdpaWnYvn27yeK8ceMGOnXqhBMnTmDYsGF4+umncfnyZaxbtw5//vknateuXew5t2/fRu/evXHo0CFs2bJFKoKvv/46UlJS8Nprr+Gtt97C2bNn8cknn+Dw4cPYs2cPnJycMH/+fLz55ptGhxh6e3uXGeOZM2cAALVq1TKa/vLLL+PJJ5/Ehx9+CCFEqc9PTExEQkICnnnmGSQlJUGpVGL//v3Ytm0bIiIiAABff/01YmNjERkZiVmzZuHWrVtYunQpOnbsiMOHD/METzKLwYMH491330V6ejpGjhxZbH5OTg6ef/55tGjRAklJSVCpVDh9+jT27NkD4P4hvElJSZg2bRpGjRqFTp06AQCeeeYZAMDq1atx69YtjBkzBrVq1cKBAwewaNEi/Pnnn1i9erXRuoqKihAZGYnQ0FB8/PHH2LJlC+bMmYPAwECMGTNGGjd8+HCkpKQgKioKI0aMwL1797Br1y7s27dP+qX6gw8+wNSpU9G/f3+MGDEC//zzDxYtWoTOnTvj8OHD8PDwMFr3yZMn0bVrV1SrVg3bt29HYGBghbbnli1bEBUVhYYNGyIhIQG3b9/GokWL0KFDB/zyyy/FPsevvPIKmjZtipkzZ2LDhg14//334enpif/85z/o2rUrZs2ahdTUVLz99tto27YtOnfuDOD+l5sXXngBu3fvxqhRo9C0aVMcPXoU8+bNw++//y6d8/T1119jxIgRaNeuHUaNGgUAUm55eXlo3749FAoF4uPjUadOHfz8888YPnw4CgsLMXbsWKNYZ8yYAaVSibfffhtarRZKpRIJCQlITk6W1lFYWIhDhw7hl19+Qffu3Su0DYnkYO26r2/fvhg9ejTWrFkjNS5paWlo0qQJnn766QpvXznfpy5duoSIiAjUqVMH77zzDjw8PHDu3DmsWbOmwuu1a4Ls3qFDhwQAodFohBBC6PV6Ua9ePfGvf/1LCCHE5s2bBQDx008/GT2vZ8+eomHDhtLjOXPmCABi7dq10rTbt2+LJk2aCABi+/btJa6/WbNm4tlnny1xnr+/v4iNjZUeT5s2TQAQa9asKTZWr9cLIYTYvn27ACBWr14trl+/Lp599llRu3ZtcfjwYWnsrl27BACRmppqtIxNmzYVm15afIb1fPHFF+Kff/4Rf//9t9iwYYNo0KCBUCgU4uDBg0IIIaZPny4AiAEDBhRbhmGewalTp4SDg4N48cUXRVFRUYn5Xb9+XXh4eIiRI0cazc/NzRXu7u7FphPJtXz5cgFAeu+WxN3dXbRu3VoIUfz9O2/ePAFA/PPPP6U+/+DBgwKAWL58ebF5t27dKjYtOTlZKBQKcf78eWlabGysACCSkpKMxrZu3VqEhIRIj7dt2yYAiLfeeqvYcg2fp3PnzglHR0fxwQcfGM0/evSoqFatmtH02NhY4eTkJOrWrSt8fX3F77//Xmqezz77rFHdOHv2bLG8W7VqJby8vMSVK1ekab/++qtwcHAQQ4YMkaYZtvOoUaOkaffu3RP16tUTCoVCzJw5U5p+7do14eLiYlQ3v/76a+Hg4CB27dplFOOyZcsEALFnzx5pmpubm9FzDYYPHy7q1q0rLl++bDQ9JiZGuLu7S6+doS42bNiw2OvZsmVLER0dXcLWIno8rF3/p7Ta5ebmJoQQ4qWXXhLdunUTQghRVFQkfHx8RGJiolSjPvroI+l5hs/zg9/fYmNjhb+/v/RY7vepH3744ZGvUVXCQ/gqgdTUVHh7e+O5554DcP8wjldeeQUrVqxAUVERunbtitq1a2PlypXSc65duwaNRoNXXnlFmrZp0yY88cQTeOGFF6Rpzs7OJf7aU1Hff/89WrZsiRdffLHYvId3xxcUFCAiIgK//fYbMjIyjE76XL16Ndzd3dG9e3dcvnxZ+hcSEoLq1auXa6/ZsGHDUKdOHfj6+iI6Olo6BObB47ABYPTo0Y9c1tq1a6HX6zFt2rRi5wsY8tNoNMjPz8eAAQOMYnd0dERoaKhJ9/gRPax69eqlXtHK8Gvnjz/+CL1eX+5lu7i4SP9/8+ZNXL58Gc888wyEEDh8+HCx8Q9/pjp16mR0Bczvv/8eCoWixPM5DZ+nNWvWQK/Xo3///kafJx8fHzz55JPFPk9FRUW4fPkyPD09S9zjLdfFixeRnZ2NoUOHwtPTU5reokULdO/eHRs3biz2nBEjRkj/7+joiDZt2kAIgeHDh0vTPTw80LhxY6PtsHr1ajRt2hRNmjQxytFwuPGjaoYQAt9//z169eoFIYTRMiIjI1FQUIBffvnF6DmxsbFGr6chtpycHJw6dUrGFiIyrapeuwwGDhyIjIwM5ObmYtu2bcjNzS3x8D255H6fMmzj9evXQ6fTVXh9lQUP4bNzRUVFWLFiBZ577jnpnB0ACA0NxZw5c7B161ZERESgX79+SEtLg1arhUqlwpo1a6DT6YwaqPPnzyMwMLBYI2PKq/mdOXMG/fr1kzV27NixuHPnDg4fPoxmzZoZzTt16hQKCgrg5eVV4nMvXbokO6Zp06ahU6dOcHR0RO3atdG0adMST0598ATz0pw5cwYODg4ICgoqdYzhy4fhy8/D1Gq1zMiJyu/GjRulfm5eeeUVfPbZZxgxYgTeeecddOvWDX379sVLL70k6wICFy5cwLRp07Bu3bpix84XFBQYPTacE/CgmjVrGj3vzJkz8PX1NWpQHnbq1CkIIfDkk0+WON/JycnosYuLCz777DMMGjQI0dHR0Gg0cHNze2RuDzt//jwAoHHjxsXmNW3aFJs3b5YuNmNQv359o3Hu7u5wdnYu1si5u7vjypUr0uNTp07hxIkTxbaXwaPq3T///IP8/Hx8+umn+PTTT2Uto6R6l5SUhN69e+Opp55C8+bN0aNHDwwePFi6MhqROVX12mXQs2dP1KhRAytXrkR2djbatm2LRo0aVfgWDHK/Tz377LPo168fEhMTMW/ePHTp0gV9+vTBwIED7eKCYabGBsrObdu2DRcvXsSKFSuwYsWKYvNTU1MRERGBmJgY/Oc//8HPP/+MPn36YNWqVWjSpAlatmxphajl6d27N1asWIGZM2fiq6++MiqCer0eXl5e0sUyHlbaF42SBAcHIzw8/JHjHv41tqIMv459/fXX8PHxKTa/ql1ZiCznzz//REFBQak/iri4uGDnzp3Yvn07NmzYgE2bNmHlypXo2rUr0tPT4ejoWOqyi4qK0L17d1y9ehWTJk1CkyZN4Obmhr/++gtDhw4t9qtwWcsqD71eD4VCgZ9//rnEZZZ036eYmBhcu3YNb7zxBvr27YuffvrJIlfdKym+0raDeOA8S71ej+DgYMydO7fEsX5+fmWu17DtX331VcTGxpY45uEmqKR617lzZ5w5cwY//vgj0tPT8dlnn2HevHlYtmyZ0d41IlNj7fo/KpUKffv2xZdffok//vgDCQkJjx2HnO9TCoUC3333Hfbt24effvoJmzdvxrBhwzBnzhzs27ev1HgrK35Ts3Opqanw8vLC4sWLi81bs2YNfvjhByxbtgydO3dG3bp1sXLlSnTs2BHbtm0rdt8mf39/HD9+HEIIo71Qp0+fNlm8gYGBOHbsmKyxffr0QUREBIYOHYoaNWpg6dKlRsvZsmULOnTo8MjGxpI39Q0MDIRer8fx48dLvc+E4aRuLy8vWY0bkakY7uEWGRlZ6hgHBwd069YN3bp1w9y5c/Hhhx/ivffew/bt2xEeHl7q5+no0aP4/fff8eWXX2LIkCHS9Me5QltgYCA2b96Mq1evlvpLbmBgIIQQCAgIwFNPPSV72WPGjMHVq1cxZcoUvPrqq1ixYkW5LtPt7+8P4P4FKR7222+/oXbt2hXas1WSwMBA/Prrr+jWrdsj61lJ8+vUqYMaNWqgqKjosWuO4aqur732Gm7cuIHOnTsjISGBDRSZFWuXsYEDB+KLL76Ag4ODdCGwx4lV7vcpAGjfvj3at2+PDz74AGlpaRg0aBBWrFhR5WoAz4GyY7dv38aaNWvw/PPP46WXXir2Lz4+HtevX8e6devg4OCAl156CT/99BO+/vpr3Lt3z+jwPeB+Yfrrr7+wbt06adqdO3fw3//+12Qx9+vXD7/++it++OGHYvNECVe2GzJkCBYuXIhly5Zh0qRJ0vT+/fujqKgIM2bMKPace/fuGV3i083NzeixOfXp0wcODg5ISkoq9quVIb/IyEio1Wp8+OGHJR5H/M8//1gkVqpatm3bhhkzZiAgIACDBg0qcczVq1eLTTP8EGC4XLahKXj4M2X4BfXBz7EQAgsWLKhwzP369YMQAomJicXmGdbTt29fODo6IjExsVgNEUIYHQr3sPfeew/jxo3D6tWr8frrr5crtrp166JVq1b48ssvjbbFsWPHkJ6ejp49e5ZreWXp378//vrrrxJr8e3bt3Hz5k3pcUn1ztHREf369cP3339f4g9YcmvOw9uyevXqaNSokdGl1IlMjbWruOeeew4zZszAJ598UuKRLOUh9/vUtWvXisX58DauSrgHyo6tW7cO169fN7row4Pat2+POnXqIDU1Fa+88gpeeeUVLFq0CNOnT0dwcDCaNm1qNP7111/HJ598ggEDBuBf//oX6tatK93dGjDNnpwJEybgu+++w8svv4xhw4YhJCQEV69exbp167Bs2bISDymMj49HYWEh3nvvPbi7u+Pdd9/Fs88+i9dffx3JycnIzs5GREQEnJyccOrUKaxevRoLFiyQbo4bEhKCpUuX4v3330ejRo3g5eVV6vlHj6tRo0Z47733MGPGDHTq1Al9+/aFSqXCwYMH4evri+TkZKjVaixduhSDBw/G008/jZiYGNSpUwcXLlzAhg0b0KFDB3zyySdmiY+qhp9//hm//fYb7t27h7y8PGzbtg0ajQb+/v5Yt25dqTdWTEpKws6dOxEdHQ1/f39cunQJS5YsQb169aR7nwUGBsLDwwPLli1DjRo14ObmhtDQUDRp0gSBgYF4++238ddff0GtVuP7778vdj5BeTz33HMYPHgwFi5ciFOnTqFHjx7Q6/XYtWsXnnvuOcTHxyMwMBDvv/8+Jk+ejHPnzqFPnz6oUaMGzp49ix9++AGjRo0yutfdw+bMmYNr167hs88+g6enJ2bNmiU7vo8++ghRUVEICwvD8OHDpcuYu7u7P/ZhNQ8aPHgwVq1ahdGjR2P79u3o0KEDioqK8Ntvv2HVqlXYvHmzdNGbkJAQbNmyBXPnzoWvry8CAgIQGhqKmTNnYvv27QgNDcXIkSMRFBSEq1ev4pdffsGWLVtK/AL6sKCgIHTp0gUhISHw9PTEoUOH8N133yE+Pt5kuVLVxtolr3Y5ODhgypQpFY7vQXK/T3355ZdYsmQJXnzxRQQGBuL69ev473//C7VabdIfjOyGpS73R6bXq1cv4ezsLG7evFnqmKFDhwonJydx+fJlodfrhZ+fnwAg3n///RLH//HHHyI6Olq4uLiIOnXqiH//+9/i+++/FwDEvn37SnxOeS5jLoQQV65cEfHx8eKJJ54QSqVS1KtXT8TGxkqX133wMuYPmjhxogAgPvnkE2nap59+KkJCQoSLi4uoUaOGCA4OFhMnThR///23NCY3N1dER0eLGjVqCABSrKWt52GGy6WWdHnUhy+lavDFF1+I1q1bC5VKJWrWrCmeffZZ6TLzBtu3bxeRkZHC3d1dODs7i8DAQDF06FBx6NChMuMhKo3hUsCGf0qlUvj4+Iju3buLBQsWiMLCQqPxD79/t27dKnr37i18fX2FUqkUvr6+YsCAAcUu9/3jjz+KoKAgUa1aNaPLAh8/flyEh4eL6tWri9q1a4uRI0eKX3/9tdilgx+8JG9Z8Qhx/3LfH330kWjSpIlQKpWiTp06IioqSmRlZRmN+/7770XHjh2Fm5ubcHNzE02aNBFxcXHi5MmTj1zvvXv3RJ8+fQQAkZycLISQdxlzIYTYsmWL6NChg3BxcRFqtVr06tVLHD9+vMS8Hq4hpcXz7LPPimbNmhlNu3v3rpg1a5Zo1qyZVFdCQkJEYmKiKCgokMb99ttvonPnzsLFxUUAMKq/eXl5Ii4uTvj5+QknJyfh4+MjunXrJj799FNpTFl18f333xft2rUTHh4ewsXFRTRp0kR88MEH4u7du8XGEpUHa1fFateDKnoZc4NHfZ/65ZdfxIABA0T9+vWFSqUSXl5e4vnnn6+y31kUQpRxR1AiAPPnz8e4cePw559/4oknnrB2OEREREREVsMGiozcvn3b6CTCO3fuoHXr1igqKsLvv/9uxciIiIiIiKyP50CRkb59+6J+/fpo1aoVCgoK8M033+C3334r9fKWRERERERVCRsoMhIZGYnPPvsMqampKCoqQlBQEFasWFHsin1ERERERFURD+EjIiIiIiKSifeBIiIiIiIikokNFBERERERkUxV+hwovV6Pv//+GzVq1DDJTWKJ6D4hBK5fvw5fX184OFS932lYW4jMh/WF9YXIXOTWlyrdQP3999/w8/OzdhhEldb//vc/1KtXz9phWBxrC5H5sb4Qkbk8qr5U6QaqRo0aAO5vJLVabeVoAJ1Oh/T0dERERMDJycna4chibzHbW7yA/cWs0+mwdu1ajBgxQvqMVTVya4u9vbYlqQw5AJUjj6qSQ2FhIfz8/FhfqkB9sRZuu8djz9tPbn2p0g2UYde3Wq22mQbK1dUVarXabt5w9hazvcUL2F/MhngBVNnDS+TWFnt7bUtSGXIAKkceVS0H1pfKX1+shdvu8VSG7feo+lL1Dh4mIru1dOlStGjRQvriEBYWhp9//lmaf+fOHcTFxaFWrVqoXr06+vXrh7y8PKNlXLhwAdHR0XB1dYWXlxcmTJiAe/fuGY3JyMjA008/DZVKhUaNGiElJcUS6RGRFbG+EJFcbKCIyG7Uq1cPM2fORFZWFg4dOoSuXbuid+/eyMnJAQCMGzcOP/30E1avXo0dO3bg77//Rt++faXnFxUVITo6Gnfv3sXevXvx5ZdfIiUlBdOmTZPGnD17FtHR0XjuueeQnZ2NsWPHYsSIEdi8ebPF8yUiy2F9ISK5qvQhfERkX3r16mX0+IMPPsDSpUuxb98+1KtXD59//jnS0tLQtWtXAMDy5cvRtGlT7Nu3D+3bt0d6ejqOHz+OLVu2wNvbG61atcKMGTMwadIkJCQkQKlUYtmyZQgICMCcOXMAAE2bNsXu3bsxb948REZGWjxnIrIM1hcikosNFBHZpaKiIqxevRo3b95EWFgYsrKyoNPpEB4eLo1p0qQJ6tevj8zMTLRv3x6ZmZkIDg6Gt7e3NCYyMhJjxoxBTk4OWrdujczMTKNlGMaMHTu21Fi0Wi20Wq30uLCwEMD948B1Ol2pzzPMK2uMrasMOQCVI4+qkoMl8mN9qdq47R6PPW8/uTGzgSIiu3L06FGEhYXhzp07qF69On744QcEBQUhOzsbSqUSHh4eRuO9vb2Rm5sLAMjNzTX6cmOYb5hX1pjCwkLcvn0bLi4uxWJKTk5GYmJisenp6enSBTXKotFoHjnG1lWGHIDKkUdlz+HWrVtmWy/rCz2I2+7x2OP2k1tf2EARkV1p3LgxsrOzUVBQgO+++w6xsbHYsWOHVWOaPHkyxo8fLz02XAY1IiLikVfJ0mg06N69u91eqagy5ABUjjyqSg6GPTDmwPpCALfd47Ln7Se3vrCBIiK7olQq0ahRIwBASEgIDh48iAULFuCVV17B3bt3kZ+fb/QrcV5eHnx8fAAAPj4+OHDggNHyDFfRenDMw1fWysvLg1qtLvHXYQBQqVRQqVTFpjs5Ocn64yF3nC2rDDkAlSOPyp6DOXNjfaEHcds9HnvcfnLjZQNFVVaDdzaYbFnnZkabbFlUPnq9HlqtFiEhIXBycsLWrVvRr18/AMDJkydx4cIFhIWFAQDCwsLwwQcf4NKlS/Dy8gJw/xADtVqNoKAgaczGjRuN1qHRaKRlmEPzhM3QFpnmnjZ8LxKZDuuLMdYXovvYQBGR3Zg8eTKioqJQv359XL9+HWlpacjIyMDmzZvh7u6O4cOHY/z48fD09IRarcabb76JsLAwtG/fHgAQERGBoKAgDB48GLNnz0Zubi6mTJmCuLg46Rfe0aNH45NPPsHEiRMxbNgwbNu2DatWrcKGDaZruInI9rC+EJFcbKCIyG5cunQJQ4YMwcWLF+Hu7o4WLVpg8+bN6N69OwBg3rx5cHBwQL9+/aDVahEZGYklS5ZIz3d0dMT69esxZswYhIWFwc3NDbGxsUhKSpLGBAQEYMOGDRg3bhwWLFiAevXq4bPPPuMlhm2QKfcin5oRYbJlkX1ifSGD5gmbMbud6fbecc9d5cMGiojsxueff17mfGdnZyxevBiLFy8udYy/v3+xQ2ge1qVLFxw+fLhCMRKRfWJ9ISK5HKwdABERERERkb3gHiiyG6Y4XEflKKTd8oBpTqolIiIioqqDe6CIiIiIiIhkYgNFREREREQkExsoIiIiIiIimdhAERERERERycQGioiIiIiISCY2UERERERERDKxgSIiIiIiIpKJDRQREREREZFMbKCIiIiIiIhkqmbtAIgqgwbvbDDp8s7NjDbp8oiIiIjINLgHioiIiIiISCY2UERERERERDLxED4yK1Mf2kZEREREZE3cA0VERERERCQTGygiIiIiIiKZeAgfERFZBA/pJSJzMWV9UTmabFFUSXEPFBERERERkUxsoIiIiIiIiGRiA0VERERERCQTGygiIiIiIiKZ2EARERERERHJxAaKiOxGcnIy2rZtixo1asDLywt9+vTByZMnjcZ06dIFCoXC6N/o0aONxly4cAHR0dFwdXWFl5cXJkyYgHv37hmNycjIwNNPPw2VSoVGjRohJSXF3OkRkRWxvhCRXGygiMhu7NixA3Fxcdi3bx80Gg10Oh0iIiJw8+ZNo3EjR47ExYsXpX+zZ8+W5hUVFSE6Ohp3797F3r178eWXXyIlJQXTpk2Txpw9exbR0dF47rnnkJ2djbFjx2LEiBHYvHmzxXIlIstifSEiuXgfKCKyG5s2bTJ6nJKSAi8vL2RlZaFz587SdFdXV/j4+JS4jPT0dBw/fhxbtmyBt7c3WrVqhRkzZmDSpElISEiAUqnEsmXLEBAQgDlz5gAAmjZtit27d2PevHmIjIw0X4JEZDWsL0Qkl8n3QO3cuRO9evWCr68vFAoF1q5dazR/6NChxXZ/9+jRw2jM1atXMWjQIKjVanh4eGD48OG4ceOG0ZgjR46gU6dOcHZ2hp+fn9EvQERUNRQUFAAAPD09jaanpqaidu3aaN68OSZPnoxbt25J8zIzMxEcHAxvb29pWmRkJAoLC5GTkyONCQ8PN1pmZGQkMjMzzZUKEdkY1hciKo3J90DdvHkTLVu2xLBhw9C3b98Sx/To0QPLly+XHqtUKqP5gwYNwsWLF6Vd6K+99hpGjRqFtLQ0AEBhYSEiIiIQHh6OZcuW4ejRoxg2bBg8PDwwatQoU6dUpZT3Tt4qR4HZ7YDmCZuhLVKYKSqi4vR6PcaOHYsOHTqgefPm0vSBAwfC398fvr6+OHLkCCZNmoSTJ09izZo1AIDc3FyjLzcApMe5ublljiksLMTt27fh4uJiNE+r1UKr1UqPCwsLAQA6nQ46na7UHAzzVA6iXLmXpaz1mYNhfXLWq3I0XZ6mVp48bFVVycES+bG+lL1MW2TK+mLYZqbadra83czBnmuR3JhN3kBFRUUhKiqqzDEqlarU3d8nTpzApk2bcPDgQbRp0wYAsGjRIvTs2RMff/wxfH19kZqairt37+KLL76AUqlEs2bNkJ2djblz57KBIqoi4uLicOzYMezevdto+oM1IDg4GHXr1kW3bt1w5swZBAYGmiWW5ORkJCYmFpuenp4OV1fXRz5/Rhu9yWLZuHGjyZZVHhqN5pFjZrezQCAVZIhfTh62rrLn8OAeH3NhfSmZteqLHOaoL6badra83czJHmuR3PpilXOgMjIy4OXlhZo1a6Jr1654//33UatWLQD3d217eHhIzRMAhIeHw8HBAfv378eLL76IzMxMdO7cGUqlUhoTGRmJWbNm4dq1a6hZs6bFcyIiy4mPj8f69euxc+dO1KtXr8yxoaGhAIDTp08jMDAQPj4+OHDggNGYvLw8AJB+2PHx8ZGmPThGrVYX+3UYACZPnozx48dLjwsLC+Hn54eIiAio1epSY9PpdNBoNJh6yAFavWn24B5LsOw5FIYcunfvDicnpzLHNk+w3ZPkD7/XVXYetqo8r4WtkpODYQ+MubC+lM7S9aU8TFlfVA4CM9roTbbtbHm7mYM91yK59cXiDVSPHj3Qt29fBAQE4MyZM3j33XcRFRWFzMxMODo6Ijc3F15eXsZBVqsGT09Po93fAQEBRmMe3EVeWgNV0d3glmILuzzLuwvc1Lu5zc1e4n3wPWAL74vyMGecQgi8+eab+OGHH5CRkVGsDpQkOzsbAFC3bl0AQFhYGD744ANcunRJqjUajQZqtRpBQUHSmId/MdRoNAgLCytxHSqVqtihyADg5OQk64+HVq8w2SGw1vpjJSdXWz7M1xC73NfMllX2HMyVG+vLo9ny+8oc9cVU286Wt5s52WMtkhuvxRuomJgY6f+Dg4PRokULBAYGIiMjA926dTPruh93N7ilWHOXZ0V3gZvyEAFLsPV4S9rdb4+7wk0tLi4OaWlp+PHHH1GjRg3pRxV3d3e4uLjgzJkzSEtLQ8+ePVGrVi0cOXIE48aNQ+fOndGiRQsAQEREBIKCgjB48GDMnj0bubm5mDJlCuLi4qQvKaNHj8Ynn3yCiRMnYtiwYdi2bRtWrVqFDRvKd44gEdkP1hciksvqlzFv2LAhateujdOnT6Nbt27w8fHBpUuXjMbcu3cPV69efeTub8O80lR0N7il2MIuz/LuAjf1bm5zs5d4H9zdbwvvi/LQ6XT48ccfzbLspUuXArh/M8sHLV++HEOHDoVSqcSWLVswf/583Lx5E35+fujXrx+mTJkijXV0dMT69esxZswYhIWFwc3NDbGxsUhKSpLGBAQEYMOGDRg3bhwWLFiAevXq4bPPPuMlhokqMdYXIpLL6g3Un3/+iStXrhjt/s7Pz0dWVhZCQkIAANu2bYNer5eONQ4LC8N7770HnU4nfaHUaDRo3Lhxmec/Pe5ucEuxZjwV3VVtykMELMHW4y3p9be196k1CFH2oZd+fn7YsWPHI5fj7+//yJN6u3TpgsOHD5crPiKyX6wvRCSXye8DdePGDWRnZ0vHBZ89exbZ2dm4cOECbty4gQkTJmDfvn04d+4ctm7dit69e6NRo0bSLy9NmzZFjx49MHLkSBw4cAB79uxBfHw8YmJi4OvrC+D+ZUSVSiWGDx+OnJwcrFy5EgsWLDDau0RERERERGRqJm+gDh06hNatW6N169YAgPHjx6N169aYNm0aHB0dceTIEbzwwgt46qmnMHz4cISEhGDXrl1Ge4ZSU1PRpEkTdOvWDT179kTHjh3x6aefSvPd3d2Rnp6Os2fPIiQkBP/+978xbdo0XsKciIiIiIjMyuSH8HXp0qXM3eCbNz/6HBtPT0/pprmladGiBXbt2lXu+IiIiIiIiCrK5HugiIiIiIiIKis2UERERERERDJZ/Sp89PgavMN7RxARERERWQL3QBEREREREcnEBoqIiIiIiEgmNlBEREREREQysYEiIiIiIiKSiQ0UERERERGRTGygiIiIiIiIZGIDRUREREREJBMbKCIiIiIiIpnYQBEREREREcnEBoqIiIiIiEgmNlBEREREREQysYEiIiIiIiKSiQ0UERERERGRTGygiIiIiIiIZGIDRUREREREJBMbKCIiIiIiIpnYQBEREREREcnEBoqIiIiIiEgmNlBEZDeSk5PRtm1b1KhRA15eXujTpw9OnjxpNObOnTuIi4tDrVq1UL16dfTr1w95eXlGYy5cuIDo6Gi4urrCy8sLEyZMwL1794zGZGRk4Omnn4ZKpUKjRo2QkpJi7vSIyIpYX4hIrmrWDqAqavDOhhKnqxwFZrcDmidshrZIYeGoiGzfjh07EBcXh7Zt2+LevXt49913ERERgePHj8PNzQ0AMG7cOGzYsAGrV6+Gu7s74uPj0bdvX+zZswcAUFRUhOjoaPj4+GDv3r24ePEihgwZAicnJ3z44YcAgLNnzyI6OhqjR49Gamoqtm7dihEjRqBu3bqIjIy0Wv5EZD6sL0QkFxsoIrIbmzZtMnqckpICLy8vZGVloXPnzigoKMDnn3+OtLQ0dO3aFQCwfPlyNG3aFPv27UP79u2Rnp6O48ePY8uWLfD29karVq0wY8YMTJo0CQkJCVAqlVi2bBkCAgIwZ84cAEDTpk2xe/duzJs3j19wiCop1hcikosNFBHZrYKCAgCAp6cnACArKws6nQ7h4eHSmCZNmqB+/frIzMxE+/btkZmZieDgYHh7e0tjIiMjMWbMGOTk5KB169bIzMw0WoZhzNixY0uMQ6vVQqvVSo8LCwsBADqdDjqdrtT4DfNUDqIcWZetrPWZg2F9ctarcjRdnqZWnjxsVVXJwVL5sb6UvkxbZMr6Ythmptp2trzdzMGea5HcmNlAEZFd0uv1GDt2LDp06IDmzZsDAHJzc6FUKuHh4WE01tvbG7m5udKYB7/cGOYb5pU1prCwELdv34aLi4vRvOTkZCQmJhaLMT09Ha6uro/MZUYb/SPHyLVx40aTLas8NBrNI8fMbmeBQCrIEL+cPGxdZc/h1q1bZl8/60vJrFVf5DBHfTHVtrPl7WZO9liL5NYXNlBEZJfi4uJw7Ngx7N6929qhYPLkyRg/frz0uLCwEH5+foiIiIBarS71eTqdDhqNBlMPOUCrN815j8cSLHsIkCGH7t27w8nJqcyxzRM2Wyiq8jv8XlfZediq8rwWtkpODoY9MObE+lIyS9eX8jBlfVE5CMxoozfZtrPl7WYO9lyL5NYXNlBEZHfi4+Oxfv167Ny5E/Xq1ZOm+/j44O7du8jPzzf6lTgvLw8+Pj7SmAMHDhgtz3AVrQfHPHxlrby8PKjV6mK/DgOASqWCSqUqNt3JyUnWHw+tXmGyC8dY64+VnFxt+eI4htjlvma2rLLnYO7cWF9KZ8vvK3PUF1NtO1vebuZkj7VIbry8jDkR2Q0hBOLj4/HDDz9g27ZtCAgIMJofEhICJycnbN26VZp28uRJXLhwAWFhYQCAsLAwHD16FJcuXZLGaDQaqNVqBAUFSWMeXIZhjGEZRFT5sL4QkVzcA0VEdiMuLg5paWn48ccfUaNGDemcAnd3d7i4uMDd3R3Dhw/H+PHj4enpCbVajTfffBNhYWFo3749ACAiIgJBQUEYPHgwZs+ejdzcXEyZMgVxcXHSr7yjR4/GJ598gokTJ2LYsGHYtm0bVq1ahQ0bSr4FARHZP9YXIpKLe6CIyG4sXboUBQUF6NKlC+rWrSv9W7lypTRm3rx5eP7559GvXz907twZPj4+WLNmjTTf0dER69evh6OjI8LCwvDqq69iyJAhSEpKksYEBARgw4YN0Gg0aNmyJebMmYPPPvuMlxgmqsRYX4hILu6BIiK7IcSjLynr7OyMxYsXY/HixaWO8ff3f+RVkbp06YLDhw+XO0Yisk+sL0QkF/dAERERERERycQGioiIiIiISCY2UERERERERDKxgSIiIiIiIpKJDRQREREREZFMbKCIiIiIiIhkYgNFREREREQkExsoIiIiIiIimdhAERERERERycQGioiIiIiISCY2UERERERERDKxgSIiIiIiIpKJDRQREREREZFMbKCIiIiIiIhkMnkDtXPnTvTq1Qu+vr5QKBRYu3at0XwhBKZNm4a6devCxcUF4eHhOHXqlNGYq1evYtCgQVCr1fDw8MDw4cNx48YNozFHjhxBp06d4OzsDD8/P8yePdvUqRARERERERkxeQN18+ZNtGzZEosXLy5x/uzZs7Fw4UIsW7YM+/fvh5ubGyIjI3Hnzh1pzKBBg5CTkwONRoP169dj586dGDVqlDS/sLAQERER8Pf3R1ZWFj766CMkJCTg008/NXU6REREREREkmqmXmBUVBSioqJKnCeEwPz58zFlyhT07t0bAPDVV1/B29sba9euRUxMDE6cOIFNmzbh4MGDaNOmDQBg0aJF6NmzJz7++GP4+voiNTUVd+/exRdffAGlUolmzZohOzsbc+fONWq0iIiIiIiITMnkDVRZzp49i9zcXISHh0vT3N3dERoaiszMTMTExCAzMxMeHh5S8wQA4eHhcHBwwP79+/Hiiy8iMzMTnTt3hlKplMZERkZi1qxZuHbtGmrWrFni+rVaLbRarfS4sLAQAKDT6aDT6UydbqlUjqLk6Q7C6L/2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xAkxffr0cl12t6w8rl+/Lt5++22RmZkpzp49K7Zs2SKefvpp8eSTT4o7d+7YRB6P+hsnhOXeP7b0mbI2bgv7rGvWUlnqqSWxgTIzACX+W758uRBCiAsXLojOnTsLT09PoVKpRKNGjcSECROM7lMkhBDnzp0TUVFRwsXFRdSuXVv8+9//Fjqdziwxv/LKK6Ju3bpCqVSKJ554Qrzyyivi9OnT0vzbt2+LN954Q9SsWVO4urqKF198UVy8eNFq8QohxObNmwUAcfLkSaPptrJ9t2/fXuL7IDY2Vghx/zKhU6dOFd7e3kKlUolu3boVy+XKlStiwIABonr16kKtVovXXntNXL9+3WjMr7/+Kjp27ChUKpV44oknxMyZM00e79mzZ0t9XxvuvZWVlSVCQ0OFu7u7cHZ2Fk2bNhUffvih0Zc+U8ZrrxYtWiTq168vlEqlaNeundi3b59V4rDUZ3779u2iVatWQqlUioYNG0p1sCJs6TO1atUq8dRTTwmlUimaNWsmNmzYYJI8bt26JSIiIkSdOnWEk5OT8Pf3FyNHjiz2JdiaeTzqb5wQln3/2MpnyhZU9W1hj3XNWipLPbUkhRBCmHy3FhERERERUSXEc6CIiIiIiIhkYgNFREREREQkExsoIiIiIiIimdhAERERERERycQGioiIiIiISCY2UERERERERDKxgSIiIiIiIpKJDRQREREREZFMbKCIiIiIiIhkYgNFREREREQkExsoIiIiIiIimdhAERERERERycQGioiIiIiISCY2UERERERERDKxgSIiIiIiIpKJDRQREREREZFMbKCIiIiIiIhkYgNFREREREQkExsoIiIiIiIimdhAERERERERycQGqpJr0KABhg4dKj3OyMiAQqFARkZGuZdleO53331nugBNTKFQICEhwdphlMiWYyMqD3utKykpKVAoFDh37pzZ10VEpsOaY1kPb28qjg2UHTN8MEv6984771g1trS0NMyfP7/Y9HPnzhnF6eTkhNq1a+OZZ57Bu+++iwsXLlg+2HJ4cJvv3r272HwhBPz8/KBQKPD8889bIUKix2NvdaVLly6lxvvgP2v/ePGoL21Dhw5F9erVLRwVkfWx5piHoeYoFAp88803JY7p0KEDFAoFmjdvbuHo7F81awdAjy8pKQkBAQFG00r7MHTu3Bm3b9+GUqk0a0xpaWk4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VVZWav369erQoYP+8pe/qEePHurUqZP+8pe/6C9/+Yt69uypgQMHKigoSNu2bTOfu337drVs2VIDBgxQYmKiS4Cq+XdNgDpw4IAGDhyoTz/9VI888ojmz5+vli1basyYMS774Ny5c/rxj3+sv/71r5o4caIWLVqkwYMHa8aMGcrIyKi3j6qqKt1999164403tHLlSt122231jgUAAIAPMdAsjRkzxggNDTX+7//+z1z2ySefGIGBgcb3fyzOnTtX67mpqalG165dzcdVVVVGp06djDvuuMNl3IIFCwybzWZ8/vnnhmEYxvTp0w1Jxp49e+qt6+OPPzYkGRkZGeayH//4x8Y111xTa+yAAQOMK6+80nz8P//zP8YNN9xgGIZhPPzww8aAAQPMdT/72c+MsLAww+l0GoZhGCNGjDB69+5tnD9/3hxTXV1tDBo0yLjqqqvMZXPnzjVatmxp/Pvf/3Z57UceecQIDAw0CgsLDcMwjCNHjhiSjKeeespwOp3GHXfcYbRo0cLYsGFDvb0CAADA93AEqhmqqqrShg0bNGbMGHXu3Nlc3rNnT6WmprqMbdGihfnvkpISnThxQj/+8Y/1+eefq6SkRJIUEBCg8ePHa/Xq1Tpz5ow5/s0339SgQYMUHx8vSea61q1b11tbzbrS0tIL9jFkyBCXc522b9+uQYMGSZIGDx6sPXv26Ny5c+a6pKQkBQUF6dSpU9q4caNuv/12nTlzRidOnNCJEyd08uRJpaam6tChQ/rPf/4jSXr77bc1dOhQtWnTxhx34sQJJScnq6qqSlu2bHGpqaKiQj//+c+1Zs0arVu3TikpKRfsAwAAAL6DANUMff311/r222911VVX1VpXc75Sje3btys5OVktW7ZUZGSkOnTooN///veSZAYo6buP3n377bfmx98OHjyo/Px8TZgwwRxTE46+H7J+yErIqvH986BOnz6tAwcOmBeJGDRokCorK7Vr1y4dOXJEx44dM8cfPnxYhmHoD3/4gzp06ODyNWvWLEnfXbhCkg4dOmR+nPD7X8nJyS7jamRmZmrVqlX6+9//ruHDh1+wBwAAAPgWLmOOen322WcaMWKEevTooQULFiguLk4hISFat26dFi5c6HIRhV69eikhIcE8V+ivf/2rQkJCdPvtt5tjevbsKUnau3ev+vXrV+dr7t2719zehdQEom3b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rMHX6dOnj7Zu3XrJdQIAAADAxfLoOVAAAAAA4MsIUAAAAABgEQEKAAAAACwiQAEAAACARQQoAAAAALCIAAUAAAAAFhGgAAAAAMAiAhQAAAAAWESAAgAAAACLCFAAAAAAYBEBCgAAAAAsIkABAAAAgEUEKAAAAACwiAAFAAAAABYRoAAAAADAIgIUAAAAAFhEgAIAAAAAiwhQAAAAAGARAQoAAAAALCJAAQAAAIBFBCgAAAAAsIgABQAAAAAWEaAAAAAAwCICFAAAAABYRIACAAAAAIsIUAAAAABgEQEKAAAAACwiQAEAAACARQQoAAAAALCIAAUAAAAAFhGgAAAAAMAiAhQAAAAAWESAAgAAAACLCFAAAAAAYBEBCgAAAAAsIkABAAAAgEUEKAAAAACwiAAFAAAAABYRoAAAAADAIq8EqNmzZ8tms7l89ejRw1x//vx5paenq127dmrVqpXGjh2r4uJil20UFhYqLS1NYWFhioqK0kMPPaTKykpPtwIAAACgGQny1gtfc801ev/99/9bSNB/S3nggQe0du1avf3224qIiNC0adN02223afv27ZKkqqoqpaWlKSYmRh9++KGOHTumiRMnKjg4WH/605883gsAAACA5sFrASooKEgxMTG1lpeUlOjVV1/VsmXLdOONN0qSlixZop49e2rHjh0aOHCgsrOz9cknn+j9999XdHS0+vXrp7lz5+p3v/udZs+erZCQEE+3AwAAAKAZ8FqAOnTokGJjYxUaGiqHw6HMzEx17txZ+fn5cjqdSk5ONsf26NFDnTt3Vl5engYOHKi8vDz17t1b0dHR5pjU1FRNnTpVBw4cUP/+/et8zfLycpWXl5uPS0tLJUlOp1NOp7PO59QstwcYl91zY6mv9kthD6y7z5r+L3Y/eKI2T2loH7izT8n7vdanpvcL9evu/QEAANBUeCVAJSUlaenSperevbuOHTumOXPmaOjQodq/f7+KiooUEhKiyMhIl+dER0erqKhIklRUVOQSnmrW16yrT2ZmpubMmVNreXZ2tsLCwhqseW5itZXWvGLdunVu29a86xtef7H7wZO1eUpd+8CdfUpNp9f65OTkNLj+3LlzHqoEAADAs7wSoEaPHm3+u0+fPkpKSlKXLl301ltvqUWLFo32ujNmzFBGRob5uLS0VHFxcUpJSVF4eHidz3E6ncrJydEf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",
|
||
"text/plain": [
|
||
"<Figure size 1000x1000 with 9 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"ed_flights.select_dtypes(include=np.number).hist(figsize=[10,10])\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Elasticsearch utilities"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 57,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"ed_flights2 = ed_flights[(ed_flights.OriginAirportID == 'AMS') & (ed_flights.FlightDelayMin > 60)]\n",
|
||
"ed_flights2 = ed_flights2[['timestamp', 'OriginAirportID', 'DestAirportID', 'FlightDelayMin']]\n",
|
||
"ed_flights2 = ed_flights2.tail()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 58,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"es_index_pattern: flights\n",
|
||
"Index:\n",
|
||
" es_index_field: _id\n",
|
||
" is_source_field: False\n",
|
||
"Mappings:\n",
|
||
" capabilities:\n",
|
||
" es_field_name is_source es_dtype es_date_format pd_dtype is_searchable is_aggregatable is_scripted aggregatable_es_field_name\n",
|
||
"timestamp timestamp True date strict_date_hour_minute_second datetime64[ns] True True False timestamp\n",
|
||
"OriginAirportID OriginAirportID True keyword None object True True False OriginAirportID\n",
|
||
"DestAirportID DestAirportID True keyword None object True True False DestAirportID\n",
|
||
"FlightDelayMin FlightDelayMin True integer None int64 True True False FlightDelayMin\n",
|
||
"Operations:\n",
|
||
" tasks: [('boolean_filter': ('boolean_filter': {'bool': {'must': [{'term': {'OriginAirportID': 'AMS'}}, {'range': {'FlightDelayMin': {'gt': 60}}}]}})), ('tail': ('sort_field': '_doc', 'count': 5))]\n",
|
||
" size: 5\n",
|
||
" sort_params: {'_doc': 'desc'}\n",
|
||
" _source: ['timestamp', 'OriginAirportID', 'DestAirportID', 'FlightDelayMin']\n",
|
||
" body: {'query': {'bool': {'must': [{'term': {'OriginAirportID': 'AMS'}}, {'range': {'FlightDelayMin': {'gt': 60}}}]}}}\n",
|
||
" post_processing: [('sort_index')]\n",
|
||
"\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"print(ed_flights2.es_info())"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "Python 3 (ipykernel)",
|
||
"language": "python",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.10.13"
|
||
},
|
||
"vscode": {
|
||
"interpreter": {
|
||
"hash": "8d80939be9cc7b6e652d5cdc2d3a4605b7dd564f2bebaa359e7fd4a3d9f61dba"
|
||
}
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 4
|
||
}
|