tom*_*z74 4 python inheritance pandas
在我的项目中,我构建了一个以pandas DataFrame为核心的类.数据框中的值取决于某些规范,我用一些代表我想要使用的数据的字母初始化它.我把我的所有函数都放在一个内部创建数据框架,__init__
因为我知道这个函数只有一个,并且在初始化之后不需要它们.在我的类在以后的代码中使用后,我也不想访问这个函数.(我不确定这是否是"pythonic"方式).
在使用__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()
Run Code Online (Sandbox Code Playgroud)
大多数代码都起作用,至少在初始化时,但是当我尝试使用附加列创建新数据帧时,我遇到了错误.当我把它作为新的__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'
Run Code Online (Sandbox Code Playgroud)
问题是:我可以'部分'覆盖超类的方法,以获得此方法中的一些新功能吗?我想将myClassAv()初始化为带有四列而不是三列的数据帧,如myClass(),我想让myClassAv().plotData()绘制第三行,但保留两个基类.
我不知道如何解释错误以及myObject5为什么是None,但我怀疑它是继承的东西.
此外,如果你有建议我应该以不同的方式做我的所有想法,我将很高兴听到他们.
怎么样只是打电话给myClass.__init__
内部myClassAv.__init__
:
def __init__(self, frameType='All'):
myClass.__init__(self, frameType)
def addingCol(cObject):
...
addingCol(self.cObject)
Run Code Online (Sandbox Code Playgroud)
具体,
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()
Run Code Online (Sandbox Code Playgroud)
顺便说一句,而不是
self.cObject['avarage'] = (self.cObject['c1']+self.cObject['c2']+self.cObject['c3'])/3
Run Code Online (Sandbox Code Playgroud)
你可以使用mean(axis = 1)
:
self.cObject['average'] = self.cObject.mean(axis=1)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3014 次 |
最近记录: |