diff --git a/pandas/core/base.py b/pandas/core/base.py index cc676b9682277..6c0a0c26b6457 100644 --- a/pandas/core/base.py +++ b/pandas/core/base.py @@ -19,7 +19,7 @@ class StringMixin(object): # Formatting def __unicode__(self): - raise NotImplementedError + raise NotImplementedError("StringMixin __unicode__ format") def __str__(self): """ @@ -382,7 +382,7 @@ def _box_func(self): """ box function to get object from internal representation """ - raise NotImplementedError + raise NotImplementedError("Box function to get object from internal representation") def _box_values(self, values): """ diff --git a/pandas/core/common.py b/pandas/core/common.py index 92d60ae8d8847..bad9a03942277 100644 --- a/pandas/core/common.py +++ b/pandas/core/common.py @@ -39,6 +39,11 @@ class SettingWithCopyWarning(Warning): class AmbiguousIndexError(PandasError, KeyError): pass +class AbstractMethodError(NotImplementedError): + def __init__(self,m): + self.message = m + def __str__(self): + return "This method must be defined on the concrete class - "+self.message _POSSIBLY_CAST_DTYPES = set([np.dtype(t).name for t in ['O', 'int8', @@ -134,7 +139,7 @@ def _isnull_new(obj): return lib.checknull(obj) # hack (for now) because MI registers as ndarray elif isinstance(obj, pd.MultiIndex): - raise NotImplementedError("isnull is not defined for MultiIndex") + raise AbstractMethodError("isnull is not defined for MultiIndex") elif isinstance(obj, (ABCSeries, np.ndarray)): return _isnull_ndarraylike(obj) elif isinstance(obj, ABCGeneric): @@ -160,7 +165,7 @@ def _isnull_old(obj): return lib.checknull_old(obj) # hack (for now) because MI registers as ndarray elif isinstance(obj, pd.MultiIndex): - raise NotImplementedError("isnull is not defined for MultiIndex") + raise AbstractMethodError("isnull is not defined for MultiIndex") elif isinstance(obj, (ABCSeries, np.ndarray)): return _isnull_ndarraylike_old(obj) elif isinstance(obj, ABCGeneric): diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 756de479a471a..3d4a90ed82592 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -135,7 +135,7 @@ def _init_mgr(self, mgr, axes=None, dtype=None, copy=False): @property def _constructor(self): - raise NotImplementedError + raise NotImplementedError("NDFrame _constructor") def __unicode__(self): # unicode representation based upon iterating over self @@ -150,7 +150,7 @@ def _local_dir(self): @property def _constructor_sliced(self): - raise NotImplementedError + raise NotImplementedError("NDFrame _constructor_sliced") #---------------------------------------------------------------------- # Axis @@ -1073,7 +1073,7 @@ def _iget_item_cache(self, item): return lower def _box_item_values(self, key, values): - raise NotImplementedError + raise NotImplementedError("NDFrame _box_item_values") def _maybe_cache_changed(self, item, value): """ @@ -1653,7 +1653,7 @@ def _needs_reindex_multi(self, axes, method, level): method is None and level is None and not self._is_mixed_type) def _reindex_multi(self, axes, copy, fill_value): - return NotImplemented + raise NotImplementedError("NDFrame _reindex_multi") _shared_docs['reindex_axis'] = ( """Conform input object to new index with optional filling logic, @@ -2179,7 +2179,7 @@ def fillna(self, value=None, method=None, axis=0, inplace=False, raise ValueError('must specify a fill method or value') if self._is_mixed_type and axis == 1: if inplace: - raise NotImplementedError() + raise NotImplementedError("fillna with inplace=True and _is_mixed_type=True and axis=1") result = self.T.fillna(method=method, limit=limit).T # need to downcast here because of all of the transposes @@ -2880,7 +2880,7 @@ def first(self, offset): """ from pandas.tseries.frequencies import to_offset if not isinstance(self.index, DatetimeIndex): - raise NotImplementedError + raise NotImplementedError("Currently implemented for DatatimeIndex instance only") if len(self.index) == 0: return self @@ -2914,7 +2914,7 @@ def last(self, offset): """ from pandas.tseries.frequencies import to_offset if not isinstance(self.index, DatetimeIndex): - raise NotImplementedError + raise NotImplementedError("Currently implemented for DatatimeIndex instance only") if len(self.index) == 0: return self diff --git a/pandas/core/groupby.py b/pandas/core/groupby.py index c2debb9bfe1c0..abba9f352da44 100644 --- a/pandas/core/groupby.py +++ b/pandas/core/groupby.py @@ -283,7 +283,7 @@ def _set_grouper(self, obj, sort=False): return self.grouper def _get_binner_for_grouping(self, obj): - raise NotImplementedError + raise NotImplementedError("Binner for grouping") @property def groups(self): @@ -644,7 +644,7 @@ def _python_apply_general(self, f): not_indexed_same=mutated) def aggregate(self, func, *args, **kwargs): - raise NotImplementedError + raise NotImplementedError("Groupby aggregrate") @Appender(_agg_doc) def agg(self, func, *args, **kwargs): @@ -654,7 +654,7 @@ def _iterate_slices(self): yield self.name, self._selected_obj def transform(self, func, *args, **kwargs): - raise NotImplementedError + raise NotImplementedError("Groupby transform") def mean(self): """ @@ -1041,7 +1041,7 @@ def _python_agg_general(self, func, *args, **kwargs): return self._wrap_aggregated_output(output) def _wrap_applied_output(self, *args, **kwargs): - raise NotImplementedError + raise NotImplementedError("Groupby wrap applied output") def _concat_objects(self, keys, values, not_indexed_same=False): from pandas.tools.merge import concat @@ -1404,7 +1404,7 @@ def aggregate(self, values, how, axis=0): swapped = True values = values.swapaxes(0, axis) if arity > 1: - raise NotImplementedError + raise NotImplementedError("BaseGrouper aggregate for arity > 1") out_shape = (self.ngroups,) + values.shape[1:] if is_numeric_dtype(values.dtype): @@ -1459,7 +1459,7 @@ def _aggregate(self, result, counts, values, how, is_numeric): comp_ids, _, ngroups = self.group_info if values.ndim > 3: # punting for now - raise NotImplementedError + raise NotImplementedError("BaseGrouper aggregrate for > 3 dimensions") elif values.ndim > 2: for i, chunk in enumerate(values.transpose(2, 0, 1)): @@ -1695,7 +1695,7 @@ def _aggregate(self, result, counts, values, how, is_numeric=True): if values.ndim > 3: # punting for now - raise NotImplementedError + raise NotImplementedError("BinGrouper aggregate for > 3 dimensions") elif values.ndim > 2: for i, chunk in enumerate(values.transpose(2, 0, 1)): agg_func(result[:, :, i], counts, chunk, self.bins) @@ -2399,7 +2399,7 @@ def aggregate(self, arg, *args, **kwargs): if self._selection is not None: subset = obj if isinstance(subset, DataFrame): - raise NotImplementedError + raise NotImplementedError("aggregate not implemented for subset being a Dataframe") for fname, agg_how in compat.iteritems(arg): colg = SeriesGroupBy(subset, selection=self._selection, @@ -2459,7 +2459,7 @@ def _aggregate_multiple_funcs(self, arg): from pandas.tools.merge import concat if self.axis != 0: - raise NotImplementedError + raise NotImplementedError("Currently implemented for axis = 0") obj = self._obj_with_exclusions @@ -2509,7 +2509,7 @@ def _aggregate_generic(self, func, *args, **kwargs): return self._wrap_generic_output(result, obj) def _wrap_aggregated_output(self, output, names=None): - raise NotImplementedError + raise NotImplementedError("NDFrameGroupBy wrap aggregated output") def _aggregate_item_by_item(self, func, *args, **kwargs): # only for axis==0 @@ -3050,7 +3050,7 @@ def _iterate_slices(self): slice_axis = self._selection_list slicer = lambda x: self._selected_obj[x] else: - raise NotImplementedError + raise NotImplementedError("Currently implemented for axis = 0") for val in slice_axis: if val in self.exclusions: @@ -3115,10 +3115,10 @@ def _aggregate_item_by_item(self, func, *args, **kwargs): new_axes[self.axis] = self.grouper.result_index return Panel._from_axes(result, new_axes) else: - raise NotImplementedError + raise NotImplementedError("Currently implemented for axis>0") def _wrap_aggregated_output(self, output, names=None): - raise NotImplementedError + raise NotImplementedError("PanelGroupBy _wrap_aggregated_output") class NDArrayGroupBy(GroupBy): @@ -3172,7 +3172,7 @@ def _chop(self, sdata, slice_obj): return sdata.iloc[slice_obj] def apply(self, f): - raise NotImplementedError + raise NotImplementedError("DataSplitter apply function") class ArraySplitter(DataSplitter): diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index 280c4073b0f94..860422c058d77 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -7,7 +7,7 @@ import pandas.core.common as com from pandas.core.common import (_is_bool_indexer, is_integer_dtype, _asarray_tuplesafe, is_list_like, isnull, - ABCSeries, ABCDataFrame, ABCPanel, is_float) + ABCSeries, ABCDataFrame, ABCPanel, is_float, AbstractMethodError) import pandas.lib as lib import numpy as np @@ -55,7 +55,7 @@ def __call__(self, *args, **kwargs): return self def __iter__(self): - raise NotImplementedError('ix is not iterable') + raise AbstractMethodError('ix is not iterable') def __getitem__(self, key): if type(key) is tuple: @@ -120,7 +120,7 @@ def __setitem__(self, key, value): self._setitem_with_indexer(indexer, value) def _has_valid_type(self, k, axis): - raise NotImplementedError() + raise AbstractMethodError("Valid type checking for _NDFrameIndexer is not implemented") def _has_valid_tuple(self, key): """ check the key for valid keys across my indexer """ @@ -644,7 +644,7 @@ def _align_frame(self, indexer, df): def _align_panel(self, indexer, df): is_frame = self.obj.ndim == 2 is_panel = self.obj.ndim >= 3 - raise NotImplementedError("cannot set using an indexer with a Panel " + raise AbstractMethodError("cannot set using an indexer with a Panel " "yet!") def _getitem_tuple(self, tup): @@ -1141,7 +1141,7 @@ def __getitem__(self, key): return self._getitem_axis(key, axis=0) def _getitem_axis(self, key, axis=0, validate_iterable=False): - raise NotImplementedError() + raise AbstractMethodError("Get item along given axis in _LocationIndexer is not implemented") def _getbool_axis(self, key, axis=0): labels = self.obj._get_axis(axis) @@ -1299,7 +1299,7 @@ def _has_valid_type(self, key, axis): if com._is_bool_indexer(key): if hasattr(key, 'index') and isinstance(key.index, Index): if key.index.inferred_type == 'integer': - raise NotImplementedError( + raise AbstractMethodError( "iLocation based boolean indexing on an integer type " "is not available" ) diff --git a/pandas/core/internals.py b/pandas/core/internals.py index 8100b98d6e42d..884dab11e8808 100644 --- a/pandas/core/internals.py +++ b/pandas/core/internals.py @@ -243,7 +243,7 @@ def fillna(self, value, limit=None, inplace=False, downcast=None): mask = isnull(self.values) if limit is not None: if self.ndim > 2: - raise NotImplementedError + raise NotImplementedError("fillna function not implemented for more than 2 dimensions") mask[mask.cumsum(self.ndim-1)>limit]=False value = self._try_fill(value) @@ -363,10 +363,10 @@ def convert(self, copy=True, **kwargs): return [self.copy()] if copy else [self] def _can_hold_element(self, value): - raise NotImplementedError() + raise NotImplementedError("Block _can_hold_element function") def _try_cast(self, value): - raise NotImplementedError() + raise NotImplementedError("Block _try_cast") def _try_cast_result(self, result, dtype=None): """ try to cast the result to our original type, @@ -1519,7 +1519,7 @@ def fillna(self, value, limit=None, value = self._try_fill(value) if limit is not None: if self.ndim > 2: - raise NotImplementedError + raise NotImplementedError("fillna function not implemented for more than 2 dimensions") mask[mask.cumsum(self.ndim-1)>limit]=False np.putmask(values, mask, value) @@ -1741,7 +1741,7 @@ def interpolate(self, method='pad', axis=0, inplace=False, def fillna(self, value, limit=None, inplace=False, downcast=None): # we may need to upcast our fill to match our dtype if limit is not None: - raise NotImplementedError + raise NotImplementedError("fillna currently implemented only for limit=None") if issubclass(self.dtype.type, np.floating): value = float(value) values = self.values if inplace else self.values.copy() diff --git a/pandas/core/panel.py b/pandas/core/panel.py index e9f8893355f2d..1cd867a5233ba 100644 --- a/pandas/core/panel.py +++ b/pandas/core/panel.py @@ -595,10 +595,10 @@ def conform(self, frame, axis='items'): return frame.reindex(**self._extract_axes_for_slice(self, axes)) def head(self, n=5): - raise NotImplementedError + raise NotImplementedError("Returns the head content of a Panel") def tail(self, n=5): - raise NotImplementedError + raise NotImplementedError("Returns the tail content of a Panel") def _needs_reindex_multi(self, axes, method, level): """ don't allow a multi reindex on Panel or above ndim """ diff --git a/pandas/core/panelnd.py b/pandas/core/panelnd.py index 3eebd51190e3d..73ba07f845e87 100644 --- a/pandas/core/panelnd.py +++ b/pandas/core/panelnd.py @@ -99,7 +99,7 @@ def _combine_with_constructor(self, other, func): for f in ['to_frame', 'to_excel', 'to_sparse', 'groupby', 'join', 'filter', 'dropna', 'shift']: def func(self, *args, **kwargs): - raise NotImplementedError + raise NotImplementedError("%s is not implemented" % f) setattr(klass, f, func) # add the aggregate operations diff --git a/pandas/core/series.py b/pandas/core/series.py index 78b049f4bf8d5..2ed3f9c854817 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -156,7 +156,7 @@ def __init__(self, data=None, index=None, dtype=None, name=None, dtype = self._validate_dtype(dtype) if isinstance(data, MultiIndex): - raise NotImplementedError + raise NotImplementedError("Series initialization currently is not implemented for MultiIndex") elif isinstance(data, Index): # need to copy to avoid aliasing issues if name is None: diff --git a/pandas/core/strings.py b/pandas/core/strings.py index ad64d2bf6bdd9..0591131f986b6 100644 --- a/pandas/core/strings.py +++ b/pandas/core/strings.py @@ -680,7 +680,7 @@ def str_slice_replace(arr, start=None, stop=None, repl=None): ------- replaced : array """ - raise NotImplementedError + raise NotImplementedError("String slice replace not implemented") def str_strip(arr, to_strip=None): @@ -985,7 +985,7 @@ def slice(self, start=None, stop=None, step=1): @copy(str_slice) def slice_replace(self, i=None, j=None): - raise NotImplementedError + raise NotImplementedError("String slice replace is not implemented.") @copy(str_decode) def decode(self, encoding, errors="strict"): diff --git a/pandas/index.pyx b/pandas/index.pyx index 3dcdbf207fb3f..ab1bea2abb22c 100644 --- a/pandas/index.pyx +++ b/pandas/index.pyx @@ -234,10 +234,10 @@ cdef class IndexEngine: self._ensure_mapping_populated() def _call_monotonic(self, values): - raise NotImplementedError + raise NotImplementedError("IndexEngine _call_monotonic is not implemented") cdef _make_hash_table(self, n): - raise NotImplementedError + raise NotImplementedError("IndexEngine _make_hash_table is not implemented") cdef _check_type(self, object val): hash(val) diff --git a/pandas/io/ga.py b/pandas/io/ga.py index f002994888932..9ee6a64c1affc 100644 --- a/pandas/io/ga.py +++ b/pandas/io/ga.py @@ -240,7 +240,7 @@ def get_profile(self, account_id=None, web_property_id=None, name=None, return _get_match(profiles, name, id, **kwargs) def create_query(self, *args, **kwargs): - raise NotImplementedError() + raise NotImplementedError("Create query in GDataReader is not implemented") @Substitution(extras='') @Appender(_GA_READER_DOC) diff --git a/pandas/io/html.py b/pandas/io/html.py index 5ea6ca36ac764..39da36f84a3aa 100644 --- a/pandas/io/html.py +++ b/pandas/io/html.py @@ -215,7 +215,7 @@ def _text_getter(self, obj): text : str or unicode The text from an individual DOM node. """ - raise NotImplementedError + raise NotImplementedError("Text from an individual DOM node") def _parse_td(self, obj): """Return the td elements from a row element. @@ -229,7 +229,7 @@ def _parse_td(self, obj): columns : list of node-like These are the elements of each row, i.e., the columns. """ - raise NotImplementedError + raise NotImplementedError("Elements of each row, i.e the columns") def _parse_tables(self, doc, match, attrs): """Return all tables from the parsed DOM. @@ -256,7 +256,7 @@ def _parse_tables(self, doc, match, attrs): tables : list of node-like A list of
elements. """ - raise NotImplementedError + raise NotImplementedError("List of row elements from parsed table element") def _parse_thead(self, table): """Return the header of a table. @@ -286,7 +286,7 @@ def _parse_thead(self, table): thead : node-like A ... element. """ - raise NotImplementedError + raise NotImplementedError("Header of HTML table") def _parse_tbody(self, table): """Return the body of the table. @@ -301,7 +301,7 @@ def _parse_tbody(self, table): tbody : node-like A |
---|