私はいくつかのユーザ入力で生データの束を読み込み、それをPandasシリーズにコンパイルする関数を持っています。下の例では、私はそれをcreate_data
と呼んでおり、長さがn
のランダム系列を構築しています。pandasシリーズからクラスオブジェクトを作成してメソッドを適用する
>>> 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
次に、このシリーズに適用したい機能セットがあります。この例では、系列とその1次の差との間の相関を計算するものを作成します。
>>> 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
機能create_data
の結果として作成さmyobj
クラスオブジェクトを持つための最良の方法は何ですか?私はcreate_data
に電話し、その結果をtemporal_corr()
と呼ぶことができるオブジェクトにしたいと考えています。
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
をすることができ、あなたの工場の機能:基本的に
私はこの質問をよく理解していません。 'create_data'が' myobj'インスタンスを返すようにしたいのであれば、それだけではありません: 'create create_data(n):return myobj(pd.Series(np.random.randint(1、100、n)))' – Blckknght
なぜ地球上でそれをしたいのですか?これはコードをより複雑にし、利益をもたらさない。 – BlackJack