From 86686ebb18397fd38f2ec03cf865085b6d5d7b8d Mon Sep 17 00:00:00 2001 From: Stephen Dodson Date: Tue, 26 Nov 2019 11:02:46 +0000 Subject: [PATCH 1/2] Reformat and cleanup based on PyCharm --- .gitignore | 1 - docs/source/conf.py | 10 +- .../reference/api/eland-DataFrame-hist-1.png | Bin 0 -> 36478 bytes .../reference/api/eland.DataFrame.hist.rst | 2 + eland/common.py | 2 + eland/conftest.py | 6 +- eland/dataframe.py | 150 +- eland/index.py | 2 +- eland/mappings.py | 15 +- eland/ndframe.py | 14 +- eland/operations.py | 50 +- eland/plotting.py | 7 +- eland/query.py | 1 - eland/query_compiler.py | 16 +- eland/series.py | 19 +- eland/tests/DEMO.md | 23 - eland/tests/client/test_eq_pytest.py | 2 - eland/tests/dataframe/test_count_pytest.py | 1 - eland/tests/dataframe/test_describe_pytest.py | 4 +- eland/tests/dataframe/test_dtypes_pytest.py | 5 +- eland/tests/dataframe/test_init_pytest.py | 5 +- eland/tests/dataframe/test_keys_pytest.py | 4 +- eland/tests/dataframe/test_metrics_pytest.py | 13 +- eland/tests/dataframe/test_nunique_pytest.py | 7 +- eland/tests/dataframe/test_query_pytest.py | 7 +- eland/tests/dataframe/test_repr_pytest.py | 42 +- eland/tests/dataframe/test_to_csv_pytest.py | 13 +- eland/tests/demo_day_20190815.ipynb | 7152 ----------------- .../mappings/test_aggregatables_pytest.py | 88 +- .../test_numeric_source_fields_pytest.py | 11 +- .../tests/operators/test_operators_pytest.py | 2 +- .../plotting/test_dataframe_hist_pytest.py | 7 +- .../query_compiler/test_rename_pytest.py | 17 +- eland/tests/series/test_arithmetics_pytest.py | 3 +- eland/tests/series/test_info_es_pytest.py | 5 - eland/tests/series/test_metrics_pytest.py | 4 - eland/tests/series/test_name_pytest.py | 3 - eland/tests/series/test_rename_pytest.py | 3 - eland/tests/series/test_repr_pytest.py | 3 +- .../tests/series/test_value_counts_pytest.py | 6 +- eland/utils.py | 4 +- example/load_data.py | 10 +- 42 files changed, 276 insertions(+), 7463 deletions(-) create mode 100644 docs/source/reference/api/eland-DataFrame-hist-1.png delete mode 100644 eland/tests/DEMO.md delete mode 100644 eland/tests/demo_day_20190815.ipynb diff --git a/.gitignore b/.gitignore index 1e640ca..0eb12e5 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,6 @@ docs/build/ # pytest results eland/tests/dataframe/results/ -eland/tests/dataframe/results/ result_images/ diff --git a/docs/source/conf.py b/docs/source/conf.py index 400504b..b65e7ed 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -12,6 +12,7 @@ # import os import sys + sys.path.insert(0, os.path.abspath("../sphinxext")) sys.path.extend( [ @@ -20,8 +21,6 @@ sys.path.extend( ] ) - - # -- Project information ----------------------------------------------------- project = 'eland' @@ -30,7 +29,6 @@ copyright = '2019, Elasticsearch B.V.' # The full version, including alpha/beta/rc tags release = '0.1' - # -- General configuration --------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be @@ -73,7 +71,6 @@ plot_html_show_source_link = False plot_pre_code = """import numpy as np import eland as ed""" - # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -82,16 +79,15 @@ templates_path = ['_templates'] # This pattern also affects html_static_path and html_extra_path. exclude_patterns = [] - # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -#html_theme = 'sphinx_rtd_theme' +# html_theme = 'sphinx_rtd_theme' html_theme = "pandas_sphinx_theme" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -#html_static_path = ['_static'] +# html_static_path = ['_static'] diff --git a/docs/source/reference/api/eland-DataFrame-hist-1.png b/docs/source/reference/api/eland-DataFrame-hist-1.png new file mode 100644 index 0000000000000000000000000000000000000000..a9eb2f5070175e642afe961f5c5d090ffad6a0fa GIT binary patch literal 36478 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 literal 0 HcmV?d00001 diff --git a/docs/source/reference/api/eland.DataFrame.hist.rst b/docs/source/reference/api/eland.DataFrame.hist.rst index 73c478c..035d0bb 100644 --- a/docs/source/reference/api/eland.DataFrame.hist.rst +++ b/docs/source/reference/api/eland.DataFrame.hist.rst @@ -4,3 +4,5 @@ eland.DataFrame.hist .. currentmodule:: eland .. automethod:: DataFrame.hist +.. image:: eland-DataFrame-hist-1.png + diff --git a/eland/common.py b/eland/common.py index ff36d08..45f3f17 100644 --- a/eland/common.py +++ b/eland/common.py @@ -1,8 +1,10 @@ # Default number of rows displayed (different to pandas where ALL could be displayed) DEFAULT_NUM_ROWS_DISPLAYED = 60 + def docstring_parameter(*sub): def dec(obj): obj.__doc__ = obj.__doc__.format(*sub) return obj + return dec diff --git a/eland/conftest.py b/eland/conftest.py index 98cebe5..7393c73 100644 --- a/eland/conftest.py +++ b/eland/conftest.py @@ -1,7 +1,7 @@ -import pytest - import numpy as np import pandas as pd +import pytest + import eland as ed # Fix console size for consistent test results @@ -9,9 +9,9 @@ pd.set_option('display.max_rows', 10) pd.set_option('display.max_columns', 5) pd.set_option('display.width', 100) + @pytest.fixture(autouse=True) def add_imports(doctest_namespace): doctest_namespace["np"] = np doctest_namespace["pd"] = pd doctest_namespace["ed"] = ed - diff --git a/eland/dataframe.py b/eland/dataframe.py index b75fc1d..ad6290f 100644 --- a/eland/dataframe.py +++ b/eland/dataframe.py @@ -5,8 +5,8 @@ from io import StringIO import numpy as np import pandas as pd import six -from pandas.core.computation.eval import eval from pandas.core.common import apply_if_callable, is_bool_indexer +from pandas.core.computation.eval import eval from pandas.core.dtypes.common import is_list_like from pandas.core.indexing import check_bool_indexer from pandas.io.common import _expand_user, _stringify_path @@ -17,8 +17,8 @@ from pandas.io.formats.printing import pprint_thing import eland.plotting as gfx from eland import NDFrame from eland import Series -from eland.filter import BooleanFilter, ScriptFilter from eland.common import DEFAULT_NUM_ROWS_DISPLAYED, docstring_parameter +from eland.filter import BooleanFilter class DataFrame(NDFrame): @@ -35,7 +35,7 @@ class DataFrame(NDFrame): - elasticsearch-py instance or - eland.Client instance index_pattern: str - Elasticsearch index pattern (e.g. 'flights' or 'filebeat-\*') + Elasticsearch index pattern. This can contain wildcards. (e.g. 'flights') columns: list of str, optional List of DataFrame columns. A subset of the Elasticsearch index's fields. index_field: str, optional @@ -76,10 +76,12 @@ class DataFrame(NDFrame): [5 rows x 2 columns] - Constructing DataFrame from an Elasticsearch client and an Elasticsearch index, with 'timestamp' as the DataFrame index field + Constructing DataFrame from an Elasticsearch client and an Elasticsearch index, with 'timestamp' as the DataFrame + index field (TODO - currently index_field must also be a field if not _id) - >>> df = ed.DataFrame(client='localhost', index_pattern='flights', columns=['AvgTicketPrice', 'timestamp'], index_field='timestamp') + >>> df = ed.DataFrame(client='localhost', index_pattern='flights', columns=['AvgTicketPrice', 'timestamp'], + ... index_field='timestamp') >>> df.head() AvgTicketPrice timestamp 2018-01-01T00:00:00 841.265642 2018-01-01 00:00:00 @@ -296,7 +298,7 @@ class DataFrame(NDFrame): return self.to_html(max_rows=max_rows, max_cols=max_cols, show_dimensions=show_dimensions, notebook=True, - bold_rows=False) # set for consistency with pandas output + bold_rows=False) # set for consistency with pandas output else: return None @@ -310,7 +312,8 @@ class DataFrame(NDFrame): An alternative approach is to use value_count aggregations. However, they have issues in that: - They can only be used with aggregatable fields (e.g. keyword not text) - - For list fields they return multiple counts. E.g. tags=['elastic', 'ml'] returns value_count=2 for a single document. + - For list fields they return multiple counts. E.g. tags=['elastic', 'ml'] returns value_count=2 for a + single document. TODO - add additional pandas.DataFrame.count features @@ -334,60 +337,61 @@ class DataFrame(NDFrame): return self._query_compiler.count() def info_es(self): + # noinspection PyPep8 """ - A debug summary of an eland DataFrame internals. + A debug summary of an eland DataFrame internals. - This includes the Elasticsearch search queries and query compiler task list. + This includes the Elasticsearch search queries and query compiler task list. - Returns - ------- - str - A debug summary of an eland DataFrame internals. + Returns + ------- + str + A debug summary of an eland DataFrame internals. - Examples - -------- - >>> df = ed.DataFrame('localhost', 'flights') - >>> df = df[(df.OriginAirportID == 'AMS') & (df.FlightDelayMin > 60)] - >>> df = df[['timestamp', 'OriginAirportID', 'DestAirportID', 'FlightDelayMin']] - >>> df = df.tail() - >>> df - timestamp OriginAirportID DestAirportID FlightDelayMin - 12608 2018-02-10 01:20:52 AMS CYEG 120 - 12720 2018-02-10 14:09:40 AMS BHM 255 - 12725 2018-02-10 00:53:01 AMS ATL 360 - 12823 2018-02-10 15:41:20 AMS NGO 120 - 12907 2018-02-11 20:08:25 AMS LIM 225 - - [5 rows x 4 columns] - >>> print(df.info_es()) - index_pattern: flights - Index: - index_field: _id - is_source_field: False - Mappings: - capabilities: _source es_dtype pd_dtype searchable aggregatable - AvgTicketPrice True float float64 True True - Cancelled True boolean bool True True - Carrier True keyword object True True - Dest True keyword object True True - DestAirportID True keyword object True True - ... ... ... ... ... ... - OriginLocation True geo_point object True True - OriginRegion True keyword object True True - OriginWeather True keyword object True True - dayOfWeek True integer int64 True True - timestamp True date datetime64[ns] True True - - [27 rows x 5 columns] - Operations: - tasks: [('boolean_filter', {'bool': {'must': [{'term': {'OriginAirportID': 'AMS'}}, {'range': {'FlightDelayMin': {'gt': 60}}}]}}), ('field_names', ['timestamp', 'OriginAirportID', 'DestAirportID', 'FlightDelayMin']), ('tail', ('_doc', 5))] - size: 5 - sort_params: _doc:desc - _source: ['timestamp', 'OriginAirportID', 'DestAirportID', 'FlightDelayMin'] - body: {'query': {'bool': {'must': [{'term': {'OriginAirportID': 'AMS'}}, {'range': {'FlightDelayMin': {'gt': 60}}}]}}, 'aggs': {}} - post_processing: ['sort_index'] - - """ + Examples + -------- + >>> df = ed.DataFrame('localhost', 'flights') + >>> df = df[(df.OriginAirportID == 'AMS') & (df.FlightDelayMin > 60)] + >>> df = df[['timestamp', 'OriginAirportID', 'DestAirportID', 'FlightDelayMin']] + >>> df = df.tail() + >>> df + timestamp OriginAirportID DestAirportID FlightDelayMin + 12608 2018-02-10 01:20:52 AMS CYEG 120 + 12720 2018-02-10 14:09:40 AMS BHM 255 + 12725 2018-02-10 00:53:01 AMS ATL 360 + 12823 2018-02-10 15:41:20 AMS NGO 120 + 12907 2018-02-11 20:08:25 AMS LIM 225 + + [5 rows x 4 columns] + >>> print(df.info_es()) + index_pattern: flights + Index: + index_field: _id + is_source_field: False + Mappings: + capabilities: _source es_dtype pd_dtype searchable aggregatable + AvgTicketPrice True float float64 True True + Cancelled True boolean bool True True + Carrier True keyword object True True + Dest True keyword object True True + DestAirportID True keyword object True True + ... ... ... ... ... ... + OriginLocation True geo_point object True True + OriginRegion True keyword object True True + OriginWeather True keyword object True True + dayOfWeek True integer int64 True True + timestamp True date datetime64[ns] True True + + [27 rows x 5 columns] + Operations: + tasks: [('boolean_filter', {'bool': {'must': [{'term': {'OriginAirportID': 'AMS'}}, {'range': {'FlightDelayMin': {'gt': 60}}}]}}), ('field_names', ['timestamp', 'OriginAirportID', 'DestAirportID', 'FlightDelayMin']), ('tail', ('_doc', 5))] + size: 5 + sort_params: _doc:desc + _source: ['timestamp', 'OriginAirportID', 'DestAirportID', 'FlightDelayMin'] + body: {'query': {'bool': {'must': [{'term': {'OriginAirportID': 'AMS'}}, {'range': {'FlightDelayMin': {'gt': 60}}}]}}, 'aggs': {}} + post_processing: ['sort_index'] + + """ buf = StringIO() super()._info_es(buf) @@ -437,10 +441,7 @@ class DataFrame(NDFrame): if buf is None: # pragma: no cover buf = sys.stdout - lines = [] - - lines.append(str(type(self))) - lines.append(self._index_summary()) + lines = [str(type(self)), self._index_summary()] if len(self.columns) == 0: lines.append('Empty {name}'.format(name=type(self).__name__)) @@ -562,7 +563,7 @@ class DataFrame(NDFrame): """ # In pandas calling 'to_string' without max_rows set, will dump ALL rows - we avoid this # by limiting rows by default. - num_rows = len(self) # avoid multiple calls + num_rows = len(self) # avoid multiple calls if num_rows <= DEFAULT_NUM_ROWS_DISPLAYED: if max_rows is None: max_rows = num_rows @@ -600,9 +601,9 @@ class DataFrame(NDFrame): # Our fake dataframe has incorrect number of rows (max_rows*2+1) - write out # the correct number of rows if show_dimensions: - # TODO - this results in different output to pandas - # TODO - the 'x' character is different and this gets added after the - _buf.write("\n

{nrows} rows × {ncols} columns

" + # TODO - this results in different output to pandas + # TODO - the 'x' character is different and this gets added after the + _buf.write("\n

{nrows} rows × {ncols} columns

