从pandas系列创建类对象并应用方法

时间:2016-08-05 16:40:13

标签: python pandas

我有一个函数,用一些用户输入读入一堆原始数据,并将其编译成Pandas系列。在下面的示例中,我将其称为create_data,它只是构建一个长度为n的随机序列。

>>> def create_data(n):
...     return pd.Series(np.random.randint(1, 100, n))
... 
>>> 
>>> function_result=create_data(10)
>>> function_result
0    73
1    91
2    31
3    44
4    19
5    30
6    42
7    56
8    69
9    70
dtype: int32

然后我有一组想要能够应用于这个系列的功能。在这个例子中,我创建了一个计算系列与其一级差异之间相关性的算法。

>>> def temporal_corr(x):
...     return pd.concat([x, x.shift()], 1).corr().iloc[0, 1]
... 

我显然可以通过调用函数将其应用于系列......

>>> temporal_corr(function_result)
0.38714413906049816

但是,让我说我想在这个系列中使用几种不同的功能。创建一个使用函数create_data构造对象的类,然后在类中有一组可以作为方法应用的函数,会更有意义(或者是否可能)?我创建了一个类并在下面定义了这个函数。

>>> class myobj:
...     def __init__(self, myobj):
...         self.myobj = myobj
...     
...     def temporal_corr(self):
...         return pd.concat([self.myobj, self.myobj.shift()], 1).corr().iloc[0, 1]
... 
>>> a = myobj(function_result)
>>> a.temporal_corr()
0.38714413906049816

作为函数myobj的结果,创建类对象create_data的最佳方法是什么?我希望能够调用create_data并将结果作为一个对象,我可以从中调用temporal_corr()

2 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,我认为您希望执行以下操作:

import pandas as pd
import numpy as np


class MyObjMaker(object):

    def __init__(self, n):
        self.myobj = pd.Series(np.random.randint(1, 100, n))

    def temporal_corr(self):
        return pd.concat([self.myobj, self.myobj.shift()], 1).corr().iloc[0, 1]


def create_data(n):
    return MyObjMaker(n)

这里,函数create_data从类中创建一个对象,并且具有temporal_corr函数。例如,我会按如下方式使用它:

In [2]: a = create_data(10)  # `a` is now an instance of MyObjMaker

In [4]: type(a)  # proof that `a` is now an instance of MyObjMaker
Out[4]: __main__.MyObjMaker

In [5]: a.temporal_corr()  # `temporal_corr` works
Out[5]: -0.18294239972101703

Jim的解决方案也应该没问题,但它是pd.Series的子类 - 如果你不需要pd.Series中的所有其他方法,那么就没有必要对它进行子类化。

答案 1 :(得分:1)

基本上,您正在寻找一个像Series但更像专用的对象,因此,只需创建一个继承自pd.Series的类:< / p>

import pandas as pd
from numpy.random import randint

class mySeries(pd.Series):

    def __init__(self, n):
        super().__init__(randint(0, 100, n))  # initialize series

    # Add your custom methods:
    def temporal_corr(self):
        return pd.concat([self, self.shift()], 1).corr().iloc[0, 1]

然后,create_data可以是您的专业Series对象的工厂函数:

def create_data(n):
    return mySeries(n)

您可以根据需要扩展和添加检查。