gpt4 book ai didi

python - pandas:链式方法的组合,如 .resample()、.rolling() 等

转载 作者:太空狗 更新时间:2023-10-30 00:04:45 26 4
gpt4 key购买 nike

我想构建 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 ,还有我的 wrapper to_spdf试图构建一个 SPDF从他们的输出中无需“等待”.mean()或表达式的任何其他最后部分。任何想法如何解决这个问题?

谢谢。

最佳答案

您应该正确继承dataframe。为了使 copy-constructor 方法起作用,pandas 描述您必须设置 _constructor属性(property)(连同其他信息)。

您可以执行以下操作:

class SPDF(DataFrame):

@property
def _constructor(self):
return SPDF

如果您需要保留自定义属性(不是函数 - 那些将在那里),在copy-constructor方法(如 >diff), 然后你可以做类似下面的事情

class SPDF(DataFrame):
_metadata = ['prop']
prop = 1

@property
def _constructor(self):
return SPDF

注意输出符合要求:

df = SPDF(np.eye(4))
print(type(df))
[<class '__main__.SPDF'>]
new = df.diff()
print(type(new))
[<class '__main__.SPDF'>]

关于python - pandas:链式方法的组合,如 .resample()、.rolling() 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51279610/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com