" .format(nrows=len(self.index), ncols=len(self.columns))) if buf is None: @@ -627,7 +628,7 @@ class DataFrame(NDFrame): """ # In pandas calling 'to_string' without max_rows set, will dump ALL rows - we avoid this # by limiting rows by default. - num_rows = len(self) # avoid multiple calls + num_rows = len(self) # avoid multiple calls if num_rows <= DEFAULT_NUM_ROWS_DISPLAYED: if max_rows is None: max_rows = num_rows @@ -635,9 +636,9 @@ class DataFrame(NDFrame): max_rows = min(num_rows, max_rows) elif max_rows is None: warnings.warn("DataFrame.to_string called without max_rows set " - "- this will return entire index results. " - "Setting max_rows={default}" - " overwrite if different behaviour is required." + "- this will return entire index results. " + "Setting max_rows={default}" + " overwrite if different behaviour is required." .format(default=DEFAULT_NUM_ROWS_DISPLAYED), UserWarning) max_rows = DEFAULT_NUM_ROWS_DISPLAYED @@ -697,7 +698,6 @@ class DataFrame(NDFrame): return self[key] raise e - def _getitem(self, key): """Get the column specified by key for this DataFrame. @@ -780,7 +780,8 @@ class DataFrame(NDFrame): else: self._query_compiler = new_query_compiler - def _reduce_dimension(self, query_compiler): + @staticmethod + def _reduce_dimension(query_compiler): return Series(query_compiler=query_compiler) def to_csv(self, path_or_buf=None, sep=",", na_rep='', float_format=None, @@ -961,7 +962,8 @@ class DataFrame(NDFrame): raise NotImplementedError("Aggregating via index not currently implemented - needs index transform") # currently we only support a subset of functions that aggregate columns. - # ['count', 'mad', 'max', 'mean', 'median', 'min', 'mode', 'quantile', 'rank', 'sem', 'skew', 'sum', 'std', 'var', 'nunique'] + # ['count', 'mad', 'max', 'mean', 'median', 'min', 'mode', 'quantile', + # 'rank', 'sem', 'skew', 'sum', 'std', 'var', 'nunique'] if isinstance(func, str): # wrap in list func = [func] @@ -1031,6 +1033,7 @@ class DataFrame(NDFrame): Parameters ---------- key: object + default: default value if not found Returns ------- @@ -1079,7 +1082,7 @@ class DataFrame(NDFrame): eland_to_pandas to_numpy """ - self.to_numpy() + return self.to_numpy() def to_numpy(self): """ @@ -1123,4 +1126,3 @@ class DataFrame(NDFrame): "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`" ) - diff --git a/eland/index.py b/eland/index.py index 3b5bddc..9775b32 100644 --- a/eland/index.py +++ b/eland/index.py @@ -38,7 +38,7 @@ class Index: @index_field.setter def index_field(self, index_field): - if index_field == None or index_field == Index.ID_INDEX_FIELD: + if index_field is None or index_field == Index.ID_INDEX_FIELD: self._index_field = Index.ID_INDEX_FIELD self._is_source_field = False else: diff --git a/eland/mappings.py b/eland/mappings.py index dabbcef..fe2e03f 100644 --- a/eland/mappings.py +++ b/eland/mappings.py @@ -13,7 +13,7 @@ class Mappings: Attributes ---------- - mappings_capabilities: pandas.DataFrame + _mappings_capabilities: pandas.DataFrame A data frame summarising the capabilities of the index mapping _source - is top level field (i.e. not a multi-field sub-field) @@ -71,7 +71,7 @@ class Mappings: # (this massively improves performance of DataFrame.flatten) self._source_field_pd_dtypes = {} - for field_name in self._mappings_capabilities[self._mappings_capabilities._source == True].index: + for field_name in self._mappings_capabilities[self._mappings_capabilities._source].index: pd_dtype = self._mappings_capabilities.loc[field_name]['pd_dtype'] self._source_field_pd_dtypes[field_name] = pd_dtype @@ -324,8 +324,7 @@ class Mappings: } """ - mappings = {} - mappings['properties'] = {} + mappings = {'properties': {}} for field_name_name, dtype in dataframe.dtypes.iteritems(): if geo_points is not None and field_name_name in geo_points: es_dtype = 'geo_point' @@ -453,13 +452,13 @@ class Mappings: numeric_source_fields: list of str List of source fields where pd_dtype == (int64 or float64 or bool) """ - if include_bool == True: - df = self._mappings_capabilities[(self._mappings_capabilities._source == True) & + if include_bool: + df = self._mappings_capabilities[self._mappings_capabilities._source & ((self._mappings_capabilities.pd_dtype == 'int64') | (self._mappings_capabilities.pd_dtype == 'float64') | (self._mappings_capabilities.pd_dtype == 'bool'))] else: - df = self._mappings_capabilities[(self._mappings_capabilities._source == True) & + df = self._mappings_capabilities[self._mappings_capabilities._source & ((self._mappings_capabilities.pd_dtype == 'int64') | (self._mappings_capabilities.pd_dtype == 'float64'))] # if field_names exists, filter index with field_names @@ -487,7 +486,7 @@ class Mappings: count_source_fields: int Number of source fields in mapping """ - return len(self.source_fields()) + return len(self._source_field_pd_dtypes) def dtypes(self, field_names=None): """ diff --git a/eland/ndframe.py b/eland/ndframe.py index 3abfed6..323ff6c 100644 --- a/eland/ndframe.py +++ b/eland/ndframe.py @@ -31,6 +31,7 @@ from pandas.util._validators import validate_bool_kwarg from eland import ElandQueryCompiler + class NDFrame: def __init__(self, @@ -216,7 +217,7 @@ class NDFrame: [4673 rows x 3 columns] """ - #(derived from modin.base.BasePandasDataset) + # (derived from modin.base.BasePandasDataset) # Level not supported if level is not None: raise NotImplementedError("level not supported {}".format(level)) @@ -314,7 +315,7 @@ class NDFrame: dayOfWeek 2.835975 dtype: float64 """ - if numeric_only == False: + if not numeric_only: raise NotImplementedError("Only mean of numeric fields is implemented") return self._query_compiler.mean() @@ -348,7 +349,7 @@ class NDFrame: dayOfWeek 3.703500e+04 dtype: float64 """ - if numeric_only == False: + if not numeric_only: raise NotImplementedError("Only sum of numeric fields is implemented") return self._query_compiler.sum() @@ -382,7 +383,7 @@ class NDFrame: dayOfWeek 0.000000 dtype: float64 """ - if numeric_only == False: + if not numeric_only: raise NotImplementedError("Only min of numeric fields is implemented") return self._query_compiler.min() @@ -416,7 +417,7 @@ class NDFrame: dayOfWeek 6.000000 dtype: float64 """ - if numeric_only == False: + if not numeric_only: raise NotImplementedError("Only max of numeric fields is implemented") return self._query_compiler.max() @@ -424,7 +425,8 @@ class NDFrame: """ Return cardinality of each field. - **Note we can only do this for aggregatable Elasticsearch fields - (in general) numeric and keyword rather than text fields** + **Note we can only do this for aggregatable Elasticsearch fields - (in general) numeric and keyword + rather than text fields** This method will try and field aggregatable fields if possible if mapping has:: diff --git a/eland/operations.py b/eland/operations.py index de681fa..680de46 100644 --- a/eland/operations.py +++ b/eland/operations.py @@ -39,6 +39,7 @@ class Operations: return "desc" + @staticmethod def from_string(order): if order == "asc": return Operations.SortOrder.ASC @@ -46,7 +47,7 @@ class Operations: return Operations.SortOrder.DESC def __init__(self, tasks=None): - if tasks == None: + if tasks is None: self._tasks = [] else: self._tasks = tasks @@ -105,7 +106,8 @@ class Operations: query_params, post_processing = self._resolve_tasks() # Elasticsearch _count is very efficient and so used to return results here. This means that - # data frames that have restricted size or sort params will not return valid results (_count doesn't support size). + # data frames that have restricted size or sort params will not return valid results + # (_count doesn't support size). # Longer term we may fall back to pandas, but this may result in loading all index into memory. if self._size(query_params, post_processing) is not None: raise NotImplementedError("Requesting count with additional query and processing parameters " @@ -497,10 +499,14 @@ class Operations: def to_pandas(self, query_compiler): class PandasDataFrameCollector: + def __init__(self): + self.df = None + def collect(self, df): self.df = df - def batch_size(self): + @staticmethod + def batch_size(): return None collector = PandasDataFrameCollector() @@ -528,7 +534,8 @@ class Operations: self.kwargs['mode'] = 'a' df.to_csv(**self.kwargs) - def batch_size(self): + @staticmethod + def batch_size(): # By default read 10000 docs to csv batch_size = 10000 return batch_size @@ -568,8 +575,8 @@ class Operations: sort=sort_params, body=body, _source=field_names) - except: - # Catch ES error and print debug (currently to stdout) + except Exception: + # Catch all ES errors and print debug (currently to stdout) error = { 'index': query_compiler._index_pattern, 'size': size, @@ -594,7 +601,7 @@ class Operations: partial_result, df = query_compiler._es_results_to_pandas(es_results, collector.batch_size()) df = self._apply_df_post_processing(df, post_processing) collector.collect(df) - if partial_result == False: + if not partial_result: break else: partial_result, df = query_compiler._es_results_to_pandas(es_results) @@ -761,7 +768,8 @@ class Operations: return query_params, post_processing - def _resolve_head(self, item, query_params, post_processing): + @staticmethod + def _resolve_head(item, query_params, post_processing): # head - sort asc, size n # |12345-------------| query_sort_field = item[1][0] @@ -792,7 +800,8 @@ class Operations: return query_params, post_processing - def _resolve_tail(self, item, query_params, post_processing): + @staticmethod + def _resolve_tail(item, query_params, post_processing): # tail - sort desc, size n, post-process sort asc # |-------------12345| query_sort_field = item[1][0] @@ -802,7 +811,7 @@ class Operations: # If this is a tail of a tail adjust settings and return if query_params['query_size'] is not None and \ query_params['query_sort_order'] == query_sort_order and \ - post_processing == [('sort_index')]: + post_processing == ['sort_index']: if query_size < query_params['query_size']: query_params['query_size'] = query_size return query_params, post_processing @@ -830,11 +839,12 @@ class Operations: # reverse sort order query_params['query_sort_order'] = Operations.SortOrder.reverse(query_sort_order) - post_processing.append(('sort_index')) + post_processing.append('sort_index') return query_params, post_processing - def _resolve_iloc(self, item, query_params, post_processing): + @staticmethod + def _resolve_iloc(item, query_params, post_processing): # tail - sort desc, size n, post-process sort asc # |---4--7-9---------| @@ -854,7 +864,8 @@ class Operations: return query_params, post_processing - def _resolve_query_ids(self, item, query_params, post_processing): + @staticmethod + def _resolve_query_ids(item, query_params, post_processing): # task = ('query_ids', ('must_not', items)) must_clause = item[1][0] ids = item[1][1] @@ -866,7 +877,8 @@ class Operations: return query_params, post_processing - def _resolve_query_terms(self, item, query_params, post_processing): + @staticmethod + def _resolve_query_terms(item, query_params, post_processing): # task = ('query_terms', ('must_not', (field, terms))) must_clause = item[1][0] field = item[1][1][0] @@ -879,7 +891,8 @@ class Operations: return query_params, post_processing - def _resolve_boolean_filter(self, item, query_params, post_processing): + @staticmethod + def _resolve_boolean_filter(item, query_params, post_processing): # task = ('boolean_filter', object) boolean_filter = item[1] @@ -1000,15 +1013,14 @@ class Operations: return query_params, post_processing - - def _resolve_post_processing_task(self, item, query_params, post_processing): + @staticmethod + def _resolve_post_processing_task(item, query_params, post_processing): # Just do this in post-processing if item[0] != 'field_names': post_processing.append(item) return query_params, post_processing - def _size(self, query_params, post_processing): # Shrink wrap code around checking if size parameter is set size = query_params['query_size'] # can be None @@ -1023,7 +1035,6 @@ class Operations: # This can return None return size - def info_es(self, buf): buf.write("Operations:\n") buf.write(" tasks: {0}\n".format(self._tasks)) @@ -1044,7 +1055,6 @@ class Operations: buf.write(" body: {0}\n".format(body)) buf.write(" post_processing: {0}\n".format(post_processing)) - def update_query(self, boolean_filter): task = ('boolean_filter', boolean_filter) self._tasks.append(task) diff --git a/eland/plotting.py b/eland/plotting.py index b86f14d..7a7a49d 100644 --- a/eland/plotting.py +++ b/eland/plotting.py @@ -35,11 +35,8 @@ def ed_hist_frame(ed_df, column=None, by=None, grid=True, xlabelsize=None, Examples -------- - .. plot:: - :context: close-figs - - >>> df = ed.DataFrame('localhost', 'flights') - >>> hist = df.select_dtypes(include=[np.number]).hist(figsize=[10,10]) + >>> df = ed.DataFrame('localhost', 'flights') + >>> hist = df.select_dtypes(include=[np.number]).hist(figsize=[10,10]) # doctest: +SKIP """ # Start with empty pandas data frame derived from ed_df_bins, ed_df_weights = ed_df._hist(num_bins=bins) diff --git a/eland/query.py b/eland/query.py index 72e9129..b3c33b9 100644 --- a/eland/query.py +++ b/eland/query.py @@ -169,4 +169,3 @@ class Query: def __repr__(self): return repr(self.to_search_body()) - diff --git a/eland/query_compiler.py b/eland/query_compiler.py index cf642ab..2cfc151 100644 --- a/eland/query_compiler.py +++ b/eland/query_compiler.py @@ -1,5 +1,5 @@ -import pandas as pd import numpy as np +import pandas as pd from eland import Client from eland import Index @@ -188,8 +188,10 @@ class ElandQueryCompiler: } } ``` - TODO - explain how lists are handled (https://www.elastic.co/guide/en/elasticsearch/reference/current/array.html) - TODO - an option here is to use Elasticsearch's multi-field matching instead of pandas treatment of lists (which isn't great) + TODO - explain how lists are handled + (https://www.elastic.co/guide/en/elasticsearch/reference/current/array.html) + TODO - an option here is to use Elasticsearch's multi-field matching instead of pandas treatment of lists + (which isn't great) NOTE - using this lists is generally not a good way to use this API """ partial_result = False @@ -274,7 +276,8 @@ class ElandQueryCompiler: elif not is_source_field and type(x) is list: for a in x: flatten(a, name) - elif is_source_field == True: # only print source fields from mappings (TODO - not so efficient for large number of fields and filtered mapping) + elif is_source_field: # only print source fields from mappings + # (TODO - not so efficient for large number of fields and filtered mapping) field_name = name[:-1] # Coerce types - for now just datetime @@ -292,8 +295,8 @@ class ElandQueryCompiler: # create lists for this pivot (see notes above) if field_name in out: if type(out[field_name]) is not list: - l = [out[field_name]] - out[field_name] = l + field_as_list = [out[field_name]] + out[field_name] = field_as_list out[field_name].append(x) else: out[field_name] = x @@ -524,6 +527,7 @@ class ElandQueryCompiler: """ Internal class to deal with column renaming and script_fields """ + class DisplayNameToFieldNameMapper: def __init__(self, field_to_display_names=None, diff --git a/eland/series.py b/eland/series.py index 5b69b3f..a9b4cac 100644 --- a/eland/series.py +++ b/eland/series.py @@ -20,7 +20,6 @@ import warnings from io import StringIO import numpy as np - import pandas as pd from pandas.io.common import _expand_user, _stringify_path @@ -43,7 +42,7 @@ class Series(NDFrame): A reference to a Elasticsearch python client index_pattern : str - An Elasticsearch index pattern. This can contain wildcards (e.g. filebeat-\*\). + An Elasticsearch index pattern. This can contain wildcards. index_field : str The field to base the series on @@ -201,7 +200,8 @@ class Series(NDFrame): """ Return the value counts for the specified field. - **Note we can only do this for aggregatable Elasticsearch fields - (in general) numeric and keyword rather than text fields** + **Note we can only do this for aggregatable Elasticsearch fields - (in general) numeric and keyword + rather than text fields** TODO - implement remainder of pandas arguments @@ -506,7 +506,6 @@ class Series(NDFrame): """ return self._numeric_op(right, _get_method_name()) - def __truediv__(self, right): """ Return floating division of series and right, element-wise (binary operator truediv). @@ -704,7 +703,7 @@ class Series(NDFrame): def __pow__(self, right): """ - Return exponential power of series and right, element-wise (binary operator pow \**\). + Return exponential power of series and right, element-wise (binary operator pow). Parameters ---------- @@ -772,6 +771,7 @@ class Series(NDFrame): Name: taxful_total_price, dtype: float64 """ return self._numeric_rop(left, _get_method_name()) + def __rtruediv__(self, left): """ Return division of series and left, element-wise (binary operator div). @@ -803,6 +803,7 @@ class Series(NDFrame): Name: taxful_total_price, dtype: float64 """ return self._numeric_rop(left, _get_method_name()) + def __rfloordiv__(self, left): """ Return integer division of series and left, element-wise (binary operator floordiv //). @@ -834,6 +835,7 @@ class Series(NDFrame): Name: taxful_total_price, dtype: float64 """ return self._numeric_rop(left, _get_method_name()) + def __rmod__(self, left): """ Return modulo of series and left, element-wise (binary operator mod %). @@ -865,6 +867,7 @@ class Series(NDFrame): Name: taxful_total_price, dtype: float64 """ return self._numeric_rop(left, _get_method_name()) + def __rmul__(self, left): """ Return multiplication of series and left, element-wise (binary operator mul). @@ -896,9 +899,10 @@ class Series(NDFrame): Name: taxful_total_price, dtype: float64 """ return self._numeric_rop(left, _get_method_name()) + def __rpow__(self, left): """ - Return exponential power of series and left, element-wise (binary operator pow \**\). + Return exponential power of series and left, element-wise (binary operator pow). Parameters ---------- @@ -927,6 +931,7 @@ class Series(NDFrame): Name: total_quantity, dtype: float64 """ return self._numeric_rop(left, _get_method_name()) + def __rsub__(self, left): """ Return subtraction of series and left, element-wise (binary operator sub). @@ -1170,7 +1175,7 @@ class Series(NDFrame): results = super().nunique() return results.squeeze() - #def values TODO - not implemented as causes current implementation of query to fail + # def values TODO - not implemented as causes current implementation of query to fail def to_numpy(self): """ diff --git a/eland/tests/DEMO.md b/eland/tests/DEMO.md deleted file mode 100644 index 5fd970f..0000000 --- a/eland/tests/DEMO.md +++ /dev/null @@ -1,23 +0,0 @@ -https://docs.google.com/presentation/d/1A3S5aIJC8SuEbi80PhEzyxTUNMjWJ7-_Om92yU9p3yo/edit#slide=id.g5f8a4bcb09_0_3 -https://www.kaggle.com/pmarcelino/comprehensive-data-exploration-with-python -https://nbviewer.jupyter.org/github/parente/nbestimate/blob/master/estimate.ipynb -https://stackoverflow.blog/2017/09/14/python-growing-quickly/ -https://github.com/elastic/eland -http://localhost:8889/notebooks/eland/tests/demo_day_20190815.ipynb -http://localhost:5601/app/kibana#/dev_tools/console?_g=() - - -devtool console: -``` -GET _cat/indices - -# Clean demo -DELETE ed_jetbeats_routes - -# Demo day schema -GET flights -GET flights/_search - -GET ed_jetbeats_routes -GET ed_jetbeats_routes/_search -``` diff --git a/eland/tests/client/test_eq_pytest.py b/eland/tests/client/test_eq_pytest.py index 332d6f4..2c95efb 100644 --- a/eland/tests/client/test_eq_pytest.py +++ b/eland/tests/client/test_eq_pytest.py @@ -4,8 +4,6 @@ from elasticsearch import Elasticsearch import eland as ed from eland.tests.common import TestData -import pytest - class TestClientEq(TestData): diff --git a/eland/tests/dataframe/test_count_pytest.py b/eland/tests/dataframe/test_count_pytest.py index 3dab08e..72d09af 100644 --- a/eland/tests/dataframe/test_count_pytest.py +++ b/eland/tests/dataframe/test_count_pytest.py @@ -4,7 +4,6 @@ from pandas.util.testing import assert_series_equal from eland.tests.common import TestData -import pandas as pd class TestDataFrameCount(TestData): diff --git a/eland/tests/dataframe/test_describe_pytest.py b/eland/tests/dataframe/test_describe_pytest.py index af24e66..d176d06 100644 --- a/eland/tests/dataframe/test_describe_pytest.py +++ b/eland/tests/dataframe/test_describe_pytest.py @@ -14,8 +14,8 @@ class TestDataFrameDescribe(TestData): pd_describe = pd_flights.describe() ed_describe = ed_flights.describe() - assert_almost_equal(pd_describe.drop(['25%','50%','75%'], axis='index'), - ed_describe.drop(['25%','50%','75%'], axis='index'), + assert_almost_equal(pd_describe.drop(['25%', '50%', '75%'], axis='index'), + ed_describe.drop(['25%', '50%', '75%'], axis='index'), check_less_precise=True) # TODO - this fails for percentile fields as ES aggregations are approximate diff --git a/eland/tests/dataframe/test_dtypes_pytest.py b/eland/tests/dataframe/test_dtypes_pytest.py index 9ba44ff..e8d5463 100644 --- a/eland/tests/dataframe/test_dtypes_pytest.py +++ b/eland/tests/dataframe/test_dtypes_pytest.py @@ -1,7 +1,6 @@ # File called _pytest for PyCharm compatability import numpy as np - from pandas.util.testing import assert_series_equal from eland.tests.common import TestData @@ -16,8 +15,8 @@ class TestDataFrameDtypes(TestData): assert_series_equal(pd_flights.dtypes, ed_flights.dtypes) - for i in range(0, len(pd_flights.dtypes)-1): - assert type(pd_flights.dtypes[i]) == type(ed_flights.dtypes[i]) + for i in range(0, len(pd_flights.dtypes) - 1): + assert isinstance(pd_flights.dtypes[i], type(ed_flights.dtypes[i])) def test_flights_select_dtypes(self): ed_flights = self.ed_flights_small() diff --git a/eland/tests/dataframe/test_init_pytest.py b/eland/tests/dataframe/test_init_pytest.py index 9754b0f..e3f71d2 100644 --- a/eland/tests/dataframe/test_init_pytest.py +++ b/eland/tests/dataframe/test_init_pytest.py @@ -1,12 +1,12 @@ # File called _pytest for PyCharm compatability -import eland as ed - import pytest +import eland as ed from eland.tests import ELASTICSEARCH_HOST from eland.tests import FLIGHTS_INDEX_NAME + class TestDataFrameInit: def test_init(self): @@ -28,4 +28,3 @@ class TestDataFrameInit: qc = ed.ElandQueryCompiler(client=ELASTICSEARCH_HOST, index_pattern=FLIGHTS_INDEX_NAME) df2 = ed.DataFrame(query_compiler=qc) - diff --git a/eland/tests/dataframe/test_keys_pytest.py b/eland/tests/dataframe/test_keys_pytest.py index e81b3c9..e7046f3 100644 --- a/eland/tests/dataframe/test_keys_pytest.py +++ b/eland/tests/dataframe/test_keys_pytest.py @@ -1,9 +1,9 @@ # File called _pytest for PyCharm compatability -from eland.tests.common import TestData - from pandas.testing import assert_index_equal +from eland.tests.common import TestData + class TestDataFrameKeys(TestData): diff --git a/eland/tests/dataframe/test_metrics_pytest.py b/eland/tests/dataframe/test_metrics_pytest.py index 8b07743..f2be3e0 100644 --- a/eland/tests/dataframe/test_metrics_pytest.py +++ b/eland/tests/dataframe/test_metrics_pytest.py @@ -4,11 +4,8 @@ from pandas.util.testing import assert_series_equal from eland.tests.common import TestData -import eland as ed - class TestDataFrameMetrics(TestData): - funcs = ['max', 'min', 'mean', 'sum'] def test_flights_metrics(self): @@ -29,7 +26,8 @@ class TestDataFrameMetrics(TestData): ed_ecommerce = self.ed_ecommerce()[columns] for func in self.funcs: - assert_series_equal(getattr(pd_ecommerce, func)(numeric_only=True), getattr(ed_ecommerce, func)(numeric_only=True), + assert_series_equal(getattr(pd_ecommerce, func)(numeric_only=True), + getattr(ed_ecommerce, func)(numeric_only=True), check_less_precise=True) def test_ecommerce_selected_mixed_numeric_source_fields(self): @@ -41,10 +39,10 @@ class TestDataFrameMetrics(TestData): ed_ecommerce = self.ed_ecommerce()[columns] for func in self.funcs: - assert_series_equal(getattr(pd_ecommerce, func)(numeric_only=True), getattr(ed_ecommerce, func)(numeric_only=True), + assert_series_equal(getattr(pd_ecommerce, func)(numeric_only=True), + getattr(ed_ecommerce, func)(numeric_only=True), check_less_precise=True) - def test_ecommerce_selected_all_numeric_source_fields(self): # All of these are numeric columns = ['total_quantity', 'taxful_total_price', 'taxless_total_price'] @@ -53,5 +51,6 @@ class TestDataFrameMetrics(TestData): ed_ecommerce = self.ed_ecommerce()[columns] for func in self.funcs: - assert_series_equal(getattr(pd_ecommerce, func)(numeric_only=True), getattr(ed_ecommerce, func)(numeric_only=True), + assert_series_equal(getattr(pd_ecommerce, func)(numeric_only=True), + getattr(ed_ecommerce, func)(numeric_only=True), check_less_precise=True) diff --git a/eland/tests/dataframe/test_nunique_pytest.py b/eland/tests/dataframe/test_nunique_pytest.py index 1b9e530..e160c6a 100644 --- a/eland/tests/dataframe/test_nunique_pytest.py +++ b/eland/tests/dataframe/test_nunique_pytest.py @@ -1,5 +1,4 @@ # File called _pytest for PyCharm compatability -import pandas as pd from pandas.util.testing import assert_series_equal @@ -18,9 +17,9 @@ class TestDataFrameNUnique(TestData): ed_nunique = ed_flights.nunique() # TODO - ES is approximate counts so these aren't equal... - #E[left]: [13059, 2, 4, 156, 156, 143] - #E[right]: [13132, 2, 4, 156, 156, 143] - #assert_series_equal(pd_nunique, ed_nunique) + # E[left]: [13059, 2, 4, 156, 156, 143] + # E[right]: [13132, 2, 4, 156, 156, 143] + # assert_series_equal(pd_nunique, ed_nunique) def test_ecommerce_nunique(self): columns = ['customer_first_name', 'customer_gender', 'day_of_week_i'] diff --git a/eland/tests/dataframe/test_query_pytest.py b/eland/tests/dataframe/test_query_pytest.py index 0dcbc5f..d2add40 100644 --- a/eland/tests/dataframe/test_query_pytest.py +++ b/eland/tests/dataframe/test_query_pytest.py @@ -47,12 +47,11 @@ class TestDataFrameQuery(TestData): ed_flights = self.ed_flights() pd_flights = self.pd_flights() - assert pd_flights.query('FlightDelayMin > 60').shape == \ - ed_flights.query('FlightDelayMin > 60').shape + assert pd_flights.query('FlightDelayMin > 60').shape == ed_flights.query('FlightDelayMin > 60').shape def test_isin_query(self): ed_flights = self.ed_flights() pd_flights = self.pd_flights() - assert pd_flights[pd_flights.OriginAirportID.isin(['LHR','SYD'])].shape == \ - ed_flights[ed_flights.OriginAirportID.isin(['LHR','SYD'])].shape + assert pd_flights[pd_flights.OriginAirportID.isin(['LHR', 'SYD'])].shape == \ + ed_flights[ed_flights.OriginAirportID.isin(['LHR', 'SYD'])].shape diff --git a/eland/tests/dataframe/test_repr_pytest.py b/eland/tests/dataframe/test_repr_pytest.py index 691e088..ce05560 100644 --- a/eland/tests/dataframe/test_repr_pytest.py +++ b/eland/tests/dataframe/test_repr_pytest.py @@ -1,12 +1,10 @@ # File called _pytest for PyCharm compatability +import pandas as pd import pytest -import pandas as pd - -from eland.tests.common import TestData - from eland.dataframe import DEFAULT_NUM_ROWS_DISPLAYED +from eland.tests.common import TestData class TestDataFrameRepr(TestData): @@ -19,6 +17,7 @@ class TestDataFrameRepr(TestData): """ to_string """ + def test_num_rows_to_string(self): # check setup works assert pd.get_option('display.max_rows') == 60 @@ -27,11 +26,11 @@ class TestDataFrameRepr(TestData): # In pandas calling 'to_string' without max_rows set, will dump ALL rows # Test n-1, n, n+1 for edge cases - self.num_rows_to_string(DEFAULT_NUM_ROWS_DISPLAYED-1) + self.num_rows_to_string(DEFAULT_NUM_ROWS_DISPLAYED - 1) self.num_rows_to_string(DEFAULT_NUM_ROWS_DISPLAYED) with pytest.warns(UserWarning): # UserWarning displayed by eland here (compare to pandas with max_rows set) - self.num_rows_to_string(DEFAULT_NUM_ROWS_DISPLAYED+1, None, DEFAULT_NUM_ROWS_DISPLAYED) + self.num_rows_to_string(DEFAULT_NUM_ROWS_DISPLAYED + 1, None, DEFAULT_NUM_ROWS_DISPLAYED) # Test for where max_rows lt or gt num_rows self.num_rows_to_string(10, 5, 5) @@ -47,8 +46,8 @@ class TestDataFrameRepr(TestData): ed_head_str = ed_head.to_string(max_rows=max_rows_eland) pd_head_str = pd_head.to_string(max_rows=max_rows_pandas) - #print(ed_head_str) - #print(pd_head_str) + # print(ed_head_str) + # print(pd_head_str) assert pd_head_str == ed_head_str @@ -64,13 +63,14 @@ class TestDataFrameRepr(TestData): """ repr """ + def test_num_rows_repr(self): ed_flights = self.ed_flights() pd_flights = self.pd_flights() - self.num_rows_repr(pd.get_option('display.max_rows')-1, pd.get_option('display.max_rows')-1) + self.num_rows_repr(pd.get_option('display.max_rows') - 1, pd.get_option('display.max_rows') - 1) self.num_rows_repr(pd.get_option('display.max_rows'), pd.get_option('display.max_rows')) - self.num_rows_repr(pd.get_option('display.max_rows')+1, pd.get_option('display.min_rows')) + self.num_rows_repr(pd.get_option('display.max_rows') + 1, pd.get_option('display.min_rows')) def num_rows_repr(self, rows, num_rows_printed): ed_flights = self.ed_flights() @@ -87,7 +87,7 @@ class TestDataFrameRepr(TestData): num_rows_printed = num_rows_printed + 1 # number of rows is num_rows_printed + 3 (header, summary) - assert (num_rows_printed+3) == len(ed_head_str.splitlines()) + assert (num_rows_printed + 3) == len(ed_head_str.splitlines()) assert pd_head_str == ed_head_str @@ -103,6 +103,7 @@ class TestDataFrameRepr(TestData): """ to_html """ + def test_num_rows_to_html(self): # check setup works assert pd.get_option('display.max_rows') == 60 @@ -111,11 +112,11 @@ class TestDataFrameRepr(TestData): # In pandas calling 'to_string' without max_rows set, will dump ALL rows # Test n-1, n, n+1 for edge cases - self.num_rows_to_html(DEFAULT_NUM_ROWS_DISPLAYED-1) + self.num_rows_to_html(DEFAULT_NUM_ROWS_DISPLAYED - 1) self.num_rows_to_html(DEFAULT_NUM_ROWS_DISPLAYED) with pytest.warns(UserWarning): # UserWarning displayed by eland here - self.num_rows_to_html(DEFAULT_NUM_ROWS_DISPLAYED+1, None, DEFAULT_NUM_ROWS_DISPLAYED) + self.num_rows_to_html(DEFAULT_NUM_ROWS_DISPLAYED + 1, None, DEFAULT_NUM_ROWS_DISPLAYED) # Test for where max_rows lt or gt num_rows self.num_rows_to_html(10, 5, 5) @@ -131,8 +132,8 @@ class TestDataFrameRepr(TestData): ed_head_str = ed_head.to_html(max_rows=max_rows_eland) pd_head_str = pd_head.to_html(max_rows=max_rows_pandas) - #print(ed_head_str) - #print(pd_head_str) + # print(ed_head_str) + # print(pd_head_str) assert pd_head_str == ed_head_str @@ -145,10 +146,10 @@ class TestDataFrameRepr(TestData): assert ed_ecom_h == pd_ecom_h - """ _repr_html_ """ + def test_num_rows_repr_html(self): # check setup works assert pd.get_option('display.max_rows') == 60 @@ -163,9 +164,9 @@ class TestDataFrameRepr(TestData): # In pandas calling 'to_string' without max_rows set, will dump ALL rows # Test n-1, n, n+1 for edge cases - self.num_rows_repr_html(pd.get_option('display.max_rows')-1) + self.num_rows_repr_html(pd.get_option('display.max_rows') - 1) self.num_rows_repr_html(pd.get_option('display.max_rows')) - self.num_rows_repr_html(pd.get_option('display.max_rows')+1, pd.get_option('display.max_rows')) + self.num_rows_repr_html(pd.get_option('display.max_rows') + 1, pd.get_option('display.max_rows')) # Restore default pd.set_option('display.show_dimensions', show_dimensions) @@ -180,13 +181,12 @@ class TestDataFrameRepr(TestData): ed_head_str = ed_head._repr_html_() pd_head_str = pd_head._repr_html_() - #print(ed_head_str) - #print(pd_head_str) + # print(ed_head_str) + # print(pd_head_str) assert pd_head_str == ed_head_str def test_empty_dataframe_repr_html(self): - # TODO - there is a bug in 'show_dimensions' as it gets added after the last # For now test without this show_dimensions = pd.get_option('display.show_dimensions') diff --git a/eland/tests/dataframe/test_to_csv_pytest.py b/eland/tests/dataframe/test_to_csv_pytest.py index 27f7ba0..fd2ae5e 100644 --- a/eland/tests/dataframe/test_to_csv_pytest.py +++ b/eland/tests/dataframe/test_to_csv_pytest.py @@ -3,20 +3,15 @@ import ast import time -import eland as ed - -from elasticsearch import Elasticsearch - import pandas as pd +from elasticsearch import Elasticsearch from pandas.util.testing import assert_frame_equal -from eland.tests.common import ROOT_DIR -from eland.tests.common import TestData - +import eland as ed from eland.tests import ELASTICSEARCH_HOST from eland.tests import FLIGHTS_INDEX_NAME - -from eland.tests.common import assert_pandas_eland_frame_equal +from eland.tests.common import ROOT_DIR +from eland.tests.common import TestData class TestDataFrameToCSV(TestData): diff --git a/eland/tests/demo_day_20190815.ipynb b/eland/tests/demo_day_20190815.ipynb deleted file mode 100644 index aa71222..0000000 --- a/eland/tests/demo_day_20190815.ipynb +++ /dev/null @@ -1,7152 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Pandas and Elasticsearch - Demo Day 15th August 2019" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create simple pandas DataFrame" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Read JSON file to pandas DataFrame" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "pd_flights = pd.read_json('./flights_df.json.gz').sort_index()\n", - "\n", - "# Change data types of a couple of fields\n", - "pd_flights['timestamp'] = pd.to_datetime(pd_flights['timestamp'])\n", - "pd_flights.index = pd_flights.index.map(str)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Explore pandas DataFrame" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Index: 13059 entries, 0 to 13058\n", - "Data columns (total 27 columns):\n", - "AvgTicketPrice 13059 non-null float64\n", - "Cancelled 13059 non-null bool\n", - "Carrier 13059 non-null object\n", - "Dest 13059 non-null object\n", - "DestAirportID 13059 non-null object\n", - "DestCityName 13059 non-null object\n", - "DestCountry 13059 non-null object\n", - "DestLocation 13059 non-null object\n", - "DestRegion 13059 non-null object\n", - "DestWeather 13059 non-null object\n", - "DistanceKilometers 13059 non-null float64\n", - "DistanceMiles 13059 non-null float64\n", - "FlightDelay 13059 non-null bool\n", - "FlightDelayMin 13059 non-null int64\n", - "FlightDelayType 13059 non-null object\n", - "FlightNum 13059 non-null object\n", - "FlightTimeHour 13059 non-null float64\n", - "FlightTimeMin 13059 non-null float64\n", - "Origin 13059 non-null object\n", - "OriginAirportID 13059 non-null object\n", - "OriginCityName 13059 non-null object\n", - "OriginCountry 13059 non-null object\n", - "OriginLocation 13059 non-null object\n", - "OriginRegion 13059 non-null object\n", - "OriginWeather 13059 non-null object\n", - "dayOfWeek 13059 non-null int64\n", - "timestamp 13059 non-null datetime64[ns]\n", - "dtypes: bool(2), datetime64[ns](1), float64(5), int64(2), object(17)\n", - "memory usage: 2.6+ MB\n" - ] - } - ], - "source": [ - "# Show consise summary of DataFrame + memory usage\n", - "pd_flights.info()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
AvgTicketPriceDistanceKilometersDistanceMilesFlightDelayMinFlightTimeHourFlightTimeMindayOfWeek
count13059.00000013059.00000013059.00000013059.00000013059.00000013059.00000013059.000000
mean628.2536897092.1424554406.85301347.3351718.518797511.1278422.835975
std266.3968614578.4384972844.90978796.7467115.579233334.7539521.939439
min100.0205280.0000000.0000000.0000000.0000000.0000000.000000
25%409.8938162459.7056731528.3902470.0000004.205553252.3331921.000000
50%640.5566687610.3308664728.8403630.0000008.384086503.0451703.000000
75%842.1854709736.6376006050.06611415.00000012.006934720.4160364.000000
max1199.72905319881.48231512353.780369360.00000031.7150341902.9020326.000000
\n", - "
" - ], - "text/plain": [ - " AvgTicketPrice DistanceKilometers DistanceMiles FlightDelayMin \\\n", - "count 13059.000000 13059.000000 13059.000000 13059.000000 \n", - "mean 628.253689 7092.142455 4406.853013 47.335171 \n", - "std 266.396861 4578.438497 2844.909787 96.746711 \n", - "min 100.020528 0.000000 0.000000 0.000000 \n", - "25% 409.893816 2459.705673 1528.390247 0.000000 \n", - "50% 640.556668 7610.330866 4728.840363 0.000000 \n", - "75% 842.185470 9736.637600 6050.066114 15.000000 \n", - "max 1199.729053 19881.482315 12353.780369 360.000000 \n", - "\n", - " FlightTimeHour FlightTimeMin dayOfWeek \n", - "count 13059.000000 13059.000000 13059.000000 \n", - "mean 8.518797 511.127842 2.835975 \n", - "std 5.579233 334.753952 1.939439 \n", - "min 0.000000 0.000000 0.000000 \n", - "25% 4.205553 252.333192 1.000000 \n", - "50% 8.384086 503.045170 3.000000 \n", - "75% 12.006934 720.416036 4.000000 \n", - "max 31.715034 1902.902032 6.000000 " - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Generate descriptive statistics of numeric columns\n", - "pd_flights.describe()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
AvgTicketPriceCancelledCarrierDestDestAirportIDDestCityNameDestCountryDestLocationDestRegionDestWeather...FlightTimeMinOriginOriginAirportIDOriginCityNameOriginCountryOriginLocationOriginRegionOriginWeatherdayOfWeektimestamp
0841.265642FalseKibana AirlinesSydney Kingsford Smith International AirportSYDSydneyAU{'lat': '-33.94609833', 'lon': '151.177002'}SE-BDRain...1030.770416Frankfurt am Main AirportFRAFrankfurt am MainDE{'lat': '50.033333', 'lon': '8.570556'}DE-HESunny02018-01-01 00:00:00
1882.982662FalseLogstash AirwaysVenice Marco Polo AirportVE05VeniceIT{'lat': '45.505299', 'lon': '12.3519'}IT-34Sunny...464.389481Cape Town International AirportCPTCape TownZA{'lat': '-33.96480179', 'lon': '18.60169983'}SE-BDClear02018-01-01 18:27:00
2190.636904FalseLogstash AirwaysVenice Marco Polo AirportVE05VeniceIT{'lat': '45.505299', 'lon': '12.3519'}IT-34Cloudy...0.000000Venice Marco Polo AirportVE05VeniceIT{'lat': '45.505299', 'lon': '12.3519'}IT-34Rain02018-01-01 17:11:14
3181.694216TrueKibana AirlinesTreviso-Sant'Angelo AirportTV01TrevisoIT{'lat': '45.648399', 'lon': '12.1944'}IT-34Clear...222.749059Naples International AirportNA01NaplesIT{'lat': '40.886002', 'lon': '14.2908'}IT-72Thunder & Lightning02018-01-01 10:33:28
4730.041778FalseKibana AirlinesXi'an Xianyang International AirportXIYXi'anCN{'lat': '34.447102', 'lon': '108.751999'}SE-BDClear...785.779071Licenciado Benito Juarez International AirportAICMMexico CityMX{'lat': '19.4363', 'lon': '-99.072098'}MX-DIFDamaging Wind02018-01-01 05:13:00
\n", - "

5 rows × 27 columns

