accessors module¶
Custom pandas accessors.
Methods can be accessed as follows:
- BaseSRAccessor ->
pd.Series.vbt.*
- BaseDFAccessor ->
pd.DataFrame.vbt.*
For example:
>>> import pandas as pd
>>> import vectorbt as vbt
>>> # vectorbt.base.accessors.BaseAccessor.make_symmetric
>>> pd.Series([1, 2, 3]).vbt.make_symmetric()
0 1 2
0 1.0 2.0 3.0
1 2.0 NaN NaN
2 3.0 NaN NaN
It contains base methods for working with pandas objects. Most of these methods are adaptations of combine/reshape/index functions that can work with pandas objects. For example, broadcast() can take an arbitrary number of pandas objects, thus you can find its variations as accessor methods.
>>> sr = pd.Series([1])
>>> df = pd.DataFrame([1, 2, 3])
>>> vbt.base.reshape_fns.broadcast_to(sr, df)
0
0 1
1 1
2 1
>>> sr.vbt.broadcast_to(df)
0
0 1
1 1
2 1
Additionally, BaseAccessor implements arithmetic (such as +
), comparison (such as >
) and logical operators (such as &
) by doing 1) NumPy-like broadcasting and 2) the compuation with NumPy under the hood, which is mostly much faster than with pandas.
>>> df = pd.DataFrame(np.random.uniform(size=(1000, 1000)))
>>> %timeit df * 2 # pandas
296 ms ± 27.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
>>> %timeit df.vbt * 2 # vectorbt
5.48 ms ± 1.12 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
Note
You should ensure that your *.vbt
operand is on the left if the other operand is an array.
Accessors do not utilize caching.
Grouping is only supported by the methods that accept the group_by
argument.
BaseAccessor class¶
BaseAccessor(
obj,
wrapper=None,
**kwargs
)
Accessor on top of Series and DataFrames.
Accessible through pd.Series.vbt
and pd.DataFrame.vbt
, and all child accessors.
Series is just a DataFrame with one column, hence to avoid defining methods exclusively for 1-dim data, we will convert any Series to a DataFrame and perform matrix computation on it. Afterwards, by using BaseAccessor.wrapper, we will convert the 2-dim output back to a Series.
**kwargs
will be passed to ArrayWrapper.
Superclasses
Inherited members
- AttrResolver.deep_getattr()
- AttrResolver.post_resolve_attr()
- AttrResolver.pre_resolve_attr()
- AttrResolver.resolve_attr()
- Configured.copy()
- Configured.dumps()
- Configured.loads()
- Configured.replace()
- Configured.to_doc()
- Configured.update_config()
- PandasIndexer.xs()
- Pickleable.load()
- Pickleable.save()
- Wrapping.config
- Wrapping.iloc
- Wrapping.indexing_kwargs
- Wrapping.loc
- Wrapping.regroup()
- Wrapping.resolve_self()
- Wrapping.select_one()
- Wrapping.select_one_from_obj()
- Wrapping.self_aliases
- Wrapping.wrapper
- Wrapping.writeable_attrs
Subclasses
align_to method¶
BaseAccessor.align_to(
other,
wrap_kwargs=None
)
Align to other
on their axes.
Usage
>>> import vectorbt as vbt
>>> import pandas as pd
>>> df1 = pd.DataFrame([[1, 2], [3, 4]], index=['x', 'y'], columns=['a', 'b'])
>>> df1
a b
x 1 2
y 3 4
>>> df2 = pd.DataFrame([[5, 6, 7, 8], [9, 10, 11, 12]], index=['x', 'y'],
... columns=pd.MultiIndex.from_arrays([[1, 1, 2, 2], ['a', 'b', 'a', 'b']]))
>>> df2
1 2
a b a b
x 5 6 7 8
y 9 10 11 12
>>> df1.vbt.align_to(df2)
1 2
a b a b
x 1 2 1 2
y 3 4 3 4
apply method¶
BaseAccessor.apply(
*args,
apply_func=None,
keep_pd=False,
to_2d=False,
wrap_kwargs=None,
**kwargs
)
Apply a function apply_func
.
Args
*args
- Variable arguments passed to
apply_func
. apply_func
:callable
-
Apply function.
Can be Numba-compiled.
keep_pd
:bool
- Whether to keep inputs as pandas objects, otherwise convert to NumPy arrays.
to_2d
:bool
- Whether to reshape inputs to 2-dim arrays, otherwise keep as-is.
wrap_kwargs
:dict
- Keyword arguments passed to ArrayWrapper.wrap().
**kwargs
- Keyword arguments passed to
combine_func
.
Note
The resulted array must have the same shape as the original array.
Usage
>>> import vectorbt as vbt
>>> import pandas as pd
>>> sr = pd.Series([1, 2], index=['x', 'y'])
>>> sr2.vbt.apply(apply_func=lambda x: x ** 2)
i2
x2 1
y2 4
z2 9
Name: a2, dtype: int64
apply_and_concat method¶
BaseAccessor.apply_and_concat(
ntimes,
*args,
apply_func=None,
keep_pd=False,
to_2d=False,
numba_loop=False,
use_ray=False,
keys=None,
wrap_kwargs=None,
**kwargs
)
Apply apply_func
ntimes
times and concatenate the results along columns. See apply_and_concat_one().
Args
ntimes
:int
- Number of times to call
apply_func
. *args
- Variable arguments passed to
apply_func
. apply_func
:callable
-
Apply function.
Can be Numba-compiled.
keep_pd
:bool
- Whether to keep inputs as pandas objects, otherwise convert to NumPy arrays.
to_2d
:bool
- Whether to reshape inputs to 2-dim arrays, otherwise keep as-is.
numba_loop
:bool
-
Whether to loop using Numba.
Set to True when iterating large number of times over small input, but note that Numba doesn't support variable keyword arguments.
use_ray
:bool
-
Whether to use Ray to execute
combine_func
in parallel.Only works with
numba_loop
set to False andconcat
is set to True. See ray_apply() for related keyword arguments. keys
:index_like
- Outermost column level.
wrap_kwargs
:dict
- Keyword arguments passed to ArrayWrapper.wrap().
**kwargs
- Keyword arguments passed to
combine_func
.
Note
The resulted arrays to be concatenated must have the same shape as broadcast input arrays.
Usage
>>> import vectorbt as vbt
>>> import pandas as pd
>>> df = pd.DataFrame([[3, 4], [5, 6]], index=['x', 'y'], columns=['a', 'b'])
>>> df.vbt.apply_and_concat(3, [1, 2, 3],
... apply_func=lambda i, a, b: a * b[i], keys=['c', 'd', 'e'])
c d e
a b a b a b
x 3 4 6 8 9 12
y 5 6 10 12 15 18
- Use Ray for small inputs and large processing times:
>>> def apply_func(i, a):
... time.sleep(1)
... return a
>>> sr = pd.Series([1, 2, 3])
>>> %timeit sr.vbt.apply_and_concat(3, apply_func=apply_func)
3.01 s ± 2.15 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
>>> %timeit sr.vbt.apply_and_concat(3, apply_func=apply_func, use_ray=True)
1.01 s ± 2.31 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
apply_on_index method¶
BaseAccessor.apply_on_index(
apply_func,
*args,
axis=1,
inplace=False,
**kwargs
)
Apply function apply_func
on index of the pandas object.
Set axis
to 1 for columns and 0 for index. If inplace
is True, modifies the pandas object. Otherwise, returns a copy.
broadcast class method¶
BaseAccessor.broadcast(
*others,
**kwargs
)
See broadcast().
broadcast_to method¶
BaseAccessor.broadcast_to(
other,
**kwargs
)
See broadcast_to().
combine method¶
BaseAccessor.combine(
other,
*args,
allow_multiple=True,
combine_func=None,
keep_pd=False,
to_2d=False,
concat=False,
numba_loop=False,
use_ray=False,
broadcast=True,
broadcast_kwargs=None,
keys=None,
wrap_kwargs=None,
**kwargs
)
Combine with other
using combine_func
.
Args
other
:array_like
- Object to combine this array with.
*args
- Variable arguments passed to
combine_func
. allow_multiple
:bool
- Whether a tuple/list will be considered as multiple objects in
other
. combine_func
:callable
-
Function to combine two arrays.
Can be Numba-compiled.
keep_pd
:bool
- Whether to keep inputs as pandas objects, otherwise convert to NumPy arrays.
to_2d
:bool
- Whether to reshape inputs to 2-dim arrays, otherwise keep as-is.
concat
:bool
-
Whether to concatenate the results along the column axis. Otherwise, pairwise combine into a Series/DataFrame of the same shape.
If True, see combine_and_concat(). If False, see combine_multiple().
numba_loop
:bool
-
Whether to loop using Numba.
Set to True when iterating large number of times over small input, but note that Numba doesn't support variable keyword arguments.
use_ray
:bool
-
Whether to use Ray to execute
combine_func
in parallel.Only works with
numba_loop
set to False andconcat
is set to True. See ray_apply() for related keyword arguments. broadcast
:bool
- Whether to broadcast all inputs.
broadcast_kwargs
:dict
- Keyword arguments passed to broadcast().
keys
:index_like
- Outermost column level.
wrap_kwargs
:dict
- Keyword arguments passed to ArrayWrapper.wrap().
**kwargs
- Keyword arguments passed to
combine_func
.
Note
If combine_func
is Numba-compiled, will broadcast using WRITEABLE
and C_CONTIGUOUS
flags, which can lead to an expensive computation overhead if passed objects are large and have different shape/memory order. You also must ensure that all objects have the same data type.
Also remember to bring each in *args
to a Numba-compatible format.
Usage
>>> import vectorbt as vbt
>>> import pandas as pd
>>> sr = pd.Series([1, 2], index=['x', 'y'])
>>> df = pd.DataFrame([[3, 4], [5, 6]], index=['x', 'y'], columns=['a', 'b'])
>>> sr.vbt.combine(df, combine_func=lambda x, y: x + y)
a b
x 4 5
y 7 8
>>> sr.vbt.combine([df, df*2], combine_func=lambda x, y: x + y)
a b
x 10 13
y 17 20
>>> sr.vbt.combine([df, df*2], combine_func=lambda x, y: x + y, concat=True, keys=['c', 'd'])
c d
a b a b
x 4 5 7 9
y 7 8 12 14
- Use Ray for small inputs and large processing times:
>>> def combine_func(a, b):
... time.sleep(1)
... return a + b
>>> sr = pd.Series([1, 2, 3])
>>> %timeit sr.vbt.combine([1, 1, 1], combine_func=combine_func)
3.01 s ± 2.98 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
>>> %timeit sr.vbt.combine([1, 1, 1], combine_func=combine_func, concat=True, use_ray=True)
1.02 s ± 2.32 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
concat class method¶
BaseAccessor.concat(
*others,
broadcast_kwargs=None,
keys=None
)
Concatenate with others
along columns.
Args
*others
:array_like
- List of objects to be concatenated with this array.
broadcast_kwargs
:dict
- Keyword arguments passed to broadcast().
keys
:index_like
- Outermost column level.
Usage
>>> import vectorbt as vbt
>>> import pandas as pd
>>> sr = pd.Series([1, 2], index=['x', 'y'])
>>> df = pd.DataFrame([[3, 4], [5, 6]], index=['x', 'y'], columns=['a', 'b'])
>>> sr.vbt.concat(df, keys=['c', 'd'])
c d
a b a b
x 1 1 3 4
y 2 2 5 6
df_accessor_cls property¶
Accessor class for pd.DataFrame
.
drop_duplicate_levels method¶
BaseAccessor.drop_duplicate_levels(
keep=None,
axis=1,
inplace=False
)
See BaseAccessor.apply_on_index() for other keyword arguments.
drop_levels method¶
BaseAccessor.drop_levels(
levels,
axis=1,
inplace=False,
strict=True
)
See drop_levels().
See BaseAccessor.apply_on_index() for other keyword arguments.
drop_redundant_levels method¶
BaseAccessor.drop_redundant_levels(
axis=1,
inplace=False
)
See BaseAccessor.apply_on_index() for other keyword arguments.
empty class method¶
BaseAccessor.empty(
shape,
fill_value=nan,
**kwargs
)
Generate an empty Series/DataFrame of shape shape
and fill with fill_value
.
empty_like class method¶
BaseAccessor.empty_like(
other,
fill_value=nan,
**kwargs
)
Generate an empty Series/DataFrame like other
and fill with fill_value
.
indexing_func method¶
BaseAccessor.indexing_func(
pd_indexing_func,
**kwargs
)
Perform indexing on BaseAccessor.
is_frame class method¶
BaseAccessor.is_frame()
is_series class method¶
BaseAccessor.is_series()
make_symmetric method¶
BaseAccessor.make_symmetric()
See make_symmetric().
obj property¶
Pandas object.
rename_levels method¶
BaseAccessor.rename_levels(
name_dict,
axis=1,
inplace=False,
strict=True
)
See rename_levels().
See BaseAccessor.apply_on_index() for other keyword arguments.
repeat method¶
BaseAccessor.repeat(
n,
keys=None,
axis=1,
wrap_kwargs=None
)
See repeat().
Set axis
to 1 for columns and 0 for index. Use keys
as the outermost level.
select_levels method¶
BaseAccessor.select_levels(
level_names,
axis=1,
inplace=False
)
See select_levels().
See BaseAccessor.apply_on_index() for other keyword arguments.
sr_accessor_cls property¶
Accessor class for pd.Series
.
stack_index method¶
BaseAccessor.stack_index(
index,
on_top=True,
axis=1,
inplace=False,
**kwargs
)
See stack_indexes().
Set on_top
to False to stack at bottom.
See BaseAccessor.apply_on_index() for other keyword arguments.
tile method¶
BaseAccessor.tile(
n,
keys=None,
axis=1,
wrap_kwargs=None
)
See tile().
Set axis
to 1 for columns and 0 for index. Use keys
as the outermost level.
to_1d_array method¶
BaseAccessor.to_1d_array()
Convert to 1-dim NumPy array
See to_1d().
to_2d_array method¶
BaseAccessor.to_2d_array()
Convert to 2-dim NumPy array.
See to_2d().
to_dict method¶
BaseAccessor.to_dict(
**kwargs
)
See to_dict().
unstack_to_array method¶
BaseAccessor.unstack_to_array(
**kwargs
)
See unstack_to_array().
unstack_to_df method¶
BaseAccessor.unstack_to_df(
**kwargs
)
See unstack_to_df().
BaseDFAccessor class¶
BaseDFAccessor(
obj,
**kwargs
)
Accessor on top of DataFrames.
Accessible through pd.DataFrame.vbt
and all child accessors.
Superclasses
Inherited members
- AttrResolver.deep_getattr()
- AttrResolver.post_resolve_attr()
- AttrResolver.pre_resolve_attr()
- AttrResolver.resolve_attr()
- BaseAccessor.align_to()
- BaseAccessor.apply()
- BaseAccessor.apply_and_concat()
- BaseAccessor.apply_on_index()
- BaseAccessor.broadcast()
- BaseAccessor.broadcast_to()
- BaseAccessor.combine()
- BaseAccessor.concat()
- BaseAccessor.config
- BaseAccessor.df_accessor_cls
- BaseAccessor.drop_duplicate_levels()
- BaseAccessor.drop_levels()
- BaseAccessor.drop_redundant_levels()
- BaseAccessor.empty()
- BaseAccessor.empty_like()
- BaseAccessor.iloc
- BaseAccessor.indexing_func()
- BaseAccessor.indexing_kwargs
- BaseAccessor.loc
- BaseAccessor.make_symmetric()
- BaseAccessor.obj
- BaseAccessor.rename_levels()
- BaseAccessor.repeat()
- BaseAccessor.select_levels()
- BaseAccessor.self_aliases
- BaseAccessor.sr_accessor_cls
- BaseAccessor.stack_index()
- BaseAccessor.tile()
- BaseAccessor.to_1d_array()
- BaseAccessor.to_2d_array()
- BaseAccessor.to_dict()
- BaseAccessor.unstack_to_array()
- BaseAccessor.unstack_to_df()
- BaseAccessor.wrapper
- BaseAccessor.writeable_attrs
- Configured.copy()
- Configured.dumps()
- Configured.loads()
- Configured.replace()
- Configured.to_doc()
- Configured.update_config()
- PandasIndexer.xs()
- Pickleable.load()
- Pickleable.save()
- Wrapping.regroup()
- Wrapping.resolve_self()
- Wrapping.select_one()
- Wrapping.select_one_from_obj()
Subclasses
is_frame class method¶
BaseDFAccessor.is_frame()
is_series class method¶
BaseDFAccessor.is_series()
BaseSRAccessor class¶
BaseSRAccessor(
obj,
**kwargs
)
Accessor on top of Series.
Accessible through pd.Series.vbt
and all child accessors.
Superclasses
Inherited members
- AttrResolver.deep_getattr()
- AttrResolver.post_resolve_attr()
- AttrResolver.pre_resolve_attr()
- AttrResolver.resolve_attr()
- BaseAccessor.align_to()
- BaseAccessor.apply()
- BaseAccessor.apply_and_concat()
- BaseAccessor.apply_on_index()
- BaseAccessor.broadcast()
- BaseAccessor.broadcast_to()
- BaseAccessor.combine()
- BaseAccessor.concat()
- BaseAccessor.config
- BaseAccessor.df_accessor_cls
- BaseAccessor.drop_duplicate_levels()
- BaseAccessor.drop_levels()
- BaseAccessor.drop_redundant_levels()
- BaseAccessor.empty()
- BaseAccessor.empty_like()
- BaseAccessor.iloc
- BaseAccessor.indexing_func()
- BaseAccessor.indexing_kwargs
- BaseAccessor.loc
- BaseAccessor.make_symmetric()
- BaseAccessor.obj
- BaseAccessor.rename_levels()
- BaseAccessor.repeat()
- BaseAccessor.select_levels()
- BaseAccessor.self_aliases
- BaseAccessor.sr_accessor_cls
- BaseAccessor.stack_index()
- BaseAccessor.tile()
- BaseAccessor.to_1d_array()
- BaseAccessor.to_2d_array()
- BaseAccessor.to_dict()
- BaseAccessor.unstack_to_array()
- BaseAccessor.unstack_to_df()
- BaseAccessor.wrapper
- BaseAccessor.writeable_attrs
- Configured.copy()
- Configured.dumps()
- Configured.loads()
- Configured.replace()
- Configured.to_doc()
- Configured.update_config()
- PandasIndexer.xs()
- Pickleable.load()
- Pickleable.save()
- Wrapping.regroup()
- Wrapping.resolve_self()
- Wrapping.select_one()
- Wrapping.select_one_from_obj()
Subclasses
is_frame class method¶
BaseSRAccessor.is_frame()
is_series class method¶
BaseSRAccessor.is_series()