'Timeseries dataframe returns an error when using Pandas Align - valueError: cannot join with no overlapping index names

My goal:

I have two time-series data frames, one with a time interval of 1m and the other with a time interval of 5m. The 5m data frame is a resampled version of the 1m data. What I'm doing is computing a set of RSI values that correspond to the 5m df using the vectorbt library, then aligning and broadcasting these values to the 1m df using df.align

The Problem:

When trying to do this line by line, it works perfectly. Here's what the final result looks like:

enter image description here

However, when applying it under the function, it returns the following error while having overlapping index names:

ValueError: cannot join with no overlapping index names

Here's the complete code:

import vectorbt as vbt
import numpy as np
import pandas as pd
import datetime

end_date = datetime.datetime.now()
start_date = end_date - datetime.timedelta(days=3)

btc_price = vbt.YFData.download('BTC-USD',
                                interval='1m',
                                start=start_date,
                                end=end_date,
                                missing_index='drop').get('Close')


def custom_indicator(close, rsi_window=14, ma_window=50):
    close_5m = close.resample('5T').last()
    rsi = vbt.RSI.run(close_5m, window=rsi_window).rsi
    rsi, _ = rsi.align(close, broadcast_axis=0, method='ffill')
    print(rsi) #to check
    print(close) #to check
    return

#setting up indicator factory
ind = vbt.IndicatorFactory(
    class_name='Combination',
    short_name='comb',
    input_names=['close'],
    param_names=['rsi_window', 'ma_window'],
    output_names=['value']).from_apply_func(custom_indicator,
                                            rsi_window=14,
                                             ma_window=50,
                                            keep_pd=True)
    
res = ind.run(btc_price, rsi_window=21, ma_window=50)


print(res)

Thank you for taking the time to read this. Any help would be appreciated!



Solution 1:[1]

The problem is that the data must be a time series and not a pandas data frame for table joins using align You need to fix the data type

# Time Series
close = close['Close']
close_5m = close.resample('15min').last()
rsi = vbt.RSI.run(close_5m, window=rsi_window).rsi
rsi, _ = rsi.align(close, broadcast_axis=0, method='ffill', join='right')

Solution 2:[2]

if you checked the columns of both , rsi and close

print('close is', close.columns)
print('rsi is', rsi.columns)

you will find

rsi is MultiIndex([(14, 'Close')],
           names=['rsi_window', None])
close is Index(['Close'], dtype='object')

as it has two indexes, one should be dropped, so it can be done by the below code

rsi.columns = rsi.columns.droplevel()

to drop one level of the indexes, so it could be align,

Solution 3:[3]

When you are aligning the data make sure to include join='right'

rsi, _ = rsi.align(close, broadcast_axis=0, method='ffill', join='right'

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Serhii Ovsiienko
Solution 2 Mina Nessim
Solution 3 richardec