\n", - "
" - ], - "text/plain": [ - " AvgTicketPrice Cancelled Carrier \\\n", - "0 841.265642 False Kibana Airlines \n", - "1 882.982662 False Logstash Airways \n", - "2 190.636904 False Logstash Airways \n", - "3 181.694216 True Kibana Airlines \n", - "4 730.041778 False Kibana Airlines \n", - "\n", - " Dest DestAirportID DestCityName \\\n", - "0 Sydney Kingsford Smith International Airport SYD Sydney \n", - "1 Venice Marco Polo Airport VE05 Venice \n", - "2 Venice Marco Polo Airport VE05 Venice \n", - "3 Treviso-Sant'Angelo Airport TV01 Treviso \n", - "4 Xi'an Xianyang International Airport XIY Xi'an \n", - "\n", - " DestCountry DestLocation DestRegion \\\n", - "0 AU {'lat': '-33.94609833', 'lon': '151.177002'} SE-BD \n", - "1 IT {'lat': '45.505299', 'lon': '12.3519'} IT-34 \n", - "2 IT {'lat': '45.505299', 'lon': '12.3519'} IT-34 \n", - "3 IT {'lat': '45.648399', 'lon': '12.1944'} IT-34 \n", - "4 CN {'lat': '34.447102', 'lon': '108.751999'} SE-BD \n", - "\n", - " DestWeather ... FlightTimeMin \\\n", - "0 Rain ... 1030.770416 \n", - "1 Sunny ... 464.389481 \n", - "2 Cloudy ... 0.000000 \n", - "3 Clear ... 222.749059 \n", - "4 Clear ... 785.779071 \n", - "\n", - " Origin OriginAirportID \\\n", - "0 Frankfurt am Main Airport FRA \n", - "1 Cape Town International Airport CPT \n", - "2 Venice Marco Polo Airport VE05 \n", - "3 Naples International Airport NA01 \n", - "4 Licenciado Benito Juarez International Airport AICM \n", - "\n", - " OriginCityName OriginCountry \\\n", - "0 Frankfurt am Main DE \n", - "1 Cape Town ZA \n", - "2 Venice IT \n", - "3 Naples IT \n", - "4 Mexico City MX \n", - "\n", - " OriginLocation OriginRegion \\\n", - "0 {'lat': '50.033333', 'lon': '8.570556'} DE-HE \n", - "1 {'lat': '-33.96480179', 'lon': '18.60169983'} SE-BD \n", - "2 {'lat': '45.505299', 'lon': '12.3519'} IT-34 \n", - "3 {'lat': '40.886002', 'lon': '14.2908'} IT-72 \n", - "4 {'lat': '19.4363', 'lon': '-99.072098'} MX-DIF \n", - "\n", - " OriginWeather dayOfWeek timestamp \n", - "0 Sunny 0 2018-01-01 00:00:00 \n", - "1 Clear 0 2018-01-01 18:27:00 \n", - "2 Rain 0 2018-01-01 17:11:14 \n", - "3 Thunder & Lightning 0 2018-01-01 10:33:28 \n", - "4 Damaging Wind 0 2018-01-01 05:13:00 \n", - "\n", - "[5 rows x 27 columns]" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd_flights.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
AvgTicketPriceCancelledCarrierDestDestAirportIDDestCityNameDestCountryDestLocationDestRegionDestWeather...FlightTimeMinOriginOriginAirportIDOriginCityNameOriginCountryOriginLocationOriginRegionOriginWeatherdayOfWeektimestamp
130541080.446279FalseLogstash AirwaysXi'an Xianyang International AirportXIYXi'anCN{'lat': '34.447102', 'lon': '108.751999'}SE-BDRain...402.929088Pisa International AirportPI05PisaIT{'lat': '43.683899', 'lon': '10.3927'}IT-52Sunny62018-02-11 20:42:25
13055646.612941FalseLogstash AirwaysZurich AirportZRHZurichCH{'lat': '47.464699', 'lon': '8.54917'}CH-ZHRain...644.418029Winnipeg / James Armstrong Richardson Internat...YWGWinnipegCA{'lat': '49.90999985', 'lon': '-97.23989868'}CA-MBRain62018-02-11 01:41:57
13056997.751876FalseLogstash AirwaysUkrainka Air BaseXHBUBelogorskRU{'lat': '51.169997', 'lon': '128.445007'}RU-AMURain...937.540811Licenciado Benito Juarez International AirportAICMMexico CityMX{'lat': '19.4363', 'lon': '-99.072098'}MX-DIFSunny62018-02-11 04:09:27
130571102.814465FalseJetBeatsMinistro Pistarini International AirportEZEBuenos AiresAR{'lat': '-34.8222', 'lon': '-58.5358'}SE-BDHail...1697.404971Itami AirportITMOsakaJP{'lat': '34.78549957', 'lon': '135.4380035'}SE-BDHail62018-02-11 08:28:21
13058858.144337FalseJetBeatsWashington Dulles International AirportIADWashingtonUS{'lat': '38.94449997', 'lon': '-77.45580292'}US-DCHeavy Fog...1610.761827Adelaide International AirportADLAdelaideAU{'lat': '-34.945', 'lon': '138.531006'}SE-BDRain62018-02-11 14:54:34
\n", - "

5 rows × 27 columns

\n", - "
" - ], - "text/plain": [ - " AvgTicketPrice Cancelled Carrier \\\n", - "13054 1080.446279 False Logstash Airways \n", - "13055 646.612941 False Logstash Airways \n", - "13056 997.751876 False Logstash Airways \n", - "13057 1102.814465 False JetBeats \n", - "13058 858.144337 False JetBeats \n", - "\n", - " Dest DestAirportID DestCityName \\\n", - "13054 Xi'an Xianyang International Airport XIY Xi'an \n", - "13055 Zurich Airport ZRH Zurich \n", - "13056 Ukrainka Air Base XHBU Belogorsk \n", - "13057 Ministro Pistarini International Airport EZE Buenos Aires \n", - "13058 Washington Dulles International Airport IAD Washington \n", - "\n", - " DestCountry DestLocation DestRegion \\\n", - "13054 CN {'lat': '34.447102', 'lon': '108.751999'} SE-BD \n", - "13055 CH {'lat': '47.464699', 'lon': '8.54917'} CH-ZH \n", - "13056 RU {'lat': '51.169997', 'lon': '128.445007'} RU-AMU \n", - "13057 AR {'lat': '-34.8222', 'lon': '-58.5358'} SE-BD \n", - "13058 US {'lat': '38.94449997', 'lon': '-77.45580292'} US-DC \n", - "\n", - " DestWeather ... FlightTimeMin \\\n", - "13054 Rain ... 402.929088 \n", - "13055 Rain ... 644.418029 \n", - "13056 Rain ... 937.540811 \n", - "13057 Hail ... 1697.404971 \n", - "13058 Heavy Fog ... 1610.761827 \n", - "\n", - " Origin OriginAirportID \\\n", - "13054 Pisa International Airport PI05 \n", - "13055 Winnipeg / James Armstrong Richardson Internat... YWG \n", - "13056 Licenciado Benito Juarez International Airport AICM \n", - "13057 Itami Airport ITM \n", - "13058 Adelaide International Airport ADL \n", - "\n", - " OriginCityName OriginCountry \\\n", - "13054 Pisa IT \n", - "13055 Winnipeg CA \n", - "13056 Mexico City MX \n", - "13057 Osaka JP \n", - "13058 Adelaide AU \n", - "\n", - " OriginLocation OriginRegion \\\n", - "13054 {'lat': '43.683899', 'lon': '10.3927'} IT-52 \n", - "13055 {'lat': '49.90999985', 'lon': '-97.23989868'} CA-MB \n", - "13056 {'lat': '19.4363', 'lon': '-99.072098'} MX-DIF \n", - "13057 {'lat': '34.78549957', 'lon': '135.4380035'} SE-BD \n", - "13058 {'lat': '-34.945', 'lon': '138.531006'} SE-BD \n", - "\n", - " OriginWeather dayOfWeek timestamp \n", - "13054 Sunny 6 2018-02-11 20:42:25 \n", - "13055 Rain 6 2018-02-11 01:41:57 \n", - "13056 Sunny 6 2018-02-11 04:09:27 \n", - "13057 Hail 6 2018-02-11 08:28:21 \n", - "13058 Rain 6 2018-02-11 14:54:34 \n", - "\n", - "[5 rows x 27 columns]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd_flights.tail()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
AvgTicketPriceCancelledCarrierDestDestAirportIDDestCityNameDestCountryDestLocationDestRegionDestWeather...FlightTimeMinOriginOriginAirportIDOriginCityNameOriginCountryOriginLocationOriginRegionOriginWeatherdayOfWeektimestamp
0841.265642FalseKibana AirlinesSydney Kingsford Smith International AirportSYDSydneyAU{'lat': '-33.94609833', 'lon': '151.177002'}SE-BDRain...1030.770416Frankfurt am Main AirportFRAFrankfurt am MainDE{'lat': '50.033333', 'lon': '8.570556'}DE-HESunny02018-01-01 00:00:00
1882.982662FalseLogstash AirwaysVenice Marco Polo AirportVE05VeniceIT{'lat': '45.505299', 'lon': '12.3519'}IT-34Sunny...464.389481Cape Town International AirportCPTCape TownZA{'lat': '-33.96480179', 'lon': '18.60169983'}SE-BDClear02018-01-01 18:27:00
2190.636904FalseLogstash AirwaysVenice Marco Polo AirportVE05VeniceIT{'lat': '45.505299', 'lon': '12.3519'}IT-34Cloudy...0.000000Venice Marco Polo AirportVE05VeniceIT{'lat': '45.505299', 'lon': '12.3519'}IT-34Rain02018-01-01 17:11:14
3181.694216TrueKibana AirlinesTreviso-Sant'Angelo AirportTV01TrevisoIT{'lat': '45.648399', 'lon': '12.1944'}IT-34Clear...222.749059Naples International AirportNA01NaplesIT{'lat': '40.886002', 'lon': '14.2908'}IT-72Thunder & Lightning02018-01-01 10:33:28
4730.041778FalseKibana AirlinesXi'an Xianyang International AirportXIYXi'anCN{'lat': '34.447102', 'lon': '108.751999'}SE-BDClear...785.779071Licenciado Benito Juarez International AirportAICMMexico CityMX{'lat': '19.4363', 'lon': '-99.072098'}MX-DIFDamaging Wind02018-01-01 05:13:00
5418.152089FalseJetBeatsGenoa Cristoforo Colombo AirportGE01GenovaIT{'lat': '44.4133', 'lon': '8.8375'}IT-42Thunder & Lightning...393.590441Edmonton International AirportCYEGEdmontonCA{'lat': '53.30970001', 'lon': '-113.5800018'}CA-ABRain02018-01-01 01:43:03
6180.246816FalseJetBeatsZurich AirportZRHZurichCH{'lat': '47.464699', 'lon': '8.54917'}CH-ZHHail...300.000000Zurich AirportZRHZurichCH{'lat': '47.464699', 'lon': '8.54917'}CH-ZHClear02018-01-01 13:49:53
7585.184310FalseKibana AirlinesOttawa Macdonald-Cartier International AirportYOWOttawaCA{'lat': '45.32249832', 'lon': '-75.66919708'}CA-ONClear...614.942480Ciampino___G. B. Pastine International AirportRM12RomeIT{'lat': '41.7994', 'lon': '12.5949'}IT-62Thunder & Lightning02018-01-01 04:54:59
8960.869736TrueKibana AirlinesRajiv Gandhi International AirportHYDHyderabadIN{'lat': '17.23131752', 'lon': '78.42985535'}SE-BDCloudy...602.030591Milano Linate AirportMI11MilanIT{'lat': '45.445099', 'lon': '9.27674'}IT-25Heavy Fog02018-01-01 12:09:35
9296.877773FalseLogstash AirwaysTreviso-Sant'Angelo AirportTV01TrevisoIT{'lat': '45.648399', 'lon': '12.1944'}IT-34Rain...174.822216Sheremetyevo International AirportSVOMoscowRU{'lat': '55.972599', 'lon': '37.4146'}RU-MOSCloudy02018-01-01 12:09:35
10906.437948FalseJetBeatsHelsinki Vantaa AirportHELHelsinkiFI{'lat': '60.31719971', 'lon': '24.9633007'}FI-ESRain...503.045170Albuquerque International Sunport AirportABQAlbuquerqueUS{'lat': '35.040199', 'lon': '-106.609001'}US-NMRain02018-01-01 22:06:14
11704.463771FalseLogstash AirwaysVienna International AirportVIEViennaAT{'lat': '48.11029816', 'lon': '16.56970024'}AT-9Cloudy...36.075018Venice Marco Polo AirportVE05VeniceIT{'lat': '45.505299', 'lon': '12.3519'}IT-34Rain02018-01-01 11:52:34
12922.499077TrueLogstash AirwaysShanghai Pudong International AirportPVGShanghaiCN{'lat': '31.14340019', 'lon': '121.8050003'}SE-BDClear...679.768391Licenciado Benito Juarez International AirportAICMMexico CityMX{'lat': '19.4363', 'lon': '-99.072098'}MX-DIFHeavy Fog02018-01-01 02:13:46
13374.959276FalseLogstash AirwaysOttawa Macdonald-Cartier International AirportYOWOttawaCA{'lat': '45.32249832', 'lon': '-75.66919708'}CA-ONRain...330.418282Naples International AirportNA01NaplesIT{'lat': '40.886002', 'lon': '14.2908'}IT-72Rain02018-01-01 14:21:13
14552.917371FalseLogstash AirwaysLuis Munoz Marin International AirportSJUSan JuanPR{'lat': '18.43939972', 'lon': '-66.00180054'}PR-U-AClear...407.145031Ciampino___G. B. Pastine International AirportRM12RomeIT{'lat': '41.7994', 'lon': '12.5949'}IT-62Cloudy02018-01-01 17:42:53
15566.487557TrueKibana AirlinesCologne Bonn AirportCGNCologneDE{'lat': '50.86589813', 'lon': '7.142739773'}DE-NWSunny...656.712658Chengdu Shuangliu International AirportCTUChengduCN{'lat': '30.57850075', 'lon': '103.9469986'}SE-BDThunder & Lightning02018-01-01 19:55:32
16989.952787TrueLogstash AirwaysVenice Marco Polo AirportVE05VeniceIT{'lat': '45.505299', 'lon': '12.3519'}IT-34Damaging Wind...773.030334Licenciado Benito Juarez International AirportAICMMexico CityMX{'lat': '19.4363', 'lon': '-99.072098'}MX-DIFThunder & Lightning02018-01-01 07:49:27
17569.613255FalseES-AirMinistro Pistarini International AirportEZEBuenos AiresAR{'lat': '-34.8222', 'lon': '-58.5358'}SE-BDCloudy...704.716920Cleveland Hopkins International AirportCLEClevelandUS{'lat': '41.4117012', 'lon': '-81.84980011'}US-OHRain02018-01-01 01:30:47
18277.429707FalseES-AirShanghai Pudong International AirportPVGShanghaiCN{'lat': '31.14340019', 'lon': '121.8050003'}SE-BDClear...355.957996Olenya Air BaseXLMOOlenegorskRU{'lat': '68.15180206', 'lon': '33.46390152'}RU-MURHail02018-01-01 07:58:17
19772.100846FalseJetBeatsIndira Gandhi International AirportDELNew DelhiIN{'lat': '28.5665', 'lon': '77.103104'}SE-BDClear...875.114675Casper-Natrona County International AirportCPRCasperUS{'lat': '42.90800095', 'lon': '-106.4639969'}US-WYCloudy02018-01-01 00:02:06
20167.599922FalseJetBeatsWichita Mid Continent AirportICTWichitaUS{'lat': '37.64989853', 'lon': '-97.43309784'}US-KSClear...373.966883Erie International Tom Ridge FieldERIErieUS{'lat': '42.08312701', 'lon': '-80.17386675'}US-PACloudy02018-01-01 01:08:20
21253.210065FalseES-AirOttawa Macdonald-Cartier International AirportYOWOttawaCA{'lat': '45.32249832', 'lon': '-75.66919708'}CA-ONHail...130.667700Newark Liberty International AirportEWRNewarkUS{'lat': '40.69250107', 'lon': '-74.16870117'}US-NJClear02018-01-01 01:08:20
22917.247620FalseJetBeatsItami AirportITMOsakaJP{'lat': '34.78549957', 'lon': '135.4380035'}SE-BDDamaging Wind...574.495310Copenhagen Kastrup AirportCPHCopenhagenDK{'lat': '55.61790085', 'lon': '12.65600014'}DK-84Sunny02018-01-01 07:48:35
23451.591176FalseLogstash AirwaysVienna International AirportVIEViennaAT{'lat': '48.11029816', 'lon': '16.56970024'}AT-9Heavy Fog...579.728943Seattle Tacoma International AirportSEASeattleUS{'lat': '47.44900131', 'lon': '-122.3089981'}US-WAHeavy Fog02018-01-01 18:57:21
24307.067201FalseLogstash AirwaysCharles de Gaulle International AirportCDGParisFR{'lat': '49.01279831', 'lon': '2.549999952'}FR-JClear...50.157229Berlin-Tegel AirportTXLBerlinDE{'lat': '52.5597', 'lon': '13.2877'}DE-BERain02018-01-01 13:18:25
25268.241596FalseES-AirNarita International AirportNRTTokyoJP{'lat': '35.76470184', 'lon': '140.3860016'}SE-BDRain...527.567422Manchester AirportMANManchesterGB{'lat': '53.35369873', 'lon': '-2.274950027'}GB-ENGThunder & Lightning02018-01-01 08:20:35
26975.812632TrueKibana AirlinesItami AirportITMOsakaJP{'lat': '34.78549957', 'lon': '135.4380035'}SE-BDHail...386.259764Helsinki Vantaa AirportHELHelsinkiFI{'lat': '60.31719971', 'lon': '24.9633007'}FI-ESRain02018-01-01 15:38:32
27134.214546FalseJetBeatsSan Diego International AirportSANSan DiegoUS{'lat': '32.73360062', 'lon': '-117.1900024'}US-CAClear...24.479650Phoenix Sky Harbor International AirportPHXPhoenixUS{'lat': '33.43429947', 'lon': '-112.012001'}US-AZClear02018-01-01 03:08:45
28988.897564FalseKibana AirlinesVerona Villafranca AirportVR10VeronaIT{'lat': '45.395699', 'lon': '10.8885'}IT-34Sunny...568.351033New Chitose AirportCTSChitose / TomakomaiJP{'lat': '42.77519989', 'lon': '141.6920013'}SE-BDDamaging Wind02018-01-01 01:16:59
29511.067220FalseLogstash AirwaysZurich AirportZRHZurichCH{'lat': '47.464699', 'lon': '8.54917'}CH-ZHRain...425.889194Tulsa International AirportTULTulsaUS{'lat': '36.19839859', 'lon': '-95.88809967'}US-OKRain02018-01-01 18:00:59
..................................................................
13029795.905278FalseKibana AirlinesMalpensa International AirportMI12MilanIT{'lat': '45.6306', 'lon': '8.72811'}IT-25Sunny...534.375826Itami AirportITMOsakaJP{'lat': '34.78549957', 'lon': '135.4380035'}SE-BDSunny62018-02-11 20:10:13
13030863.388068FalseLogstash AirwaysXi'an Xianyang International AirportXIYXi'anCN{'lat': '34.447102', 'lon': '108.751999'}SE-BDDamaging Wind...141.172633Tokyo Haneda International AirportHNDTokyoJP{'lat': '35.552299', 'lon': '139.779999'}SE-BDClear62018-02-11 18:59:53
13031575.183008FalseJetBeatsSavannah Hilton Head International AirportSAVSavannahUS{'lat': '32.12760162', 'lon': '-81.20210266'}US-GAThunder & Lightning...1113.137060OR Tambo International AirportJNBJohannesburgZA{'lat': '-26.1392', 'lon': '28.246'}SE-BDHail62018-02-11 00:57:48
13032817.368952FalseJetBeatsSyracuse Hancock International AirportSYRSyracuseUS{'lat': '43.11119843', 'lon': '-76.10630035'}US-NYRain...714.964864El Dorado International AirportBOGBogotaCO{'lat': '4.70159', 'lon': '-74.1469'}CO-CUNThunder & Lightning62018-02-11 12:02:49
13033579.582455FalseES-AirTampa International AirportTPATampaUS{'lat': '27.97550011', 'lon': '-82.53320313'}US-FLRain...234.929046Jorge Chavez International AirportLIMLimaPE{'lat': '-12.0219', 'lon': '-77.114304'}SE-BDThunder & Lightning62018-02-11 02:07:40
130341004.916638FalseJetBeatsOlenya Air BaseXLMOOlenegorskRU{'lat': '68.15180206', 'lon': '33.46390152'}RU-MURClear...526.895776Gimpo International AirportGMPSeoulKR{'lat': '37.5583', 'lon': '126.791'}SE-BDSunny62018-02-11 00:35:04
13035357.562842TrueLogstash AirwaysShanghai Pudong International AirportPVGShanghaiCN{'lat': '31.14340019', 'lon': '121.8050003'}SE-BDThunder & Lightning...0.000000Shanghai Pudong International AirportPVGShanghaiCN{'lat': '31.14340019', 'lon': '121.8050003'}SE-BDThunder & Lightning62018-02-11 11:19:12
13036429.580539FalseLogstash AirwaysVenice Marco Polo AirportVE05VeniceIT{'lat': '45.505299', 'lon': '12.3519'}IT-34Sunny...150.000000Venice Marco Polo AirportVE05VeniceIT{'lat': '45.505299', 'lon': '12.3519'}IT-34Cloudy62018-02-11 15:07:11
13037729.788171TrueES-AirVienna International AirportVIEViennaAT{'lat': '48.11029816', 'lon': '16.56970024'}AT-9Rain...691.944839Ukrainka Air BaseXHBUBelogorskRU{'lat': '51.169997', 'lon': '128.445007'}RU-AMUDamaging Wind62018-02-11 10:24:42
13038564.897695FalseES-AirPisa International AirportPI05PisaIT{'lat': '43.683899', 'lon': '10.3927'}IT-52Heavy Fog...567.387339OR Tambo International AirportJNBJohannesburgZA{'lat': '-26.1392', 'lon': '28.246'}SE-BDDamaging Wind62018-02-11 00:42:06
130391014.052787FalseLogstash AirwaysVienna International AirportVIEViennaAT{'lat': '48.11029816', 'lon': '16.56970024'}AT-9Thunder & Lightning...690.092327Montreal / Pierre Elliott Trudeau Internationa...YULMontrealCA{'lat': '45.47060013', 'lon': '-73.74079895'}CA-QCThunder & Lightning62018-02-11 10:56:31
13040455.243843FalseES-AirLondon Luton AirportLTNLondonGB{'lat': '51.87469864', 'lon': '-0.368333012'}GB-ENGCloudy...3.028293London Heathrow AirportLHRLondonGB{'lat': '51.4706', 'lon': '-0.461941'}GB-ENGClear62018-02-11 00:39:37
13041611.370232FalseLogstash AirwaysJorge Chavez International AirportLIMLimaPE{'lat': '-12.0219', 'lon': '-77.114304'}SE-BDSunny...338.875531Casper-Natrona County International AirportCPRCasperUS{'lat': '42.90800095', 'lon': '-106.4639969'}US-WYRain62018-02-11 10:24:30
13042595.961285FalseJetBeatsOttawa Macdonald-Cartier International AirportYOWOttawaCA{'lat': '45.32249832', 'lon': '-75.66919708'}CA-ONClear...375.129587Frankfurt am Main AirportFRAFrankfurt am MainDE{'lat': '50.033333', 'lon': '8.570556'}DE-HEClear62018-02-11 09:02:07
13043782.747648FalseLogstash AirwaysXi'an Xianyang International AirportXIYXi'anCN{'lat': '34.447102', 'lon': '108.751999'}SE-BDClear...156.858481Tokyo Haneda International AirportHNDTokyoJP{'lat': '35.552299', 'lon': '139.779999'}SE-BDThunder & Lightning62018-02-11 04:45:06
13044891.117221FalseJetBeatsWinnipeg / James Armstrong Richardson Internat...YWGWinnipegCA{'lat': '49.90999985', 'lon': '-97.23989868'}CA-MBClear...354.106457Vienna International AirportVIEViennaAT{'lat': '48.11029816', 'lon': '16.56970024'}AT-9Thunder & Lightning62018-02-11 00:51:14
13045587.169921FalseLogstash AirwaysBrisbane International AirportBNEBrisbaneAU{'lat': '-27.38419914', 'lon': '153.1170044'}SE-BDRain...771.305442Amsterdam Airport SchipholAMSAmsterdamNL{'lat': '52.30860138', 'lon': '4.76388979'}NL-NHSunny62018-02-11 05:41:51
13046739.132165FalseLogstash AirwaysXi'an Xianyang International AirportXIYXi'anCN{'lat': '34.447102', 'lon': '108.751999'}SE-BDRain...542.955572Winnipeg / James Armstrong Richardson Internat...YWGWinnipegCA{'lat': '49.90999985', 'lon': '-97.23989868'}CA-MBHail62018-02-11 10:02:21
13047605.191876FalseJetBeatsPortland International Jetport AirportPWMPortlandUS{'lat': '43.64619827', 'lon': '-70.30930328'}US-METhunder & Lightning...564.599857Jeju International AirportCJUJeju CityKR{'lat': '33.51129913', 'lon': '126.4929962'}SE-BDCloudy62018-02-11 15:55:10
13048361.767659TrueLogstash AirwaysDubai International AirportDXBDubaiAE{'lat': '25.25279999', 'lon': '55.36439896'}SE-BDSunny...180.000000Dubai International AirportDXBDubaiAE{'lat': '25.25279999', 'lon': '55.36439896'}SE-BDHail62018-02-11 04:11:14
13049662.306992FalseES-AirWinnipeg / James Armstrong Richardson Internat...YWGWinnipegCA{'lat': '49.90999985', 'lon': '-97.23989868'}CA-MBHeavy Fog...835.954429Ministro Pistarini International AirportEZEBuenos AiresAR{'lat': '-34.8222', 'lon': '-58.5358'}AR-BSunny62018-02-11 10:13:32
13050630.779526FalseJetBeatsHelsinki Vantaa AirportHELHelsinkiFI{'lat': '60.31719971', 'lon': '24.9633007'}FI-ESSunny...451.755639Beijing Capital International AirportPEKBeijingCN{'lat': '40.08010101', 'lon': '116.5849991'}SE-BDCloudy62018-02-11 11:23:23
13051937.771279TrueLogstash AirwaysLester B. Pearson International AirportYYZTorontoCA{'lat': '43.67720032', 'lon': '-79.63059998'}CA-ONSunny...507.451571Leonardo da Vinci___Fiumicino AirportRM11RomeIT{'lat': '41.8002778', 'lon': '12.2388889'}IT-62Hail62018-02-11 01:13:50
130521085.155339FalseLogstash AirwaysMelbourne International AirportMELMelbourneAU{'lat': '-37.673302', 'lon': '144.843002'}SE-BDCloudy...1044.451122Bologna Guglielmo Marconi AirportBO08BolognaIT{'lat': '44.5354', 'lon': '11.2887'}IT-45Cloudy62018-02-11 18:35:42
130531191.964104FalseLogstash AirwaysZurich AirportZRHZurichCH{'lat': '47.464699', 'lon': '8.54917'}CH-ZHHail...728.715904Portland International Jetport AirportPWMPortlandUS{'lat': '43.64619827', 'lon': '-70.30930328'}US-MEClear62018-02-11 19:02:10
130541080.446279FalseLogstash AirwaysXi'an Xianyang International AirportXIYXi'anCN{'lat': '34.447102', 'lon': '108.751999'}SE-BDRain...402.929088Pisa International AirportPI05PisaIT{'lat': '43.683899', 'lon': '10.3927'}IT-52Sunny62018-02-11 20:42:25
13055646.612941FalseLogstash AirwaysZurich AirportZRHZurichCH{'lat': '47.464699', 'lon': '8.54917'}CH-ZHRain...644.418029Winnipeg / James Armstrong Richardson Internat...YWGWinnipegCA{'lat': '49.90999985', 'lon': '-97.23989868'}CA-MBRain62018-02-11 01:41:57
13056997.751876FalseLogstash AirwaysUkrainka Air BaseXHBUBelogorskRU{'lat': '51.169997', 'lon': '128.445007'}RU-AMURain...937.540811Licenciado Benito Juarez International AirportAICMMexico CityMX{'lat': '19.4363', 'lon': '-99.072098'}MX-DIFSunny62018-02-11 04:09:27
130571102.814465FalseJetBeatsMinistro Pistarini International AirportEZEBuenos AiresAR{'lat': '-34.8222', 'lon': '-58.5358'}SE-BDHail...1697.404971Itami AirportITMOsakaJP{'lat': '34.78549957', 'lon': '135.4380035'}SE-BDHail62018-02-11 08:28:21
13058858.144337FalseJetBeatsWashington Dulles International AirportIADWashingtonUS{'lat': '38.94449997', 'lon': '-77.45580292'}US-DCHeavy Fog...1610.761827Adelaide International AirportADLAdelaideAU{'lat': '-34.945', 'lon': '138.531006'}SE-BDRain62018-02-11 14:54:34
\n", - "

