我想构建一个扩展pandas.DataFrame
——我们称之为它SPDF
——它可以做的事情超出了简单的范围DataFrame
:
import pandas as pd
import numpy as np
def to_spdf(func):
"""Transform generic output of `func` to SPDF.
Returns
-------
wrapper : callable
"""
def wrapper(*args, **kwargs):
res = func(*args, **kwargs)
return SPDF(res)
return wrapper
class SPDF:
"""Special-purpose dataframe.
Parameters
----------
df : pandas.DataFrame
"""
def __init__(self, df):
self.df = df
def __repr__(self):
return repr(self.df)
def __getattr__(self, item):
res = getattr(self.df, item)
if callable(res):
res = to_spdf(res)
return res
if __name__ == "__main__":
# construct a generic SPDF
df = pd.DataFrame(np.eye(4))
an_spdf = SPDF(df)
# call .diff() to obtain another SPDF
print(an_spdf.diff())
现在,DataFrame
那个返回 another的方法DataFrame
,比如.diff()
上面的 MWE,返回 me another SPDF
,这很棒。但是,我还想欺骗链式方法,例如.resample('M').last()
or最终.rolling(2).mean()
生成一个SPDF
。到目前为止我失败了,因为.rolling()
等是 type callable
,并且我的包装器to_spdf
尝试SPDF
从它们的输出构造一个而不“等待”.mean()
或表达式的任何其他最后部分。任何想法如何解决这个问题?
谢谢。