2013-01-20 42 views
3

在我的項目中,我構建了一個以pandas DataFrame爲核心的類。數據框中的值取決於某些規範,並用一些代表我想要使用的數據的字母初始化它。我把我所有的功能在__init__裏面創建數據框,據我所知,這個功能只有一個功能,在初始化後它們不需要。另外我不希望在後面的代碼中使用我的類之後訪問此功能。 (我不確定這是否是「pythonic」方式)。創建子類形式類返回熊貓dataFrame

__str__和plotData()方法構建基本類後我想應用一些過濾器並構建一個新類,其中附加列是過濾器。我想在__init__這樣做,但保留所有已完成的工作。也就是說我不想重寫整個__init__只想添加新的列到基本的數據幀。

以類似的方式,我想在plotData()函數中添加額外的情節

我原來的代碼已經相當的幾行,但原則是非常相似,下面列出代碼。

import pandas as pd 
import pylab as pl 
class myClass(object): 
    def __init__(self, frameType = 'All'): 
     def method1(): 
      myFrame = pd.DataFrame({'c1':[1,2,3],'c2':[4,5,6],'c3':[7,8,9]}) 
      return myFrame 
     def method2(): 
      myFrame = pd.DataFrame({'c1':[.1,.2,.3],'c2':[.4,.5,.6],'c3':[.7,.8,.9]}) 
      return myFrame 
     def makingChiose(self): 
      if self.frameType == 'All': 
       variable = method1() + method2() 
      elif self.frameType == 'a': 
       variable = method1() 
      elif self.frameType == 'b': 
       variable = method2() 
      else: 
       variable = pd.DataFrame({'c1':[0,0,0],'c2':[0,0,0],'c3':[0,0,0]}) 
      #print 'FROM __init__ : %s' % variable 
      return variable   
     self.frameType = frameType  
     self.cObject = makingChiose(self) # object created by the class 
    def __str__(self): 
     return str(self.cObject) 
    def plotData(self): 
     self.fig1 = pl.plot(self.cObject['c1'],self.cObject['c2']) 
     self.fig2 = pl.plot(self.cObject['c1'],self.cObject['c3']) 
     pl.show() 

class myClassAv(myClass): 
    def addingCol(self): 
     print 'CURRENT cObject \n%s' % self.cObject # the object is visible 
     self.cObject['avarage'] = (self.cObject['c1']+self.cObject['c2']+self.cObject['c3'])/3 
     print 'THIS WORKS IN GENERAL\n%s' % str((self.cObject['c1']+self.cObject['c2']+self.cObject['c3'])/3) # creating new column works 
    def plotData(self): 
     # Function to add new plot to already existing plots 
     self.fig3 = pl.plot(self.cObject['c1'],self.cObject['avarage']) 
if __name__ == '__main__': 
    myObject1 = myClass() 
    print 'myObject1 =\n%s' % myObject1 
    myObject1.plotData() 
    myObject2 = myClass('a') 
    print 'myObject2 =\n%s' % myObject2 
    myObject3 = myClass('b') 
    print 'myObject3 =\n%s' % myObject3 
    myObject4 = myClass('c') 
    print 'myObject4 =\n%s' % myObject4 

    myObject5 = myClassAv('a').addingCol() 
    print 'myObject5 =\n%s' % myObject5 
    myObject5.plotData() 

大部分代碼的工作,至少在初始化,但我有一個錯誤,當我嘗試創建附加列新的數據幀。當我把新的__init__放進去時,我創建了一個全新的初始化,並且我放鬆了所有已經完成的工作。我創建了一個新的功能,但我寧願有其他列後,我叫一個新的類不是新類中的函數從代碼的輸出是這樣的:

myObject1 = 
    c1 c2 c3 
0 1.1 4.4 7.7 
1 2.2 5.5 8.8 
2 3.3 6.6 9.9 
myObject2 = 
    c1 c2 c3 
0 1 4 7 
1 2 5 8 
2 3 6 9 
myObject3 = 
    c1 c2 c3 
0 0.1 0.4 0.7 
1 0.2 0.5 0.8 
2 0.3 0.6 0.9 
myObject4 = 
    c1 c2 c3 
0 0 0 0 
1 0 0 0 
2 0 0 0 
CURRENT cObject 
    c1 c2 c3 
0 1 4 7 
1 2 5 8 
2 3 6 9 
THIS WORKS IN GENERAL 
0 4 
1 5 
2 6 
myObject5 = 
None 
Traceback (most recent call last): 
    File "C:\Users\src\trys.py", line 57, in <module> 
    myObject5.plotData() 
