当前位置: 首页 > 知识库问答 >
问题:

pandas:用于链式方法的组合,如。重采样()、.rolling()等

杜茂
2023-03-14
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的方法,如上面MWE中的.diff(),返回另一个spdf,这很好。但是,我还希望欺骗链接方法,如.resample('m').last().rolling(2).mean()在最后生成一个SPDF。到目前为止,我失败了,因为.rolling()和类似的类型是callable,而我的包装器to_spdf试图从它们的输出中构造spdf,而不“等待”.mean()或表达式的任何其他最后部分。有什么想法可以解决这个问题吗?

谢了。

共有1个答案

杜俊楚
2023-03-14

您应该正确地子类化DataFrame。为了使copy-constructor方法工作,pandas说明必须设置_constructor属性(以及其他信息)。

您可以执行以下操作:

class SPDF(DataFrame):

    @property
    def _constructor(self):
        return SPDF

如果需要在复制构造函数方法(如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'>]
 类似资料:
  • 主要内容:降采样,升采样,频率转换,插值处理数据重采样是将时间序列从一个频率转换至另一个频率的过程,它主要有两种实现方式,分别是降采样和升采样,降采样指将高频率的数据转换为低频率,升采样则与其恰好相反,说明如下: 方法 说明 降采样 将高频率(间隔短)数据转换为低频率(间隔长)。 升采样 将低频率数据转换为高频率。 Pandas 提供了 resample() 函数来实现数据的重采样。 降采样 通过 resample() 函数完成数据的降采样

  • 问题内容: 我有一些层次结构数据,这些数据触底到达时间序列数据,看起来像这样: 我想对每个城市进行时间重采样,所以类似 将输出 就这样,让我 足够公平,但是我有点希望这能起作用: 在这一点上,我真的没什么主意了……是否有某种方法可以帮助我解决问题? 问题答案: 允许您指定“目标对象的groupby指令”。特别是,即使不是,您也可以使用它按日期分组: 在讲述寻找在多指标的最后一个级别的日期。此外,您

  • 将多个样式合并为一个新样式应用在单元格上 // 将粗体与斜体合并为一个样式 $format = new \Vtiful\Kernel\Format($fileHandle); $boldItalicStyle = $format->bold()->italic()->toResource();

  • 问题内容: 这个问题已经在这里有了答案 : 如何在Python中断开一系列链接方法? (8个答案) 7年前关闭。 通过阅读PEP-8,我知道您应该将右括号与函数调用中的最后一个参数放在同一行: 可能最好完全避免使用长表达式。但是,如果不希望这样做, 您将如何进行多个链接方法调用? 结束语应该换行吗? 那么无参数方法呢? 如何在不参考中间返回值的情况下将它们写在多行上? 更新 :存在一个重复的问题,

  • 目前 SOFATracer 提供了两种采样模式,一种是基于 BitSet 实现的基于固定采样率的采样模式;另外一种是提供给用户自定义实现采样的采样模式。下面通过案例来演示如何使用。 本示例基于 tracer-sample-with-springmvc 工程;除 application.properties 之外,其他均相同。 基于固定采样率的采样模式 在 application.propertie

  • 我的数据集不平衡。我尝试使用不同的重采样方法来平衡它。到目前为止,我知道有三种方法来处理采样。1、随机抽样2。交叉验证3。独自创立 我正在使用Weka进行数据预处理。我知道如何在Weka中使用交叉验证。它带有像随机森林或朴素贝叶斯或任何其他分类器。 但我没有发现随机抽样或引导。 我发现有人监督- 我想知道两次重采样之间的区别。这篇文章不是很有帮助。我如何在Weka使用Bootstap?有什么选择吗