Python 多个类的全局变量与多个等效类属性?
首先,我意识到已经有很多关于效率的问题,所以如果这是重复的,我很抱歉,但我在这里是因为我找不到我想要的。我将用一个例子来问这个问题: 我有一些时间序列数据,我从excel导入到一个数据框中。它有Python 多个类的全局变量与多个等效类属性?,python,pandas,Python,Pandas,首先,我意识到已经有很多关于效率的问题,所以如果这是重复的,我很抱歉,但我在这里是因为我找不到我想要的。我将用一个例子来问这个问题: 我有一些时间序列数据,我从excel导入到一个数据框中。它有id | name | date | total | u monthly _rtn列,我正在为报告目的做一些简单的操作(月、3M、YTD、ITD等)。然后,我按id/名称拆分此数据帧,并将其存储在Account对象中: import pandas as ps from pandas.tseries.off
id | name | date | total | u monthly _rtn
列,我正在为报告目的做一些简单的操作(月、3M、YTD、ITD等)。然后,我按id/名称拆分此数据帧,并将其存储在Account对象中:
import pandas as ps
from pandas.tseries.offsets import YearEnd, DateOffset
class Account(object):
def __init__(self, df):
self.name = df['name'][0]
self.id = df['id'][0]
self.rtn = ps.TimeSeries(df['total_monthly_rtn'].values, index=ps.DatetimeIndex(df['date'], freq='M'))
self.m = DateOffset(months=1)
# dataframe mentioned above with 4 columns (id;name;date;total_monthly_rtn)
data = parsexl(src_path) # parsexl not needed for this question
valdate = max(data['date'])
y = YearEnd()
# an example of one slice of 'data'
foo = Account(data[data['id'] == '123456'])
# where 'data[data['id'] == '123456']' looks like:
id name date total_monthly_rtn
0 123456 Bank of Foo 2011-07-31 00:00:00 -2.75
1 123456 Bank of Foo 2011-08-31 00:00:00 -7.63
2 123456 Bank of Foo 2011-09-30 00:00:00 -4.03
3 123456 Bank of Foo 2011-10-31 00:00:00 5.68
4 123456 Bank of Foo 2011-11-30 00:00:00 -1.79
5 123456 Bank of Foo 2011-12-31 00:00:00 0.93
6 123456 Bank of Foo 2012-01-31 00:00:00 3.0773
7 123456 Bank of Foo 2012-02-29 00:00:00 5.4896
8 123456 Bank of Foo 2012-03-31 00:00:00 0.5089
9 123456 Bank of Foo 2012-04-30 00:00:00 -2.0739
10 123456 Bank of Foo 2012-05-31 00:00:00 -6.0472
11 123456 Bank of Foo 2012-06-30 00:00:00 4.7578
12 123456 Bank of Foo 2012-07-31 00:00:00 2.1529
13 123456 Bank of Foo 2012-08-31 00:00:00 1.0867
14 123456 Bank of Foo 2012-09-30 00:00:00 0.3791
15 123456 Bank of Foo 2012-10-31 00:00:00 1.143
16 123456 Bank of Foo 2012-11-30 00:00:00 3.3823
17 123456 Bank of Foo 2012-12-31 00:00:00 0.6535
18 123456 Bank of Foo 2013-01-31 00:00:00 7.3905
19 123456 Bank of Foo 2013-02-28 00:00:00 3.5779
20 123456 Bank of Foo 2013-03-31 00:00:00 2.3466
21 123456 Bank of Foo 2013-04-30 00:00:00 1.6874
22 123456 Bank of Foo 2013-05-31 00:00:00 0.6536
23 123456 Bank of Foo 2013-06-30 00:00:00 -2.7618
24 123456 Bank of Foo 2013-07-31 00:00:00 3.854
25 123456 Bank of Foo 2013-08-31 00:00:00 -3.6812
26 123456 Bank of Foo 2013-09-30 00:00:00 1.9478
27 123456 Bank of Foo 2013-10-31 00:00:00 3.9654
我最初为Account编写了这两个类函数:
def ytd(self, ye, vd):
return self.rtn.truncate(before=ye.rollback(vd), after=vd)[1:].sum()
def year(self, vd):
return self.rtn.truncate(before=vd-(11*m), after=vd).sum()
# called like:
foo.ytd(y, valdate) # returns 18.9802
foo.year(valdate) # returns 23.016
但后来我开始思考,将valdate和YearEnd存储为类属性会更好吗?从而将这两个功能转变为:
def ytd(self):
return self.rtn.truncate(before=self.ye.rollback(vd), after=self.vd)[1:].sum()
def year(self):
return self.rtn.truncate(before=self.vd-(11*m), after=self.vd).sum()
在我的应用程序中,我要处理大约8000行数据
,代表100个ish帐户,所以这样做或那样做可能不会有很大影响,但一般来说?我的直觉告诉我,第一种方式更好,但如果有人知道他们的东西能让我放松,我会很感激。多谢各位
==编辑==
我在这里只包含了两个类函数,但如果有区别的话,实际上有10个类函数将valdate和YearEnd作为变量
==编辑2==
如果我的例子让一些人感到困惑,我很抱歉。
如果您不知道:rtn=返回;ytd=年初至今如果问题只是关于性能(或者更准确地说是速度),函数本地查找比属性查找快,因此您当前的解决方案很好。我确信所有这些变量名称对您都有意义,但“YearEnd”(例如1)对我们来说没有任何意义,您需要选择一些更好的变量名称,并包括更多的代码或一些背景信息,以便我们能够确切地了解您正在做什么。还有,这到底是什么
foo=Account(data[data['id']=='123456'])
您犯了很多语法错误,以及奇怪的编程决策,这使得您更难遵循代码。为了清楚起见,请编辑您的问题。包括一个工作模型和一些示例输入/预期输出。很抱歉,这让您感到困惑。事后看来,我本应该做一个更一般的例子,说明我问题的原则,而不是所有只对我有意义的事情,但我就是这样想到这个问题的。我希望我的编辑能有所帮助。另外,如果你能给我举个例子,说明这些语法错误和奇怪的编程决策,我将不胜感激。是的,这正是我想要的,谢谢。