13059 rows × 27 columns

\n", - "
" - ], - "text/plain": [ - " AvgTicketPrice Cancelled Carrier \\\n", - "0 841.265642 False Kibana Airlines \n", - "1 882.982662 False Logstash Airways \n", - "2 190.636904 False Logstash Airways \n", - "3 181.694216 True Kibana Airlines \n", - "4 730.041778 False Kibana Airlines \n", - "5 418.152089 False JetBeats \n", - "6 180.246816 False JetBeats \n", - "7 585.184310 False Kibana Airlines \n", - "8 960.869736 True Kibana Airlines \n", - "9 296.877773 False Logstash Airways \n", - "10 906.437948 False JetBeats \n", - "11 704.463771 False Logstash Airways \n", - "12 922.499077 True Logstash Airways \n", - "13 374.959276 False Logstash Airways \n", - "14 552.917371 False Logstash Airways \n", - "15 566.487557 True Kibana Airlines \n", - "16 989.952787 True Logstash Airways \n", - "17 569.613255 False ES-Air \n", - "18 277.429707 False ES-Air \n", - "19 772.100846 False JetBeats \n", - "20 167.599922 False JetBeats \n", - "21 253.210065 False ES-Air \n", - "22 917.247620 False JetBeats \n", - "23 451.591176 False Logstash Airways \n", - "24 307.067201 False Logstash Airways \n", - "25 268.241596 False ES-Air \n", - "26 975.812632 True Kibana Airlines \n", - "27 134.214546 False JetBeats \n", - "28 988.897564 False Kibana Airlines \n", - "29 511.067220 False Logstash Airways \n", - "... ... ... ... \n", - "13029 795.905278 False Kibana Airlines \n", - "13030 863.388068 False Logstash Airways \n", - "13031 575.183008 False JetBeats \n", - "13032 817.368952 False JetBeats \n", - "13033 579.582455 False ES-Air \n", - "13034 1004.916638 False JetBeats \n", - "13035 357.562842 True Logstash Airways \n", - "13036 429.580539 False Logstash Airways \n", - "13037 729.788171 True ES-Air \n", - "13038 564.897695 False ES-Air \n", - "13039 1014.052787 False Logstash Airways \n", - "13040 455.243843 False ES-Air \n", - "13041 611.370232 False Logstash Airways \n", - "13042 595.961285 False JetBeats \n", - "13043 782.747648 False Logstash Airways \n", - "13044 891.117221 False JetBeats \n", - "13045 587.169921 False Logstash Airways \n", - "13046 739.132165 False Logstash Airways \n", - "13047 605.191876 False JetBeats \n", - "13048 361.767659 True Logstash Airways \n", - "13049 662.306992 False ES-Air \n", - "13050 630.779526 False JetBeats \n", - "13051 937.771279 True Logstash Airways \n", - "13052 1085.155339 False Logstash Airways \n", - "13053 1191.964104 False Logstash Airways \n", - "13054 1080.446279 False Logstash Airways \n", - "13055 646.612941 False Logstash Airways \n", - "13056 997.751876 False Logstash Airways \n", - "13057 1102.814465 False JetBeats \n", - "13058 858.144337 False JetBeats \n", - "\n", - " Dest DestAirportID \\\n", - "0 Sydney Kingsford Smith International Airport SYD \n", - "1 Venice Marco Polo Airport VE05 \n", - "2 Venice Marco Polo Airport VE05 \n", - "3 Treviso-Sant'Angelo Airport TV01 \n", - "4 Xi'an Xianyang International Airport XIY \n", - "5 Genoa Cristoforo Colombo Airport GE01 \n", - "6 Zurich Airport ZRH \n", - "7 Ottawa Macdonald-Cartier International Airport YOW \n", - "8 Rajiv Gandhi International Airport HYD \n", - "9 Treviso-Sant'Angelo Airport TV01 \n", - "10 Helsinki Vantaa Airport HEL \n", - "11 Vienna International Airport VIE \n", - "12 Shanghai Pudong International Airport PVG \n", - "13 Ottawa Macdonald-Cartier International Airport YOW \n", - "14 Luis Munoz Marin International Airport SJU \n", - "15 Cologne Bonn Airport CGN \n", - "16 Venice Marco Polo Airport VE05 \n", - "17 Ministro Pistarini International Airport EZE \n", - "18 Shanghai Pudong International Airport PVG \n", - "19 Indira Gandhi International Airport DEL \n", - "20 Wichita Mid Continent Airport ICT \n", - "21 Ottawa Macdonald-Cartier International Airport YOW \n", - "22 Itami Airport ITM \n", - "23 Vienna International Airport VIE \n", - "24 Charles de Gaulle International Airport CDG \n", - "25 Narita International Airport NRT \n", - "26 Itami Airport ITM \n", - "27 San Diego International Airport SAN \n", - "28 Verona Villafranca Airport VR10 \n", - "29 Zurich Airport ZRH \n", - "... ... ... \n", - "13029 Malpensa International Airport MI12 \n", - "13030 Xi'an Xianyang International Airport XIY \n", - "13031 Savannah Hilton Head International Airport SAV \n", - "13032 Syracuse Hancock International Airport SYR \n", - "13033 Tampa International Airport TPA \n", - "13034 Olenya Air Base XLMO \n", - "13035 Shanghai Pudong International Airport PVG \n", - "13036 Venice Marco Polo Airport VE05 \n", - "13037 Vienna International Airport VIE \n", - "13038 Pisa International Airport PI05 \n", - "13039 Vienna International Airport VIE \n", - "13040 London Luton Airport LTN \n", - "13041 Jorge Chavez International Airport LIM \n", - "13042 Ottawa Macdonald-Cartier International Airport YOW \n", - "13043 Xi'an Xianyang International Airport XIY \n", - "13044 Winnipeg / James Armstrong Richardson Internat... YWG \n", - "13045 Brisbane International Airport BNE \n", - "13046 Xi'an Xianyang International Airport XIY \n", - "13047 Portland International Jetport Airport PWM \n", - "13048 Dubai International Airport DXB \n", - "13049 Winnipeg / James Armstrong Richardson Internat... YWG \n", - "13050 Helsinki Vantaa Airport HEL \n", - "13051 Lester B. Pearson International Airport YYZ \n", - "13052 Melbourne International Airport MEL \n", - "13053 Zurich Airport ZRH \n", - "13054 Xi'an Xianyang International Airport XIY \n", - "13055 Zurich Airport ZRH \n", - "13056 Ukrainka Air Base XHBU \n", - "13057 Ministro Pistarini International Airport EZE \n", - "13058 Washington Dulles International Airport IAD \n", - "\n", - " DestCityName DestCountry \\\n", - "0 Sydney AU \n", - "1 Venice IT \n", - "2 Venice IT \n", - "3 Treviso IT \n", - "4 Xi'an CN \n", - "5 Genova IT \n", - "6 Zurich CH \n", - "7 Ottawa CA \n", - "8 Hyderabad IN \n", - "9 Treviso IT \n", - "10 Helsinki FI \n", - "11 Vienna AT \n", - "12 Shanghai CN \n", - "13 Ottawa CA \n", - "14 San Juan PR \n", - "15 Cologne DE \n", - "16 Venice IT \n", - "17 Buenos Aires AR \n", - "18 Shanghai CN \n", - "19 New Delhi IN \n", - "20 Wichita US \n", - "21 Ottawa CA \n", - "22 Osaka JP \n", - "23 Vienna AT \n", - "24 Paris FR \n", - "25 Tokyo JP \n", - "26 Osaka JP \n", - "27 San Diego US \n", - "28 Verona IT \n", - "29 Zurich CH \n", - "... ... ... \n", - "13029 Milan IT \n", - "13030 Xi'an CN \n", - "13031 Savannah US \n", - "13032 Syracuse US \n", - "13033 Tampa US \n", - "13034 Olenegorsk RU \n", - "13035 Shanghai CN \n", - "13036 Venice IT \n", - "13037 Vienna AT \n", - "13038 Pisa IT \n", - "13039 Vienna AT \n", - "13040 London GB \n", - "13041 Lima PE \n", - "13042 Ottawa CA \n", - "13043 Xi'an CN \n", - "13044 Winnipeg CA \n", - "13045 Brisbane AU \n", - "13046 Xi'an CN \n", - "13047 Portland US \n", - "13048 Dubai AE \n", - "13049 Winnipeg CA \n", - "13050 Helsinki FI \n", - "13051 Toronto CA \n", - "13052 Melbourne AU \n", - "13053 Zurich CH \n", - "13054 Xi'an CN \n", - "13055 Zurich CH \n", - "13056 Belogorsk RU \n", - "13057 Buenos Aires AR \n", - "13058 Washington US \n", - "\n", - " DestLocation DestRegion \\\n", - "0 {'lat': '-33.94609833', 'lon': '151.177002'} SE-BD \n", - "1 {'lat': '45.505299', 'lon': '12.3519'} IT-34 \n", - "2 {'lat': '45.505299', 'lon': '12.3519'} IT-34 \n", - "3 {'lat': '45.648399', 'lon': '12.1944'} IT-34 \n", - "4 {'lat': '34.447102', 'lon': '108.751999'} SE-BD \n", - "5 {'lat': '44.4133', 'lon': '8.8375'} IT-42 \n", - "6 {'lat': '47.464699', 'lon': '8.54917'} CH-ZH \n", - "7 {'lat': '45.32249832', 'lon': '-75.66919708'} CA-ON \n", - "8 {'lat': '17.23131752', 'lon': '78.42985535'} SE-BD \n", - "9 {'lat': '45.648399', 'lon': '12.1944'} IT-34 \n", - "10 {'lat': '60.31719971', 'lon': '24.9633007'} FI-ES \n", - "11 {'lat': '48.11029816', 'lon': '16.56970024'} AT-9 \n", - "12 {'lat': '31.14340019', 'lon': '121.8050003'} SE-BD \n", - "13 {'lat': '45.32249832', 'lon': '-75.66919708'} CA-ON \n", - "14 {'lat': '18.43939972', 'lon': '-66.00180054'} PR-U-A \n", - "15 {'lat': '50.86589813', 'lon': '7.142739773'} DE-NW \n", - "16 {'lat': '45.505299', 'lon': '12.3519'} IT-34 \n", - "17 {'lat': '-34.8222', 'lon': '-58.5358'} SE-BD \n", - "18 {'lat': '31.14340019', 'lon': '121.8050003'} SE-BD \n", - "19 {'lat': '28.5665', 'lon': '77.103104'} SE-BD \n", - "20 {'lat': '37.64989853', 'lon': '-97.43309784'} US-KS \n", - "21 {'lat': '45.32249832', 'lon': '-75.66919708'} CA-ON \n", - "22 {'lat': '34.78549957', 'lon': '135.4380035'} SE-BD \n", - "23 {'lat': '48.11029816', 'lon': '16.56970024'} AT-9 \n", - "24 {'lat': '49.01279831', 'lon': '2.549999952'} FR-J \n", - "25 {'lat': '35.76470184', 'lon': '140.3860016'} SE-BD \n", - "26 {'lat': '34.78549957', 'lon': '135.4380035'} SE-BD \n", - "27 {'lat': '32.73360062', 'lon': '-117.1900024'} US-CA \n", - "28 {'lat': '45.395699', 'lon': '10.8885'} IT-34 \n", - "29 {'lat': '47.464699', 'lon': '8.54917'} CH-ZH \n", - "... ... ... \n", - "13029 {'lat': '45.6306', 'lon': '8.72811'} IT-25 \n", - "13030 {'lat': '34.447102', 'lon': '108.751999'} SE-BD \n", - "13031 {'lat': '32.12760162', 'lon': '-81.20210266'} US-GA \n", - "13032 {'lat': '43.11119843', 'lon': '-76.10630035'} US-NY \n", - "13033 {'lat': '27.97550011', 'lon': '-82.53320313'} US-FL \n", - "13034 {'lat': '68.15180206', 'lon': '33.46390152'} RU-MUR \n", - "13035 {'lat': '31.14340019', 'lon': '121.8050003'} SE-BD \n", - "13036 {'lat': '45.505299', 'lon': '12.3519'} IT-34 \n", - "13037 {'lat': '48.11029816', 'lon': '16.56970024'} AT-9 \n", - "13038 {'lat': '43.683899', 'lon': '10.3927'} IT-52 \n", - "13039 {'lat': '48.11029816', 'lon': '16.56970024'} AT-9 \n", - "13040 {'lat': '51.87469864', 'lon': '-0.368333012'} GB-ENG \n", - "13041 {'lat': '-12.0219', 'lon': '-77.114304'} SE-BD \n", - "13042 {'lat': '45.32249832', 'lon': '-75.66919708'} CA-ON \n", - "13043 {'lat': '34.447102', 'lon': '108.751999'} SE-BD \n", - "13044 {'lat': '49.90999985', 'lon': '-97.23989868'} CA-MB \n", - "13045 {'lat': '-27.38419914', 'lon': '153.1170044'} SE-BD \n", - "13046 {'lat': '34.447102', 'lon': '108.751999'} SE-BD \n", - "13047 {'lat': '43.64619827', 'lon': '-70.30930328'} US-ME \n", - "13048 {'lat': '25.25279999', 'lon': '55.36439896'} SE-BD \n", - "13049 {'lat': '49.90999985', 'lon': '-97.23989868'} CA-MB \n", - "13050 {'lat': '60.31719971', 'lon': '24.9633007'} FI-ES \n", - "13051 {'lat': '43.67720032', 'lon': '-79.63059998'} CA-ON \n", - "13052 {'lat': '-37.673302', 'lon': '144.843002'} SE-BD \n", - "13053 {'lat': '47.464699', 'lon': '8.54917'} CH-ZH \n", - "13054 {'lat': '34.447102', 'lon': '108.751999'} SE-BD \n", - "13055 {'lat': '47.464699', 'lon': '8.54917'} CH-ZH \n", - "13056 {'lat': '51.169997', 'lon': '128.445007'} RU-AMU \n", - "13057 {'lat': '-34.8222', 'lon': '-58.5358'} SE-BD \n", - "13058 {'lat': '38.94449997', 'lon': '-77.45580292'} US-DC \n", - "\n", - " DestWeather ... FlightTimeMin \\\n", - "0 Rain ... 1030.770416 \n", - "1 Sunny ... 464.389481 \n", - "2 Cloudy ... 0.000000 \n", - "3 Clear ... 222.749059 \n", - "4 Clear ... 785.779071 \n", - "5 Thunder & Lightning ... 393.590441 \n", - "6 Hail ... 300.000000 \n", - "7 Clear ... 614.942480 \n", - "8 Cloudy ... 602.030591 \n", - "9 Rain ... 174.822216 \n", - "10 Rain ... 503.045170 \n", - "11 Cloudy ... 36.075018 \n", - "12 Clear ... 679.768391 \n", - "13 Rain ... 330.418282 \n", - "14 Clear ... 407.145031 \n", - "15 Sunny ... 656.712658 \n", - "16 Damaging Wind ... 773.030334 \n", - "17 Cloudy ... 704.716920 \n", - "18 Clear ... 355.957996 \n", - "19 Clear ... 875.114675 \n", - "20 Clear ... 373.966883 \n", - "21 Hail ... 130.667700 \n", - "22 Damaging Wind ... 574.495310 \n", - "23 Heavy Fog ... 579.728943 \n", - "24 Clear ... 50.157229 \n", - "25 Rain ... 527.567422 \n", - "26 Hail ... 386.259764 \n", - "27 Clear ... 24.479650 \n", - "28 Sunny ... 568.351033 \n", - "29 Rain ... 425.889194 \n", - "... ... ... ... \n", - "13029 Sunny ... 534.375826 \n", - "13030 Damaging Wind ... 141.172633 \n", - "13031 Thunder & Lightning ... 1113.137060 \n", - "13032 Rain ... 714.964864 \n", - "13033 Rain ... 234.929046 \n", - "13034 Clear ... 526.895776 \n", - "13035 Thunder & Lightning ... 0.000000 \n", - "13036 Sunny ... 150.000000 \n", - "13037 Rain ... 691.944839 \n", - "13038 Heavy Fog ... 567.387339 \n", - "13039 Thunder & Lightning ... 690.092327 \n", - "13040 Cloudy ... 3.028293 \n", - "13041 Sunny ... 338.875531 \n", - "13042 Clear ... 375.129587 \n", - "13043 Clear ... 156.858481 \n", - "13044 Clear ... 354.106457 \n", - "13045 Rain ... 771.305442 \n", - "13046 Rain ... 542.955572 \n", - "13047 Thunder & Lightning ... 564.599857 \n", - "13048 Sunny ... 180.000000 \n", - "13049 Heavy Fog ... 835.954429 \n", - "13050 Sunny ... 451.755639 \n", - "13051 Sunny ... 507.451571 \n", - "13052 Cloudy ... 1044.451122 \n", - "13053 Hail ... 728.715904 \n", - "13054 Rain ... 402.929088 \n", - "13055 Rain ... 644.418029 \n", - "13056 Rain ... 937.540811 \n", - "13057 Hail ... 1697.404971 \n", - "13058 Heavy Fog ... 1610.761827 \n", - "\n", - " Origin OriginAirportID \\\n", - "0 Frankfurt am Main Airport FRA \n", - "1 Cape Town International Airport CPT \n", - "2 Venice Marco Polo Airport VE05 \n", - "3 Naples International Airport NA01 \n", - "4 Licenciado Benito Juarez International Airport AICM \n", - "5 Edmonton International Airport CYEG \n", - "6 Zurich Airport ZRH \n", - "7 Ciampino___G. B. Pastine International Airport RM12 \n", - "8 Milano Linate Airport MI11 \n", - "9 Sheremetyevo International Airport SVO \n", - "10 Albuquerque International Sunport Airport ABQ \n", - "11 Venice Marco Polo Airport VE05 \n", - "12 Licenciado Benito Juarez International Airport AICM \n", - "13 Naples International Airport NA01 \n", - "14 Ciampino___G. B. Pastine International Airport RM12 \n", - "15 Chengdu Shuangliu International Airport CTU \n", - "16 Licenciado Benito Juarez International Airport AICM \n", - "17 Cleveland Hopkins International Airport CLE \n", - "18 Olenya Air Base XLMO \n", - "19 Casper-Natrona County International Airport CPR \n", - "20 Erie International Tom Ridge Field ERI \n", - "21 Newark Liberty International Airport EWR \n", - "22 Copenhagen Kastrup Airport CPH \n", - "23 Seattle Tacoma International Airport SEA \n", - "24 Berlin-Tegel Airport TXL \n", - "25 Manchester Airport MAN \n", - "26 Helsinki Vantaa Airport HEL \n", - "27 Phoenix Sky Harbor International Airport PHX \n", - "28 New Chitose Airport CTS \n", - "29 Tulsa International Airport TUL \n", - "... ... ... \n", - "13029 Itami Airport ITM \n", - "13030 Tokyo Haneda International Airport HND \n", - "13031 OR Tambo International Airport JNB \n", - "13032 El Dorado International Airport BOG \n", - "13033 Jorge Chavez International Airport LIM \n", - "13034 Gimpo International Airport GMP \n", - "13035 Shanghai Pudong International Airport PVG \n", - "13036 Venice Marco Polo Airport VE05 \n", - "13037 Ukrainka Air Base XHBU \n", - "13038 OR Tambo International Airport JNB \n", - "13039 Montreal / Pierre Elliott Trudeau Internationa... YUL \n", - "13040 London Heathrow Airport LHR \n", - "13041 Casper-Natrona County International Airport CPR \n", - "13042 Frankfurt am Main Airport FRA \n", - "13043 Tokyo Haneda International Airport HND \n", - "13044 Vienna International Airport VIE \n", - "13045 Amsterdam Airport Schiphol AMS \n", - "13046 Winnipeg / James Armstrong Richardson Internat... YWG \n", - "13047 Jeju International Airport CJU \n", - "13048 Dubai International Airport DXB \n", - "13049 Ministro Pistarini International Airport EZE \n", - "13050 Beijing Capital International Airport PEK \n", - "13051 Leonardo da Vinci___Fiumicino Airport RM11 \n", - "13052 Bologna Guglielmo Marconi Airport BO08 \n", - "13053 Portland International Jetport Airport PWM \n", - "13054 Pisa International Airport PI05 \n", - "13055 Winnipeg / James Armstrong Richardson Internat... YWG \n", - "13056 Licenciado Benito Juarez International Airport AICM \n", - "13057 Itami Airport ITM \n", - "13058 Adelaide International Airport ADL \n", - "\n", - " OriginCityName OriginCountry \\\n", - "0 Frankfurt am Main DE \n", - "1 Cape Town ZA \n", - "2 Venice IT \n", - "3 Naples IT \n", - "4 Mexico City MX \n", - "5 Edmonton CA \n", - "6 Zurich CH \n", - "7 Rome IT \n", - "8 Milan IT \n", - "9 Moscow RU \n", - "10 Albuquerque US \n", - "11 Venice IT \n", - "12 Mexico City MX \n", - "13 Naples IT \n", - "14 Rome IT \n", - "15 Chengdu CN \n", - "16 Mexico City MX \n", - "17 Cleveland US \n", - "18 Olenegorsk RU \n", - "19 Casper US \n", - "20 Erie US \n", - "21 Newark US \n", - "22 Copenhagen DK \n", - "23 Seattle US \n", - "24 Berlin DE \n", - "25 Manchester GB \n", - "26 Helsinki FI \n", - "27 Phoenix US \n", - "28 Chitose / Tomakomai JP \n", - "29 Tulsa US \n", - "... ... ... \n", - "13029 Osaka JP \n", - "13030 Tokyo JP \n", - "13031 Johannesburg ZA \n", - "13032 Bogota CO \n", - "13033 Lima PE \n", - "13034 Seoul KR \n", - "13035 Shanghai CN \n", - "13036 Venice IT \n", - "13037 Belogorsk RU \n", - "13038 Johannesburg ZA \n", - "13039 Montreal CA \n", - "13040 London GB \n", - "13041 Casper US \n", - "13042 Frankfurt am Main DE \n", - "13043 Tokyo JP \n", - "13044 Vienna AT \n", - "13045 Amsterdam NL \n", - "13046 Winnipeg CA \n", - "13047 Jeju City KR \n", - "13048 Dubai AE \n", - "13049 Buenos Aires AR \n", - "13050 Beijing CN \n", - "13051 Rome IT \n", - "13052 Bologna IT \n", - "13053 Portland US \n", - "13054 Pisa IT \n", - "13055 Winnipeg CA \n", - "13056 Mexico City MX \n", - "13057 Osaka JP \n", - "13058 Adelaide AU \n", - "\n", - " OriginLocation OriginRegion \\\n", - "0 {'lat': '50.033333', 'lon': '8.570556'} DE-HE \n", - "1 {'lat': '-33.96480179', 'lon': '18.60169983'} SE-BD \n", - "2 {'lat': '45.505299', 'lon': '12.3519'} IT-34 \n", - "3 {'lat': '40.886002', 'lon': '14.2908'} IT-72 \n", - "4 {'lat': '19.4363', 'lon': '-99.072098'} MX-DIF \n", - "5 {'lat': '53.30970001', 'lon': '-113.5800018'} CA-AB \n", - "6 {'lat': '47.464699', 'lon': '8.54917'} CH-ZH \n", - "7 {'lat': '41.7994', 'lon': '12.5949'} IT-62 \n", - "8 {'lat': '45.445099', 'lon': '9.27674'} IT-25 \n", - "9 {'lat': '55.972599', 'lon': '37.4146'} RU-MOS \n", - "10 {'lat': '35.040199', 'lon': '-106.609001'} US-NM \n", - "11 {'lat': '45.505299', 'lon': '12.3519'} IT-34 \n", - "12 {'lat': '19.4363', 'lon': '-99.072098'} MX-DIF \n", - "13 {'lat': '40.886002', 'lon': '14.2908'} IT-72 \n", - "14 {'lat': '41.7994', 'lon': '12.5949'} IT-62 \n", - "15 {'lat': '30.57850075', 'lon': '103.9469986'} SE-BD \n", - "16 {'lat': '19.4363', 'lon': '-99.072098'} MX-DIF \n", - "17 {'lat': '41.4117012', 'lon': '-81.84980011'} US-OH \n", - "18 {'lat': '68.15180206', 'lon': '33.46390152'} RU-MUR \n", - "19 {'lat': '42.90800095', 'lon': '-106.4639969'} US-WY \n", - "20 {'lat': '42.08312701', 'lon': '-80.17386675'} US-PA \n", - "21 {'lat': '40.69250107', 'lon': '-74.16870117'} US-NJ \n", - "22 {'lat': '55.61790085', 'lon': '12.65600014'} DK-84 \n", - "23 {'lat': '47.44900131', 'lon': '-122.3089981'} US-WA \n", - "24 {'lat': '52.5597', 'lon': '13.2877'} DE-BE \n", - "25 {'lat': '53.35369873', 'lon': '-2.274950027'} GB-ENG \n", - "26 {'lat': '60.31719971', 'lon': '24.9633007'} FI-ES \n", - "27 {'lat': '33.43429947', 'lon': '-112.012001'} US-AZ \n", - "28 {'lat': '42.77519989', 'lon': '141.6920013'} SE-BD \n", - "29 {'lat': '36.19839859', 'lon': '-95.88809967'} US-OK \n", - "... ... ... \n", - "13029 {'lat': '34.78549957', 'lon': '135.4380035'} SE-BD \n", - "13030 {'lat': '35.552299', 'lon': '139.779999'} SE-BD \n", - "13031 {'lat': '-26.1392', 'lon': '28.246'} SE-BD \n", - "13032 {'lat': '4.70159', 'lon': '-74.1469'} CO-CUN \n", - "13033 {'lat': '-12.0219', 'lon': '-77.114304'} SE-BD \n", - "13034 {'lat': '37.5583', 'lon': '126.791'} SE-BD \n", - "13035 {'lat': '31.14340019', 'lon': '121.8050003'} SE-BD \n", - "13036 {'lat': '45.505299', 'lon': '12.3519'} IT-34 \n", - "13037 {'lat': '51.169997', 'lon': '128.445007'} RU-AMU \n", - "13038 {'lat': '-26.1392', 'lon': '28.246'} SE-BD \n", - "13039 {'lat': '45.47060013', 'lon': '-73.74079895'} CA-QC \n", - "13040 {'lat': '51.4706', 'lon': '-0.461941'} GB-ENG \n", - "13041 {'lat': '42.90800095', 'lon': '-106.4639969'} US-WY \n", - "13042 {'lat': '50.033333', 'lon': '8.570556'} DE-HE \n", - "13043 {'lat': '35.552299', 'lon': '139.779999'} SE-BD \n", - "13044 {'lat': '48.11029816', 'lon': '16.56970024'} AT-9 \n", - "13045 {'lat': '52.30860138', 'lon': '4.76388979'} NL-NH \n", - "13046 {'lat': '49.90999985', 'lon': '-97.23989868'} CA-MB \n", - "13047 {'lat': '33.51129913', 'lon': '126.4929962'} SE-BD \n", - "13048 {'lat': '25.25279999', 'lon': '55.36439896'} SE-BD \n", - "13049 {'lat': '-34.8222', 'lon': '-58.5358'} AR-B \n", - "13050 {'lat': '40.08010101', 'lon': '116.5849991'} SE-BD \n", - "13051 {'lat': '41.8002778', 'lon': '12.2388889'} IT-62 \n", - "13052 {'lat': '44.5354', 'lon': '11.2887'} IT-45 \n", - "13053 {'lat': '43.64619827', 'lon': '-70.30930328'} US-ME \n", - "13054 {'lat': '43.683899', 'lon': '10.3927'} IT-52 \n", - "13055 {'lat': '49.90999985', 'lon': '-97.23989868'} CA-MB \n", - "13056 {'lat': '19.4363', 'lon': '-99.072098'} MX-DIF \n", - "13057 {'lat': '34.78549957', 'lon': '135.4380035'} SE-BD \n", - "13058 {'lat': '-34.945', 'lon': '138.531006'} SE-BD \n", - "\n", - " OriginWeather dayOfWeek timestamp \n", - "0 Sunny 0 2018-01-01 00:00:00 \n", - "1 Clear 0 2018-01-01 18:27:00 \n", - "2 Rain 0 2018-01-01 17:11:14 \n", - "3 Thunder & Lightning 0 2018-01-01 10:33:28 \n", - "4 Damaging Wind 0 2018-01-01 05:13:00 \n", - "5 Rain 0 2018-01-01 01:43:03 \n", - "6 Clear 0 2018-01-01 13:49:53 \n", - "7 Thunder & Lightning 0 2018-01-01 04:54:59 \n", - "8 Heavy Fog 0 2018-01-01 12:09:35 \n", - "9 Cloudy 0 2018-01-01 12:09:35 \n", - "10 Rain 0 2018-01-01 22:06:14 \n", - "11 Rain 0 2018-01-01 11:52:34 \n", - "12 Heavy Fog 0 2018-01-01 02:13:46 \n", - "13 Rain 0 2018-01-01 14:21:13 \n", - "14 Cloudy 0 2018-01-01 17:42:53 \n", - "15 Thunder & Lightning 0 2018-01-01 19:55:32 \n", - "16 Thunder & Lightning 0 2018-01-01 07:49:27 \n", - "17 Rain 0 2018-01-01 01:30:47 \n", - "18 Hail 0 2018-01-01 07:58:17 \n", - "19 Cloudy 0 2018-01-01 00:02:06 \n", - "20 Cloudy 0 2018-01-01 01:08:20 \n", - "21 Clear 0 2018-01-01 01:08:20 \n", - "22 Sunny 0 2018-01-01 07:48:35 \n", - "23 Heavy Fog 0 2018-01-01 18:57:21 \n", - "24 Rain 0 2018-01-01 13:18:25 \n", - "25 Thunder & Lightning 0 2018-01-01 08:20:35 \n", - "26 Rain 0 2018-01-01 15:38:32 \n", - "27 Clear 0 2018-01-01 03:08:45 \n", - "28 Damaging Wind 0 2018-01-01 01:16:59 \n", - "29 Rain 0 2018-01-01 18:00:59 \n", - "... ... ... ... \n", - "13029 Sunny 6 2018-02-11 20:10:13 \n", - "13030 Clear 6 2018-02-11 18:59:53 \n", - "13031 Hail 6 2018-02-11 00:57:48 \n", - "13032 Thunder & Lightning 6 2018-02-11 12:02:49 \n", - "13033 Thunder & Lightning 6 2018-02-11 02:07:40 \n", - "13034 Sunny 6 2018-02-11 00:35:04 \n", - "13035 Thunder & Lightning 6 2018-02-11 11:19:12 \n", - "13036 Cloudy 6 2018-02-11 15:07:11 \n", - "13037 Damaging Wind 6 2018-02-11 10:24:42 \n", - "13038 Damaging Wind 6 2018-02-11 00:42:06 \n", - "13039 Thunder & Lightning 6 2018-02-11 10:56:31 \n", - "13040 Clear 6 2018-02-11 00:39:37 \n", - "13041 Rain 6 2018-02-11 10:24:30 \n", - "13042 Clear 6 2018-02-11 09:02:07 \n", - "13043 Thunder & Lightning 6 2018-02-11 04:45:06 \n", - "13044 Thunder & Lightning 6 2018-02-11 00:51:14 \n", - "13045 Sunny 6 2018-02-11 05:41:51 \n", - "13046 Hail 6 2018-02-11 10:02:21 \n", - "13047 Cloudy 6 2018-02-11 15:55:10 \n", - "13048 Hail 6 2018-02-11 04:11:14 \n", - "13049 Sunny 6 2018-02-11 10:13:32 \n", - "13050 Cloudy 6 2018-02-11 11:23:23 \n", - "13051 Hail 6 2018-02-11 01:13:50 \n", - "13052 Cloudy 6 2018-02-11 18:35:42 \n", - "13053 Clear 6 2018-02-11 19:02:10 \n", - "13054 Sunny 6 2018-02-11 20:42:25 \n", - "13055 Rain 6 2018-02-11 01:41:57 \n", - "13056 Sunny 6 2018-02-11 04:09:27 \n", - "13057 Hail 6 2018-02-11 08:28:21 \n", - "13058 Rain 6 2018-02-11 14:54:34 \n", - "\n", - "[13059 rows x 27 columns]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd_flights" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "Create `eland` DataFrame (pandas-like DataFrame backed by Elasticsearch rather than pandas incore memory structures)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "import eland as ed" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "ed_flights = ed.read_es(\"localhost\", \"flights\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Alternative Constructors" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "from elasticsearch import Elasticsearch\n", - "\n", - "es = Elasticsearch([\n", - " {'host': 'localhost', 'port': 9200, 'use_ssl': False}, # full range of connection options\n", - "])\n", - "\n", - "ed_ecommerce = ed.read_es(es, 'ecommerce')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Explore `eland` DataFrame" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Index: 13059 entries, 0 to 13058\n", - "Data columns (total 27 columns):\n", - "AvgTicketPrice 13059 non-null float64\n", - "Cancelled 13059 non-null bool\n", - "Carrier 13059 non-null object\n", - "Dest 13059 non-null object\n", - "DestAirportID 13059 non-null object\n", - "DestCityName 13059 non-null object\n", - "DestCountry 13059 non-null object\n", - "DestLocation 13059 non-null object\n", - "DestRegion 13059 non-null object\n", - "DestWeather 13059 non-null object\n", - "DistanceKilometers 13059 non-null float64\n", - "DistanceMiles 13059 non-null float64\n", - "FlightDelay 13059 non-null bool\n", - "FlightDelayMin 13059 non-null int64\n", - "FlightDelayType 13059 non-null object\n", - "FlightNum 13059 non-null object\n", - "FlightTimeHour 13059 non-null float64\n", - "FlightTimeMin 13059 non-null float64\n", - "Origin 13059 non-null object\n", - "OriginAirportID 13059 non-null object\n", - "OriginCityName 13059 non-null object\n", - "OriginCountry 13059 non-null object\n", - "OriginLocation 13059 non-null object\n", - "OriginRegion 13059 non-null object\n", - "OriginWeather 13059 non-null object\n", - "dayOfWeek 13059 non-null int64\n", - "timestamp 13059 non-null datetime64[ns]\n", - "dtypes: bool(2), datetime64[ns](1), float64(5), int64(2), object(17)\n", - "memory usage: 80.0 bytes\n" - ] - } - ], - "source": [ - "ed_flights.info()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
AvgTicketPriceCancelledDistanceKilometersDistanceMilesFlightDelayFlightDelayMinFlightTimeHourFlightTimeMindayOfWeek
count13059.00000013059.00000013059.00000013059.00000013059.00000013059.00000013059.00000013059.00000013059.000000
mean628.2536890.1284947092.1424574406.8530100.25116847.3351718.518797511.1278422.835975
std266.3866610.3346394578.2631932844.8008550.43368596.7430065.579019334.7411351.939365
min100.0205310.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000
25%410.0127980.0000002470.5459741535.1261180.0000000.0000004.201069252.0641621.000000
50%640.3872850.0000007612.0724034729.9224700.0000000.0000008.385816503.1489753.000000
75%842.2549900.0000009735.6604636049.5833890.84051715.00000012.010290720.5791744.256329
max1199.7290041.00000019881.48242212353.7802731.000000360.00000031.7150341902.9019786.000000
\n", - "
" - ], - "text/plain": [ - " AvgTicketPrice Cancelled DistanceKilometers DistanceMiles \\\n", - "count 13059.000000 13059.000000 13059.000000 13059.000000 \n", - "mean 628.253689 0.128494 7092.142457 4406.853010 \n", - "std 266.386661 0.334639 4578.263193 2844.800855 \n", - "min 100.020531 0.000000 0.000000 0.000000 \n", - "25% 410.012798 0.000000 2470.545974 1535.126118 \n", - "50% 640.387285 0.000000 7612.072403 4729.922470 \n", - "75% 842.254990 0.000000 9735.660463 6049.583389 \n", - "max 1199.729004 1.000000 19881.482422 12353.780273 \n", - "\n", - " FlightDelay FlightDelayMin FlightTimeHour FlightTimeMin \\\n", - "count 13059.000000 13059.000000 13059.000000 13059.000000 \n", - "mean 0.251168 47.335171 8.518797 511.127842 \n", - "std 0.433685 96.743006 5.579019 334.741135 \n", - "min 0.000000 0.000000 0.000000 0.000000 \n", - "25% 0.000000 0.000000 4.201069 252.064162 \n", - "50% 0.000000 0.000000 8.385816 503.148975 \n", - "75% 0.840517 15.000000 12.010290 720.579174 \n", - "max 1.000000 360.000000 31.715034 1902.901978 \n", - "\n", - " dayOfWeek \n", - "count 13059.000000 \n", - "mean 2.835975 \n", - "std 1.939365 \n", - "min 0.000000 \n", - "25% 1.000000 \n", - "50% 3.000000 \n", - "75% 4.256329 \n", - "max 6.000000 " - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ed_flights.describe()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
AvgTicketPriceCancelledCarrierDestDestAirportIDDestCityNameDestCountryDestLocationDestRegionDestWeather...FlightTimeMinOriginOriginAirportIDOriginCityNameOriginCountryOriginLocationOriginRegionOriginWeatherdayOfWeektimestamp
0841.265642FalseKibana AirlinesSydney Kingsford Smith International AirportSYDSydneyAU{'lat': '-33.94609833', 'lon': '151.177002'}SE-BDRain...1030.770416Frankfurt am Main AirportFRAFrankfurt am MainDE{'lat': '50.033333', 'lon': '8.570556'}DE-HESunny02018-01-01 00:00:00
1882.982662FalseLogstash AirwaysVenice Marco Polo AirportVE05VeniceIT{'lat': '45.505299', 'lon': '12.3519'}IT-34Sunny...464.389481Cape Town International AirportCPTCape TownZA{'lat': '-33.96480179', 'lon': '18.60169983'}SE-BDClear02018-01-01 18:27:00
2190.636904FalseLogstash AirwaysVenice Marco Polo AirportVE05VeniceIT{'lat': '45.505299', 'lon': '12.3519'}IT-34Cloudy...0.000000Venice Marco Polo AirportVE05VeniceIT{'lat': '45.505299', 'lon': '12.3519'}IT-34Rain02018-01-01 17:11:14
3181.694216TrueKibana AirlinesTreviso-Sant'Angelo AirportTV01TrevisoIT{'lat': '45.648399', 'lon': '12.1944'}IT-34Clear...222.749059Naples International AirportNA01NaplesIT{'lat': '40.886002', 'lon': '14.2908'}IT-72Thunder & Lightning02018-01-01 10:33:28
4730.041778FalseKibana AirlinesXi'an Xianyang International AirportXIYXi'anCN{'lat': '34.447102', 'lon': '108.751999'}SE-BDClear...785.779071Licenciado Benito Juarez International AirportAICMMexico CityMX{'lat': '19.4363', 'lon': '-99.072098'}MX-DIFDamaging Wind02018-01-01 05:13:00
\n", - "
\n", - "