AttributeError: 'NoneType' object has no attribute 'plotData' 

的問題是:我可以「部分'重寫超類的方法,使之具有一些新功能的方法之前的內容?我想將myClassAv()初始化爲四個列而不是三個像myClass()的數據框,並且我想讓myClassAv()。plotData()繪製第三行,但保留兩個基類。

我不知道如何解釋一個錯誤,爲什麼myObject5是None,但我懷疑它是繼承的東西。

此外,如果你有建議,我應該以不同的方式做我的想法,我會很高興聽到他們。

回答

5

如何就叫myClass.__init__myClassAv.__init__

def __init__(self, frameType='All'): 
    myClass.__init__(self, frameType) 
    def addingCol(cObject): 
     ... 
    addingCol(self.cObject) 

爲具體,

import pandas as pd 
import pylab as pl 
import numpy as np 


class myClass(object): 
    def __init__(self, frameType='All'): 
     def method1(): 
      myFrame = pd.DataFrame(
       {'c1': [1, 2, 3], 'c2': [4, 5, 6], 'c3': [7, 8, 9]}) 
      return myFrame 

     def method2(): 
      myFrame = pd.DataFrame(
       {'c1': [.1, .2, .3], 'c2': [.4, .5, .6], 'c3': [.7, .8, .9]}) 
      return myFrame 

     def makingChoice(self): 
      if self.frameType == 'All': 
       variable = method1() + method2() 
      elif self.frameType == 'a': 
       variable = method1() 
      elif self.frameType == 'b': 
       variable = method2() 
      else: 
       variable = pd.DataFrame(
        {'c1': [0, 0, 0], 'c2': [0, 0, 0], 'c3': [0, 0, 0]}) 
      # print 'FROM __init__ : %s' % variable 
      return variable 
     self.frameType = frameType 
     self.cObject = makingChoice(self) # object created by the class 

    def __str__(self): 
     return str(self.cObject) 

    def plotData(self): 
     self.fig1 = pl.plot(self.cObject['c1'], self.cObject['c2']) 
     self.fig2 = pl.plot(self.cObject['c1'], self.cObject['c3']) 
     pl.show() 


class myClassAv(myClass): 
    def __init__(self, frameType='All'): 
     myClass.__init__(self, frameType) 

     def addingCol(cObject): 
      print 'CURRENT cObject \n%s' % cObject # the object is visible 
      cObject['average'] = cObject.mean(axis=1) 
      # creating new column works 
      print 'THIS WORKS IN GENERAL\n%s' % str(cObject['average']) 
      return cObject 

     addingCol(self.cObject) 

    def plotData(self): 
     # Function to add new plot to already existing plots 
     self.fig3 = pl.plot(self.cObject['c1'], self.cObject['average']) 

if __name__ == '__main__': 
    myObject1 = myClass() 
    print 'myObject1 =\n%s' % myObject1 
    myObject1.plotData() 
    myObject2 = myClass('a') 
    print 'myObject2 =\n%s' % myObject2 
    myObject3 = myClass('b') 
    print 'myObject3 =\n%s' % myObject3 
    myObject4 = myClass('c') 
    print 'myObject4 =\n%s' % myObject4 

    myObject5 = myClassAv('a') 
    print 'myObject5 =\n%s' % myObject5 
    myObject5.plotData() 

順便說一句,而不是

self.cObject['avarage'] = (self.cObject['c1']+self.cObject['c2']+self.cObject['c3'])/3 

您可以使用mean(axis = 1)

self.cObject['average'] = self.cObject.mean(axis=1) 
+0

謝謝@unutbu,這正是我需要的。如果嵌套方法內的方法是一般的和良好的做法,你會添加一些評論嗎? – tomasz74

+0

首先,我很抱歉這麼晚回覆。我認爲我必須快速關閉標籤頁或某事,因爲當人們給我寫信時,我並不總是看到通知。關於函數的嵌套:如果您認爲函數具有通用性或可重用性,那麼它應該定義在模塊的頂層或其他函數可以調用它的某個地方。如果函數具有非常專用的目的(不可重用),或者如果要保持頂級命名空間整潔,則可以嵌套該函數。 Python的禪說「扁平比嵌套更好」,所以如果有疑問,不要築巢。 – unutbu

+0

嵌套可以用來防止人們調用函數。但是,它不會阻止黑客,因此爲此目的而嵌套的好處可能是可疑的。 – unutbu