Skip to content

Commit 469a930

Browse files
committed
BUG: Improve _as_str() to handle DataFrame and other inputs
Fixes #44
1 parent 655f802 commit 469a930

File tree

3 files changed

+14
-14
lines changed

3 files changed

+14
-14
lines changed

backtesting/_util.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@ def try_(lazy_func, default=None, exception=Exception):
1515
def _as_str(value):
1616
if isinstance(value, (Number, str)):
1717
return str(value)
18+
if isinstance(value, pd.DataFrame):
19+
return 'df'
1820
name = str(getattr(value, 'name', '') or '')
21+
if name in ('Open', 'High', 'Low', 'Close', 'Volume'):
22+
return name[:1]
1923
if callable(value):
20-
name = value.__name__.replace('<lambda>', '')
21-
if name in ('Open', 'High', 'Low', 'Close'):
22-
name = name[:1]
24+
name = value.__name__.replace('<lambda>', 'λ')
2325
if len(name) > 10:
2426
name = name[:9] + '…'
2527
return name
@@ -93,13 +95,13 @@ def __init__(self, df):
9395
self.__arrays['__index'] = df.index.copy()
9496

9597
def __getitem__(self, item):
96-
return getattr(self, item)
98+
return self.__get_array(item)
9799

98100
def __getattr__(self, item):
99101
try:
100102
return self.__get_array(item)
101103
except KeyError:
102-
raise KeyError("Column '{}' not in data".format(item)) from None
104+
raise AttributeError("Column '{}' not in data".format(item)) from None
103105

104106
def _set_length(self, i):
105107
self.__i = i

backtesting/backtesting.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ def init():
115115
"""
116116
if name is None:
117117
params = ','.join(filter(None, map(_as_str, chain(args, kwargs.values()))))
118-
func_name = func.__name__.replace('<lambda>', 'λ')
118+
func_name = _as_str(func)
119119
name = ('{}({})' if params else '{}').format(func_name, params)
120120
else:
121121
name = name.format(*map(_as_str, args),

backtesting/test/_test.py

+6-8
Original file line numberDiff line numberDiff line change
@@ -130,12 +130,8 @@ def init(self):
130130
assert resampled in self._indicators, "Strategy.I not called"
131131
assert resampled_ind in self._indicators, "Strategy.I not called"
132132

133-
try:
134-
self.data.X
135-
except KeyError:
136-
pass
137-
else:
138-
assert False
133+
assert 1 == try_(lambda: self.data.X, 1, AttributeError)
134+
assert 1 == try_(lambda: self.data['X'], 1, KeyError)
139135

140136
assert self.data.pip == .01
141137

@@ -588,8 +584,10 @@ class Class:
588584
self.assertEqual(_as_str(_Indicator([1, 2], name='x')), 'x')
589585
self.assertEqual(_as_str(func), 'func')
590586
self.assertEqual(_as_str(Class), 'Class')
591-
self.assertEqual(_as_str(lambda x: x), '')
592-
for s in ('Open', 'High', 'Low', 'Close'):
587+
self.assertEqual(_as_str(pd.Series([1, 2], name='x')), 'x')
588+
self.assertEqual(_as_str(pd.DataFrame()), 'df')
589+
self.assertEqual(_as_str(lambda x: x), 'λ')
590+
for s in ('Open', 'High', 'Low', 'Close', 'Volume'):
593591
self.assertEqual(_as_str(_Array([1], name=s)), s[0])
594592

595593

0 commit comments

Comments
 (0)