diff --git a/docs/source/examples/demo_notebook.ipynb b/docs/source/examples/demo_notebook.ipynb index 27c12f4..e5d24de 100644 --- a/docs/source/examples/demo_notebook.ipynb +++ b/docs/source/examples/demo_notebook.ipynb @@ -753,7 +753,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 17, @@ -787,7 +787,7 @@ } ], "source": [ - "ed_flights.index.index_field" + "ed_flights.index.es_index_field" ] }, { @@ -2381,8 +2381,8 @@ " \n", " \n", " std\n", - " 4.578263e+03\n", - " 2.663867e+02\n", + " 4.578614e+03\n", + " 2.664071e+02\n", " \n", " \n", "\n", @@ -2392,7 +2392,7 @@ " DistanceKilometers AvgTicketPrice\n", "sum 9.261629e+07 8.204365e+06\n", "min 0.000000e+00 1.000205e+02\n", - "std 4.578263e+03 2.663867e+02" + "std 4.578614e+03 2.664071e+02" ] }, "execution_count": 36, @@ -2704,15 +2704,15 @@ " \n", " \n", " 25%\n", - " 410.012798\n", + " 410.008918\n", " 2470.545974\n", " ...\n", - " 251.682199\n", + " 252.064162\n", " 1.000000\n", " \n", " \n", " 50%\n", - " 640.362667\n", + " 640.387285\n", " 7612.072403\n", " ...\n", " 503.148975\n", @@ -2720,11 +2720,11 @@ " \n", " \n", " 75%\n", - " 842.233478\n", - " 9735.660463\n", + " 842.227593\n", + " 9735.860651\n", " ...\n", - " 720.572969\n", - " 4.271242\n", + " 720.511968\n", + " 4.068548\n", " \n", " \n", " max\n", @@ -2745,9 +2745,9 @@ "mean 628.253689 7092.142457 ... 511.127842 2.835975\n", "std 266.386661 4578.263193 ... 334.741135 1.939365\n", "min 100.020531 0.000000 ... 0.000000 0.000000\n", - "25% 410.012798 2470.545974 ... 251.682199 1.000000\n", - "50% 640.362667 7612.072403 ... 503.148975 3.000000\n", - "75% 842.233478 9735.660463 ... 720.572969 4.271242\n", + "25% 410.008918 2470.545974 ... 252.064162 1.000000\n", + "50% 640.387285 7612.072403 ... 503.148975 3.000000\n", + "75% 842.227593 9735.860651 ... 720.511968 4.068548\n", "max 1199.729004 19881.482422 ... 1902.901978 6.000000\n", "\n", "[8 rows x 7 columns]" @@ -3594,27 +3594,9 @@ } }, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/daniel/PycharmProjects/eland/venv/lib/python3.6/site-packages/pandas/plotting/_matplotlib/tools.py:298: MatplotlibDeprecationWarning: \n", - "The rowNum attribute was deprecated in Matplotlib 3.2 and will be removed two minor releases later. Use ax.get_subplotspec().rowspan.start instead.\n", - " layout[ax.rowNum, ax.colNum] = ax.get_visible()\n", - "/home/daniel/PycharmProjects/eland/venv/lib/python3.6/site-packages/pandas/plotting/_matplotlib/tools.py:298: MatplotlibDeprecationWarning: \n", - "The colNum attribute was deprecated in Matplotlib 3.2 and will be removed two minor releases later. Use ax.get_subplotspec().colspan.start instead.\n", - " layout[ax.rowNum, ax.colNum] = ax.get_visible()\n", - "/home/daniel/PycharmProjects/eland/venv/lib/python3.6/site-packages/pandas/plotting/_matplotlib/tools.py:304: MatplotlibDeprecationWarning: \n", - "The rowNum attribute was deprecated in Matplotlib 3.2 and will be removed two minor releases later. Use ax.get_subplotspec().rowspan.start instead.\n", - " if not layout[ax.rowNum + 1, ax.colNum]:\n", - "/home/daniel/PycharmProjects/eland/venv/lib/python3.6/site-packages/pandas/plotting/_matplotlib/tools.py:304: MatplotlibDeprecationWarning: \n", - "The colNum attribute was deprecated in Matplotlib 3.2 and will be removed two minor releases later. Use ax.get_subplotspec().colspan.start instead.\n", - " if not layout[ax.rowNum + 1, ax.colNum]:\n" - ] - }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -3641,7 +3623,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -3681,7 +3663,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 58, "metadata": { "pycharm": { "is_executing": false @@ -3692,9 +3674,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "index_pattern: flights\n", + "es_index_pattern: flights\n", "Index:\n", - " index_field: _id\n", + " es_index_field: _id\n", " is_source_field: False\n", "Mappings:\n", " capabilities:\n", diff --git a/docs/source/examples/online_retail_analysis.ipynb b/docs/source/examples/online_retail_analysis.ipynb index 171cd12..c30c5b4 100644 --- a/docs/source/examples/online_retail_analysis.ipynb +++ b/docs/source/examples/online_retail_analysis.ipynb @@ -72,7 +72,7 @@ } ], "source": [ - "df.index.index_field" + "df.index.es_index_field" ] }, { @@ -155,9 +155,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "index_pattern: online-retail\n", + "es_index_pattern: online-retail\n", "Index:\n", - " index_field: _id\n", + " es_index_field: _id\n", " is_source_field: False\n", "Mappings:\n", " capabilities:\n", @@ -284,9 +284,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "index_pattern: online-retail\n", + "es_index_pattern: online-retail\n", "Index:\n", - " index_field: _id\n", + " es_index_field: _id\n", " is_source_field: False\n", "Mappings:\n", " capabilities:\n", @@ -786,9 +786,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "index_pattern: online-retail\n", + "es_index_pattern: online-retail\n", "Index:\n", - " index_field: _id\n", + " es_index_field: _id\n", " is_source_field: False\n", "Mappings:\n", " capabilities:\n", @@ -1023,21 +1023,21 @@ " \n", " \n", " 25%\n", - " 14227.934845\n", + " 14220.777549\n", " 1.000000\n", " 1.250000\n", " \n", " \n", " 50%\n", - " 15669.138235\n", + " 15656.783333\n", " 2.000000\n", " 2.510000\n", " \n", " \n", " 75%\n", - " 17212.690092\n", - " 6.610262\n", - " 4.211297\n", + " 17214.162905\n", + " 6.607062\n", + " 4.216043\n", " \n", " \n", " max\n", @@ -1055,9 +1055,9 @@ "mean 15590.776680 7.464000 4.103233\n", "std 1764.025160 85.924387 20.104873\n", "min 12347.000000 -9360.000000 0.000000\n", - "25% 14227.934845 1.000000 1.250000\n", - "50% 15669.138235 2.000000 2.510000\n", - "75% 17212.690092 6.610262 4.211297\n", + "25% 14220.777549 1.000000 1.250000\n", + "50% 15656.783333 2.000000 2.510000\n", + "75% 17214.162905 6.607062 4.216043\n", "max 18239.000000 2880.000000 950.990000" ] }, @@ -1085,7 +1085,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1111,7 +1111,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1436,7 +1436,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.5" + "version": "3.6.9" }, "pycharm": { "stem_cell": { diff --git a/docs/source/reference/api/eland.DataFrame.es_info.rst b/docs/source/reference/api/eland.DataFrame.es_info.rst new file mode 100644 index 0000000..caa8f77 --- /dev/null +++ b/docs/source/reference/api/eland.DataFrame.es_info.rst @@ -0,0 +1,10 @@ +eland.DataFrame.es_info +======================= + +.. currentmodule:: eland + +.. warning:: + Previously this method was named ``info_es()``. + DataFrame.info_es() is deprecated, use DataFrame.es_info() instead. + +.. automethod:: DataFrame.es_info diff --git a/docs/source/reference/api/eland.DataFrame.info_es.rst b/docs/source/reference/api/eland.DataFrame.info_es.rst deleted file mode 100644 index e93f6e8..0000000 --- a/docs/source/reference/api/eland.DataFrame.info_es.rst +++ /dev/null @@ -1,6 +0,0 @@ -eland.DataFrame.info_es -======================= - -.. currentmodule:: eland - -.. automethod:: DataFrame.info_es diff --git a/docs/source/reference/api/eland.DataFrame.to_pandas.rst b/docs/source/reference/api/eland.DataFrame.to_pandas.rst new file mode 100644 index 0000000..f011f87 --- /dev/null +++ b/docs/source/reference/api/eland.DataFrame.to_pandas.rst @@ -0,0 +1,6 @@ +eland.DataFrame.to_pandas +========================= + +.. currentmodule:: eland + +.. automethod:: DataFrame.to_pandas diff --git a/docs/source/reference/api/eland.Series.es_info.rst b/docs/source/reference/api/eland.Series.es_info.rst new file mode 100644 index 0000000..ade3c24 --- /dev/null +++ b/docs/source/reference/api/eland.Series.es_info.rst @@ -0,0 +1,10 @@ +eland.Series.es_info +==================== + +.. currentmodule:: eland + +.. warning:: + Previously this method was named ``info_es()``. + Series.info_es() is deprecated, use Series.es_info() instead. + +.. automethod:: Series.es_info diff --git a/docs/source/reference/api/eland.Series.info_es.rst b/docs/source/reference/api/eland.Series.info_es.rst deleted file mode 100644 index 2b3b104..0000000 --- a/docs/source/reference/api/eland.Series.info_es.rst +++ /dev/null @@ -1,6 +0,0 @@ -eland.Series.info_es -==================== - -.. currentmodule:: eland - -.. automethod:: Series.info_es diff --git a/docs/source/reference/api/eland.Series.to_pandas.rst b/docs/source/reference/api/eland.Series.to_pandas.rst new file mode 100644 index 0000000..621e8bd --- /dev/null +++ b/docs/source/reference/api/eland.Series.to_pandas.rst @@ -0,0 +1,6 @@ +eland.DataFrame.to_pandas +========================= + +.. currentmodule:: eland + +.. automethod:: Series.to_pandas diff --git a/docs/source/reference/api/eland.csv_to_eland.rst b/docs/source/reference/api/eland.csv_to_eland.rst new file mode 100644 index 0000000..2c39136 --- /dev/null +++ b/docs/source/reference/api/eland.csv_to_eland.rst @@ -0,0 +1,6 @@ +eland.csv_to_eland +================== + +.. currentmodule:: eland + +.. autofunction:: csv_to_eland diff --git a/docs/source/reference/api/eland.read_csv.rst b/docs/source/reference/api/eland.read_csv.rst deleted file mode 100644 index c43cdec..0000000 --- a/docs/source/reference/api/eland.read_csv.rst +++ /dev/null @@ -1,6 +0,0 @@ -eland.read_csv -============== - -.. currentmodule:: eland - -.. autofunction:: read_csv diff --git a/docs/source/reference/api/eland.read_es.rst b/docs/source/reference/api/eland.read_es.rst deleted file mode 100644 index e31751e..0000000 --- a/docs/source/reference/api/eland.read_es.rst +++ /dev/null @@ -1,6 +0,0 @@ -eland.read_es -============= - -.. currentmodule:: eland - -.. autofunction:: read_es diff --git a/docs/source/reference/dataframe.rst b/docs/source/reference/dataframe.rst index cf94043..a24be30 100644 --- a/docs/source/reference/dataframe.rst +++ b/docs/source/reference/dataframe.rst @@ -82,7 +82,7 @@ Elasticsearch Functions .. autosummary:: :toctree: api/ - DataFrame.info_es + DataFrame.es_info DataFrame.es_query Serialization / IO / conversion @@ -95,3 +95,4 @@ Serialization / IO / conversion DataFrame.to_csv DataFrame.to_html DataFrame.to_string + DataFrame.to_pandas diff --git a/docs/source/reference/general_utility_functions.rst b/docs/source/reference/general_utility_functions.rst index fd6960d..030a740 100644 --- a/docs/source/reference/general_utility_functions.rst +++ b/docs/source/reference/general_utility_functions.rst @@ -5,13 +5,6 @@ General utility functions ========================= .. currentmodule:: eland -Elasticsearch access -~~~~~~~~~~~~~~~~~~~~ -.. autosummary:: - :toctree: api/ - - read_es - Pandas and Eland ~~~~~~~~~~~~~~~~ .. autosummary:: diff --git a/docs/source/reference/io.rst b/docs/source/reference/io.rst index 1d16d9c..56e20a3 100644 --- a/docs/source/reference/io.rst +++ b/docs/source/reference/io.rst @@ -10,4 +10,4 @@ Flat File .. autosummary:: :toctree: api/ - read_csv + csv_to_eland diff --git a/docs/source/reference/series.rst b/docs/source/reference/series.rst index 3ab6889..31b89f4 100644 --- a/docs/source/reference/series.rst +++ b/docs/source/reference/series.rst @@ -89,10 +89,11 @@ Serialization / IO / conversion Series.to_string Series.to_numpy + Series.to_pandas -Elasticsearch utilities +Elasticsearch Functions ~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: :toctree: api/ - Series.info_es + Series.es_info diff --git a/eland/__init__.py b/eland/__init__.py index e675a9d..b2f8398 100644 --- a/eland/__init__.py +++ b/eland/__init__.py @@ -17,7 +17,7 @@ from eland.index import Index from eland.ndframe import NDFrame from eland.series import Series from eland.dataframe import DataFrame -from eland.utils import pandas_to_eland, eland_to_pandas, read_es, read_csv +from eland.etl import pandas_to_eland, eland_to_pandas, read_es, read_csv, csv_to_eland __all__ = [ "DataFrame", @@ -26,6 +26,7 @@ __all__ = [ "Index", "pandas_to_eland", "eland_to_pandas", + "csv_to_eland", "read_csv", "read_es", "SortOrder", diff --git a/eland/dataframe.py b/eland/dataframe.py index 2510528..246600d 100644 --- a/eland/dataframe.py +++ b/eland/dataframe.py @@ -19,10 +19,11 @@ from pandas.io.formats.printing import pprint_thing from pandas.util._validators import validate_bool_kwarg import eland.plotting as gfx -from eland import NDFrame -from eland import Series +from eland.ndframe import NDFrame +from eland.series import Series from eland.common import DEFAULT_NUM_ROWS_DISPLAYED, docstring_parameter from eland.filter import BooleanFilter +from eland.utils import deprecated_api class DataFrame(NDFrame): @@ -34,14 +35,14 @@ class DataFrame(NDFrame): Parameters ---------- - client: Elasticsearch client argument(s) (e.g. 'localhost:9200') + es_client: Elasticsearch client argument(s) (e.g. 'localhost:9200') - elasticsearch-py parameters or - elasticsearch-py instance - index_pattern: str + es_index_pattern: str 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 + es_index_field: str, optional The Elasticsearch index field to use as the DataFrame index. Defaults to _id if None is used. See Also @@ -68,7 +69,7 @@ class DataFrame(NDFrame): >>> from elasticsearch import Elasticsearch >>> es = Elasticsearch("localhost:9200") - >>> df = ed.DataFrame(client=es, index_pattern='flights', columns=['AvgTicketPrice', 'Cancelled']) + >>> df = ed.DataFrame(es_client=es, es_index_pattern='flights', columns=['AvgTicketPrice', 'Cancelled']) >>> df.head() AvgTicketPrice Cancelled 0 841.265642 False @@ -83,8 +84,12 @@ class DataFrame(NDFrame): 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( + ... es_client='localhost', + ... es_index_pattern='flights', + ... columns=['AvgTicketPrice', 'timestamp'], + ... es_index_field='timestamp' + ... ) >>> df.head() AvgTicketPrice timestamp 2018-01-01T00:00:00 841.265642 2018-01-01 00:00:00 @@ -98,12 +103,12 @@ class DataFrame(NDFrame): def __init__( self, - client=None, - index_pattern=None, + es_client=None, + es_index_pattern=None, + es_index_field=None, columns=None, - index_field=None, - query_compiler=None, - ): + _query_compiler=None, + ) -> None: """ There are effectively 2 constructors: @@ -112,18 +117,18 @@ class DataFrame(NDFrame): The constructor with 'query_compiler' is for internal use only. """ - if query_compiler is None: - if client is None or index_pattern is None: + if _query_compiler is None: + if es_client is None or es_index_pattern is None: raise ValueError( "client and index_pattern must be defined in DataFrame constructor" ) # python 3 syntax super().__init__( - client=client, - index_pattern=index_pattern, + es_client=es_client, + es_index_pattern=es_index_pattern, columns=columns, - index_field=index_field, - query_compiler=query_compiler, + es_index_field=es_index_field, + _query_compiler=_query_compiler, ) def _get_columns(self): @@ -210,7 +215,7 @@ class DataFrame(NDFrame): [3 rows x 2 columns] """ - return DataFrame(query_compiler=self._query_compiler.head(n)) + return DataFrame(_query_compiler=self._query_compiler.head(n)) def tail(self, n: int = 5) -> "DataFrame": """ @@ -254,7 +259,7 @@ class DataFrame(NDFrame): [5 rows x 2 columns] """ - return DataFrame(query_compiler=self._query_compiler.tail(n)) + return DataFrame(_query_compiler=self._query_compiler.tail(n)) def sample( self, n: int = None, frac: float = None, random_state: int = None @@ -290,7 +295,7 @@ class DataFrame(NDFrame): raise ValueError("Please enter a value for `frac` OR `n`, not both") return DataFrame( - query_compiler=self._query_compiler.sample( + _query_compiler=self._query_compiler.sample( n=n, frac=frac, random_state=random_state ) ) @@ -543,7 +548,7 @@ class DataFrame(NDFrame): """ return self._query_compiler.count() - def info_es(self): + def es_info(self): # noinspection PyPep8 """ A debug summary of an eland DataFrame internals. @@ -570,10 +575,10 @@ class DataFrame(NDFrame): 12907 2018-02-11 20:08:25 AMS LIM 225 [5 rows x 4 columns] - >>> print(df.info_es()) - index_pattern: flights + >>> print(df.es_info()) + es_index_pattern: flights Index: - index_field: _id + es_index_field: _id is_source_field: False Mappings: capabilities: @@ -593,10 +598,14 @@ class DataFrame(NDFrame): """ buf = StringIO() - super()._info_es(buf) + super()._es_info(buf) return buf.getvalue() + @deprecated_api("eland.DataFrame.es_info()") + def info_es(self): + return self.es_info() + def es_query(self, query): """Applies an Elasticsearch DSL query to the current DataFrame. @@ -651,7 +660,7 @@ class DataFrame(NDFrame): raise TypeError("'query' must be of type 'dict'") if tuple(query) == ("query",): query = query["query"] - return DataFrame(query_compiler=self._query_compiler.es_query(query)) + return DataFrame(_query_compiler=self._query_compiler.es_query(query)) def _index_summary(self): # Print index summary e.g. @@ -659,11 +668,11 @@ class DataFrame(NDFrame): # Do this by getting head and tail of dataframe if self.empty: # index[0] is out of bounds for empty df - head = self.head(1)._to_pandas() - tail = self.tail(1)._to_pandas() + head = self.head(1).to_pandas() + tail = self.tail(1).to_pandas() else: - head = self.head(1)._to_pandas().index[0] - tail = self.tail(1)._to_pandas().index[0] + head = self.head(1).to_pandas().index[0] + tail = self.tail(1).to_pandas().index[0] index_summary = f", {pprint_thing(head)} to {pprint_thing(tail)}" name = "Index" @@ -1076,7 +1085,7 @@ class DataFrame(NDFrame): elif isinstance(key, DataFrame): return self.where(key) elif isinstance(key, BooleanFilter): - return DataFrame(query_compiler=self._query_compiler._update_query(key)) + return DataFrame(_query_compiler=self._query_compiler._update_query(key)) else: return self._getitem_column(key) @@ -1088,7 +1097,7 @@ class DataFrame(NDFrame): def _getitem_array(self, key): if isinstance(key, Series): - key = key._to_pandas() + key = key.to_pandas() if is_bool_indexer(key): if isinstance(key, pd.Series) and not key.index.equals(self.index): warnings.warn( @@ -1107,7 +1116,7 @@ class DataFrame(NDFrame): key = pd.RangeIndex(len(self.index))[key] if len(key): return DataFrame( - query_compiler=self._query_compiler.getitem_row_array(key) + _query_compiler=self._query_compiler.getitem_row_array(key) ) else: return DataFrame(columns=self.columns) @@ -1118,7 +1127,7 @@ class DataFrame(NDFrame): f" not index" ) return DataFrame( - query_compiler=self._query_compiler.getitem_column_array(key) + _query_compiler=self._query_compiler.getitem_column_array(key) ) def _create_or_update_from_compiler(self, new_query_compiler, inplace=False): @@ -1128,13 +1137,13 @@ class DataFrame(NDFrame): or type(new_query_compiler) in self._query_compiler.__class__.__bases__ ), f"Invalid Query Compiler object: {type(new_query_compiler)}" if not inplace: - return DataFrame(query_compiler=new_query_compiler) + return DataFrame(_query_compiler=new_query_compiler) else: self._query_compiler = new_query_compiler @staticmethod def _reduce_dimension(query_compiler): - return Series(query_compiler=query_compiler) + return Series(_query_compiler=query_compiler) def to_csv( self, @@ -1189,7 +1198,7 @@ class DataFrame(NDFrame): } return self._query_compiler.to_csv(**kwargs) - def _to_pandas(self, show_progress=False): + def to_pandas(self, show_progress: bool = False) -> "DataFrame": """ Utility method to convert eland.Dataframe to pandas.Dataframe @@ -1256,7 +1265,7 @@ class DataFrame(NDFrame): Examples -------- - >>> df = ed.read_es('localhost', 'ecommerce') + >>> df = ed.DataFrame('localhost', 'ecommerce') >>> df.shape (4675, 45) """ @@ -1372,7 +1381,7 @@ class DataFrame(NDFrame): Examples -------- - >>> df = ed.read_es('localhost', 'flights') + >>> df = ed.DataFrame('localhost', 'flights') >>> df.shape (13059, 27) >>> df.query('FlightDelayMin > 60').shape @@ -1380,7 +1389,7 @@ class DataFrame(NDFrame): """ if isinstance(expr, BooleanFilter): return DataFrame( - query_compiler=self._query_compiler._update_query(BooleanFilter(expr)) + _query_compiler=self._query_compiler._update_query(BooleanFilter(expr)) ) elif isinstance(expr, str): column_resolver = {} @@ -1390,7 +1399,7 @@ class DataFrame(NDFrame): resolvers = column_resolver, {} # Use pandas eval to parse query - TODO validate this further filter = eval(expr, target=self, resolvers=tuple(tuple(resolvers))) - return DataFrame(query_compiler=self._query_compiler._update_query(filter)) + return DataFrame(_query_compiler=self._query_compiler._update_query(filter)) else: raise NotImplementedError(expr, type(expr)) diff --git a/eland/etl.py b/eland/etl.py new file mode 100644 index 0000000..10977e2 --- /dev/null +++ b/eland/etl.py @@ -0,0 +1,521 @@ +# Licensed to Elasticsearch B.V under one or more agreements. +# Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +# See the LICENSE file in the project root for more information + +import csv +from typing import Union, List, Tuple, Optional, Mapping, Dict, Any + +import pandas as pd # type: ignore +from pandas.io.parsers import _c_parser_defaults # type: ignore + +from eland import DataFrame +from eland.field_mappings import FieldMappings +from eland.common import ensure_es_client, DEFAULT_CHUNK_SIZE +from eland.utils import deprecated_api +from elasticsearch import Elasticsearch # type: ignore +from elasticsearch.helpers import bulk # type: ignore + + +@deprecated_api("eland.DataFrame()") +def read_es( + es_client: Union[str, List[str], Tuple[str, ...], Elasticsearch], + es_index_pattern: str, +) -> DataFrame: + """ + Utility method to create an eland.Dataframe from an Elasticsearch index_pattern. + (Similar to pandas.read_csv, but source data is an Elasticsearch index rather than + a csv file) + + Parameters + ---------- + es_client: Elasticsearch client argument(s) + - elasticsearch-py parameters or + - elasticsearch-py instance + es_index_pattern: str + Elasticsearch index pattern + + Returns + ------- + eland.DataFrame + + See Also + -------- + eland.pandas_to_eland: Create an eland.Dataframe from pandas.DataFrame + eland.eland_to_pandas: Create a pandas.Dataframe from eland.DataFrame + """ + return DataFrame(es_client=es_client, es_index_pattern=es_index_pattern) + + +def pandas_to_eland( + pd_df: pd.DataFrame, + es_client: Union[str, List[str], Tuple[str, ...], Elasticsearch], + es_dest_index: str, + es_if_exists: str = "fail", + es_refresh: bool = False, + es_dropna: bool = False, + es_type_overrides: Optional[Mapping[str, str]] = None, + chunksize: Optional[int] = None, + use_pandas_index_for_es_ids: bool = True, +) -> DataFrame: + """ + Append a pandas DataFrame to an Elasticsearch index. + Mainly used in testing. + Modifies the elasticsearch destination index + + Parameters + ---------- + es_client: Elasticsearch client argument(s) + - elasticsearch-py parameters or + - elasticsearch-py instance + es_dest_index: str + Name of Elasticsearch index to be appended to + es_if_exists : {'fail', 'replace', 'append'}, default 'fail' + How to behave if the index already exists. + + - fail: Raise a ValueError. + - replace: Delete the index before inserting new values. + - append: Insert new values to the existing index. Create if does not exist. + es_refresh: bool, default 'False' + Refresh es_dest_index after bulk index + es_dropna: bool, default 'False' + * True: Remove missing values (see pandas.Series.dropna) + * False: Include missing values - may cause bulk to fail + es_type_overrides: dict, default None + Dict of field_name: es_data_type that overrides default es data types + chunksize: int, default None + Number of pandas.DataFrame rows to read before bulk index into Elasticsearch + use_pandas_index_for_es_ids: bool, default 'True' + * True: pandas.DataFrame.index fields will be used to populate Elasticsearch '_id' fields. + * False: Ignore pandas.DataFrame.index when indexing into Elasticsearch + + Returns + ------- + eland.Dataframe + eland.DataFrame referencing data in destination_index + + Examples + -------- + + >>> pd_df = pd.DataFrame(data={'A': 3.141, + ... 'B': 1, + ... 'C': 'foo', + ... 'D': pd.Timestamp('20190102'), + ... 'E': [1.0, 2.0, 3.0], + ... 'F': False, + ... 'G': [1, 2, 3], + ... 'H': 'Long text - to be indexed as es type text'}, + ... index=['0', '1', '2']) + >>> type(pd_df) + + >>> pd_df + A B ... G H + 0 3.141 1 ... 1 Long text - to be indexed as es type text + 1 3.141 1 ... 2 Long text - to be indexed as es type text + 2 3.141 1 ... 3 Long text - to be indexed as es type text + + [3 rows x 8 columns] + >>> pd_df.dtypes + A float64 + B int64 + C object + D datetime64[ns] + E float64 + F bool + G int64 + H object + dtype: object + + Convert `pandas.DataFrame` to `eland.DataFrame` - this creates an Elasticsearch index called `pandas_to_eland`. + Overwrite existing Elasticsearch index if it exists `if_exists="replace"`, and sync index so it is + readable on return `refresh=True` + + + >>> ed_df = ed.pandas_to_eland(pd_df, + ... 'localhost', + ... 'pandas_to_eland', + ... es_if_exists="replace", + ... es_refresh=True, + ... es_type_overrides={'H':'text'}) # index field 'H' as text not keyword + >>> type(ed_df) + + >>> ed_df + A B ... G H + 0 3.141 1 ... 1 Long text - to be indexed as es type text + 1 3.141 1 ... 2 Long text - to be indexed as es type text + 2 3.141 1 ... 3 Long text - to be indexed as es type text + + [3 rows x 8 columns] + >>> ed_df.dtypes + A float64 + B int64 + C object + D datetime64[ns] + E float64 + F bool + G int64 + H object + dtype: object + + See Also + -------- + eland.eland_to_pandas: Create a pandas.Dataframe from eland.DataFrame + """ + if chunksize is None: + chunksize = DEFAULT_CHUNK_SIZE + + mapping = FieldMappings._generate_es_mappings(pd_df, es_type_overrides) + es_client = ensure_es_client(es_client) + + # If table exists, check if_exists parameter + if es_client.indices.exists(index=es_dest_index): + if es_if_exists == "fail": + raise ValueError( + f"Could not create the index [{es_dest_index}] because it " + f"already exists. " + f"Change the if_exists parameter to " + f"'append' or 'replace' data." + ) + elif es_if_exists == "replace": + es_client.indices.delete(index=es_dest_index) + es_client.indices.create(index=es_dest_index, body=mapping) + # elif if_exists == "append": + # TODO validate mapping are compatible + else: + es_client.indices.create(index=es_dest_index, body=mapping) + + # Now add data + actions = [] + n = 0 + for row in pd_df.iterrows(): + if es_dropna: + values = row[1].dropna().to_dict() + else: + values = row[1].to_dict() + + if use_pandas_index_for_es_ids: + # Use index as _id + id = row[0] + + # Use integer as id field for repeatable results + action = {"_index": es_dest_index, "_source": values, "_id": str(id)} + else: + action = {"_index": es_dest_index, "_source": values} + + actions.append(action) + + n = n + 1 + + if n % chunksize == 0: + bulk(client=es_client, actions=actions, refresh=es_refresh) + actions = [] + + bulk(client=es_client, actions=actions, refresh=es_refresh) + return DataFrame(es_client, es_dest_index) + + +def eland_to_pandas(ed_df: DataFrame, show_progress: bool = False) -> pd.DataFrame: + """ + Convert an eland.Dataframe to a pandas.DataFrame + + **Note: this loads the entire Elasticsearch index into in core pandas.DataFrame structures. For large + indices this can create significant load on the Elasticsearch cluster and require signficant memory** + + Parameters + ---------- + ed_df: eland.DataFrame + The source eland.Dataframe referencing the Elasticsearch index + show_progress: bool + Output progress of option to stdout? By default False. + + Returns + ------- + pandas.Dataframe + pandas.DataFrame contains all rows and columns in eland.DataFrame + + Examples + -------- + >>> ed_df = ed.DataFrame('localhost', 'flights').head() + >>> type(ed_df) + + >>> ed_df + AvgTicketPrice Cancelled ... dayOfWeek timestamp + 0 841.265642 False ... 0 2018-01-01 00:00:00 + 1 882.982662 False ... 0 2018-01-01 18:27:00 + 2 190.636904 False ... 0 2018-01-01 17:11:14 + 3 181.694216 True ... 0 2018-01-01 10:33:28 + 4 730.041778 False ... 0 2018-01-01 05:13:00 + + [5 rows x 27 columns] + + Convert `eland.DataFrame` to `pandas.DataFrame` (Note: this loads entire Elasticsearch index into core memory) + + >>> pd_df = ed.eland_to_pandas(ed_df) + >>> type(pd_df) + + >>> pd_df + AvgTicketPrice Cancelled ... dayOfWeek timestamp + 0 841.265642 False ... 0 2018-01-01 00:00:00 + 1 882.982662 False ... 0 2018-01-01 18:27:00 + 2 190.636904 False ... 0 2018-01-01 17:11:14 + 3 181.694216 True ... 0 2018-01-01 10:33:28 + 4 730.041778 False ... 0 2018-01-01 05:13:00 + + [5 rows x 27 columns] + + Convert `eland.DataFrame` to `pandas.DataFrame` and show progress every 10000 rows + + >>> pd_df = ed.eland_to_pandas(ed.DataFrame('localhost', 'flights'), show_progress=True) # doctest: +SKIP + 2020-01-29 12:43:36.572395: read 10000 rows + 2020-01-29 12:43:37.309031: read 13059 rows + + See Also + -------- + eland.pandas_to_eland: Create an eland.Dataframe from pandas.DataFrame + """ + return ed_df.to_pandas(show_progress=show_progress) + + +def csv_to_eland( # type: ignore + filepath_or_buffer, + es_client: Union[str, List[str], Tuple[str, ...], Elasticsearch], + es_dest_index: str, + es_if_exists: str = "fail", + es_refresh: bool = False, + es_dropna: bool = False, + es_type_overrides: Optional[Mapping[str, str]] = None, + sep=",", + delimiter=None, + # Column and Index Locations and Names + header="infer", + names=None, + index_col=None, + usecols=None, + squeeze=False, + prefix=None, + mangle_dupe_cols=True, + # General Parsing Configuration + dtype=None, + engine=None, + converters=None, + true_values=None, + false_values=None, + skipinitialspace=False, + skiprows=None, + skipfooter=0, + nrows=None, + # Iteration + # iterator=False, + chunksize=None, + # NA and Missing Data Handling + na_values=None, + keep_default_na=True, + na_filter=True, + verbose=False, + skip_blank_lines=True, + # Datetime Handling + parse_dates=False, + infer_datetime_format=False, + keep_date_col=False, + date_parser=None, + dayfirst=False, + cache_dates=True, + # Quoting, Compression, and File Format + compression="infer", + thousands=None, + decimal=b".", + lineterminator=None, + quotechar='"', + quoting=csv.QUOTE_MINIMAL, + doublequote=True, + escapechar=None, + comment=None, + encoding=None, + dialect=None, + # Error Handling + error_bad_lines=True, + warn_bad_lines=True, + # Internal + delim_whitespace=False, + low_memory=_c_parser_defaults["low_memory"], + memory_map=False, + float_precision=None, +) -> "DataFrame": + """ + Read a comma-separated values (csv) file into eland.DataFrame (i.e. an Elasticsearch index). + + **Modifies an Elasticsearch index** + + **Note pandas iteration options not supported** + + Parameters + ---------- + es_client: Elasticsearch client argument(s) + - elasticsearch-py parameters or + - elasticsearch-py instance + es_dest_index: str + Name of Elasticsearch index to be appended to + es_if_exists : {'fail', 'replace', 'append'}, default 'fail' + How to behave if the index already exists. + + - fail: Raise a ValueError. + - replace: Delete the index before inserting new values. + - append: Insert new values to the existing index. Create if does not exist. + es_dropna: bool, default 'False' + * True: Remove missing values (see pandas.Series.dropna) + * False: Include missing values - may cause bulk to fail + es_type_overrides: dict, default None + Dict of columns: es_type to override default es datatype mappings + chunksize + number of csv rows to read before bulk index into Elasticsearch + + Other Parameters + ---------------- + Parameters derived from :pandas_api_docs:`pandas.read_csv`. + + See Also + -------- + :pandas_api_docs:`pandas.read_csv` + + Notes + ----- + iterator not supported + + Examples + -------- + + See if 'churn' index exists in Elasticsearch + + >>> from elasticsearch import Elasticsearch # doctest: +SKIP + >>> es = Elasticsearch() # doctest: +SKIP + >>> es.indices.exists(index="churn") # doctest: +SKIP + False + + Read 'churn.csv' and use first column as _id (and eland.DataFrame index) + :: + + # churn.csv + ,state,account length,area code,phone number,international plan,voice mail plan,number vmail messages,total day minutes,total day calls,total day charge,total eve minutes,total eve calls,total eve charge,total night minutes,total night calls,total night charge,total intl minutes,total intl calls,total intl charge,customer service calls,churn + 0,KS,128,415,382-4657,no,yes,25,265.1,110,45.07,197.4,99,16.78,244.7,91,11.01,10.0,3,2.7,1,0 + 1,OH,107,415,371-7191,no,yes,26,161.6,123,27.47,195.5,103,16.62,254.4,103,11.45,13.7,3,3.7,1,0 + ... + + >>> ed.csv_to_eland( + ... "churn.csv", + ... es_client='localhost', + ... es_dest_index='churn', + ... es_refresh=True, + ... index_col=0 + ... ) # doctest: +SKIP + account length area code churn customer service calls ... total night calls total night charge total night minutes voice mail plan + 0 128 415 0 1 ... 91 11.01 244.7 yes + 1 107 415 0 1 ... 103 11.45 254.4 yes + 2 137 415 0 0 ... 104 7.32 162.6 no + 3 84 408 0 2 ... 89 8.86 196.9 no + 4 75 415 0 3 ... 121 8.41 186.9 no + ... ... ... ... ... ... ... ... ... ... + 3328 192 415 0 2 ... 83 12.56 279.1 yes + 3329 68 415 0 3 ... 123 8.61 191.3 no + 3330 28 510 0 2 ... 91 8.64 191.9 no + 3331 184 510 0 2 ... 137 6.26 139.2 no + 3332 74 415 0 0 ... 77 10.86 241.4 yes + + [3333 rows x 21 columns] + + Validate data now exists in 'churn' index: + + >>> es.search(index="churn", size=1) # doctest: +SKIP + {'took': 1, 'timed_out': False, '_shards': {'total': 1, 'successful': 1, 'skipped': 0, 'failed': 0}, 'hits': {'total': {'value': 3333, 'relation': 'eq'}, 'max_score': 1.0, 'hits': [{'_index': 'churn', '_id': '0', '_score': 1.0, '_source': {'state': 'KS', 'account length': 128, 'area code': 415, 'phone number': '382-4657', 'international plan': 'no', 'voice mail plan': 'yes', 'number vmail messages': 25, 'total day minutes': 265.1, 'total day calls': 110, 'total day charge': 45.07, 'total eve minutes': 197.4, 'total eve calls': 99, 'total eve charge': 16.78, 'total night minutes': 244.7, 'total night calls': 91, 'total night charge': 11.01, 'total intl minutes': 10.0, 'total intl calls': 3, 'total intl charge': 2.7, 'customer service calls': 1, 'churn': 0}}]}} + + TODO - currently the eland.DataFrame may not retain the order of the data in the csv. + """ + kwargs: Dict[str, Any] = { + "sep": sep, + "delimiter": delimiter, + "engine": engine, + "dialect": dialect, + "compression": compression, + # "engine_specified": engine_specified, + "doublequote": doublequote, + "escapechar": escapechar, + "quotechar": quotechar, + "quoting": quoting, + "skipinitialspace": skipinitialspace, + "lineterminator": lineterminator, + "header": header, + "index_col": index_col, + "names": names, + "prefix": prefix, + "skiprows": skiprows, + "skipfooter": skipfooter, + "na_values": na_values, + "true_values": true_values, + "false_values": false_values, + "keep_default_na": keep_default_na, + "thousands": thousands, + "comment": comment, + "decimal": decimal, + "parse_dates": parse_dates, + "keep_date_col": keep_date_col, + "dayfirst": dayfirst, + "date_parser": date_parser, + "cache_dates": cache_dates, + "nrows": nrows, + # "iterator": iterator, + "chunksize": chunksize, + "converters": converters, + "dtype": dtype, + "usecols": usecols, + "verbose": verbose, + "encoding": encoding, + "squeeze": squeeze, + "memory_map": memory_map, + "float_precision": float_precision, + "na_filter": na_filter, + "delim_whitespace": delim_whitespace, + "warn_bad_lines": warn_bad_lines, + "error_bad_lines": error_bad_lines, + "low_memory": low_memory, + "mangle_dupe_cols": mangle_dupe_cols, + "infer_datetime_format": infer_datetime_format, + "skip_blank_lines": skip_blank_lines, + } + + if chunksize is None: + kwargs["chunksize"] = DEFAULT_CHUNK_SIZE + + # read csv in chunks to pandas DataFrame and dump to eland DataFrame (and Elasticsearch) + reader = pd.read_csv(filepath_or_buffer, **kwargs) + + first_write = True + for chunk in reader: + if first_write: + pandas_to_eland( + chunk, + es_client, + es_dest_index, + es_if_exists=es_if_exists, + chunksize=chunksize, + es_refresh=es_refresh, + es_dropna=es_dropna, + es_type_overrides=es_type_overrides, + ) + first_write = False + else: + pandas_to_eland( + chunk, + es_client, + es_dest_index, + es_if_exists="append", + chunksize=chunksize, + es_refresh=es_refresh, + es_dropna=es_dropna, + es_type_overrides=es_type_overrides, + ) + + # Now create an eland.DataFrame that references the new index + return DataFrame(es_client, es_index_pattern=es_dest_index) + + +@deprecated_api("eland.csv_to_eland()") +def read_csv(*args, **kwargs) -> DataFrame: # type: ignore + return csv_to_eland(*args, **kwargs) diff --git a/eland/field_mappings.py b/eland/field_mappings.py index 6ae6661..2b8df8a 100644 --- a/eland/field_mappings.py +++ b/eland/field_mappings.py @@ -14,7 +14,10 @@ from pandas.core.dtypes.common import ( is_string_dtype, ) from pandas.core.dtypes.inference import is_list_like -from typing import NamedTuple, Optional +from typing import NamedTuple, Optional, Mapping, Dict, TYPE_CHECKING + +if TYPE_CHECKING: + from eland import DataFrame class Field(NamedTuple): @@ -431,7 +434,9 @@ class FieldMappings: return es_dtype @staticmethod - def _generate_es_mappings(dataframe, es_type_overrides=None): + def _generate_es_mappings( + dataframe: "DataFrame", es_type_overrides: Optional[Mapping[str, str]] = None + ) -> Dict[str, str]: """Given a pandas dataframe, generate the associated Elasticsearch mapping Parameters @@ -712,7 +717,7 @@ class FieldMappings: # Convert return from 'str' to 'np.dtype' return pd_dtypes.apply(lambda x: np.dtype(x)) - def info_es(self, buf): + def es_info(self, buf): buf.write("Mappings:\n") buf.write(f" capabilities:\n{self._mappings_capabilities.to_string()}\n") diff --git a/eland/index.py b/eland/index.py index e50702e..3632c2e 100644 --- a/eland/index.py +++ b/eland/index.py @@ -4,6 +4,7 @@ from typing import Optional, TextIO, TYPE_CHECKING +from eland.utils import deprecated_api if TYPE_CHECKING: from .query_compiler import QueryCompiler @@ -30,7 +31,7 @@ class Index: ID_SORT_FIELD = "_doc" # if index field is _id, sort by _doc def __init__( - self, query_compiler: "QueryCompiler", index_field: Optional[str] = None + self, query_compiler: "QueryCompiler", es_index_field: Optional[str] = None ): self._query_compiler = query_compiler @@ -41,7 +42,7 @@ class Index: # The type:ignore is due to mypy not being smart enough # to recognize the property.setter has a different type # than the property.getter. - self.index_field = index_field # type: ignore + self.es_index_field = es_index_field # type: ignore @property def sort_field(self) -> str: @@ -54,11 +55,11 @@ class Index: return self._is_source_field @property - def index_field(self) -> str: + def es_index_field(self) -> str: return self._index_field - @index_field.setter - def index_field(self, index_field: Optional[str]) -> None: + @es_index_field.setter + def es_index_field(self, index_field: Optional[str]) -> None: if index_field is None or index_field == Index.ID_INDEX_FIELD: self._index_field = Index.ID_INDEX_FIELD self._is_source_field = False @@ -77,7 +78,11 @@ class Index: def __iter__(self) -> "Index": return self - def info_es(self, buf: TextIO) -> None: + def es_info(self, buf: TextIO) -> None: buf.write("Index:\n") - buf.write(f" index_field: {self.index_field}\n") + buf.write(f" es_index_field: {self.es_index_field}\n") buf.write(f" is_source_field: {self.is_source_field}\n") + + @deprecated_api("eland.Index.es_info()") + def info_es(self, buf: TextIO) -> None: + self.es_info(buf) diff --git a/eland/ndframe.py b/eland/ndframe.py index f037605..038d982 100644 --- a/eland/ndframe.py +++ b/eland/ndframe.py @@ -36,11 +36,11 @@ only Elasticsearch aggregatable fields can be aggregated or grouped. class NDFrame(ABC): def __init__( self, - client=None, - index_pattern=None, + es_client=None, + es_index_pattern=None, columns=None, - index_field=None, - query_compiler=None, + es_index_field=None, + _query_compiler=None, ): """ pandas.DataFrame/Series like API that proxies into Elasticsearch index(es). @@ -50,14 +50,14 @@ class NDFrame(ABC): client : elasticsearch.Elasticsearch A reference to a Elasticsearch python client """ - if query_compiler is None: - query_compiler = QueryCompiler( - client=client, - index_pattern=index_pattern, + if _query_compiler is None: + _query_compiler = QueryCompiler( + client=es_client, + index_pattern=es_index_pattern, display_names=columns, - index_field=index_field, + index_field=es_index_field, ) - self._query_compiler = query_compiler + self._query_compiler = _query_compiler def _get_index(self): """ @@ -77,11 +77,11 @@ class NDFrame(ABC): -------- >>> df = ed.DataFrame('localhost', 'flights') >>> assert isinstance(df.index, ed.Index) - >>> df.index.index_field + >>> df.index.es_index_field '_id' >>> s = df['Carrier'] >>> assert isinstance(s.index, ed.Index) - >>> s.index.index_field + >>> s.index.es_index_field '_id' """ return self._query_compiler.index @@ -118,15 +118,15 @@ class NDFrame(ABC): def _build_repr(self, num_rows): # self could be Series or DataFrame if len(self.index) <= num_rows: - return self._to_pandas() + return self.to_pandas() num_rows = num_rows head_rows = int(num_rows / 2) + num_rows % 2 tail_rows = num_rows - head_rows - head = self.head(head_rows)._to_pandas() - tail = self.tail(tail_rows)._to_pandas() + head = self.head(head_rows).to_pandas() + tail = self.tail(tail_rows).to_pandas() return head.append(tail) @@ -142,8 +142,8 @@ class NDFrame(ABC): """ return len(self.index) - def _info_es(self, buf): - self._query_compiler.info_es(buf) + def _es_info(self, buf): + self._query_compiler.es_info(buf) def mean(self, numeric_only=True): """ @@ -478,7 +478,7 @@ class NDFrame(ABC): return self._query_compiler.describe() @abstractmethod - def _to_pandas(self, show_progress=False): + def to_pandas(self, show_progress=False): pass @abstractmethod diff --git a/eland/operations.py b/eland/operations.py index a5c2856..bfd0ff4 100644 --- a/eland/operations.py +++ b/eland/operations.py @@ -11,7 +11,7 @@ import numpy as np import pandas as pd from elasticsearch.helpers import scan -from eland import Index +from eland.index import Index from eland.common import ( SortOrder, DEFAULT_CSV_BATCH_OUTPUT_SIZE, @@ -860,7 +860,7 @@ class Operations: # This can return None return size - def info_es(self, query_compiler, buf): + def es_info(self, query_compiler, buf): buf.write("Operations:\n") buf.write(f" tasks: {self._tasks}\n") diff --git a/eland/query_compiler.py b/eland/query_compiler.py index 1386082..9a0bf7b 100644 --- a/eland/query_compiler.py +++ b/eland/query_compiler.py @@ -12,7 +12,7 @@ import pandas as pd from eland.field_mappings import FieldMappings from eland.filter import QueryFilter from eland.operations import Operations -from eland import Index +from eland.index import Index from eland.common import ( ensure_es_client, DEFAULT_PROGRESS_REPORTING_NUM_ROWS, @@ -64,7 +64,7 @@ class QueryCompiler: if to_copy is not None: self._client = to_copy._client self._index_pattern = to_copy._index_pattern - self._index = Index(self, to_copy._index.index_field) + self._index = Index(self, to_copy._index.es_index_field) self._operations = copy.deepcopy(to_copy._operations) self._mappings: FieldMappings = copy.deepcopy(to_copy._mappings) else: @@ -240,9 +240,9 @@ class QueryCompiler: # get index value - can be _id or can be field value in source if self._index.is_source_field: - index_field = row[self._index.index_field] + index_field = row[self._index.es_index_field] else: - index_field = hit[self._index.index_field] + index_field = hit[self._index.es_index_field] index.append(index_field) # flatten row to map correctly to 2D DataFrame @@ -349,7 +349,7 @@ class QueryCompiler: index_count: int Count of docs where index_field exists """ - return self._operations.index_count(self, self.index.index_field) + return self._operations.index_count(self, self.index.es_index_field) def _index_matches_count(self, items): """ @@ -358,7 +358,9 @@ class QueryCompiler: index_count: int Count of docs where items exist """ - return self._operations.index_matches_count(self, self.index.index_field, items) + return self._operations.index_matches_count( + self, self.index.es_index_field, items + ) def _empty_pd_ef(self): # Return an empty dataframe with correct columns and dtypes @@ -463,7 +465,7 @@ class QueryCompiler: result._mappings.display_names = new_columns.to_list() if index is not None: - result._operations.drop_index_values(self, self.index.index_field, index) + result._operations.drop_index_values(self, self.index.es_index_field, index) return result @@ -503,12 +505,12 @@ class QueryCompiler: def value_counts(self, es_size): return self._operations.value_counts(self, es_size) - def info_es(self, buf): - buf.write(f"index_pattern: {self._index_pattern}\n") + def es_info(self, buf): + buf.write(f"es_index_pattern: {self._index_pattern}\n") - self._index.info_es(buf) - self._mappings.info_es(buf) - self._operations.info_es(self, buf) + self._index.es_info(buf) + self._mappings.es_info(buf) + self._operations.es_info(self, buf) def describe(self): return self._operations.describe(self) @@ -550,10 +552,10 @@ class QueryCompiler: f"{self._client} != {right._client}" ) - if self._index.index_field != right._index.index_field: + if self._index.es_index_field != right._index.es_index_field: raise ValueError( f"Can not perform arithmetic operations across different index fields " - f"{self._index.index_field} != {right._index.index_field}" + f"{self._index.es_index_field} != {right._index.es_index_field}" ) if self._index_pattern != right._index_pattern: diff --git a/eland/series.py b/eland/series.py index 4343d84..733e59f 100644 --- a/eland/series.py +++ b/eland/series.py @@ -40,6 +40,7 @@ from eland.filter import ( ScriptFilter, IsIn, ) +from eland.utils import deprecated_api def _get_method_name(): @@ -52,13 +53,13 @@ class Series(NDFrame): Parameters ---------- - client : elasticsearch.Elasticsearch + es_client : elasticsearch.Elasticsearch A reference to a Elasticsearch python client - index_pattern : str + es_index_pattern : str An Elasticsearch index pattern. This can contain wildcards. - index_field : str + es_index_field : str The field to base the series on Notes @@ -72,7 +73,7 @@ class Series(NDFrame): Examples -------- - >>> ed.Series(client='localhost', index_pattern='flights', name='Carrier') + >>> ed.Series(es_client='localhost', es_index_pattern='flights', name='Carrier') 0 Kibana Airlines 1 Logstash Airways 2 Logstash Airways @@ -89,11 +90,11 @@ class Series(NDFrame): def __init__( self, - client=None, - index_pattern=None, + es_client=None, + es_index_pattern=None, name=None, - index_field=None, - query_compiler=None, + es_index_field=None, + _query_compiler=None, ): # Series has 1 column if name is None: @@ -102,11 +103,11 @@ class Series(NDFrame): columns = [name] super().__init__( - client=client, - index_pattern=index_pattern, + es_client=es_client, + es_index_pattern=es_index_pattern, columns=columns, - index_field=index_field, - query_compiler=query_compiler, + es_index_field=es_index_field, + _query_compiler=_query_compiler, ) hist = eland.plotting.ed_hist_series @@ -217,16 +218,20 @@ class Series(NDFrame): 13058 JetBeats Name: Airline, Length: 13059, dtype: object """ - return Series(query_compiler=self._query_compiler.rename({self.name: new_name})) + return Series( + _query_compiler=self._query_compiler.rename({self.name: new_name}) + ) def head(self, n=5): - return Series(query_compiler=self._query_compiler.head(n)) + return Series(_query_compiler=self._query_compiler.head(n)) def tail(self, n=5): - return Series(query_compiler=self._query_compiler.tail(n)) + return Series(_query_compiler=self._query_compiler.tail(n)) def sample(self, n: int = None, frac: float = None, random_state: int = None): - return Series(query_compiler=self._query_compiler.sample(n, frac, random_state)) + return Series( + _query_compiler=self._query_compiler.sample(n, frac, random_state) + ) def value_counts(self, es_size=10): """ @@ -390,7 +395,7 @@ class Series(NDFrame): result = _buf.getvalue() return result - def _to_pandas(self, show_progress=False): + def to_pandas(self, show_progress=False): return self._query_compiler.to_pandas(show_progress=show_progress)[self.name] @property @@ -484,13 +489,17 @@ class Series(NDFrame): """ return 1 - def info_es(self): + def es_info(self): buf = StringIO() - super()._info_es(buf) + super()._es_info(buf) return buf.getvalue() + @deprecated_api("eland.Series.es_info()") + def info_es(self): + return self.es_info() + def __add__(self, right): """ Return addition of series and right, element-wise (binary operator add). @@ -1081,7 +1090,7 @@ class Series(NDFrame): left_object.arithmetic_operation(method_name, right_object) series = Series( - query_compiler=self._query_compiler.arithmetic_op_fields( + _query_compiler=self._query_compiler.arithmetic_op_fields( display_name, left_object ) ) diff --git a/eland/tests/common.py b/eland/tests/common.py index b74438c..661d329 100644 --- a/eland/tests/common.py +++ b/eland/tests/common.py @@ -24,10 +24,10 @@ from eland.tests import ( _pd_flights = pd.read_json(FLIGHTS_DF_FILE_NAME).sort_index() _pd_flights["timestamp"] = pd.to_datetime(_pd_flights["timestamp"]) _pd_flights.index = _pd_flights.index.map(str) # make index 'object' not int -_ed_flights = ed.read_es(ES_TEST_CLIENT, FLIGHTS_INDEX_NAME) +_ed_flights = ed.DataFrame(ES_TEST_CLIENT, FLIGHTS_INDEX_NAME) _pd_flights_small = _pd_flights.head(48) -_ed_flights_small = ed.read_es(ES_TEST_CLIENT, FLIGHTS_SMALL_INDEX_NAME) +_ed_flights_small = ed.DataFrame(ES_TEST_CLIENT, FLIGHTS_SMALL_INDEX_NAME) _pd_ecommerce = pd.read_json(ECOMMERCE_DF_FILE_NAME).sort_index() _pd_ecommerce["order_date"] = pd.to_datetime(_pd_ecommerce["order_date"]) @@ -37,7 +37,7 @@ _pd_ecommerce["products.created_on"] = _pd_ecommerce["products.created_on"].appl _pd_ecommerce.insert(2, "customer_birth_date", None) _pd_ecommerce.index = _pd_ecommerce.index.map(str) # make index 'object' not int _pd_ecommerce["customer_birth_date"].astype("datetime64") -_ed_ecommerce = ed.read_es(ES_TEST_CLIENT, ECOMMERCE_INDEX_NAME) +_ed_ecommerce = ed.DataFrame(ES_TEST_CLIENT, ECOMMERCE_INDEX_NAME) class TestData: @@ -68,7 +68,7 @@ def assert_pandas_eland_frame_equal(left, right): raise AssertionError(f"Expected type ed.DataFrame, found {type(right)} instead") # Use pandas tests to check similarity - assert_frame_equal(left, right._to_pandas()) + assert_frame_equal(left, right.to_pandas()) def assert_eland_frame_equal(left, right): @@ -79,7 +79,7 @@ def assert_eland_frame_equal(left, right): raise AssertionError(f"Expected type ed.DataFrame, found {type(right)} instead") # Use pandas tests to check similarity - assert_frame_equal(left._to_pandas(), right._to_pandas()) + assert_frame_equal(left.to_pandas(), right.to_pandas()) def assert_pandas_eland_series_equal(left, right, check_less_precise=False): @@ -90,4 +90,4 @@ def assert_pandas_eland_series_equal(left, right, check_less_precise=False): raise AssertionError(f"Expected type ed.Series, found {type(right)} instead") # Use pandas tests to check similarity - assert_series_equal(left, right._to_pandas(), check_less_precise=check_less_precise) + assert_series_equal(left, right.to_pandas(), check_less_precise=check_less_precise) diff --git a/eland/tests/dataframe/test_datetime_pytest.py b/eland/tests/dataframe/test_datetime_pytest.py index e73d48c..3cb6d81 100644 --- a/eland/tests/dataframe/test_datetime_pytest.py +++ b/eland/tests/dataframe/test_datetime_pytest.py @@ -101,7 +101,7 @@ class TestDataFrameDateTime(TestData): # print(df.to_string()) # print(ed_df.to_string()) # print(ed_df.dtypes) - # print(ed_df._to_pandas().dtypes) + # print(ed_df.to_pandas().dtypes) assert_series_equal(df.dtypes, ed_df.dtypes) @@ -109,7 +109,7 @@ class TestDataFrameDateTime(TestData): def test_all_formats(self): index_name = self.time_index_name - ed_df = ed.read_es(ES_TEST_CLIENT, index_name) + ed_df = ed.DataFrame(ES_TEST_CLIENT, index_name) for format_name in self.time_formats.keys(): times = [ diff --git a/eland/tests/dataframe/test_init_pytest.py b/eland/tests/dataframe/test_init_pytest.py index 7479002..cc7f04e 100644 --- a/eland/tests/dataframe/test_init_pytest.py +++ b/eland/tests/dataframe/test_init_pytest.py @@ -20,15 +20,15 @@ class TestDataFrameInit: # Construct invalid DataFrame (throws) with pytest.raises(ValueError): - ed.DataFrame(client=ES_TEST_CLIENT) + ed.DataFrame(es_client=ES_TEST_CLIENT) # Construct invalid DataFrame (throws) with pytest.raises(ValueError): - ed.DataFrame(index_pattern=FLIGHTS_INDEX_NAME) + ed.DataFrame(es_index_pattern=FLIGHTS_INDEX_NAME) # Good constructors ed.DataFrame(ES_TEST_CLIENT, FLIGHTS_INDEX_NAME) - ed.DataFrame(client=ES_TEST_CLIENT, index_pattern=FLIGHTS_INDEX_NAME) + ed.DataFrame(es_client=ES_TEST_CLIENT, es_index_pattern=FLIGHTS_INDEX_NAME) qc = QueryCompiler(client=ES_TEST_CLIENT, index_pattern=FLIGHTS_INDEX_NAME) - ed.DataFrame(query_compiler=qc) + ed.DataFrame(_query_compiler=qc) diff --git a/eland/tests/dataframe/test_sample_pytest.py b/eland/tests/dataframe/test_sample_pytest.py index 4bf265d..ab420c4 100644 --- a/eland/tests/dataframe/test_sample_pytest.py +++ b/eland/tests/dataframe/test_sample_pytest.py @@ -7,7 +7,7 @@ import pytest from pandas.testing import assert_frame_equal from eland.tests.common import TestData -from eland.utils import eland_to_pandas +from eland import eland_to_pandas class TestDataFrameSample(TestData): diff --git a/eland/tests/dataframe/test_to_csv_pytest.py b/eland/tests/dataframe/test_to_csv_pytest.py index b2f6c74..d481d9e 100644 --- a/eland/tests/dataframe/test_to_csv_pytest.py +++ b/eland/tests/dataframe/test_to_csv_pytest.py @@ -65,7 +65,7 @@ class TestDataFrameToCSV(TestData): test_index = FLIGHTS_INDEX_NAME + "." + str(now_millis) - ed_flights_from_csv = ed.read_csv( + ed_flights_from_csv = ed.csv_to_eland( results_file, ES_TEST_CLIENT, test_index, diff --git a/eland/tests/field_mappings/test_scripted_fields_pytest.py b/eland/tests/field_mappings/test_scripted_fields_pytest.py index 807673c..beaeca7 100644 --- a/eland/tests/field_mappings/test_scripted_fields_pytest.py +++ b/eland/tests/field_mappings/test_scripted_fields_pytest.py @@ -43,7 +43,7 @@ class TestScriptedFields(TestData): # note 'None' is printed as 'NaN' in index, but .index shows it is 'None' buf = StringIO() - ed_field_mappings.info_es(buf) + ed_field_mappings.es_info(buf) print(buf.getvalue()) expected = self.pd_flights().columns.to_list() diff --git a/eland/tests/series/test_hist_pytest.py b/eland/tests/series/test_hist_pytest.py index ebc534a..c76bf2e 100644 --- a/eland/tests/series/test_hist_pytest.py +++ b/eland/tests/series/test_hist_pytest.py @@ -47,7 +47,7 @@ class TestSeriesFrameHist(TestData): pd_weights = pd.DataFrame({"FlightDelayMin": pd_filteredhist[0]}) d = ed_flights[ed_flights.FlightDelay == True].FlightDelayMin - print(d.info_es()) + print(d.es_info()) ed_bins, ed_weights = ed_flights[ ed_flights.FlightDelay == True diff --git a/eland/tests/series/test_info_es_pytest.py b/eland/tests/series/test_info_es_pytest.py index 2ac2c8f..d9a53f3 100644 --- a/eland/tests/series/test_info_es_pytest.py +++ b/eland/tests/series/test_info_es_pytest.py @@ -12,4 +12,4 @@ class TestSeriesInfoEs(TestData): ed_flights = self.ed_flights()["AvgTicketPrice"] # No assertion, just test it can be called - ed_flights.info_es() + ed_flights.es_info() diff --git a/eland/tests/series/test_rename_pytest.py b/eland/tests/series/test_rename_pytest.py index 1ec0469..a077ea0 100644 --- a/eland/tests/series/test_rename_pytest.py +++ b/eland/tests/series/test_rename_pytest.py @@ -23,14 +23,14 @@ class TestSeriesRename(TestData): print(pd_renamed) print(ed_renamed) - print(ed_renamed.info_es()) + print(ed_renamed.es_info()) assert_pandas_eland_series_equal(pd_renamed, ed_renamed) pd_renamed2 = pd_renamed.rename("renamed2") ed_renamed2 = ed_renamed.rename("renamed2") - print(ed_renamed2.info_es()) + print(ed_renamed2.es_info()) assert "renamed2" == ed_renamed2.name diff --git a/eland/tests/series/test_sample_pytest.py b/eland/tests/series/test_sample_pytest.py index 856d59e..87c7cfa 100644 --- a/eland/tests/series/test_sample_pytest.py +++ b/eland/tests/series/test_sample_pytest.py @@ -14,7 +14,7 @@ class TestSeriesSample(TestData): SEED = 42 def build_from_index(self, ed_series): - ed2pd_series = ed_series._to_pandas() + ed2pd_series = ed_series.to_pandas() return self.pd_flights()["Carrier"].iloc[ed2pd_series.index] def test_sample(self): diff --git a/eland/utils.py b/eland/utils.py index cc1cfee..9202572 100644 --- a/eland/utils.py +++ b/eland/utils.py @@ -2,515 +2,24 @@ # Elasticsearch B.V licenses this file to you under the Apache 2.0 License. # See the LICENSE file in the project root for more information -import csv -from typing import Union, List, Tuple, Optional, Mapping - -import pandas as pd -from pandas.io.parsers import _c_parser_defaults - -from eland import DataFrame -from eland.field_mappings import FieldMappings -from eland.common import ensure_es_client, DEFAULT_CHUNK_SIZE -from elasticsearch import Elasticsearch -from elasticsearch.helpers import bulk +import functools +import warnings +from typing import Callable, TypeVar -def read_es( - es_client: Union[str, List[str], Tuple[str, ...], Elasticsearch], - es_index_pattern: str, -) -> DataFrame: - """ - Utility method to create an eland.Dataframe from an Elasticsearch index_pattern. - (Similar to pandas.read_csv, but source data is an Elasticsearch index rather than - a csv file) - - Parameters - ---------- - es_client: Elasticsearch client argument(s) - - elasticsearch-py parameters or - - elasticsearch-py instance - es_index_pattern: str - Elasticsearch index pattern - - Returns - ------- - eland.DataFrame - - See Also - -------- - eland.pandas_to_eland: Create an eland.Dataframe from pandas.DataFrame - eland.eland_to_pandas: Create a pandas.Dataframe from eland.DataFrame - """ - return DataFrame(client=es_client, index_pattern=es_index_pattern) +F = TypeVar("F") -def pandas_to_eland( - pd_df: pd.DataFrame, - es_client: Union[str, List[str], Tuple[str, ...], Elasticsearch], - es_dest_index: str, - es_if_exists: str = "fail", - es_refresh: bool = False, - es_dropna: bool = False, - es_type_overrides: Optional[Mapping[str, str]] = None, - chunksize: Optional[int] = None, - use_pandas_index_for_es_ids: bool = True, -) -> DataFrame: - """ - Append a pandas DataFrame to an Elasticsearch index. - Mainly used in testing. - Modifies the elasticsearch destination index - - Parameters - ---------- - es_client: Elasticsearch client argument(s) - - elasticsearch-py parameters or - - elasticsearch-py instance - es_dest_index: str - Name of Elasticsearch index to be appended to - es_if_exists : {'fail', 'replace', 'append'}, default 'fail' - How to behave if the index already exists. - - - fail: Raise a ValueError. - - replace: Delete the index before inserting new values. - - append: Insert new values to the existing index. Create if does not exist. - es_refresh: bool, default 'False' - Refresh es_dest_index after bulk index - es_dropna: bool, default 'False' - * True: Remove missing values (see pandas.Series.dropna) - * False: Include missing values - may cause bulk to fail - es_type_overrides: dict, default None - Dict of field_name: es_data_type that overrides default es data types - chunksize: int, default None - Number of pandas.DataFrame rows to read before bulk index into Elasticsearch - use_pandas_index_for_es_ids: bool, default 'True' - * True: pandas.DataFrame.index fields will be used to populate Elasticsearch '_id' fields. - * False: Ignore pandas.DataFrame.index when indexing into Elasticsearch - - Returns - ------- - eland.Dataframe - eland.DataFrame referencing data in destination_index - - Examples - -------- - - >>> pd_df = pd.DataFrame(data={'A': 3.141, - ... 'B': 1, - ... 'C': 'foo', - ... 'D': pd.Timestamp('20190102'), - ... 'E': [1.0, 2.0, 3.0], - ... 'F': False, - ... 'G': [1, 2, 3], - ... 'H': 'Long text - to be indexed as es type text'}, - ... index=['0', '1', '2']) - >>> type(pd_df) - - >>> pd_df - A B ... G H - 0 3.141 1 ... 1 Long text - to be indexed as es type text - 1 3.141 1 ... 2 Long text - to be indexed as es type text - 2 3.141 1 ... 3 Long text - to be indexed as es type text - - [3 rows x 8 columns] - >>> pd_df.dtypes - A float64 - B int64 - C object - D datetime64[ns] - E float64 - F bool - G int64 - H object - dtype: object - - Convert `pandas.DataFrame` to `eland.DataFrame` - this creates an Elasticsearch index called `pandas_to_eland`. - Overwrite existing Elasticsearch index if it exists `if_exists="replace"`, and sync index so it is - readable on return `refresh=True` - - - >>> ed_df = ed.pandas_to_eland(pd_df, - ... 'localhost', - ... 'pandas_to_eland', - ... es_if_exists="replace", - ... es_refresh=True, - ... es_type_overrides={'H':'text'}) # index field 'H' as text not keyword - >>> type(ed_df) - - >>> ed_df - A B ... G H - 0 3.141 1 ... 1 Long text - to be indexed as es type text - 1 3.141 1 ... 2 Long text - to be indexed as es type text - 2 3.141 1 ... 3 Long text - to be indexed as es type text - - [3 rows x 8 columns] - >>> ed_df.dtypes - A float64 - B int64 - C object - D datetime64[ns] - E float64 - F bool - G int64 - H object - dtype: object - - See Also - -------- - eland.read_es: Create an eland.Dataframe from an Elasticsearch index - eland.eland_to_pandas: Create a pandas.Dataframe from eland.DataFrame - """ - if chunksize is None: - chunksize = DEFAULT_CHUNK_SIZE - - mapping = FieldMappings._generate_es_mappings(pd_df, es_type_overrides) - es_client = ensure_es_client(es_client) - - # If table exists, check if_exists parameter - if es_client.indices.exists(index=es_dest_index): - if es_if_exists == "fail": - raise ValueError( - f"Could not create the index [{es_dest_index}] because it " - f"already exists. " - f"Change the if_exists parameter to " - f"'append' or 'replace' data." +def deprecated_api(replace_with: str) -> Callable[[F], F]: + def wrapper(f: F) -> F: + @functools.wraps(f) + def wrapped(*args, **kwargs): + warnings.warn( + f"{f.__name__} is deprecated, use {replace_with} instead", + DeprecationWarning, ) - elif es_if_exists == "replace": - es_client.indices.delete(index=es_dest_index) - es_client.indices.create(index=es_dest_index, body=mapping) - # elif if_exists == "append": - # TODO validate mapping are compatible - else: - es_client.indices.create(index=es_dest_index, body=mapping) + return f(*args, **kwargs) - # Now add data - actions = [] - n = 0 - for row in pd_df.iterrows(): - if es_dropna: - values = row[1].dropna().to_dict() - else: - values = row[1].to_dict() + return wrapped - if use_pandas_index_for_es_ids: - # Use index as _id - id = row[0] - - # Use integer as id field for repeatable results - action = {"_index": es_dest_index, "_source": values, "_id": str(id)} - else: - action = {"_index": es_dest_index, "_source": values} - - actions.append(action) - - n = n + 1 - - if n % chunksize == 0: - bulk(client=es_client, actions=actions, refresh=es_refresh) - actions = [] - - bulk(client=es_client, actions=actions, refresh=es_refresh) - return DataFrame(es_client, es_dest_index) - - -def eland_to_pandas(ed_df: DataFrame, show_progress: bool = False) -> pd.DataFrame: - """ - Convert an eland.Dataframe to a pandas.DataFrame - - **Note: this loads the entire Elasticsearch index into in core pandas.DataFrame structures. For large - indices this can create significant load on the Elasticsearch cluster and require signficant memory** - - Parameters - ---------- - ed_df: eland.DataFrame - The source eland.Dataframe referencing the Elasticsearch index - show_progress: bool - Output progress of option to stdout? By default False. - - Returns - ------- - pandas.Dataframe - pandas.DataFrame contains all rows and columns in eland.DataFrame - - Examples - -------- - >>> ed_df = ed.DataFrame('localhost', 'flights').head() - >>> type(ed_df) - - >>> ed_df - AvgTicketPrice Cancelled ... dayOfWeek timestamp - 0 841.265642 False ... 0 2018-01-01 00:00:00 - 1 882.982662 False ... 0 2018-01-01 18:27:00 - 2 190.636904 False ... 0 2018-01-01 17:11:14 - 3 181.694216 True ... 0 2018-01-01 10:33:28 - 4 730.041778 False ... 0 2018-01-01 05:13:00 - - [5 rows x 27 columns] - - Convert `eland.DataFrame` to `pandas.DataFrame` (Note: this loads entire Elasticsearch index into core memory) - - >>> pd_df = ed.eland_to_pandas(ed_df) - >>> type(pd_df) - - >>> pd_df - AvgTicketPrice Cancelled ... dayOfWeek timestamp - 0 841.265642 False ... 0 2018-01-01 00:00:00 - 1 882.982662 False ... 0 2018-01-01 18:27:00 - 2 190.636904 False ... 0 2018-01-01 17:11:14 - 3 181.694216 True ... 0 2018-01-01 10:33:28 - 4 730.041778 False ... 0 2018-01-01 05:13:00 - - [5 rows x 27 columns] - - Convert `eland.DataFrame` to `pandas.DataFrame` and show progress every 10000 rows - - >>> pd_df = ed.eland_to_pandas(ed.DataFrame('localhost', 'flights'), show_progress=True) # doctest: +SKIP - 2020-01-29 12:43:36.572395: read 10000 rows - 2020-01-29 12:43:37.309031: read 13059 rows - - See Also - -------- - eland.read_es: Create an eland.Dataframe from an Elasticsearch index - eland.pandas_to_eland: Create an eland.Dataframe from pandas.DataFrame - """ - return ed_df._to_pandas(show_progress=show_progress) - - -def read_csv( - filepath_or_buffer, - es_client, - es_dest_index, - es_if_exists="fail", - es_refresh=False, - es_dropna=False, - es_type_overrides=None, - sep=",", - delimiter=None, - # Column and Index Locations and Names - header="infer", - names=None, - index_col=None, - usecols=None, - squeeze=False, - prefix=None, - mangle_dupe_cols=True, - # General Parsing Configuration - dtype=None, - engine=None, - converters=None, - true_values=None, - false_values=None, - skipinitialspace=False, - skiprows=None, - skipfooter=0, - nrows=None, - # Iteration - # iterator=False, - chunksize=None, - # NA and Missing Data Handling - na_values=None, - keep_default_na=True, - na_filter=True, - verbose=False, - skip_blank_lines=True, - # Datetime Handling - parse_dates=False, - infer_datetime_format=False, - keep_date_col=False, - date_parser=None, - dayfirst=False, - cache_dates=True, - # Quoting, Compression, and File Format - compression="infer", - thousands=None, - decimal=b".", - lineterminator=None, - quotechar='"', - quoting=csv.QUOTE_MINIMAL, - doublequote=True, - escapechar=None, - comment=None, - encoding=None, - dialect=None, - # Error Handling - error_bad_lines=True, - warn_bad_lines=True, - # Internal - delim_whitespace=False, - low_memory=_c_parser_defaults["low_memory"], - memory_map=False, - float_precision=None, -): - """ - Read a comma-separated values (csv) file into eland.DataFrame (i.e. an Elasticsearch index). - - **Modifies an Elasticsearch index** - - **Note pandas iteration options not supported** - - Parameters - ---------- - es_client: Elasticsearch client argument(s) - - elasticsearch-py parameters or - - elasticsearch-py instance - es_dest_index: str - Name of Elasticsearch index to be appended to - es_if_exists : {'fail', 'replace', 'append'}, default 'fail' - How to behave if the index already exists. - - - fail: Raise a ValueError. - - replace: Delete the index before inserting new values. - - append: Insert new values to the existing index. Create if does not exist. - es_dropna: bool, default 'False' - * True: Remove missing values (see pandas.Series.dropna) - * False: Include missing values - may cause bulk to fail - es_type_overrides: dict, default None - Dict of columns: es_type to override default es datatype mappings - chunksize - number of csv rows to read before bulk index into Elasticsearch - - Other Parameters - ---------------- - Parameters derived from :pandas_api_docs:`pandas.read_csv`. - - See Also - -------- - :pandas_api_docs:`pandas.read_csv` - - Notes - ----- - iterator not supported - - Examples - -------- - - See if 'churn' index exists in Elasticsearch - - >>> from elasticsearch import Elasticsearch # doctest: +SKIP - >>> es = Elasticsearch() # doctest: +SKIP - >>> es.indices.exists(index="churn") # doctest: +SKIP - False - - Read 'churn.csv' and use first column as _id (and eland.DataFrame index) - :: - - # churn.csv - ,state,account length,area code,phone number,international plan,voice mail plan,number vmail messages,total day minutes,total day calls,total day charge,total eve minutes,total eve calls,total eve charge,total night minutes,total night calls,total night charge,total intl minutes,total intl calls,total intl charge,customer service calls,churn - 0,KS,128,415,382-4657,no,yes,25,265.1,110,45.07,197.4,99,16.78,244.7,91,11.01,10.0,3,2.7,1,0 - 1,OH,107,415,371-7191,no,yes,26,161.6,123,27.47,195.5,103,16.62,254.4,103,11.45,13.7,3,3.7,1,0 - ... - - >>> ed.read_csv("churn.csv", - ... es_client='localhost', - ... es_dest_index='churn', - ... es_refresh=True, - ... index_col=0) # doctest: +SKIP - account length area code churn customer service calls ... total night calls total night charge total night minutes voice mail plan - 0 128 415 0 1 ... 91 11.01 244.7 yes - 1 107 415 0 1 ... 103 11.45 254.4 yes - 2 137 415 0 0 ... 104 7.32 162.6 no - 3 84 408 0 2 ... 89 8.86 196.9 no - 4 75 415 0 3 ... 121 8.41 186.9 no - ... ... ... ... ... ... ... ... ... ... - 3328 192 415 0 2 ... 83 12.56 279.1 yes - 3329 68 415 0 3 ... 123 8.61 191.3 no - 3330 28 510 0 2 ... 91 8.64 191.9 no - 3331 184 510 0 2 ... 137 6.26 139.2 no - 3332 74 415 0 0 ... 77 10.86 241.4 yes - - [3333 rows x 21 columns] - - Validate data now exists in 'churn' index: - - >>> es.search(index="churn", size=1) # doctest: +SKIP - {'took': 1, 'timed_out': False, '_shards': {'total': 1, 'successful': 1, 'skipped': 0, 'failed': 0}, 'hits': {'total': {'value': 3333, 'relation': 'eq'}, 'max_score': 1.0, 'hits': [{'_index': 'churn', '_id': '0', '_score': 1.0, '_source': {'state': 'KS', 'account length': 128, 'area code': 415, 'phone number': '382-4657', 'international plan': 'no', 'voice mail plan': 'yes', 'number vmail messages': 25, 'total day minutes': 265.1, 'total day calls': 110, 'total day charge': 45.07, 'total eve minutes': 197.4, 'total eve calls': 99, 'total eve charge': 16.78, 'total night minutes': 244.7, 'total night calls': 91, 'total night charge': 11.01, 'total intl minutes': 10.0, 'total intl calls': 3, 'total intl charge': 2.7, 'customer service calls': 1, 'churn': 0}}]}} - - TODO - currently the eland.DataFrame may not retain the order of the data in the csv. - """ - kwds = dict() - - kwds.update( - sep=sep, - delimiter=delimiter, - engine=engine, - dialect=dialect, - compression=compression, - # engine_specified=engine_specified, - doublequote=doublequote, - escapechar=escapechar, - quotechar=quotechar, - quoting=quoting, - skipinitialspace=skipinitialspace, - lineterminator=lineterminator, - header=header, - index_col=index_col, - names=names, - prefix=prefix, - skiprows=skiprows, - skipfooter=skipfooter, - na_values=na_values, - true_values=true_values, - false_values=false_values, - keep_default_na=keep_default_na, - thousands=thousands, - comment=comment, - decimal=decimal, - parse_dates=parse_dates, - keep_date_col=keep_date_col, - dayfirst=dayfirst, - date_parser=date_parser, - cache_dates=cache_dates, - nrows=nrows, - # iterator=iterator, - chunksize=chunksize, - converters=converters, - dtype=dtype, - usecols=usecols, - verbose=verbose, - encoding=encoding, - squeeze=squeeze, - memory_map=memory_map, - float_precision=float_precision, - na_filter=na_filter, - delim_whitespace=delim_whitespace, - warn_bad_lines=warn_bad_lines, - error_bad_lines=error_bad_lines, - low_memory=low_memory, - mangle_dupe_cols=mangle_dupe_cols, - infer_datetime_format=infer_datetime_format, - skip_blank_lines=skip_blank_lines, - ) - - if chunksize is None: - kwds.update(chunksize=DEFAULT_CHUNK_SIZE) - - # read csv in chunks to pandas DataFrame and dump to eland DataFrame (and Elasticsearch) - reader = pd.read_csv(filepath_or_buffer, **kwds) - - first_write = True - for chunk in reader: - if first_write: - pandas_to_eland( - chunk, - es_client, - es_dest_index, - es_if_exists=es_if_exists, - chunksize=chunksize, - es_refresh=es_refresh, - es_dropna=es_dropna, - es_type_overrides=es_type_overrides, - ) - first_write = False - else: - pandas_to_eland( - chunk, - es_client, - es_dest_index, - es_if_exists="append", - chunksize=chunksize, - es_refresh=es_refresh, - es_dropna=es_dropna, - es_type_overrides=es_type_overrides, - ) - - # Now create an eland.DataFrame that references the new index - return DataFrame(es_client, es_dest_index) + return wrapper diff --git a/noxfile.py b/noxfile.py index 4dd47e9..63ef1e0 100644 --- a/noxfile.py +++ b/noxfile.py @@ -25,6 +25,7 @@ TYPED_FILES = { "eland/actions.py", "eland/arithmetics.py", "eland/common.py", + "eland/etl.py", "eland/filter.py", "eland/index.py", "eland/query.py", @@ -106,7 +107,7 @@ def docs(session): session.run("pandoc", "--version", external=True) session.install("-r", "docs/requirements-docs.txt") - session.run("python", "setup.py", "install") + session.install(".") # See if we have an Elasticsearch cluster active # to rebuild the Jupyter notebooks with.