5 rows x 27 columns

" - ], - "text/plain": [ - " AvgTicketPrice Cancelled Carrier \\\n", - "0 841.265642 False Kibana Airlines \n", - "1 882.982662 False Logstash Airways \n", - "2 190.636904 False Logstash Airways \n", - "3 181.694216 True Kibana Airlines \n", - "4 730.041778 False Kibana Airlines \n", - "\n", - " Dest DestAirportID DestCityName \\\n", - "0 Sydney Kingsford Smith International Airport SYD Sydney \n", - "1 Venice Marco Polo Airport VE05 Venice \n", - "2 Venice Marco Polo Airport VE05 Venice \n", - "3 Treviso-Sant'Angelo Airport TV01 Treviso \n", - "4 Xi'an Xianyang International Airport XIY Xi'an \n", - "\n", - " DestCountry DestLocation DestRegion \\\n", - "0 AU {'lat': '-33.94609833', 'lon': '151.177002'} SE-BD \n", - "1 IT {'lat': '45.505299', 'lon': '12.3519'} IT-34 \n", - "2 IT {'lat': '45.505299', 'lon': '12.3519'} IT-34 \n", - "3 IT {'lat': '45.648399', 'lon': '12.1944'} IT-34 \n", - "4 CN {'lat': '34.447102', 'lon': '108.751999'} SE-BD \n", - "\n", - " DestWeather ... FlightTimeMin \\\n", - "0 Rain ... 1030.770416 \n", - "1 Sunny ... 464.389481 \n", - "2 Cloudy ... 0.000000 \n", - "3 Clear ... 222.749059 \n", - "4 Clear ... 785.779071 \n", - "\n", - " Origin OriginAirportID \\\n", - "0 Frankfurt am Main Airport FRA \n", - "1 Cape Town International Airport CPT \n", - "2 Venice Marco Polo Airport VE05 \n", - "3 Naples International Airport NA01 \n", - "4 Licenciado Benito Juarez International Airport AICM \n", - "\n", - " OriginCityName OriginCountry \\\n", - "0 Frankfurt am Main DE \n", - "1 Cape Town ZA \n", - "2 Venice IT \n", - "3 Naples IT \n", - "4 Mexico City MX \n", - "\n", - " OriginLocation OriginRegion \\\n", - "0 {'lat': '50.033333', 'lon': '8.570556'} DE-HE \n", - "1 {'lat': '-33.96480179', 'lon': '18.60169983'} SE-BD \n", - "2 {'lat': '45.505299', 'lon': '12.3519'} IT-34 \n", - "3 {'lat': '40.886002', 'lon': '14.2908'} IT-72 \n", - "4 {'lat': '19.4363', 'lon': '-99.072098'} MX-DIF \n", - "\n", - " OriginWeather dayOfWeek timestamp \n", - "0 Sunny 0 2018-01-01 00:00:00 \n", - "1 Clear 0 2018-01-01 18:27:00 \n", - "2 Rain 0 2018-01-01 17:11:14 \n", - "3 Thunder & Lightning 0 2018-01-01 10:33:28 \n", - "4 Damaging Wind 0 2018-01-01 05:13:00 \n", - "\n", - "[5 rows x 27 columns]" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ed_flights.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
AvgTicketPriceCancelledCarrierDestDestAirportIDDestCityNameDestCountryDestLocationDestRegionDestWeather...FlightTimeMinOriginOriginAirportIDOriginCityNameOriginCountryOriginLocationOriginRegionOriginWeatherdayOfWeektimestamp
130541080.446279FalseLogstash AirwaysXi'an Xianyang International AirportXIYXi'anCN{'lat': '34.447102', 'lon': '108.751999'}SE-BDRain...402.929088Pisa International AirportPI05PisaIT{'lat': '43.683899', 'lon': '10.3927'}IT-52Sunny62018-02-11 20:42:25
13055646.612941FalseLogstash AirwaysZurich AirportZRHZurichCH{'lat': '47.464699', 'lon': '8.54917'}CH-ZHRain...644.418029Winnipeg / James Armstrong Richardson Internat...YWGWinnipegCA{'lat': '49.90999985', 'lon': '-97.23989868'}CA-MBRain62018-02-11 01:41:57
13056997.751876FalseLogstash AirwaysUkrainka Air BaseXHBUBelogorskRU{'lat': '51.169997', 'lon': '128.445007'}RU-AMURain...937.540811Licenciado Benito Juarez International AirportAICMMexico CityMX{'lat': '19.4363', 'lon': '-99.072098'}MX-DIFSunny62018-02-11 04:09:27
130571102.814465FalseJetBeatsMinistro Pistarini International AirportEZEBuenos AiresAR{'lat': '-34.8222', 'lon': '-58.5358'}SE-BDHail...1697.404971Itami AirportITMOsakaJP{'lat': '34.78549957', 'lon': '135.4380035'}SE-BDHail62018-02-11 08:28:21
13058858.144337FalseJetBeatsWashington Dulles International AirportIADWashingtonUS{'lat': '38.94449997', 'lon': '-77.45580292'}US-DCHeavy Fog...1610.761827Adelaide International AirportADLAdelaideAU{'lat': '-34.945', 'lon': '138.531006'}SE-BDRain62018-02-11 14:54:34
\n", - "
\n", - "

5 rows x 27 columns

