2016-08-05 105 views
1

我有一個函數,它讀入一堆用戶輸入的原始數據,並將它編譯成熊貓系列。在下面的示例中,我將它稱爲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

我不知道我理解這個問題。如果你想'create_data'返回一個'myobj'實例,爲什麼不這樣做:'def create_data(n):return myobj(pd.Series(np.random.randint(1,100,n)))' – Blckknght

+0

你爲什麼要這麼做?它使代碼更復雜,沒有任何好處。 – BlackJack

回答

0

如果我正確理解你的問題,我認爲你在尋找做到以下幾點:

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 

吉姆的解決方案應該是沒關係,但是它的子類關閉的pd.Series - 如果你並不需要所有的其他方法pd.Series那麼有沒有點再分類。

+0

如果你只是'__init __()',封裝一個值,並有一個這樣的方法,你沒有一個類。這只是一種以過度複雜的方式編寫的函數。這個解決方案是如何解決的? 'create_data()'也沒有意義。該函數的作用僅僅是'MyObjMaker'的別名,它可以簡單寫爲'create_data = MyObjMaker' - 或完全省略。 – BlackJack

+0

@BlackJack如果你仔細閱讀Q/A,這是提問者想要解決的問題。這不是我想知道他們爲什麼要以某種方式做某事的地方,因爲這個問題非常具體,而不是Python和Pythonic風格。另外,你的'create_data = MyObjMaker'不正確。這也會使create_data成爲一個類。我有它的方式,它返回一個類型爲'MyObjMaker'的保證實例。 – alichaudry

+0

評論與Python或風格無關。把一個簡單的函數裝扮成無用的類是沒有意義的,除非語言強迫你像Java(在lambda表達式之前)。我更簡單的'create_data'定義會如何返回一個不同的實例?也許當'MyObjMaker'實現'__new __()',但這會以同樣的方式影響你的功能。 – BlackJack

1

從本質上講,你要尋找的是就像一個Series但更專門,因此,只需要創建一個類從pd.Series繼承的對象:

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) 

,你可以擴展和根據自己的需要添加的檢查。