# Indicator Output

There would be no fun in technical analysis if one could not access the calculated values and accessing them and reusing them if needed should be easy.

## The actual outputs

Each indicator is fully documented with a proper *docstring*, which allows to
do the following

import btalib print(btalib.sma.__doc__)

Generating the following output

Non-weighted average of the last n periods Formula: - movav = Sum(data, period) / period See also: - http://en.wikipedia.org/wiki/Moving_average#Simple_moving_average Aliases: SMA, SimpleMovingAverage Inputs: close Outputs: sma Params: - period (default: 30) Period for the moving average calculation

The output is named as the indicator in this case, `sma`

.

A shorter route to get the output is also possible.

import btalib print(btalib.sma.outputs)

And the actual outputs are printed

('sma',)

Multi-outuput indicators will simply show more items, like is the case of the
`stochastic`

import btalib print(btalib.stochastic.outputs)

('k', 'd')

## Outputs as `pandas.DataFrame`

A sure winner for mostly everybody is when getting the results as a `DataFrame`

is easy. And it is.

With a single-output indicator like the `sma`

, with a complete script.

import btalib import pandas as pd # Read a csv file into a pandas dataframe df = pd.read_csv('2006-day-001.txt', parse_dates=True, index_col='Date') sma = btalib.sma(df, period=4) print(sma.df)

It has not taken much to get a `DataFrame`

, accessing `sma.df`

has
sufficed. The output (shortened) of the `print`

statement

sma Date 2006-01-02 NaN 2006-01-03 NaN 2006-01-04 NaN 2006-01-05 1815.1700 2006-01-06 1823.0050 ... ... 2006-12-21 2057.6475 ...

As a single-output indicator, the resulting *DataFrame* contains just one
column named after the output: `sma`

The same but for a multi-output indicator like the `stochastic`

import btalib import pandas as pd # Read a csv file into a pandas dataframe df = pd.read_csv('2006-day-001.txt', parse_dates=True, index_col='Date') stochastic = btalib.stochastic(df) print(stochastic.df)

With the following result

k d Date 2006-01-02 NaN NaN 2006-01-03 NaN NaN 2006-01-04 NaN NaN 2006-01-05 NaN NaN 2006-01-06 NaN NaN ... ... ... 2006-12-21 83.814859 86.781570 ...

And the two outputs reported by `stochastic`

above are mapped to the columns in
the output `DataFrame`

.

### Direct Output as a `pandas.DataFrame`

In modern times, waiting for something, writing an extra line of code or
accessing an attribute to get a *DataFrame* is not meant to be. Everybody is
busy and things have to happen at once.

And yes, ... they can! I.e.: the output can be directly obtained as *DataFrame*
by tweaking the configuration of *bta-lib* with `set_return_dataframe()`

. An
example

import btalib import pandas as pd btalib.config.set_return_dataframe() # force return of a DataFrame # Read a csv file into a pandas dataframe df = pd.read_csv('2006-day-001.txt', parse_dates=True, index_col='Date') print(btalib.stochastic(df))

The code has been compressed to even avoid assigning the result to a variable, because everything has to happen quickly. And the result:

k d Date 2006-01-02 NaN NaN 2006-01-03 NaN NaN 2006-01-04 NaN NaN 2006-01-05 NaN NaN 2006-01-06 NaN NaN ... ... ... 2006-12-21 83.814859 86.781570 ...

## Access to Individual Outputs

If getting the individual columns, without going through a `DataFrame`

is the
wish, it can also be achieved.

import btalib import pandas as pd # Read a csv file into a pandas dataframe df = pd.read_csv('2006-day-001.txt', parse_dates=True, index_col='Date') stochastic = btalib.stochastic(df) # Get an object to column `k` stochastic_k = stochastic.k # alias to: stochastic.outputs.k / stochastic.o.k

Note

`stochastic.k`

is the same as doing `stochastic.outputs.k`

or
`stochastic.o.k`

Done. It should be taken into account that this is still an internal object to
the platform, which can be reused to feed it back into an `sma`

for example.

import btalib import pandas as pd # Read a csv file into a pandas dataframe df = pd.read_csv('2006-day-001.txt', parse_dates=True, index_col='Date') stochastic = btalib.stochastic(df) # Get an object to column `k` stochastic_k = stochastic.k # alias to: stochastic.outputs.k / stochastic.o.k sma_k = btalib.sma(stochastic_k)

### Individual Outputs as `pd.Series`

Rather than getting an internal object, direct access to the underlying results
as a `pandas.Series`

is possible. The notation for the `stochastic`

result above

import btalib import pandas as pd # Read a csv file into a pandas dataframe df = pd.read_csv('2006-day-001.txt', parse_dates=True, index_col='Date') stochastic = btalib.stochastic(df) # Get an object to column `k` stochastic_k_series = stochastic.k.series

It is also possible to invert the notation and do the following.

import btalib import pandas as pd # Read a csv file into a pandas dataframe df = pd.read_csv('2006-day-001.txt', parse_dates=True, index_col='Date') stochastic = btalib.stochastic(df) # Get an object to column `k` stochastic_k_series = stochastic.series.k

Although it may seem pointless to also support the inverted notation, it has
one advantage, which is **"output unpacking"**, i.e.: it is possible to
recover all inputs as series in a single shot.

import btalib import pandas as pd # Read a csv file into a pandas dataframe df = pd.read_csv('2006-day-001.txt', parse_dates=True, index_col='Date') stochastic = btalib.stochastic(df) # Get an object to column `k` k_series, d_series = stochastic.series

Notice that same is also possible to do output unpacking of the individual outputs for internal objects

import btalib import pandas as pd # Read a csv file into a pandas dataframe df = pd.read_csv('2006-day-001.txt', parse_dates=True, index_col='Date') stochastic = btalib.stochastic(df) # Get an object to column `k` k, d = stochastic

Note

Yes, for both `series`

and the regular objects, the `**`

keyword arguments
unpacking can also be applied, or they can be passed directly for the
construction of a dictionary with the output names

my_dict = dict(**stochastic) # or dict(stochastic) my_series_dict = dict(**stochastic.series) # or dict(stochastic.series)