[DataFrame] Inherit documentation from Pandas (#1727)

* Added _inherit_docstrings

* DataFrame documentation inherits from Pandas

* Fix formatting

* Replace hasattr and document properties

* Fix rebase

* Override documentation for groupby

* Override documentation for series

* Don't overwrite property docstrings

* Fix property __doc__ for python2
This commit is contained in:
Peter Schafhalter 2018-04-12 20:30:19 -07:00 committed by Devin Petersohn
parent d0fffec2d0
commit 1d605e8f8a
5 changed files with 63 additions and 1 deletions

View file

@ -32,11 +32,13 @@ from .utils import (
to_pandas,
_blocks_to_col,
_blocks_to_row,
_create_block_partitions)
_create_block_partitions,
_inherit_docstrings)
from . import get_npartitions
from .index_metadata import _IndexMetadata
@_inherit_docstrings(pd.DataFrame)
class DataFrame(object):
def __init__(self, data=None, index=None, columns=None, dtype=None,

View file

@ -2,7 +2,12 @@ from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import pandas.core.groupby
from .utils import _inherit_docstrings
@_inherit_docstrings(pandas.core.groupby.DataFrameGroupBy)
class DataFrameGroupBy(object):
def __init__(self, partitions, columns, index):

View file

@ -3,6 +3,9 @@ from __future__ import division
from __future__ import print_function
import numpy as np
import pandas as pd
from .utils import _inherit_docstrings
def na_op():
@ -11,6 +14,7 @@ def na_op():
raise NotImplementedError("Not Yet implemented.")
@_inherit_docstrings(pd.Series)
class Series(object):
def __init__(self, series_oids):

View file

@ -3014,3 +3014,14 @@ def test_iloc(ray_df, pd_df):
assert ray_df.iloc[1:, 0].equals(pd_df.iloc[1:, 0])
assert ray_df.iloc[1:2, 0].equals(pd_df.iloc[1:2, 0])
assert ray_df.iloc[1:2, 0:2].equals(pd_df.iloc[1:2, 0:2])
def test__doc__():
assert rdf.DataFrame.__doc__ != pd.DataFrame.__doc__
assert rdf.DataFrame.__init__ != pd.DataFrame.__init__
for attr, obj in rdf.DataFrame.__dict__.items():
if (callable(obj) or isinstance(obj, property)) \
and attr != "__init__":
pd_obj = getattr(pd.DataFrame, attr, None)
if callable(pd_obj) or isinstance(pd_obj, property):
assert obj.__doc__ == pd_obj.__doc__

View file

@ -242,3 +242,43 @@ def _blocks_to_row(*partition):
# columns), this change is needed to ensure correctness.
row_part.columns = pd.RangeIndex(0, len(row_part.columns))
return row_part
def _inherit_docstrings(parent):
"""Creates a decorator which overwrites a decorated class' __doc__
attribute with parent's __doc__ attribute. Also overwrites __doc__ of
methods and properties defined in the class with the __doc__ of matching
methods in parent.
Args:
parent (object): Class from which the decorated class inherits __doc__.
Note:
Currently does not override class' __doc__ or __init__'s __doc__.
Todo:
Override the class' __doc__ and __init__'s __doc__ once DataFrame's
__init__ method matches pandas.DataFrame's __init__ method.
Returns:
function: decorator which replaces the decorated class' documentation
parent's documentation.
"""
def decorator(cls):
# cls.__doc__ = parent.__doc__
for attr, obj in cls.__dict__.items():
if attr == "__init__":
continue
parent_obj = getattr(parent, attr, None)
if not callable(parent_obj) and \
not isinstance(parent_obj, property):
continue
if callable(obj):
obj.__doc__ = parent_obj.__doc__
elif isinstance(obj, property) and obj.fget is not None:
p = property(obj.fget, obj.fset, obj.fdel, parent_obj.__doc__)
setattr(cls, attr, p)
return cls
return decorator