我有一个函数,用一些用户输入读入一堆原始数据,并将其编译成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()
。
答案 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)
您可以根据需要扩展和添加检查。