" - ], - "text/plain": [ - " AvgTicketPrice Cancelled Carrier \\\n", - "13054 1080.446279 False Logstash Airways \n", - "13055 646.612941 False Logstash Airways \n", - "13056 997.751876 False Logstash Airways \n", - "13057 1102.814465 False JetBeats \n", - "13058 858.144337 False JetBeats \n", - "\n", - " Dest DestAirportID DestCityName \\\n", - "13054 Xi'an Xianyang International Airport XIY Xi'an \n", - "13055 Zurich Airport ZRH Zurich \n", - "13056 Ukrainka Air Base XHBU Belogorsk \n", - "13057 Ministro Pistarini International Airport EZE Buenos Aires \n", - "13058 Washington Dulles International Airport IAD Washington \n", - "\n", - " DestCountry DestLocation DestRegion \\\n", - "13054 CN {'lat': '34.447102', 'lon': '108.751999'} SE-BD \n", - "13055 CH {'lat': '47.464699', 'lon': '8.54917'} CH-ZH \n", - "13056 RU {'lat': '51.169997', 'lon': '128.445007'} RU-AMU \n", - "13057 AR {'lat': '-34.8222', 'lon': '-58.5358'} SE-BD \n", - "13058 US {'lat': '38.94449997', 'lon': '-77.45580292'} US-DC \n", - "\n", - " DestWeather ... FlightTimeMin \\\n", - "13054 Rain ... 402.929088 \n", - "13055 Rain ... 644.418029 \n", - "13056 Rain ... 937.540811 \n", - "13057 Hail ... 1697.404971 \n", - "13058 Heavy Fog ... 1610.761827 \n", - "\n", - " Origin OriginAirportID \\\n", - "13054 Pisa International Airport PI05 \n", - "13055 Winnipeg / James Armstrong Richardson Internat... YWG \n", - "13056 Licenciado Benito Juarez International Airport AICM \n", - "13057 Itami Airport ITM \n", - "13058 Adelaide International Airport ADL \n", - "\n", - " OriginCityName OriginCountry \\\n", - "13054 Pisa IT \n", - "13055 Winnipeg CA \n", - "13056 Mexico City MX \n", - "13057 Osaka JP \n", - "13058 Adelaide AU \n", - "\n", - " OriginLocation OriginRegion \\\n", - "13054 {'lat': '43.683899', 'lon': '10.3927'} IT-52 \n", - "13055 {'lat': '49.90999985', 'lon': '-97.23989868'} CA-MB \n", - "13056 {'lat': '19.4363', 'lon': '-99.072098'} MX-DIF \n", - "13057 {'lat': '34.78549957', 'lon': '135.4380035'} SE-BD \n", - "13058 {'lat': '-34.945', 'lon': '138.531006'} SE-BD \n", - "\n", - " OriginWeather dayOfWeek timestamp \n", - "13054 Sunny 6 2018-02-11 20:42:25 \n", - "13055 Rain 6 2018-02-11 01:41:57 \n", - "13056 Sunny 6 2018-02-11 04:09:27 \n", - "13057 Hail 6 2018-02-11 08:28:21 \n", - "13058 Rain 6 2018-02-11 14:54:34 \n", - "\n", - "[5 rows x 27 columns]" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ed_flights.tail()" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
AvgTicketPriceCancelledCarrierDestDestAirportIDDestCityNameDestCountryDestLocationDestRegionDestWeather...FlightTimeMinOriginOriginAirportIDOriginCityNameOriginCountryOriginLocationOriginRegionOriginWeatherdayOfWeektimestamp
0841.265642FalseKibana AirlinesSydney Kingsford Smith International AirportSYDSydneyAU{'lat': '-33.94609833', 'lon': '151.177002'}SE-BDRain...1030.770416Frankfurt am Main AirportFRAFrankfurt am MainDE{'lat': '50.033333', 'lon': '8.570556'}DE-HESunny02018-01-01 00:00:00
1882.982662FalseLogstash AirwaysVenice Marco Polo AirportVE05VeniceIT{'lat': '45.505299', 'lon': '12.3519'}IT-34Sunny...464.389481Cape Town International AirportCPTCape TownZA{'lat': '-33.96480179', 'lon': '18.60169983'}SE-BDClear02018-01-01 18:27:00
2190.636904FalseLogstash AirwaysVenice Marco Polo AirportVE05VeniceIT{'lat': '45.505299', 'lon': '12.3519'}IT-34Cloudy...0.000000Venice Marco Polo AirportVE05VeniceIT{'lat': '45.505299', 'lon': '12.3519'}IT-34Rain02018-01-01 17:11:14
3181.694216TrueKibana AirlinesTreviso-Sant'Angelo AirportTV01TrevisoIT{'lat': '45.648399', 'lon': '12.1944'}IT-34Clear...222.749059Naples International AirportNA01NaplesIT{'lat': '40.886002', 'lon': '14.2908'}IT-72Thunder & Lightning02018-01-01 10:33:28
4730.041778FalseKibana AirlinesXi'an Xianyang International AirportXIYXi'anCN{'lat': '34.447102', 'lon': '108.751999'}SE-BDClear...785.779071Licenciado Benito Juarez International AirportAICMMexico CityMX{'lat': '19.4363', 'lon': '-99.072098'}MX-DIFDamaging Wind02018-01-01 05:13:00
5418.152089FalseJetBeatsGenoa Cristoforo Colombo AirportGE01GenovaIT{'lat': '44.4133', 'lon': '8.8375'}IT-42Thunder & Lightning...393.590441Edmonton International AirportCYEGEdmontonCA{'lat': '53.30970001', 'lon': '-113.5800018'}CA-ABRain02018-01-01 01:43:03
6180.246816FalseJetBeatsZurich AirportZRHZurichCH{'lat': '47.464699', 'lon': '8.54917'}CH-ZHHail...300.000000Zurich AirportZRHZurichCH{'lat': '47.464699', 'lon': '8.54917'}CH-ZHClear02018-01-01 13:49:53
7585.184310FalseKibana AirlinesOttawa Macdonald-Cartier International AirportYOWOttawaCA{'lat': '45.32249832', 'lon': '-75.66919708'}CA-ONClear...614.942480Ciampino___G. B. Pastine International AirportRM12RomeIT{'lat': '41.7994', 'lon': '12.5949'}IT-62Thunder & Lightning02018-01-01 04:54:59
8960.869736TrueKibana AirlinesRajiv Gandhi International AirportHYDHyderabadIN{'lat': '17.23131752', 'lon': '78.42985535'}SE-BDCloudy...602.030591Milano Linate AirportMI11MilanIT{'lat': '45.445099', 'lon': '9.27674'}IT-25Heavy Fog02018-01-01 12:09:35
9296.877773FalseLogstash AirwaysTreviso-Sant'Angelo AirportTV01TrevisoIT{'lat': '45.648399', 'lon': '12.1944'}IT-34Rain...174.822216Sheremetyevo International AirportSVOMoscowRU{'lat': '55.972599', 'lon': '37.4146'}RU-MOSCloudy02018-01-01 12:09:35
10906.437948FalseJetBeatsHelsinki Vantaa AirportHELHelsinkiFI{'lat': '60.31719971', 'lon': '24.9633007'}FI-ESRain...503.045170Albuquerque International Sunport AirportABQAlbuquerqueUS{'lat': '35.040199', 'lon': '-106.609001'}US-NMRain02018-01-01 22:06:14
11704.463771FalseLogstash AirwaysVienna International AirportVIEViennaAT{'lat': '48.11029816', 'lon': '16.56970024'}AT-9Cloudy...36.075018Venice Marco Polo AirportVE05VeniceIT{'lat': '45.505299', 'lon': '12.3519'}IT-34Rain02018-01-01 11:52:34
12922.499077TrueLogstash AirwaysShanghai Pudong International AirportPVGShanghaiCN{'lat': '31.14340019', 'lon': '121.8050003'}SE-BDClear...679.768391Licenciado Benito Juarez International AirportAICMMexico CityMX{'lat': '19.4363', 'lon': '-99.072098'}MX-DIFHeavy Fog02018-01-01 02:13:46
13374.959276FalseLogstash AirwaysOttawa Macdonald-Cartier International AirportYOWOttawaCA{'lat': '45.32249832', 'lon': '-75.66919708'}CA-ONRain...330.418282Naples International AirportNA01NaplesIT{'lat': '40.886002', 'lon': '14.2908'}IT-72Rain02018-01-01 14:21:13
14552.917371FalseLogstash AirwaysLuis Munoz Marin International AirportSJUSan JuanPR{'lat': '18.43939972', 'lon': '-66.00180054'}PR-U-AClear...407.145031Ciampino___G. B. Pastine International AirportRM12RomeIT{'lat': '41.7994', 'lon': '12.5949'}IT-62Cloudy02018-01-01 17:42:53
15566.487557TrueKibana AirlinesCologne Bonn AirportCGNCologneDE{'lat': '50.86589813', 'lon': '7.142739773'}DE-NWSunny...656.712658Chengdu Shuangliu International AirportCTUChengduCN{'lat': '30.57850075', 'lon': '103.9469986'}SE-BDThunder & Lightning02018-01-01 19:55:32
16989.952787TrueLogstash AirwaysVenice Marco Polo AirportVE05VeniceIT{'lat': '45.505299', 'lon': '12.3519'}IT-34Damaging Wind...773.030334Licenciado Benito Juarez International AirportAICMMexico CityMX{'lat': '19.4363', 'lon': '-99.072098'}MX-DIFThunder & Lightning02018-01-01 07:49:27
17569.613255FalseES-AirMinistro Pistarini International AirportEZEBuenos AiresAR{'lat': '-34.8222', 'lon': '-58.5358'}SE-BDCloudy...704.716920Cleveland Hopkins International AirportCLEClevelandUS{'lat': '41.4117012', 'lon': '-81.84980011'}US-OHRain02018-01-01 01:30:47
18277.429707FalseES-AirShanghai Pudong International AirportPVGShanghaiCN{'lat': '31.14340019', 'lon': '121.8050003'}SE-BDClear...355.957996Olenya Air BaseXLMOOlenegorskRU{'lat': '68.15180206', 'lon': '33.46390152'}RU-MURHail02018-01-01 07:58:17
19772.100846FalseJetBeatsIndira Gandhi International AirportDELNew DelhiIN{'lat': '28.5665', 'lon': '77.103104'}SE-BDClear...875.114675Casper-Natrona County International AirportCPRCasperUS{'lat': '42.90800095', 'lon': '-106.4639969'}US-WYCloudy02018-01-01 00:02:06
20167.599922FalseJetBeatsWichita Mid Continent AirportICTWichitaUS{'lat': '37.64989853', 'lon': '-97.43309784'}US-KSClear...373.966883Erie International Tom Ridge FieldERIErieUS{'lat': '42.08312701', 'lon': '-80.17386675'}US-PACloudy02018-01-01 01:08:20
21253.210065FalseES-AirOttawa Macdonald-Cartier International AirportYOWOttawaCA{'lat': '45.32249832', 'lon': '-75.66919708'}CA-ONHail...130.667700Newark Liberty International AirportEWRNewarkUS{'lat': '40.69250107', 'lon': '-74.16870117'}US-NJClear02018-01-01 01:08:20
22917.247620FalseJetBeatsItami AirportITMOsakaJP{'lat': '34.78549957', 'lon': '135.4380035'}SE-BDDamaging Wind...574.495310Copenhagen Kastrup AirportCPHCopenhagenDK{'lat': '55.61790085', 'lon': '12.65600014'}DK-84Sunny02018-01-01 07:48:35
23451.591176FalseLogstash AirwaysVienna International AirportVIEViennaAT{'lat': '48.11029816', 'lon': '16.56970024'}AT-9Heavy Fog...579.728943Seattle Tacoma International AirportSEASeattleUS{'lat': '47.44900131', 'lon': '-122.3089981'}US-WAHeavy Fog02018-01-01 18:57:21
24307.067201FalseLogstash AirwaysCharles de Gaulle International AirportCDGParisFR{'lat': '49.01279831', 'lon': '2.549999952'}FR-JClear...50.157229Berlin-Tegel AirportTXLBerlinDE{'lat': '52.5597', 'lon': '13.2877'}DE-BERain02018-01-01 13:18:25
25268.241596FalseES-AirNarita International AirportNRTTokyoJP{'lat': '35.76470184', 'lon': '140.3860016'}SE-BDRain...527.567422Manchester AirportMANManchesterGB{'lat': '53.35369873', 'lon': '-2.274950027'}GB-ENGThunder & Lightning02018-01-01 08:20:35
26975.812632TrueKibana AirlinesItami AirportITMOsakaJP{'lat': '34.78549957', 'lon': '135.4380035'}SE-BDHail...386.259764Helsinki Vantaa AirportHELHelsinkiFI{'lat': '60.31719971', 'lon': '24.9633007'}FI-ESRain02018-01-01 15:38:32
27134.214546FalseJetBeatsSan Diego International AirportSANSan DiegoUS{'lat': '32.73360062', 'lon': '-117.1900024'}US-CAClear...24.479650Phoenix Sky Harbor International AirportPHXPhoenixUS{'lat': '33.43429947', 'lon': '-112.012001'}US-AZClear02018-01-01 03:08:45
28988.897564FalseKibana AirlinesVerona Villafranca AirportVR10VeronaIT{'lat': '45.395699', 'lon': '10.8885'}IT-34Sunny...568.351033New Chitose AirportCTSChitose / TomakomaiJP{'lat': '42.77519989', 'lon': '141.6920013'}SE-BDDamaging Wind02018-01-01 01:16:59
29511.067220FalseLogstash AirwaysZurich AirportZRHZurichCH{'lat': '47.464699', 'lon': '8.54917'}CH-ZHRain...425.889194Tulsa International AirportTULTulsaUS{'lat': '36.19839859', 'lon': '-95.88809967'}US-OKRain02018-01-01 18:00:59
..................................................................
13029795.905278FalseKibana AirlinesMalpensa International AirportMI12MilanIT{'lat': '45.6306', 'lon': '8.72811'}IT-25Sunny...534.375826Itami AirportITMOsakaJP{'lat': '34.78549957', 'lon': '135.4380035'}SE-BDSunny62018-02-11 20:10:13
13030863.388068FalseLogstash AirwaysXi'an Xianyang International AirportXIYXi'anCN{'lat': '34.447102', 'lon': '108.751999'}SE-BDDamaging Wind...141.172633Tokyo Haneda International AirportHNDTokyoJP{'lat': '35.552299', 'lon': '139.779999'}SE-BDClear62018-02-11 18:59:53
13031575.183008FalseJetBeatsSavannah Hilton Head International AirportSAVSavannahUS{'lat': '32.12760162', 'lon': '-81.20210266'}US-GAThunder & Lightning...1113.137060OR Tambo International AirportJNBJohannesburgZA{'lat': '-26.1392', 'lon': '28.246'}SE-BDHail62018-02-11 00:57:48
13032817.368952FalseJetBeatsSyracuse Hancock International AirportSYRSyracuseUS{'lat': '43.11119843', 'lon': '-76.10630035'}US-NYRain...714.964864El Dorado International AirportBOGBogotaCO{'lat': '4.70159', 'lon': '-74.1469'}CO-CUNThunder & Lightning62018-02-11 12:02:49
13033579.582455FalseES-AirTampa International AirportTPATampaUS{'lat': '27.97550011', 'lon': '-82.53320313'}US-FLRain...234.929046Jorge Chavez International AirportLIMLimaPE{'lat': '-12.0219', 'lon': '-77.114304'}SE-BDThunder & Lightning62018-02-11 02:07:40
130341004.916638FalseJetBeatsOlenya Air BaseXLMOOlenegorskRU{'lat': '68.15180206', 'lon': '33.46390152'}RU-MURClear...526.895776Gimpo International AirportGMPSeoulKR{'lat': '37.5583', 'lon': '126.791'}SE-BDSunny62018-02-11 00:35:04
13035357.562842TrueLogstash AirwaysShanghai Pudong International AirportPVGShanghaiCN{'lat': '31.14340019', 'lon': '121.8050003'}SE-BDThunder & Lightning...0.000000Shanghai Pudong International AirportPVGShanghaiCN{'lat': '31.14340019', 'lon': '121.8050003'}SE-BDThunder & Lightning62018-02-11 11:19:12
13036429.580539FalseLogstash AirwaysVenice Marco Polo AirportVE05VeniceIT{'lat': '45.505299', 'lon': '12.3519'}IT-34Sunny...150.000000Venice Marco Polo AirportVE05VeniceIT{'lat': '45.505299', 'lon': '12.3519'}IT-34Cloudy62018-02-11 15:07:11
13037729.788171TrueES-AirVienna International AirportVIEViennaAT{'lat': '48.11029816', 'lon': '16.56970024'}AT-9Rain...691.944839Ukrainka Air BaseXHBUBelogorskRU{'lat': '51.169997', 'lon': '128.445007'}RU-AMUDamaging Wind62018-02-11 10:24:42
13038564.897695FalseES-AirPisa International AirportPI05PisaIT{'lat': '43.683899', 'lon': '10.3927'}IT-52Heavy Fog...567.387339OR Tambo International AirportJNBJohannesburgZA{'lat': '-26.1392', 'lon': '28.246'}SE-BDDamaging Wind62018-02-11 00:42:06
130391014.052787FalseLogstash AirwaysVienna International AirportVIEViennaAT{'lat': '48.11029816', 'lon': '16.56970024'}AT-9Thunder & Lightning...690.092327Montreal / Pierre Elliott Trudeau Internationa...YULMontrealCA{'lat': '45.47060013', 'lon': '-73.74079895'}CA-QCThunder & Lightning62018-02-11 10:56:31
13040455.243843FalseES-AirLondon Luton AirportLTNLondonGB{'lat': '51.87469864', 'lon': '-0.368333012'}GB-ENGCloudy...3.028293London Heathrow AirportLHRLondonGB{'lat': '51.4706', 'lon': '-0.461941'}GB-ENGClear62018-02-11 00:39:37
13041611.370232FalseLogstash AirwaysJorge Chavez International AirportLIMLimaPE{'lat': '-12.0219', 'lon': '-77.114304'}SE-BDSunny...338.875531Casper-Natrona County International AirportCPRCasperUS{'lat': '42.90800095', 'lon': '-106.4639969'}US-WYRain62018-02-11 10:24:30
13042595.961285FalseJetBeatsOttawa Macdonald-Cartier International AirportYOWOttawaCA{'lat': '45.32249832', 'lon': '-75.66919708'}CA-ONClear...375.129587Frankfurt am Main AirportFRAFrankfurt am MainDE{'lat': '50.033333', 'lon': '8.570556'}DE-HEClear62018-02-11 09:02:07
13043782.747648FalseLogstash AirwaysXi'an Xianyang International AirportXIYXi'anCN{'lat': '34.447102', 'lon': '108.751999'}SE-BDClear...156.858481Tokyo Haneda International AirportHNDTokyoJP{'lat': '35.552299', 'lon': '139.779999'}SE-BDThunder & Lightning62018-02-11 04:45:06
13044891.117221FalseJetBeatsWinnipeg / James Armstrong Richardson Internat...YWGWinnipegCA{'lat': '49.90999985', 'lon': '-97.23989868'}CA-MBClear...354.106457Vienna International AirportVIEViennaAT{'lat': '48.11029816', 'lon': '16.56970024'}AT-9Thunder & Lightning62018-02-11 00:51:14
13045587.169921FalseLogstash AirwaysBrisbane International AirportBNEBrisbaneAU{'lat': '-27.38419914', 'lon': '153.1170044'}SE-BDRain...771.305442Amsterdam Airport SchipholAMSAmsterdamNL{'lat': '52.30860138', 'lon': '4.76388979'}NL-NHSunny62018-02-11 05:41:51
13046739.132165FalseLogstash AirwaysXi'an Xianyang International AirportXIYXi'anCN{'lat': '34.447102', 'lon': '108.751999'}SE-BDRain...542.955572Winnipeg / James Armstrong Richardson Internat...YWGWinnipegCA{'lat': '49.90999985', 'lon': '-97.23989868'}CA-MBHail62018-02-11 10:02:21
13047605.191876FalseJetBeatsPortland International Jetport AirportPWMPortlandUS{'lat': '43.64619827', 'lon': '-70.30930328'}US-METhunder & Lightning...564.599857Jeju International AirportCJUJeju CityKR{'lat': '33.51129913', 'lon': '126.4929962'}SE-BDCloudy62018-02-11 15:55:10
13048361.767659TrueLogstash AirwaysDubai International AirportDXBDubaiAE{'lat': '25.25279999', 'lon': '55.36439896'}SE-BDSunny...180.000000Dubai International AirportDXBDubaiAE{'lat': '25.25279999', 'lon': '55.36439896'}SE-BDHail62018-02-11 04:11:14
13049662.306992FalseES-AirWinnipeg / James Armstrong Richardson Internat...YWGWinnipegCA{'lat': '49.90999985', 'lon': '-97.23989868'}CA-MBHeavy Fog...835.954429Ministro Pistarini International AirportEZEBuenos AiresAR{'lat': '-34.8222', 'lon': '-58.5358'}AR-BSunny62018-02-11 10:13:32
13050630.779526FalseJetBeatsHelsinki Vantaa AirportHELHelsinkiFI{'lat': '60.31719971', 'lon': '24.9633007'}FI-ESSunny...451.755639Beijing Capital International AirportPEKBeijingCN{'lat': '40.08010101', 'lon': '116.5849991'}SE-BDCloudy62018-02-11 11:23:23
13051937.771279TrueLogstash AirwaysLester B. Pearson International AirportYYZTorontoCA{'lat': '43.67720032', 'lon': '-79.63059998'}CA-ONSunny...507.451571Leonardo da Vinci___Fiumicino AirportRM11RomeIT{'lat': '41.8002778', 'lon': '12.2388889'}IT-62Hail62018-02-11 01:13:50
130521085.155339FalseLogstash AirwaysMelbourne International AirportMELMelbourneAU{'lat': '-37.673302', 'lon': '144.843002'}SE-BDCloudy...1044.451122Bologna Guglielmo Marconi AirportBO08BolognaIT{'lat': '44.5354', 'lon': '11.2887'}IT-45Cloudy62018-02-11 18:35:42
130531191.964104FalseLogstash AirwaysZurich AirportZRHZurichCH{'lat': '47.464699', 'lon': '8.54917'}CH-ZHHail...728.715904Portland International Jetport AirportPWMPortlandUS{'lat': '43.64619827', 'lon': '-70.30930328'}US-MEClear62018-02-11 19:02:10
130541080.446279FalseLogstash AirwaysXi'an Xianyang International AirportXIYXi'anCN{'lat': '34.447102', 'lon': '108.751999'}SE-BDRain...402.929088Pisa International AirportPI05PisaIT{'lat': '43.683899', 'lon': '10.3927'}IT-52Sunny62018-02-11 20:42:25
13055646.612941FalseLogstash AirwaysZurich AirportZRHZurichCH{'lat': '47.464699', 'lon': '8.54917'}CH-ZHRain...644.418029Winnipeg / James Armstrong Richardson Internat...YWGWinnipegCA{'lat': '49.90999985', 'lon': '-97.23989868'}CA-MBRain62018-02-11 01:41:57
13056997.751876FalseLogstash AirwaysUkrainka Air BaseXHBUBelogorskRU{'lat': '51.169997', 'lon': '128.445007'}RU-AMURain...937.540811Licenciado Benito Juarez International AirportAICMMexico CityMX{'lat': '19.4363', 'lon': '-99.072098'}MX-DIFSunny62018-02-11 04:09:27
130571102.814465FalseJetBeatsMinistro Pistarini International AirportEZEBuenos AiresAR{'lat': '-34.8222', 'lon': '-58.5358'}SE-BDHail...1697.404971Itami AirportITMOsakaJP{'lat': '34.78549957', 'lon': '135.4380035'}SE-BDHail62018-02-11 08:28:21
13058858.144337FalseJetBeatsWashington Dulles International AirportIADWashingtonUS{'lat': '38.94449997', 'lon': '-77.45580292'}US-DCHeavy Fog...1610.761827Adelaide International AirportADLAdelaideAU{'lat': '-34.945', 'lon': '138.531006'}SE-BDRain62018-02-11 14:54:34
\n", - "
\n", - "

13059 rows x 27 columns

