Я хотел бы построить расширение 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
, которые возвращают еще один DataFrame
, например .diff()
в приведенном выше MWE, возвращают мне еще один SPDF
, и это здорово. Однако я также хотел бы обмануть цепные методы, такие как .resample('M').last()
или .rolling(2).mean()
, чтобы получить SPDF
в самом конце. До сих пор я терпел неудачу, потому что .rolling()
и тому подобное имеют тип callable
, а моя оболочка to_spdf
пытается построить SPDF
из их вывода, не «ожидая» .mean()
или любой другой последней части выражения. Любые идеи, как решить эту проблему?
Спасибо.
SPDF
. На что это даст вам обычныйDataFrame
, на что не способен? - person igrinis   schedule 16.07.2018SPDF
в самом конце и получают ожидаемый результат (т.е.isinstance(an_spdf.rolling(2).mean(), SPDF)
возвращаетTrue
) - person Tomas Farias   schedule 16.07.2018