すべてが同じ pandas データフレームを参照するいくつかのクラスがありますが、各クラスに関連するのはデータ フレームの一部のみです。また、高度なインデックス作成を使用せずに、関連する行に簡単にアクセスできるようにしたいと考えています。これは、インデックス内のレベルが数によって繰り返されるためです。その結果、各クラスがそのスライスを表示できるように、部分関数を生成するコードを作成しました。
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'))
私の懸念は、データフレームの現在の状態を常に取得できるとは限らないことです。
これは私の目標を達成するための正しい方法ですか?