" - ], - "text/plain": [ - " AvgTicketPrice Cancelled Carrier \\\n", - "0 841.265642 False Kibana Airlines \n", - "1 882.982662 False Logstash Airways \n", - "2 190.636904 False Logstash Airways \n", - "3 181.694216 True Kibana Airlines \n", - "4 730.041778 False Kibana Airlines \n", - "5 418.152089 False JetBeats \n", - "6 180.246816 False JetBeats \n", - "7 585.184310 False Kibana Airlines \n", - "8 960.869736 True Kibana Airlines \n", - "9 296.877773 False Logstash Airways \n", - "10 906.437948 False JetBeats \n", - "11 704.463771 False Logstash Airways \n", - "12 922.499077 True Logstash Airways \n", - "13 374.959276 False Logstash Airways \n", - "14 552.917371 False Logstash Airways \n", - "15 566.487557 True Kibana Airlines \n", - "16 989.952787 True Logstash Airways \n", - "17 569.613255 False ES-Air \n", - "18 277.429707 False ES-Air \n", - "19 772.100846 False JetBeats \n", - "20 167.599922 False JetBeats \n", - "21 253.210065 False ES-Air \n", - "22 917.247620 False JetBeats \n", - "23 451.591176 False Logstash Airways \n", - "24 307.067201 False Logstash Airways \n", - "25 268.241596 False ES-Air \n", - "26 975.812632 True Kibana Airlines \n", - "27 134.214546 False JetBeats \n", - "28 988.897564 False Kibana Airlines \n", - "29 511.067220 False Logstash Airways \n", - "... ... ... ... \n", - "13029 795.905278 False Kibana Airlines \n", - "13030 863.388068 False Logstash Airways \n", - "13031 575.183008 False JetBeats \n", - "13032 817.368952 False JetBeats \n", - "13033 579.582455 False ES-Air \n", - "13034 1004.916638 False JetBeats \n", - "13035 357.562842 True Logstash Airways \n", - "13036 429.580539 False Logstash Airways \n", - "13037 729.788171 True ES-Air \n", - "13038 564.897695 False ES-Air \n", - "13039 1014.052787 False Logstash Airways \n", - "13040 455.243843 False ES-Air \n", - "13041 611.370232 False Logstash Airways \n", - "13042 595.961285 False JetBeats \n", - "13043 782.747648 False Logstash Airways \n", - "13044 891.117221 False JetBeats \n", - "13045 587.169921 False Logstash Airways \n", - "13046 739.132165 False Logstash Airways \n", - "13047 605.191876 False JetBeats \n", - "13048 361.767659 True Logstash Airways \n", - "13049 662.306992 False ES-Air \n", - "13050 630.779526 False JetBeats \n", - "13051 937.771279 True Logstash Airways \n", - "13052 1085.155339 False Logstash Airways \n", - "13053 1191.964104 False Logstash Airways \n", - "13054 1080.446279 False Logstash Airways \n", - "13055 646.612941 False Logstash Airways \n", - "13056 997.751876 False Logstash Airways \n", - "13057 1102.814465 False JetBeats \n", - "13058 858.144337 False JetBeats \n", - "\n", - " Dest DestAirportID \\\n", - "0 Sydney Kingsford Smith International Airport SYD \n", - "1 Venice Marco Polo Airport VE05 \n", - "2 Venice Marco Polo Airport VE05 \n", - "3 Treviso-Sant'Angelo Airport TV01 \n", - "4 Xi'an Xianyang International Airport XIY \n", - "5 Genoa Cristoforo Colombo Airport GE01 \n", - "6 Zurich Airport ZRH \n", - "7 Ottawa Macdonald-Cartier International Airport YOW \n", - "8 Rajiv Gandhi International Airport HYD \n", - "9 Treviso-Sant'Angelo Airport TV01 \n", - "10 Helsinki Vantaa Airport HEL \n", - "11 Vienna International Airport VIE \n", - "12 Shanghai Pudong International Airport PVG \n", - "13 Ottawa Macdonald-Cartier International Airport YOW \n", - "14 Luis Munoz Marin International Airport SJU \n", - "15 Cologne Bonn Airport CGN \n", - "16 Venice Marco Polo Airport VE05 \n", - "17 Ministro Pistarini International Airport EZE \n", - "18 Shanghai Pudong International Airport PVG \n", - "19 Indira Gandhi International Airport DEL \n", - "20 Wichita Mid Continent Airport ICT \n", - "21 Ottawa Macdonald-Cartier International Airport YOW \n", - "22 Itami Airport ITM \n", - "23 Vienna International Airport VIE \n", - "24 Charles de Gaulle International Airport CDG \n", - "25 Narita International Airport NRT \n", - "26 Itami Airport ITM \n", - "27 San Diego International Airport SAN \n", - "28 Verona Villafranca Airport VR10 \n", - "29 Zurich Airport ZRH \n", - "... ... ... \n", - "13029 Malpensa International Airport MI12 \n", - "13030 Xi'an Xianyang International Airport XIY \n", - "13031 Savannah Hilton Head International Airport SAV \n", - "13032 Syracuse Hancock International Airport SYR \n", - "13033 Tampa International Airport TPA \n", - "13034 Olenya Air Base XLMO \n", - "13035 Shanghai Pudong International Airport PVG \n", - "13036 Venice Marco Polo Airport VE05 \n", - "13037 Vienna International Airport VIE \n", - "13038 Pisa International Airport PI05 \n", - "13039 Vienna International Airport VIE \n", - "13040 London Luton Airport LTN \n", - "13041 Jorge Chavez International Airport LIM \n", - "13042 Ottawa Macdonald-Cartier International Airport YOW \n", - "13043 Xi'an Xianyang International Airport XIY \n", - "13044 Winnipeg / James Armstrong Richardson Internat... YWG \n", - "13045 Brisbane International Airport BNE \n", - "13046 Xi'an Xianyang International Airport XIY \n", - "13047 Portland International Jetport Airport PWM \n", - "13048 Dubai International Airport DXB \n", - "13049 Winnipeg / James Armstrong Richardson Internat... YWG \n", - "13050 Helsinki Vantaa Airport HEL \n", - "13051 Lester B. Pearson International Airport YYZ \n", - "13052 Melbourne International Airport MEL \n", - "13053 Zurich Airport ZRH \n", - "13054 Xi'an Xianyang International Airport XIY \n", - "13055 Zurich Airport ZRH \n", - "13056 Ukrainka Air Base XHBU \n", - "13057 Ministro Pistarini International Airport EZE \n", - "13058 Washington Dulles International Airport IAD \n", - "\n", - " DestCityName DestCountry \\\n", - "0 Sydney AU \n", - "1 Venice IT \n", - "2 Venice IT \n", - "3 Treviso IT \n", - "4 Xi'an CN \n", - "5 Genova IT \n", - "6 Zurich CH \n", - "7 Ottawa CA \n", - "8 Hyderabad IN \n", - "9 Treviso IT \n", - "10 Helsinki FI \n", - "11 Vienna AT \n", - "12 Shanghai CN \n", - "13 Ottawa CA \n", - "14 San Juan PR \n", - "15 Cologne DE \n", - "16 Venice IT \n", - "17 Buenos Aires AR \n", - "18 Shanghai CN \n", - "19 New Delhi IN \n", - "20 Wichita US \n", - "21 Ottawa CA \n", - "22 Osaka JP \n", - "23 Vienna AT \n", - "24 Paris FR \n", - "25 Tokyo JP \n", - "26 Osaka JP \n", - "27 San Diego US \n", - "28 Verona IT \n", - "29 Zurich CH \n", - "... ... ... \n", - "13029 Milan IT \n", - "13030 Xi'an CN \n", - "13031 Savannah US \n", - "13032 Syracuse US \n", - "13033 Tampa US \n", - "13034 Olenegorsk RU \n", - "13035 Shanghai CN \n", - "13036 Venice IT \n", - "13037 Vienna AT \n", - "13038 Pisa IT \n", - "13039 Vienna AT \n", - "13040 London GB \n", - "13041 Lima PE \n", - "13042 Ottawa CA \n", - "13043 Xi'an CN \n", - "13044 Winnipeg CA \n", - "13045 Brisbane AU \n", - "13046 Xi'an CN \n", - "13047 Portland US \n", - "13048 Dubai AE \n", - "13049 Winnipeg CA \n", - "13050 Helsinki FI \n", - "13051 Toronto CA \n", - "13052 Melbourne AU \n", - "13053 Zurich CH \n", - "13054 Xi'an CN \n", - "13055 Zurich CH \n", - "13056 Belogorsk RU \n", - "13057 Buenos Aires AR \n", - "13058 Washington US \n", - "\n", - " DestLocation DestRegion \\\n", - "0 {'lat': '-33.94609833', 'lon': '151.177002'} SE-BD \n", - "1 {'lat': '45.505299', 'lon': '12.3519'} IT-34 \n", - "2 {'lat': '45.505299', 'lon': '12.3519'} IT-34 \n", - "3 {'lat': '45.648399', 'lon': '12.1944'} IT-34 \n", - "4 {'lat': '34.447102', 'lon': '108.751999'} SE-BD \n", - "5 {'lat': '44.4133', 'lon': '8.8375'} IT-42 \n", - "6 {'lat': '47.464699', 'lon': '8.54917'} CH-ZH \n", - "7 {'lat': '45.32249832', 'lon': '-75.66919708'} CA-ON \n", - "8 {'lat': '17.23131752', 'lon': '78.42985535'} SE-BD \n", - "9 {'lat': '45.648399', 'lon': '12.1944'} IT-34 \n", - "10 {'lat': '60.31719971', 'lon': '24.9633007'} FI-ES \n", - "11 {'lat': '48.11029816', 'lon': '16.56970024'} AT-9 \n", - "12 {'lat': '31.14340019', 'lon': '121.8050003'} SE-BD \n", - "13 {'lat': '45.32249832', 'lon': '-75.66919708'} CA-ON \n", - "14 {'lat': '18.43939972', 'lon': '-66.00180054'} PR-U-A \n", - "15 {'lat': '50.86589813', 'lon': '7.142739773'} DE-NW \n", - "16 {'lat': '45.505299', 'lon': '12.3519'} IT-34 \n", - "17 {'lat': '-34.8222', 'lon': '-58.5358'} SE-BD \n", - "18 {'lat': '31.14340019', 'lon': '121.8050003'} SE-BD \n", - "19 {'lat': '28.5665', 'lon': '77.103104'} SE-BD \n", - "20 {'lat': '37.64989853', 'lon': '-97.43309784'} US-KS \n", - "21 {'lat': '45.32249832', 'lon': '-75.66919708'} CA-ON \n", - "22 {'lat': '34.78549957', 'lon': '135.4380035'} SE-BD \n", - "23 {'lat': '48.11029816', 'lon': '16.56970024'} AT-9 \n", - "24 {'lat': '49.01279831', 'lon': '2.549999952'} FR-J \n", - "25 {'lat': '35.76470184', 'lon': '140.3860016'} SE-BD \n", - "26 {'lat': '34.78549957', 'lon': '135.4380035'} SE-BD \n", - "27 {'lat': '32.73360062', 'lon': '-117.1900024'} US-CA \n", - "28 {'lat': '45.395699', 'lon': '10.8885'} IT-34 \n", - "29 {'lat': '47.464699', 'lon': '8.54917'} CH-ZH \n", - "... ... ... \n", - "13029 {'lat': '45.6306', 'lon': '8.72811'} IT-25 \n", - "13030 {'lat': '34.447102', 'lon': '108.751999'} SE-BD \n", - "13031 {'lat': '32.12760162', 'lon': '-81.20210266'} US-GA \n", - "13032 {'lat': '43.11119843', 'lon': '-76.10630035'} US-NY \n", - "13033 {'lat': '27.97550011', 'lon': '-82.53320313'} US-FL \n", - "13034 {'lat': '68.15180206', 'lon': '33.46390152'} RU-MUR \n", - "13035 {'lat': '31.14340019', 'lon': '121.8050003'} SE-BD \n", - "13036 {'lat': '45.505299', 'lon': '12.3519'} IT-34 \n", - "13037 {'lat': '48.11029816', 'lon': '16.56970024'} AT-9 \n", - "13038 {'lat': '43.683899', 'lon': '10.3927'} IT-52 \n", - "13039 {'lat': '48.11029816', 'lon': '16.56970024'} AT-9 \n", - "13040 {'lat': '51.87469864', 'lon': '-0.368333012'} GB-ENG \n", - "13041 {'lat': '-12.0219', 'lon': '-77.114304'} SE-BD \n", - "13042 {'lat': '45.32249832', 'lon': '-75.66919708'} CA-ON \n", - "13043 {'lat': '34.447102', 'lon': '108.751999'} SE-BD \n", - "13044 {'lat': '49.90999985', 'lon': '-97.23989868'} CA-MB \n", - "13045 {'lat': '-27.38419914', 'lon': '153.1170044'} SE-BD \n", - "13046 {'lat': '34.447102', 'lon': '108.751999'} SE-BD \n", - "13047 {'lat': '43.64619827', 'lon': '-70.30930328'} US-ME \n", - "13048 {'lat': '25.25279999', 'lon': '55.36439896'} SE-BD \n", - "13049 {'lat': '49.90999985', 'lon': '-97.23989868'} CA-MB \n", - "13050 {'lat': '60.31719971', 'lon': '24.9633007'} FI-ES \n", - "13051 {'lat': '43.67720032', 'lon': '-79.63059998'} CA-ON \n", - "13052 {'lat': '-37.673302', 'lon': '144.843002'} SE-BD \n", - "13053 {'lat': '47.464699', 'lon': '8.54917'} CH-ZH \n", - "13054 {'lat': '34.447102', 'lon': '108.751999'} SE-BD \n", - "13055 {'lat': '47.464699', 'lon': '8.54917'} CH-ZH \n", - "13056 {'lat': '51.169997', 'lon': '128.445007'} RU-AMU \n", - "13057 {'lat': '-34.8222', 'lon': '-58.5358'} SE-BD \n", - "13058 {'lat': '38.94449997', 'lon': '-77.45580292'} US-DC \n", - "\n", - " DestWeather ... FlightTimeMin \\\n", - "0 Rain ... 1030.770416 \n", - "1 Sunny ... 464.389481 \n", - "2 Cloudy ... 0.000000 \n", - "3 Clear ... 222.749059 \n", - "4 Clear ... 785.779071 \n", - "5 Thunder & Lightning ... 393.590441 \n", - "6 Hail ... 300.000000 \n", - "7 Clear ... 614.942480 \n", - "8 Cloudy ... 602.030591 \n", - "9 Rain ... 174.822216 \n", - "10 Rain ... 503.045170 \n", - "11 Cloudy ... 36.075018 \n", - "12 Clear ... 679.768391 \n", - "13 Rain ... 330.418282 \n", - "14 Clear ... 407.145031 \n", - "15 Sunny ... 656.712658 \n", - "16 Damaging Wind ... 773.030334 \n", - "17 Cloudy ... 704.716920 \n", - "18 Clear ... 355.957996 \n", - "19 Clear ... 875.114675 \n", - "20 Clear ... 373.966883 \n", - "21 Hail ... 130.667700 \n", - "22 Damaging Wind ... 574.495310 \n", - "23 Heavy Fog ... 579.728943 \n", - "24 Clear ... 50.157229 \n", - "25 Rain ... 527.567422 \n", - "26 Hail ... 386.259764 \n", - "27 Clear ... 24.479650 \n", - "28 Sunny ... 568.351033 \n", - "29 Rain ... 425.889194 \n", - "... ... ... ... \n", - "13029 Sunny ... 534.375826 \n", - "13030 Damaging Wind ... 141.172633 \n", - "13031 Thunder & Lightning ... 1113.137060 \n", - "13032 Rain ... 714.964864 \n", - "13033 Rain ... 234.929046 \n", - "13034 Clear ... 526.895776 \n", - "13035 Thunder & Lightning ... 0.000000 \n", - "13036 Sunny ... 150.000000 \n", - "13037 Rain ... 691.944839 \n", - "13038 Heavy Fog ... 567.387339 \n", - "13039 Thunder & Lightning ... 690.092327 \n", - "13040 Cloudy ... 3.028293 \n", - "13041 Sunny ... 338.875531 \n", - "13042 Clear ... 375.129587 \n", - "13043 Clear ... 156.858481 \n", - "13044 Clear ... 354.106457 \n", - "13045 Rain ... 771.305442 \n", - "13046 Rain ... 542.955572 \n", - "13047 Thunder & Lightning ... 564.599857 \n", - "13048 Sunny ... 180.000000 \n", - "13049 Heavy Fog ... 835.954429 \n", - "13050 Sunny ... 451.755639 \n", - "13051 Sunny ... 507.451571 \n", - "13052 Cloudy ... 1044.451122 \n", - "13053 Hail ... 728.715904 \n", - "13054 Rain ... 402.929088 \n", - "13055 Rain ... 644.418029 \n", - "13056 Rain ... 937.540811 \n", - "13057 Hail ... 1697.404971 \n", - "13058 Heavy Fog ... 1610.761827 \n", - "\n", - " Origin OriginAirportID \\\n", - "0 Frankfurt am Main Airport FRA \n", - "1 Cape Town International Airport CPT \n", - "2 Venice Marco Polo Airport VE05 \n", - "3 Naples International Airport NA01 \n", - "4 Licenciado Benito Juarez International Airport AICM \n", - "5 Edmonton International Airport CYEG \n", - "6 Zurich Airport ZRH \n", - "7 Ciampino___G. B. Pastine International Airport RM12 \n", - "8 Milano Linate Airport MI11 \n", - "9 Sheremetyevo International Airport SVO \n", - "10 Albuquerque International Sunport Airport ABQ \n", - "11 Venice Marco Polo Airport VE05 \n", - "12 Licenciado Benito Juarez International Airport AICM \n", - "13 Naples International Airport NA01 \n", - "14 Ciampino___G. B. Pastine International Airport RM12 \n", - "15 Chengdu Shuangliu International Airport CTU \n", - "16 Licenciado Benito Juarez International Airport AICM \n", - "17 Cleveland Hopkins International Airport CLE \n", - "18 Olenya Air Base XLMO \n", - "19 Casper-Natrona County International Airport CPR \n", - "20 Erie International Tom Ridge Field ERI \n", - "21 Newark Liberty International Airport EWR \n", - "22 Copenhagen Kastrup Airport CPH \n", - "23 Seattle Tacoma International Airport SEA \n", - "24 Berlin-Tegel Airport TXL \n", - "25 Manchester Airport MAN \n", - "26 Helsinki Vantaa Airport HEL \n", - "27 Phoenix Sky Harbor International Airport PHX \n", - "28 New Chitose Airport CTS \n", - "29 Tulsa International Airport TUL \n", - "... ... ... \n", - "13029 Itami Airport ITM \n", - "13030 Tokyo Haneda International Airport HND \n", - "13031 OR Tambo International Airport JNB \n", - "13032 El Dorado International Airport BOG \n", - "13033 Jorge Chavez International Airport LIM \n", - "13034 Gimpo International Airport GMP \n", - "13035 Shanghai Pudong International Airport PVG \n", - "13036 Venice Marco Polo Airport VE05 \n", - "13037 Ukrainka Air Base XHBU \n", - "13038 OR Tambo International Airport JNB \n", - "13039 Montreal / Pierre Elliott Trudeau Internationa... YUL \n", - "13040 London Heathrow Airport LHR \n", - "13041 Casper-Natrona County International Airport CPR \n", - "13042 Frankfurt am Main Airport FRA \n", - "13043 Tokyo Haneda International Airport HND \n", - "13044 Vienna International Airport VIE \n", - "13045 Amsterdam Airport Schiphol AMS \n", - "13046 Winnipeg / James Armstrong Richardson Internat... YWG \n", - "13047 Jeju International Airport CJU \n", - "13048 Dubai International Airport DXB \n", - "13049 Ministro Pistarini International Airport EZE \n", - "13050 Beijing Capital International Airport PEK \n", - "13051 Leonardo da Vinci___Fiumicino Airport RM11 \n", - "13052 Bologna Guglielmo Marconi Airport BO08 \n", - "13053 Portland International Jetport Airport PWM \n", - "13054 Pisa International Airport PI05 \n", - "13055 Winnipeg / James Armstrong Richardson Internat... YWG \n", - "13056 Licenciado Benito Juarez International Airport AICM \n", - "13057 Itami Airport ITM \n", - "13058 Adelaide International Airport ADL \n", - "\n", - " OriginCityName OriginCountry \\\n", - "0 Frankfurt am Main DE \n", - "1 Cape Town ZA \n", - "2 Venice IT \n", - "3 Naples IT \n", - "4 Mexico City MX \n", - "5 Edmonton CA \n", - "6 Zurich CH \n", - "7 Rome IT \n", - "8 Milan IT \n", - "9 Moscow RU \n", - "10 Albuquerque US \n", - "11 Venice IT \n", - "12 Mexico City MX \n", - "13 Naples IT \n", - "14 Rome IT \n", - "15 Chengdu CN \n", - "16 Mexico City MX \n", - "17 Cleveland US \n", - "18 Olenegorsk RU \n", - "19 Casper US \n", - "20 Erie US \n", - "21 Newark US \n", - "22 Copenhagen DK \n", - "23 Seattle US \n", - "24 Berlin DE \n", - "25 Manchester GB \n", - "26 Helsinki FI \n", - "27 Phoenix US \n", - "28 Chitose / Tomakomai JP \n", - "29 Tulsa US \n", - "... ... ... \n", - "13029 Osaka JP \n", - "13030 Tokyo JP \n", - "13031 Johannesburg ZA \n", - "13032 Bogota CO \n", - "13033 Lima PE \n", - "13034 Seoul KR \n", - "13035 Shanghai CN \n", - "13036 Venice IT \n", - "13037 Belogorsk RU \n", - "13038 Johannesburg ZA \n", - "13039 Montreal CA \n", - "13040 London GB \n", - "13041 Casper US \n", - "13042 Frankfurt am Main DE \n", - "13043 Tokyo JP \n", - "13044 Vienna AT \n", - "13045 Amsterdam NL \n", - "13046 Winnipeg CA \n", - "13047 Jeju City KR \n", - "13048 Dubai AE \n", - "13049 Buenos Aires AR \n", - "13050 Beijing CN \n", - "13051 Rome IT \n", - "13052 Bologna IT \n", - "13053 Portland US \n", - "13054 Pisa IT \n", - "13055 Winnipeg CA \n", - "13056 Mexico City MX \n", - "13057 Osaka JP \n", - "13058 Adelaide AU \n", - "\n", - " OriginLocation OriginRegion \\\n", - "0 {'lat': '50.033333', 'lon': '8.570556'} DE-HE \n", - "1 {'lat': '-33.96480179', 'lon': '18.60169983'} SE-BD \n", - "2 {'lat': '45.505299', 'lon': '12.3519'} IT-34 \n", - "3 {'lat': '40.886002', 'lon': '14.2908'} IT-72 \n", - "4 {'lat': '19.4363', 'lon': '-99.072098'} MX-DIF \n", - "5 {'lat': '53.30970001', 'lon': '-113.5800018'} CA-AB \n", - "6 {'lat': '47.464699', 'lon': '8.54917'} CH-ZH \n", - "7 {'lat': '41.7994', 'lon': '12.5949'} IT-62 \n", - "8 {'lat': '45.445099', 'lon': '9.27674'} IT-25 \n", - "9 {'lat': '55.972599', 'lon': '37.4146'} RU-MOS \n", - "10 {'lat': '35.040199', 'lon': '-106.609001'} US-NM \n", - "11 {'lat': '45.505299', 'lon': '12.3519'} IT-34 \n", - "12 {'lat': '19.4363', 'lon': '-99.072098'} MX-DIF \n", - "13 {'lat': '40.886002', 'lon': '14.2908'} IT-72 \n", - "14 {'lat': '41.7994', 'lon': '12.5949'} IT-62 \n", - "15 {'lat': '30.57850075', 'lon': '103.9469986'} SE-BD \n", - "16 {'lat': '19.4363', 'lon': '-99.072098'} MX-DIF \n", - "17 {'lat': '41.4117012', 'lon': '-81.84980011'} US-OH \n", - "18 {'lat': '68.15180206', 'lon': '33.46390152'} RU-MUR \n", - "19 {'lat': '42.90800095', 'lon': '-106.4639969'} US-WY \n", - "20 {'lat': '42.08312701', 'lon': '-80.17386675'} US-PA \n", - "21 {'lat': '40.69250107', 'lon': '-74.16870117'} US-NJ \n", - "22 {'lat': '55.61790085', 'lon': '12.65600014'} DK-84 \n", - "23 {'lat': '47.44900131', 'lon': '-122.3089981'} US-WA \n", - "24 {'lat': '52.5597', 'lon': '13.2877'} DE-BE \n", - "25 {'lat': '53.35369873', 'lon': '-2.274950027'} GB-ENG \n", - "26 {'lat': '60.31719971', 'lon': '24.9633007'} FI-ES \n", - "27 {'lat': '33.43429947', 'lon': '-112.012001'} US-AZ \n", - "28 {'lat': '42.77519989', 'lon': '141.6920013'} SE-BD \n", - "29 {'lat': '36.19839859', 'lon': '-95.88809967'} US-OK \n", - "... ... ... \n", - "13029 {'lat': '34.78549957', 'lon': '135.4380035'} SE-BD \n", - "13030 {'lat': '35.552299', 'lon': '139.779999'} SE-BD \n", - "13031 {'lat': '-26.1392', 'lon': '28.246'} SE-BD \n", - "13032 {'lat': '4.70159', 'lon': '-74.1469'} CO-CUN \n", - "13033 {'lat': '-12.0219', 'lon': '-77.114304'} SE-BD \n", - "13034 {'lat': '37.5583', 'lon': '126.791'} SE-BD \n", - "13035 {'lat': '31.14340019', 'lon': '121.8050003'} SE-BD \n", - "13036 {'lat': '45.505299', 'lon': '12.3519'} IT-34 \n", - "13037 {'lat': '51.169997', 'lon': '128.445007'} RU-AMU \n", - "13038 {'lat': '-26.1392', 'lon': '28.246'} SE-BD \n", - "13039 {'lat': '45.47060013', 'lon': '-73.74079895'} CA-QC \n", - "13040 {'lat': '51.4706', 'lon': '-0.461941'} GB-ENG \n", - "13041 {'lat': '42.90800095', 'lon': '-106.4639969'} US-WY \n", - "13042 {'lat': '50.033333', 'lon': '8.570556'} DE-HE \n", - "13043 {'lat': '35.552299', 'lon': '139.779999'} SE-BD \n", - "13044 {'lat': '48.11029816', 'lon': '16.56970024'} AT-9 \n", - "13045 {'lat': '52.30860138', 'lon': '4.76388979'} NL-NH \n", - "13046 {'lat': '49.90999985', 'lon': '-97.23989868'} CA-MB \n", - "13047 {'lat': '33.51129913', 'lon': '126.4929962'} SE-BD \n", - "13048 {'lat': '25.25279999', 'lon': '55.36439896'} SE-BD \n", - "13049 {'lat': '-34.8222', 'lon': '-58.5358'} AR-B \n", - "13050 {'lat': '40.08010101', 'lon': '116.5849991'} SE-BD \n", - "13051 {'lat': '41.8002778', 'lon': '12.2388889'} IT-62 \n", - "13052 {'lat': '44.5354', 'lon': '11.2887'} IT-45 \n", - "13053 {'lat': '43.64619827', 'lon': '-70.30930328'} US-ME \n", - "13054 {'lat': '43.683899', 'lon': '10.3927'} IT-52 \n", - "13055 {'lat': '49.90999985', 'lon': '-97.23989868'} CA-MB \n", - "13056 {'lat': '19.4363', 'lon': '-99.072098'} MX-DIF \n", - "13057 {'lat': '34.78549957', 'lon': '135.4380035'} SE-BD \n", - "13058 {'lat': '-34.945', 'lon': '138.531006'} SE-BD \n", - "\n", - " OriginWeather dayOfWeek timestamp \n", - "0 Sunny 0 2018-01-01 00:00:00 \n", - "1 Clear 0 2018-01-01 18:27:00 \n", - "2 Rain 0 2018-01-01 17:11:14 \n", - "3 Thunder & Lightning 0 2018-01-01 10:33:28 \n", - "4 Damaging Wind 0 2018-01-01 05:13:00 \n", - "5 Rain 0 2018-01-01 01:43:03 \n", - "6 Clear 0 2018-01-01 13:49:53 \n", - "7 Thunder & Lightning 0 2018-01-01 04:54:59 \n", - "8 Heavy Fog 0 2018-01-01 12:09:35 \n", - "9 Cloudy 0 2018-01-01 12:09:35 \n", - "10 Rain 0 2018-01-01 22:06:14 \n", - "11 Rain 0 2018-01-01 11:52:34 \n", - "12 Heavy Fog 0 2018-01-01 02:13:46 \n", - "13 Rain 0 2018-01-01 14:21:13 \n", - "14 Cloudy 0 2018-01-01 17:42:53 \n", - "15 Thunder & Lightning 0 2018-01-01 19:55:32 \n", - "16 Thunder & Lightning 0 2018-01-01 07:49:27 \n", - "17 Rain 0 2018-01-01 01:30:47 \n", - "18 Hail 0 2018-01-01 07:58:17 \n", - "19 Cloudy 0 2018-01-01 00:02:06 \n", - "20 Cloudy 0 2018-01-01 01:08:20 \n", - "21 Clear 0 2018-01-01 01:08:20 \n", - "22 Sunny 0 2018-01-01 07:48:35 \n", - "23 Heavy Fog 0 2018-01-01 18:57:21 \n", - "24 Rain 0 2018-01-01 13:18:25 \n", - "25 Thunder & Lightning 0 2018-01-01 08:20:35 \n", - "26 Rain 0 2018-01-01 15:38:32 \n", - "27 Clear 0 2018-01-01 03:08:45 \n", - "28 Damaging Wind 0 2018-01-01 01:16:59 \n", - "29 Rain 0 2018-01-01 18:00:59 \n", - "... ... ... ... \n", - "13029 Sunny 6 2018-02-11 20:10:13 \n", - "13030 Clear 6 2018-02-11 18:59:53 \n", - "13031 Hail 6 2018-02-11 00:57:48 \n", - "13032 Thunder & Lightning 6 2018-02-11 12:02:49 \n", - "13033 Thunder & Lightning 6 2018-02-11 02:07:40 \n", - "13034 Sunny 6 2018-02-11 00:35:04 \n", - "13035 Thunder & Lightning 6 2018-02-11 11:19:12 \n", - "13036 Cloudy 6 2018-02-11 15:07:11 \n", - "13037 Damaging Wind 6 2018-02-11 10:24:42 \n", - "13038 Damaging Wind 6 2018-02-11 00:42:06 \n", - "13039 Thunder & Lightning 6 2018-02-11 10:56:31 \n", - "13040 Clear 6 2018-02-11 00:39:37 \n", - "13041 Rain 6 2018-02-11 10:24:30 \n", - "13042 Clear 6 2018-02-11 09:02:07 \n", - "13043 Thunder & Lightning 6 2018-02-11 04:45:06 \n", - "13044 Thunder & Lightning 6 2018-02-11 00:51:14 \n", - "13045 Sunny 6 2018-02-11 05:41:51 \n", - "13046 Hail 6 2018-02-11 10:02:21 \n", - "13047 Cloudy 6 2018-02-11 15:55:10 \n", - "13048 Hail 6 2018-02-11 04:11:14 \n", - "13049 Sunny 6 2018-02-11 10:13:32 \n", - "13050 Cloudy 6 2018-02-11 11:23:23 \n", - "13051 Hail 6 2018-02-11 01:13:50 \n", - "13052 Cloudy 6 2018-02-11 18:35:42 \n", - "13053 Clear 6 2018-02-11 19:02:10 \n", - "13054 Sunny 6 2018-02-11 20:42:25 \n", - "13055 Rain 6 2018-02-11 01:41:57 \n", - "13056 Sunny 6 2018-02-11 04:09:27 \n", - "13057 Hail 6 2018-02-11 08:28:21 \n", - "13058 Rain 6 2018-02-11 14:54:34 \n", - "\n", - "[13059 rows x 27 columns]" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ed_flights" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Quick dump of underlying task list**" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Dest 1678\n", - "Origin 1678\n", - "dtype: int64" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ed_dest_origin_cancelled = ed_flights[ed_flights.Cancelled == True][['Dest', 'Origin']]\n", - "\n", - "ed_dest_origin_cancelled.count()" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "index_pattern: flights\n", - "Index:\n", - "\tindex_field: _id\n", - "\tis_source_field: False\n", - "Mappings:\n", - "\tcapabilities: _source es_dtype pd_dtype searchable \\\n", - "AvgTicketPrice True float float64 True \n", - "Cancelled True boolean bool True \n", - "Carrier True keyword object True \n", - "Dest True keyword object True \n", - "DestAirportID True keyword object True \n", - "DestCityName True keyword object True \n", - "DestCountry True keyword object True \n", - "DestLocation True geo_point object True \n", - "DestRegion True keyword object True \n", - "DestWeather True keyword object True \n", - "DistanceKilometers True float float64 True \n", - "DistanceMiles True float float64 True \n", - "FlightDelay True boolean bool True \n", - "FlightDelayMin True integer int64 True \n", - "FlightDelayType True keyword object True \n", - "FlightNum True keyword object True \n", - "FlightTimeHour True float float64 True \n", - "FlightTimeMin True float float64 True \n", - "Origin True keyword object True \n", - "OriginAirportID True keyword object True \n", - "OriginCityName True keyword object True \n", - "OriginCountry True keyword object True \n", - "OriginLocation True geo_point object True \n", - "OriginRegion True keyword object True \n", - "OriginWeather True keyword object True \n", - "dayOfWeek True integer int64 True \n", - "timestamp True date datetime64[ns] True \n", - "\n", - " aggregatable \n", - "AvgTicketPrice True \n", - "Cancelled True \n", - "Carrier True \n", - "Dest True \n", - "DestAirportID True \n", - "DestCityName True \n", - "DestCountry True \n", - "DestLocation True \n", - "DestRegion True \n", - "DestWeather True \n", - "DistanceKilometers True \n", - "DistanceMiles True \n", - "FlightDelay True \n", - "FlightDelayMin True \n", - "FlightDelayType True \n", - "FlightNum True \n", - "FlightTimeHour True \n", - "FlightTimeMin True \n", - "Origin True \n", - "OriginAirportID True \n", - "OriginCityName True \n", - "OriginCountry True \n", - "OriginLocation True \n", - "OriginRegion True \n", - "OriginWeather True \n", - "dayOfWeek True \n", - "timestamp True \n", - "Operations:\n", - "\ttasks: [('boolean_filter', {'term': {'Cancelled': True}}), ('columns', ['Dest', 'Origin']), ('tail', ('_doc', 5))]\n", - "\tsize: 5\n", - "\tsort_params: _doc:desc\n", - "\tcolumns: ['Dest', 'Origin']\n", - "\tpost_processing: ['sort_index']\n", - "\n" - ] - } - ], - "source": [ - "print(ed_dest_origin_cancelled.tail().info_es())" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "AvgTicketPrice float64\n", - "Cancelled bool\n", - "Carrier object\n", - "Dest object\n", - "DestAirportID object\n", - "DestCityName object\n", - "DestCountry object\n", - "DestLocation object\n", - "DestRegion object\n", - "DestWeather object\n", - "DistanceKilometers float64\n", - "DistanceMiles float64\n", - "FlightDelay bool\n", - "FlightDelayMin int64\n", - "FlightDelayType object\n", - "FlightNum object\n", - "FlightTimeHour float64\n", - "FlightTimeMin float64\n", - "Origin object\n", - "OriginAirportID object\n", - "OriginCityName object\n", - "OriginCountry object\n", - "OriginLocation object\n", - "OriginRegion object\n", - "OriginWeather object\n", - "dayOfWeek int64\n", - "timestamp datetime64[ns]\n", - "dtype: object" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ed_flights.dtypes" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['AvgTicketPrice', 'DistanceKilometers', 'DistanceMiles',\n", - " 'FlightDelayMin', 'FlightTimeHour', 'FlightTimeMin', 'dayOfWeek'],\n", - " dtype='object')" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ed_numeric_fields = ed_flights.select_dtypes(include=[np.number])\n", - "\n", - "ed_numeric_fields.columns" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "AvgTicketPrice float64\n", - "DistanceKilometers float64\n", - "DistanceMiles float64\n", - "FlightDelayMin int64\n", - "FlightTimeHour float64\n", - "FlightTimeMin float64\n", - "dayOfWeek int64\n", - "dtype: object" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ed_numeric_fields.dtypes" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "AvgTicketPrice 8.204365e+06\n", - "DistanceKilometers 9.261629e+07\n", - "DistanceMiles 5.754909e+07\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": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ed_numeric_fields.sum()" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
AvgTicketPriceDistanceKilometersDistanceMilesFlightDelayMinFlightTimeHourFlightTimeMindayOfWeek
min100.0205310.0000000.0000000.0000000.0000000.0000000.000000
std266.3866614578.2631932844.80085596.7430065.579019334.7411351.939365
mean628.2536897092.1424574406.85301047.3351718.518797511.1278422.835975
\n", - "
" - ], - "text/plain": [ - " AvgTicketPrice DistanceKilometers DistanceMiles FlightDelayMin \\\n", - "min 100.020531 0.000000 0.000000 0.000000 \n", - "std 266.386661 4578.263193 2844.800855 96.743006 \n", - "mean 628.253689 7092.142457 4406.853010 47.335171 \n", - "\n", - " FlightTimeHour FlightTimeMin dayOfWeek \n", - "min 0.000000 0.000000 0.000000 \n", - "std 5.579019 334.741135 1.939365 \n", - "mean 8.518797 511.127842 2.835975 " - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ed_numeric_fields.aggregate(['min', 'std', 'mean'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plotting" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "ed_numeric_fields.hist(figsize=[10,10])\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Compare with pandas" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "pd_flights.select_dtypes(include=[np.number]).hist(figsize=[10,10])\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Filtering" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "ed_jetbeats_routes = ed_flights[(ed_flights.Carrier == 'JetBeats') & (ed_flights.Cancelled == True)]\n", - "\n", - "ed_jetbeats_routes = ed_jetbeats_routes[['OriginAirportID', 'DestAirportID']]" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OriginAirportIDDestAirportID
77AICMMAN
125RM11CTS
131CTURM11
156AICMRST
175TV01XIY
195GMPRM11
227DWCBNA
245ITMUIO
257UIOEZE
304ITMSJU
319AICMUIO
361NGONA01
381SCLTUL
402XLMOZRH
417CANMUC
455CGNMI12
457CDGRM11
523GMPVIE
532BCNICN
535MELXLMO
551TUSVR10
554CA07JFK
566BILPI05
600PI05VIE
638MADMCI
694SVOTO11
714ISTMEM
715HELMI12
728LTNSVO
748FCONRT
.........
11931EZEPVG
11933NRTSHA
11971CA07BOG
11981CT03CTS
12063GE01GE01
12098DWCHEL
12201KIXEZE
12206YULIAD
12215SYRYWG
12330DELPI05
12336MELNA01
12347BO08MUC
12365NGOCYEG
12384VIEXIY
12400CA07CTS
12432CYEGHYD
12458YWGYWG
12464VIEVIE
12488DLHXHBU
12533JNBHYD
12601PVGPVG
12619FRAOSL
12673GE01EZE
12690UIOHND
12722VR10YWG
12729BNECPT
12745CGNYYZ
12871TPATV01
12955ZRHZRH
13003TO11WAW
\n", - "
\n", - "

441 rows x 2 columns

" - ], - "text/plain": [ - " OriginAirportID DestAirportID\n", - "77 AICM MAN\n", - "125 RM11 CTS\n", - "131 CTU RM11\n", - "156 AICM RST\n", - "175 TV01 XIY\n", - "195 GMP RM11\n", - "227 DWC BNA\n", - "245 ITM UIO\n", - "257 UIO EZE\n", - "304 ITM SJU\n", - "319 AICM UIO\n", - "361 NGO NA01\n", - "381 SCL TUL\n", - "402 XLMO ZRH\n", - "417 CAN MUC\n", - "455 CGN MI12\n", - "457 CDG RM11\n", - "523 GMP VIE\n", - "532 BCN ICN\n", - "535 MEL XLMO\n", - "551 TUS VR10\n", - "554 CA07 JFK\n", - "566 BIL PI05\n", - "600 PI05 VIE\n", - "638 MAD MCI\n", - "694 SVO TO11\n", - "714 IST MEM\n", - "715 HEL MI12\n", - "728 LTN SVO\n", - "748 FCO NRT\n", - "... ... ...\n", - "11931 EZE PVG\n", - "11933 NRT SHA\n", - "11971 CA07 BOG\n", - "11981 CT03 CTS\n", - "12063 GE01 GE01\n", - "12098 DWC HEL\n", - "12201 KIX EZE\n", - "12206 YUL IAD\n", - "12215 SYR YWG\n", - "12330 DEL PI05\n", - "12336 MEL NA01\n", - "12347 BO08 MUC\n", - "12365 NGO CYEG\n", - "12384 VIE XIY\n", - "12400 CA07 CTS\n", - "12432 CYEG HYD\n", - "12458 YWG YWG\n", - "12464 VIE VIE\n", - "12488 DLH XHBU\n", - "12533 JNB HYD\n", - "12601 PVG PVG\n", - "12619 FRA OSL\n", - "12673 GE01 EZE\n", - "12690 UIO HND\n", - "12722 VR10 YWG\n", - "12729 BNE CPT\n", - "12745 CGN YYZ\n", - "12871 TPA TV01\n", - "12955 ZRH ZRH\n", - "13003 TO11 WAW\n", - "\n", - "[441 rows x 2 columns]" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ed_jetbeats_routes" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Compare with pandas" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OriginAirportIDDestAirportID
12729BNECPT
12745CGNYYZ
12871TPATV01
12955ZRHZRH
13003TO11WAW
\n", - "
\n", - "

5 rows x 2 columns

" - ], - "text/plain": [ - " OriginAirportID DestAirportID\n", - "12729 BNE CPT\n", - "12745 CGN YYZ\n", - "12871 TPA TV01\n", - "12955 ZRH ZRH\n", - "13003 TO11 WAW\n", - "\n", - "[5 rows x 2 columns]" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ed_jetbeats_routes.tail()" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "pd_jetbeats_routes = pd_flights[(pd_flights.Carrier == 'JetBeats') & (pd_flights.Cancelled == True)]\n", - "\n", - "pd_jetbeats_routes = pd_jetbeats_routes[['OriginAirportID', 'DestAirportID']]" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OriginAirportIDDestAirportID
12729BNECPT
12745CGNYYZ
12871TPATV01
12955ZRHZRH
13003TO11WAW
\n", - "
" - ], - "text/plain": [ - " OriginAirportID DestAirportID\n", - "12729 BNE CPT\n", - "12745 CGN YYZ\n", - "12871 TPA TV01\n", - "12955 ZRH ZRH\n", - "13003 TO11 WAW" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd_jetbeats_routes.tail()" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
AvgTicketPriceCancelledCarrier
10906.437948FalseJetBeats
11704.463771FalseLogstash Airways
12922.499077TrueLogstash Airways
13374.959276FalseLogstash Airways
14552.917371FalseLogstash Airways
\n", - "
\n", - "

