我有几个类都引用相同的熊猫数据框,但只有部分数据框与每个类相关。我还希望在不使用高级索引的情况下轻松访问相关行,因为由于索引中的数字级别,它会变得重复。因此,我编写了生成部分函数的代码,以便每个类都可以查看其切片。
from functools import partial
import pandas as pd
import numpy as np
import dateutil.relativedelta as rd
import datetime as dt
class baz(object):
pass
groups = ['foo', 'foo', 'bar', 'bar']
items = ['x','y', 'x', 'y']
diff = rd.relativedelta(years=1)
dates = [dt.date(2013,1,1) + (diff * shift) for shift in xrange(4)] * 2
index = pd.MultiIndex.from_arrays([groups, items], names=['groups', 'items'])
values = np.random.randn(4,8)
data = pd.DataFrame(values, index=index, columns=dates)
def view_data(group, item):
return data.ix[group, item]
foo = baz()
bar = baz()
# I use partial because I want lazy evaluation
foo.x = partial(view_data, 'foo', 'x')
foo.y = partial(view_data, 'foo', 'y')
bar.x = partial(view_data, 'bar', 'x')
bar.y = partial(view_data, 'bar', 'y')
foo.x()
但是,我希望引用不必看起来像 foo.x()[date],而是看起来像 foo.x[date]。
结果,我创建了一个装饰器来包装函数并返回值。
def execute_func(func):
def inner(*args, **kwargs):
return func(*args, **kwargs)
return inner()
foo.x = execute_func(partial(view_data, 'foo', 'x'))
foo.y = execute_func(partial(view_data, 'foo', 'y'))
bar.x = execute_func(partial(view_data, 'bar', 'x'))
bar.y = execute_func(partial(view_data, 'bar', 'y'))
我担心的是我不会总是获得数据框的当前状态。
这是实现我的目标的正确方法吗?