import pandas as pd
import numpy as np
class TestFrame(pd.DataFrame):
df = None
def __new__(cls, *args, **kwargs):
df = pd.DataFrame(*args, **kwargs)
instance = object.__new__(cls)
instance.df = df
return instance
def __getattribute__(self, name):
if name in ['df', '_delegate', '_wrap']:
return object.__getattribute__(self, name)
if hasattr(self.df, name):
return self._wrap(name)
return object.__getattribute__(self, name)
def __getattr__(self, name):
# unset pandas getattr
return object.__getattr__(self, name)
def _wrap(self, name):
attr = getattr(self.df, name, None)
if callable(attr):
def _wrapped(*args, **kwargs):
return self._delegate(name, *args, **kwargs)
return _wrapped
else:
return self._delegate(name)
def _delegate(self, name, *args, **kwargs):
"""
Delegate to DataFrame and wrap output.
"""
attr = getattr(self.df, name, None)
res = attr
if callable(attr):
res = attr(*args, **kwargs)
# maybe need better way to tell when to wrap?
if isinstance(res, pd.DataFrame):
return type(self)(res)
return res
def custom(self):
print 'subclass method'
return self.pct_change()
ind = pd.date_range(start="2000/1/1", freq="D", periods=1000)
df = pd.DataFrame({'test': np.random.randn(len(ind)), 'bob': range(len(ind))}, index=ind)
import pandas.util.testing as tm
tf = TestFrame(df)
tm.assert_frame_equal(tf, df)
tm.assert_frame_equal(pd.rolling_mean(tf, 10), pd.rolling_mean(df, 10))
tf.tail() + 1
bob test 2002-09-22 996 1.211586 2002-09-23 997 1.704499 2002-09-24 998 0.883378 2002-09-25 999 2.631249 2002-09-26 1000 0.200498
type((tf >= df - 1).tail())
_compare_frame df _wrap df _delegate df df columns df _data df _init_mgr df _wrap df _delegate df tail df _wrap df _delegate df df columns df _data df _init_mgr df _wrap df _delegate df
__main__.TestFrame
tf.tail() - 1
bob test \ 2002-09-22 994 0.010667 2002-09-23 995 -2.727564 2002-09-24 996 -2.200067 2002-09-25 997 -1.641603 2002-09-26 998 -2.065013
tf.bob
2000-01-01 0 2000-01-02 1 2000-01-03 2 2000-01-04 3 2000-01-05 4 2000-01-06 5 2000-01-07 6 2000-01-08 7 2000-01-09 8 2000-01-10 9 2000-01-11 10 2000-01-12 11 2000-01-13 12 2000-01-14 13 2000-01-15 14 ... 2002-09-12 985 2002-09-13 986 2002-09-14 987 2002-09-15 988 2002-09-16 989 2002-09-17 990 2002-09-18 991 2002-09-19 992 2002-09-20 993 2002-09-21 994 2002-09-22 995 2002-09-23 996 2002-09-24 997 2002-09-25 998 2002-09-26 999 Freq: D, Name: bob, Length: 1000
tf.whee = 'hi'
tf.whee
'hi'
tf.df2 = df
type(tf.df2)
pandas.core.frame.DataFrame
tf.plot()
<matplotlib.axes.AxesSubplot at 0x10b511110>
type(tf.custom())
subclass method
__main__.TestFrame
tf.ix[:100]
bob | test | |
---|---|---|
2000-01-01 | 0 | 0.039011 |
2000-01-02 | 1 | 0.631876 |
2000-01-03 | 2 | -1.843544 |
2000-01-04 | 3 | 0.911880 |
2000-01-05 | 4 | 1.159095 |
2000-01-06 | 5 | -1.370229 |
2000-01-07 | 6 | 0.178066 |
2000-01-08 | 7 | 0.543112 |
2000-01-09 | 8 | -0.296443 |
2000-01-10 | 9 | 0.330540 |
2000-01-11 | 10 | 0.052989 |
2000-01-12 | 11 | 0.688231 |
2000-01-13 | 12 | -0.675966 |
2000-01-14 | 13 | 0.017001 |
2000-01-15 | 14 | 0.027286 |
2000-01-16 | 15 | -1.092365 |
2000-01-17 | 16 | 1.398045 |
2000-01-18 | 17 | -0.361476 |
2000-01-19 | 18 | 0.009481 |
2000-01-20 | 19 | 1.265651 |
2000-01-21 | 20 | -0.234009 |
2000-01-22 | 21 | -0.859149 |
2000-01-23 | 22 | -0.561337 |
2000-01-24 | 23 | -0.162586 |
2000-01-25 | 24 | 1.231425 |
2000-01-26 | 25 | 0.325311 |
2000-01-27 | 26 | 1.101560 |
2000-01-28 | 27 | -0.516393 |
2000-01-29 | 28 | -1.026526 |
2000-01-30 | 29 | 1.497308 |
2000-01-31 | 30 | -1.430837 |
2000-02-01 | 31 | -0.002380 |
2000-02-02 | 32 | 1.857482 |
2000-02-03 | 33 | 2.046706 |
2000-02-04 | 34 | -1.955151 |
2000-02-05 | 35 | -0.661517 |
2000-02-06 | 36 | 0.801246 |
2000-02-07 | 37 | 0.405801 |
2000-02-08 | 38 | -1.226820 |
2000-02-09 | 39 | 0.662877 |
2000-02-10 | 40 | 0.497073 |
2000-02-11 | 41 | 0.612529 |
2000-02-12 | 42 | -1.465876 |
2000-02-13 | 43 | -2.789636 |
2000-02-14 | 44 | 0.447547 |
2000-02-15 | 45 | -0.477878 |
2000-02-16 | 46 | -1.212441 |
2000-02-17 | 47 | -0.315991 |
2000-02-18 | 48 | -0.893155 |
2000-02-19 | 49 | 0.592178 |
2000-02-20 | 50 | -1.498540 |
2000-02-21 | 51 | -0.391808 |
2000-02-22 | 52 | -0.334314 |
2000-02-23 | 53 | -0.462160 |
2000-02-24 | 54 | 1.128088 |
2000-02-25 | 55 | 0.497370 |
2000-02-26 | 56 | 0.144936 |
2000-02-27 | 57 | 0.033837 |
2000-02-28 | 58 | 0.255648 |
2000-02-29 | 59 | 0.610688 |
2000-03-01 | 60 | 1.565399 |
2000-03-02 | 61 | -0.847857 |
2000-03-03 | 62 | -0.916810 |
2000-03-04 | 63 | 0.367881 |
2000-03-05 | 64 | 0.165379 |
2000-03-06 | 65 | -0.775153 |
2000-03-07 | 66 | -0.185984 |
2000-03-08 | 67 | 1.967449 |
2000-03-09 | 68 | 0.642104 |
2000-03-10 | 69 | -0.096368 |
2000-03-11 | 70 | 1.828683 |
2000-03-12 | 71 | 0.857416 |
2000-03-13 | 72 | -0.383251 |
2000-03-14 | 73 | -0.896925 |
2000-03-15 | 74 | -0.962953 |
2000-03-16 | 75 | 0.811334 |
2000-03-17 | 76 | -0.165782 |
2000-03-18 | 77 | 0.682227 |
2000-03-19 | 78 | 0.752934 |
2000-03-20 | 79 | 0.470452 |
2000-03-21 | 80 | -0.673254 |
2000-03-22 | 81 | 0.074238 |
2000-03-23 | 82 | 0.172119 |
2000-03-24 | 83 | 0.723505 |
2000-03-25 | 84 | -1.057808 |
2000-03-26 | 85 | -1.017878 |
2000-03-27 | 86 | -1.181534 |
2000-03-28 | 87 | -0.490955 |
2000-03-29 | 88 | 0.686956 |
2000-03-30 | 89 | 0.439895 |
2000-03-31 | 90 | 1.073969 |
2000-04-01 | 91 | 0.064766 |
2000-04-02 | 92 | -0.089403 |
2000-04-03 | 93 | 1.795686 |
2000-04-04 | 94 | 1.041462 |
2000-04-05 | 95 | 0.394156 |
2000-04-06 | 96 | 1.900370 |
2000-04-07 | 97 | 0.706928 |
2000-04-08 | 98 | -0.067476 |
2000-04-09 | 99 | -0.023017 |