15 rows x 27 columns

" - ], - "text/plain": [ - " AvgTicketPrice Cancelled Carrier\n", - "10 906.437948 False JetBeats\n", - "11 704.463771 False Logstash Airways\n", - "12 922.499077 True Logstash Airways\n", - "13 374.959276 False Logstash Airways\n", - "14 552.917371 False Logstash Airways\n", - "\n", - "[15 rows x 27 columns]" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ed_flights.iloc[10:15, 0:3]" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
AvgTicketPriceCancelledCarrier
10906.437948FalseJetBeats
11704.463771FalseLogstash Airways
12922.499077TrueLogstash Airways
13374.959276FalseLogstash Airways
14552.917371FalseLogstash Airways
\n", - "
" - ], - "text/plain": [ - " AvgTicketPrice Cancelled Carrier\n", - "10 906.437948 False JetBeats\n", - "11 704.463771 False Logstash Airways\n", - "12 922.499077 True Logstash Airways\n", - "13 374.959276 False Logstash Airways\n", - "14 552.917371 False Logstash Airways" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd_flights.iloc[10:15, 0:3]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Elasticsearch/Pandas Interoperability" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**`eland` DataFrame to `pandas` DataFrame**" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "pd_df = ed_jetbeats_routes._to_pandas()" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Index: 441 entries, 77 to 13003\n", - "Data columns (total 2 columns):\n", - "OriginAirportID 441 non-null object\n", - "DestAirportID 441 non-null object\n", - "dtypes: object(2)\n", - "memory usage: 10.3+ KB\n" - ] - } - ], - "source": [ - "pd_df.info()" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Index: 441 entries, 77 to 13003\n", - "Data columns (total 2 columns):\n", - "OriginAirportID 441 non-null object\n", - "DestAirportID 441 non-null object\n", - "dtypes: object(2)\n", - "memory usage: 80.0 bytes\n" - ] - } - ], - "source": [ - "ed_jetbeats_routes.info()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**`pandas` DataFrame to `eland` DataFrame (Elasticsearch index)**" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "green open ecommerce-customer-sales G2ZbWrUjQdGW9A4YoVmkig 1 0 3320 0 377.2kb 377.2kb\n", - "yellow open ecommerce _EcfrcYuRKGNcPE9dkMBMg 1 1 4675 0 4.4mb 4.4mb\n", - "yellow open electrical-grid-stability GnxO5cN4TzyQQdrB8AhuhA 1 1 10000 0 3.6mb 3.6mb\n", - "yellow open ed_jetbeats_routes 06QSjoVQS5W8K2esGaqOkA 1 1 441 0 19.3kb 19.3kb\n", - "yellow open electrical-grid-stability_regression -imErXhsSZmrIan6yeWEyQ 1 1 10000 0 4.1mb 4.1mb\n", - "\n" - ] - } - ], - "source": [ - "print(es.cat.indices('e*'))" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "green open ecommerce-customer-sales G2ZbWrUjQdGW9A4YoVmkig 1 0 3320 0 377.2kb 377.2kb\n", - "yellow open ecommerce _EcfrcYuRKGNcPE9dkMBMg 1 1 4675 0 4.4mb 4.4mb\n", - "yellow open electrical-grid-stability GnxO5cN4TzyQQdrB8AhuhA 1 1 10000 0 3.6mb 3.6mb\n", - "yellow open ed_jetbeats_routes RIYR5oZHScSx2ZI4-4Qiug 1 1 441 0 19.2kb 19.2kb\n", - "yellow open electrical-grid-stability_regression -imErXhsSZmrIan6yeWEyQ 1 1 10000 0 4.1mb 4.1mb\n", - "\n" - ] - } - ], - "source": [ - "ed.pandas_to_es(pd_df, \"localhost\", \"ed_jetbeats_routes\", if_exists=\"replace\", refresh=True)\n", - "\n", - "print(es.cat.indices('e*'))" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "ed_df = ed.DataFrame(\"localhost\", \"ed_jetbeats_routes\")" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Index: 441 entries, 77 to 13003\n", - "Data columns (total 2 columns):\n", - "DestAirportID 441 non-null object\n", - "OriginAirportID 441 non-null object\n", - "dtypes: object(2)\n", - "memory usage: 80.0 bytes\n" - ] - } - ], - "source": [ - "ed_df.info()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## CSV Interoperability" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['ed_df.csv']" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import glob\n", - "import os\n", - "\n", - "#os.remove('ed_df.csv')\n", - "\n", - "glob.glob('*.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [], - "source": [ - "ed_df.to_csv('ed_df.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['ed_df.csv']" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "glob.glob('*.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [], - "source": [ - "pd_csv = pd.read_csv('ed_df.csv', index_col=0)" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Int64Index: 441 entries, 77 to 13003\n", - "Data columns (total 2 columns):\n", - "DestAirportID 441 non-null object\n", - "OriginAirportID 441 non-null object\n", - "dtypes: object(2)\n", - "memory usage: 10.3+ KB\n" - ] - } - ], - "source": [ - "pd_csv.info()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.7.4" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/eland/tests/mappings/test_aggregatables_pytest.py b/eland/tests/mappings/test_aggregatables_pytest.py index 9d27ba7..a2f7111 100644 --- a/eland/tests/mappings/test_aggregatables_pytest.py +++ b/eland/tests/mappings/test_aggregatables_pytest.py @@ -11,50 +11,50 @@ class TestMappingsAggregatables(TestData): aggregatables = ed_ecommerce._query_compiler._mappings.aggregatable_field_names() expected = {'category.keyword': 'category', - 'currency': 'currency', - 'customer_birth_date': 'customer_birth_date', - 'customer_first_name.keyword': 'customer_first_name', - 'customer_full_name.keyword': 'customer_full_name', - 'customer_gender': 'customer_gender', - 'customer_id': 'customer_id', - 'customer_last_name.keyword': 'customer_last_name', - 'customer_phone': 'customer_phone', - 'day_of_week': 'day_of_week', - 'day_of_week_i': 'day_of_week_i', - 'email': 'email', - 'geoip.city_name': 'geoip.city_name', - 'geoip.continent_name': 'geoip.continent_name', - 'geoip.country_iso_code': 'geoip.country_iso_code', - 'geoip.location': 'geoip.location', - 'geoip.region_name': 'geoip.region_name', - 'manufacturer.keyword': 'manufacturer', - 'order_date': 'order_date', - 'order_id': 'order_id', - 'products._id.keyword': 'products._id', - 'products.base_price': 'products.base_price', - 'products.base_unit_price': 'products.base_unit_price', - 'products.category.keyword': 'products.category', - 'products.created_on': 'products.created_on', - 'products.discount_amount': 'products.discount_amount', - 'products.discount_percentage': 'products.discount_percentage', - 'products.manufacturer.keyword': 'products.manufacturer', - 'products.min_price': 'products.min_price', - 'products.price': 'products.price', - 'products.product_id': 'products.product_id', - 'products.product_name.keyword': 'products.product_name', - 'products.quantity': 'products.quantity', - 'products.sku': 'products.sku', - 'products.tax_amount': 'products.tax_amount', - 'products.taxful_price': 'products.taxful_price', - 'products.taxless_price': 'products.taxless_price', - 'products.unit_discount_amount': 'products.unit_discount_amount', - 'sku': 'sku', - 'taxful_total_price': 'taxful_total_price', - 'taxless_total_price': 'taxless_total_price', - 'total_quantity': 'total_quantity', - 'total_unique_products': 'total_unique_products', - 'type': 'type', - 'user': 'user'} + 'currency': 'currency', + 'customer_birth_date': 'customer_birth_date', + 'customer_first_name.keyword': 'customer_first_name', + 'customer_full_name.keyword': 'customer_full_name', + 'customer_gender': 'customer_gender', + 'customer_id': 'customer_id', + 'customer_last_name.keyword': 'customer_last_name', + 'customer_phone': 'customer_phone', + 'day_of_week': 'day_of_week', + 'day_of_week_i': 'day_of_week_i', + 'email': 'email', + 'geoip.city_name': 'geoip.city_name', + 'geoip.continent_name': 'geoip.continent_name', + 'geoip.country_iso_code': 'geoip.country_iso_code', + 'geoip.location': 'geoip.location', + 'geoip.region_name': 'geoip.region_name', + 'manufacturer.keyword': 'manufacturer', + 'order_date': 'order_date', + 'order_id': 'order_id', + 'products._id.keyword': 'products._id', + 'products.base_price': 'products.base_price', + 'products.base_unit_price': 'products.base_unit_price', + 'products.category.keyword': 'products.category', + 'products.created_on': 'products.created_on', + 'products.discount_amount': 'products.discount_amount', + 'products.discount_percentage': 'products.discount_percentage', + 'products.manufacturer.keyword': 'products.manufacturer', + 'products.min_price': 'products.min_price', + 'products.price': 'products.price', + 'products.product_id': 'products.product_id', + 'products.product_name.keyword': 'products.product_name', + 'products.quantity': 'products.quantity', + 'products.sku': 'products.sku', + 'products.tax_amount': 'products.tax_amount', + 'products.taxful_price': 'products.taxful_price', + 'products.taxless_price': 'products.taxless_price', + 'products.unit_discount_amount': 'products.unit_discount_amount', + 'sku': 'sku', + 'taxful_total_price': 'taxful_total_price', + 'taxless_total_price': 'taxless_total_price', + 'total_quantity': 'total_quantity', + 'total_unique_products': 'total_unique_products', + 'type': 'type', + 'user': 'user'} assert expected == aggregatables diff --git a/eland/tests/mappings/test_numeric_source_fields_pytest.py b/eland/tests/mappings/test_numeric_source_fields_pytest.py index a63e94d..9d015ab 100644 --- a/eland/tests/mappings/test_numeric_source_fields_pytest.py +++ b/eland/tests/mappings/test_numeric_source_fields_pytest.py @@ -2,8 +2,6 @@ import numpy as np -from pandas.util.testing import assert_series_equal - from eland.tests.common import TestData @@ -32,7 +30,8 @@ class TestMappingsNumericSourceFields(TestData): ed_ecommerce = self.ed_ecommerce()[field_names] pd_ecommerce = self.pd_ecommerce()[field_names] - ed_numeric = ed_ecommerce._query_compiler._mappings.numeric_source_fields(field_names=field_names, include_bool=False) + ed_numeric = ed_ecommerce._query_compiler._mappings.numeric_source_fields(field_names=field_names, + include_bool=False) pd_numeric = pd_ecommerce.select_dtypes(include=np.number) assert pd_numeric.columns.to_list() == ed_numeric @@ -53,7 +52,8 @@ class TestMappingsNumericSourceFields(TestData): ed_ecommerce = self.ed_ecommerce()[field_names] pd_ecommerce = self.pd_ecommerce()[field_names] - ed_numeric = ed_ecommerce._query_compiler._mappings.numeric_source_fields(field_names=field_names, include_bool=False) + ed_numeric = ed_ecommerce._query_compiler._mappings.numeric_source_fields(field_names=field_names, + include_bool=False) pd_numeric = pd_ecommerce.select_dtypes(include=np.number) assert pd_numeric.columns.to_list() == ed_numeric @@ -71,7 +71,8 @@ class TestMappingsNumericSourceFields(TestData): ed_ecommerce = self.ed_ecommerce()[field_names] pd_ecommerce = self.pd_ecommerce()[field_names] - ed_numeric = ed_ecommerce._query_compiler._mappings.numeric_source_fields(field_names=field_names, include_bool=False) + ed_numeric = ed_ecommerce._query_compiler._mappings.numeric_source_fields(field_names=field_names, + include_bool=False) pd_numeric = pd_ecommerce.select_dtypes(include=np.number) assert pd_numeric.columns.to_list() == ed_numeric diff --git a/eland/tests/operators/test_operators_pytest.py b/eland/tests/operators/test_operators_pytest.py index f9e5ee4..be1ba61 100644 --- a/eland/tests/operators/test_operators_pytest.py +++ b/eland/tests/operators/test_operators_pytest.py @@ -2,7 +2,7 @@ from eland.filter import * -class TestOperators(): +class TestOperators: def test_leaf_boolean_filter(self): assert GreaterEqual('a', 2).build() == {"range": {"a": {"gte": 2}}} assert LessEqual('a', 2).build() == {"range": {"a": {"lte": 2}}} diff --git a/eland/tests/plotting/test_dataframe_hist_pytest.py b/eland/tests/plotting/test_dataframe_hist_pytest.py index 7ee5eb8..ce736dd 100644 --- a/eland/tests/plotting/test_dataframe_hist_pytest.py +++ b/eland/tests/plotting/test_dataframe_hist_pytest.py @@ -1,7 +1,6 @@ # File called _pytest for PyCharm compatability import pytest - from matplotlib.testing.decorators import check_figures_equal from eland.tests.common import TestData @@ -14,12 +13,14 @@ def test_plot_hist(fig_test, fig_ref): pd_flights = test_data.pd_flights()[['DistanceKilometers', 'DistanceMiles', 'FlightDelayMin', 'FlightTimeHour']] ed_flights = test_data.ed_flights()[['DistanceKilometers', 'DistanceMiles', 'FlightDelayMin', 'FlightTimeHour']] - # This throws a userwarning (https://github.com/pandas-dev/pandas/blob/171c71611886aab8549a8620c5b0071a129ad685/pandas/plotting/_matplotlib/tools.py#L222) + # This throws a userwarning + # (https://github.com/pandas-dev/pandas/blob/171c71611886aab8549a8620c5b0071a129ad685/pandas/plotting/_matplotlib/tools.py#L222) with pytest.warns(UserWarning): pd_ax = fig_ref.subplots() pd_flights.hist(ax=pd_ax) - # This throws a userwarning (https://github.com/pandas-dev/pandas/blob/171c71611886aab8549a8620c5b0071a129ad685/pandas/plotting/_matplotlib/tools.py#L222) + # This throws a userwarning + # (https://github.com/pandas-dev/pandas/blob/171c71611886aab8549a8620c5b0071a129ad685/pandas/plotting/_matplotlib/tools.py#L222) with pytest.warns(UserWarning): ed_ax = fig_test.subplots() ed_flights.hist(ax=ed_ax) diff --git a/eland/tests/query_compiler/test_rename_pytest.py b/eland/tests/query_compiler/test_rename_pytest.py index 40f0534..710d826 100644 --- a/eland/tests/query_compiler/test_rename_pytest.py +++ b/eland/tests/query_compiler/test_rename_pytest.py @@ -1,7 +1,4 @@ # File called _pytest for PyCharm compatability -import pandas as pd - -from pandas.util.testing import assert_series_equal from eland import ElandQueryCompiler from eland.tests.common import TestData @@ -20,7 +17,7 @@ class TestQueryCompilerRename(TestData): field_names = ['a'] display_names = ['A'] - update_A = {'a' : 'A'} + update_A = {'a': 'A'} mapper.rename_display_name(update_A) assert field_names == mapper.field_names_to_list() @@ -29,7 +26,7 @@ class TestQueryCompilerRename(TestData): field_names = ['a', 'b'] display_names = ['A', 'B'] - update_B = {'b' : 'B'} + update_B = {'b': 'B'} mapper.rename_display_name(update_B) assert field_names == mapper.field_names_to_list() @@ -38,7 +35,7 @@ class TestQueryCompilerRename(TestData): field_names = ['a', 'b'] display_names = ['AA', 'B'] - update_AA = {'A' : 'AA'} + update_AA = {'A': 'AA'} mapper.rename_display_name(update_AA) assert field_names == mapper.field_names_to_list() @@ -50,26 +47,26 @@ class TestQueryCompilerRename(TestData): mapper = ElandQueryCompiler.DisplayNameToFieldNameMapper() display_names = ['A', 'b', 'c', 'd'] - update_A = {'a' : 'A'} + update_A = {'a': 'A'} mapper.rename_display_name(update_A) assert display_names == mapper.field_to_display_names(columns) # Invalid update display_names = ['A', 'b', 'c', 'd'] - update_ZZ = {'a' : 'ZZ'} + update_ZZ = {'a': 'ZZ'} mapper.rename_display_name(update_ZZ) assert display_names == mapper.field_to_display_names(columns) display_names = ['AA', 'b', 'c', 'd'] - update_AA = {'A' : 'AA'} # already renamed to 'A' + update_AA = {'A': 'AA'} # already renamed to 'A' mapper.rename_display_name(update_AA) assert display_names == mapper.field_to_display_names(columns) display_names = ['AA', 'b', 'C', 'd'] - update_AA_C = {'a' : 'AA', 'c' : 'C'} # 'a' rename ignored + update_AA_C = {'a': 'AA', 'c': 'C'} # 'a' rename ignored mapper.rename_display_name(update_AA_C) assert display_names == mapper.field_to_display_names(columns) diff --git a/eland/tests/series/test_arithmetics_pytest.py b/eland/tests/series/test_arithmetics_pytest.py index c3c0666..3c1567e 100644 --- a/eland/tests/series/test_arithmetics_pytest.py +++ b/eland/tests/series/test_arithmetics_pytest.py @@ -1,7 +1,6 @@ # File called _pytest for PyCharm compatability -import pytest - import numpy as np +import pytest from eland.tests.common import TestData, assert_pandas_eland_series_equal diff --git a/eland/tests/series/test_info_es_pytest.py b/eland/tests/series/test_info_es_pytest.py index cc6b633..ca5a302 100644 --- a/eland/tests/series/test_info_es_pytest.py +++ b/eland/tests/series/test_info_es_pytest.py @@ -1,11 +1,7 @@ # File called _pytest for PyCharm compatability -from pandas.util.testing import assert_almost_equal - from eland.tests.common import TestData -import eland as ed - class TestSeriesInfoEs(TestData): @@ -14,4 +10,3 @@ class TestSeriesInfoEs(TestData): # No assertion, just test it can be called info_es = ed_flights.info_es() - diff --git a/eland/tests/series/test_metrics_pytest.py b/eland/tests/series/test_metrics_pytest.py index ef221ba..5d470f5 100644 --- a/eland/tests/series/test_metrics_pytest.py +++ b/eland/tests/series/test_metrics_pytest.py @@ -4,11 +4,8 @@ from pandas.util.testing import assert_almost_equal from eland.tests.common import TestData -import eland as ed - class TestSeriesMetrics(TestData): - funcs = ['max', 'min', 'mean', 'sum'] def test_flights_metrics(self): @@ -30,7 +27,6 @@ class TestSeriesMetrics(TestData): ed_metric = getattr(ed_ecommerce, func)() assert ed_metric.empty - def test_ecommerce_selected_all_numeric_source_fields(self): # All of these are numeric columns = ['total_quantity', 'taxful_total_price', 'taxless_total_price'] diff --git a/eland/tests/series/test_name_pytest.py b/eland/tests/series/test_name_pytest.py index 5e757a8..f395ae3 100644 --- a/eland/tests/series/test_name_pytest.py +++ b/eland/tests/series/test_name_pytest.py @@ -27,6 +27,3 @@ class TestSeriesName(TestData): assert_pandas_eland_series_equal(pd_series, ed_series) assert ed_series.name == pd_series.name - - - diff --git a/eland/tests/series/test_rename_pytest.py b/eland/tests/series/test_rename_pytest.py index 89eb7f7..96cc19f 100644 --- a/eland/tests/series/test_rename_pytest.py +++ b/eland/tests/series/test_rename_pytest.py @@ -18,6 +18,3 @@ class TestSeriesRename(TestData): ed_renamed = ed_carrier.rename("renamed") assert_pandas_eland_series_equal(pd_renamed, ed_renamed) - - - diff --git a/eland/tests/series/test_repr_pytest.py b/eland/tests/series/test_repr_pytest.py index e83d6e9..6b3dec0 100644 --- a/eland/tests/series/test_repr_pytest.py +++ b/eland/tests/series/test_repr_pytest.py @@ -1,8 +1,7 @@ # File called _pytest for PyCharm compatability import eland as ed -import pandas as pd from eland.tests import ELASTICSEARCH_HOST -from eland.tests import FLIGHTS_INDEX_NAME, ECOMMERCE_INDEX_NAME +from eland.tests import FLIGHTS_INDEX_NAME from eland.tests.common import TestData diff --git a/eland/tests/series/test_value_counts_pytest.py b/eland/tests/series/test_value_counts_pytest.py index f79bf4c..20187e8 100644 --- a/eland/tests/series/test_value_counts_pytest.py +++ b/eland/tests/series/test_value_counts_pytest.py @@ -1,8 +1,8 @@ # File called _pytest for PyCharm compatability -import eland as ed -from eland.tests.common import TestData -from pandas.util.testing import assert_series_equal import pytest +from pandas.util.testing import assert_series_equal + +from eland.tests.common import TestData class TestSeriesValueCounts(TestData): diff --git a/eland/utils.py b/eland/utils.py index b9f9d18..755ea1a 100644 --- a/eland/utils.py +++ b/eland/utils.py @@ -1,9 +1,8 @@ -import pandas as pd import csv +import pandas as pd from pandas.io.parsers import _c_parser_defaults - from eland import Client from eland import DataFrame from eland import Mappings @@ -339,4 +338,3 @@ def read_csv(filepath_or_buffer, ed_df = DataFrame(client, es_dest_index) return ed_df - diff --git a/example/load_data.py b/example/load_data.py index 4b93d91..308372a 100644 --- a/example/load_data.py +++ b/example/load_data.py @@ -4,6 +4,7 @@ import csv from elasticsearch import Elasticsearch, helpers from elasticsearch.exceptions import TransportError + def create_index(es, index): mapping = { "mappings": { @@ -30,6 +31,7 @@ def create_index(es, index): else: raise + def parse_date(date): """ we need to convert dates to conform to the mapping in the following way: @@ -55,6 +57,7 @@ def parse_date(date): return date + def parse_line(line): """ creates the document to be indexed @@ -72,6 +75,7 @@ def parse_line(line): return obj + def load_data(es): """ generate one document per line of online-retail.csv @@ -85,7 +89,7 @@ def load_data(es): reader = csv.reader(f, quotechar='"', delimiter=',', quoting=csv.QUOTE_ALL) for line in reader: if header: - header=False + header = False continue doc = parse_line(line) @@ -106,11 +110,11 @@ if __name__ == "__main__": # create the elasticsearch client, pointing to the host parameter es = Elasticsearch(args.host) - index='online-retail' + index = 'online-retail' # load data from online retail csv in data directory stream = load_data(es) - for ok, result in helpers.streaming_bulk( + for ok, result in helpers.streaming_bulk( es, actions=stream, index=index, From 93dadc054cc5a3028a6c1291a07605d7b6ba146d Mon Sep 17 00:00:00 2001 From: Stephen Dodson Date: Tue, 26 Nov 2019 11:10:18 +0000 Subject: [PATCH 2/2] Fixing docstring format --- eland/dataframe.py | 101 +++++++++++++++++++++++---------------------- 1 file changed, 51 insertions(+), 50 deletions(-) diff --git a/eland/dataframe.py b/eland/dataframe.py index ad6290f..2f01aef 100644 --- a/eland/dataframe.py +++ b/eland/dataframe.py @@ -92,6 +92,7 @@ class DataFrame(NDFrame): [5 rows x 2 columns] """ + def __init__(self, client=None, index_pattern=None, @@ -339,59 +340,59 @@ class DataFrame(NDFrame): def info_es(self): # noinspection PyPep8 """ - A debug summary of an eland DataFrame internals. + A debug summary of an eland DataFrame internals. - This includes the Elasticsearch search queries and query compiler task list. + This includes the Elasticsearch search queries and query compiler task list. - Returns - ------- - str - A debug summary of an eland DataFrame internals. + Returns + ------- + str + A debug summary of an eland DataFrame internals. - Examples - -------- - >>> df = ed.DataFrame('localhost', 'flights') - >>> df = df[(df.OriginAirportID == 'AMS') & (df.FlightDelayMin > 60)] - >>> df = df[['timestamp', 'OriginAirportID', 'DestAirportID', 'FlightDelayMin']] - >>> df = df.tail() - >>> df - timestamp OriginAirportID DestAirportID FlightDelayMin - 12608 2018-02-10 01:20:52 AMS CYEG 120 - 12720 2018-02-10 14:09:40 AMS BHM 255 - 12725 2018-02-10 00:53:01 AMS ATL 360 - 12823 2018-02-10 15:41:20 AMS NGO 120 - 12907 2018-02-11 20:08:25 AMS LIM 225 - - [5 rows x 4 columns] - >>> print(df.info_es()) - index_pattern: flights - Index: - index_field: _id - is_source_field: False - Mappings: - capabilities: _source es_dtype pd_dtype searchable aggregatable - AvgTicketPrice True float float64 True True - Cancelled True boolean bool True True - Carrier True keyword object True True - Dest True keyword object True True - DestAirportID True keyword object True True - ... ... ... ... ... ... - OriginLocation True geo_point object True True - OriginRegion True keyword object True True - OriginWeather True keyword object True True - dayOfWeek True integer int64 True True - timestamp True date datetime64[ns] True True - - [27 rows x 5 columns] - Operations: - tasks: [('boolean_filter', {'bool': {'must': [{'term': {'OriginAirportID': 'AMS'}}, {'range': {'FlightDelayMin': {'gt': 60}}}]}}), ('field_names', ['timestamp', 'OriginAirportID', 'DestAirportID', 'FlightDelayMin']), ('tail', ('_doc', 5))] - size: 5 - sort_params: _doc:desc - _source: ['timestamp', 'OriginAirportID', 'DestAirportID', 'FlightDelayMin'] - body: {'query': {'bool': {'must': [{'term': {'OriginAirportID': 'AMS'}}, {'range': {'FlightDelayMin': {'gt': 60}}}]}}, 'aggs': {}} - post_processing: ['sort_index'] - - """ + Examples + -------- + >>> df = ed.DataFrame('localhost', 'flights') + >>> df = df[(df.OriginAirportID == 'AMS') & (df.FlightDelayMin > 60)] + >>> df = df[['timestamp', 'OriginAirportID', 'DestAirportID', 'FlightDelayMin']] + >>> df = df.tail() + >>> df + timestamp OriginAirportID DestAirportID FlightDelayMin + 12608 2018-02-10 01:20:52 AMS CYEG 120 + 12720 2018-02-10 14:09:40 AMS BHM 255 + 12725 2018-02-10 00:53:01 AMS ATL 360 + 12823 2018-02-10 15:41:20 AMS NGO 120 + 12907 2018-02-11 20:08:25 AMS LIM 225 + + [5 rows x 4 columns] + >>> print(df.info_es()) + index_pattern: flights + Index: + index_field: _id + is_source_field: False + Mappings: + capabilities: _source es_dtype pd_dtype searchable aggregatable + AvgTicketPrice True float float64 True True + Cancelled True boolean bool True True + Carrier True keyword object True True + Dest True keyword object True True + DestAirportID True keyword object True True + ... ... ... ... ... ... + OriginLocation True geo_point object True True + OriginRegion True keyword object True True + OriginWeather True keyword object True True + dayOfWeek True integer int64 True True + timestamp True date datetime64[ns] True True + + [27 rows x 5 columns] + Operations: + tasks: [('boolean_filter', {'bool': {'must': [{'term': {'OriginAirportID': 'AMS'}}, {'range': {'FlightDelayMin': {'gt': 60}}}]}}), ('field_names', ['timestamp', 'OriginAirportID', 'DestAirportID', 'FlightDelayMin']), ('tail', ('_doc', 5))] + size: 5 + sort_params: _doc:desc + _source: ['timestamp', 'OriginAirportID', 'DestAirportID', 'FlightDelayMin'] + body: {'query': {'bool': {'must': [{'term': {'OriginAirportID': 'AMS'}}, {'range': {'FlightDelayMin': {'gt': 60}}}]}}, 'aggs': {}} + post_processing: ['sort_index'] + + """ buf = StringIO() super()._info_es(buf)