def mfi(df, high, low, close, volume, mfi, n):
    """
    The Money Flow Index (MFI) calculates the ratio of money flowing into and
    out of a security. To interpret the Money Flow Index, look for divergence
    with price to signal reversals. Money Flow Index values range from 0 to 100.
    Values above 80/below 20 indicate market tops/bottoms.

    Parameters:
        df (pd.DataFrame): DataFrame which contain the asset information.
        high (string): the column name for the period highest price  of the asset.
        low (string): the column name for the period lowest price of the asset.
        close (string): the column name for the closing price of the asset.
        volume (string): the column name of the volume of the asset.
        mfi (string): the column name for the mfi values.
        n (int): the total number of periods.

    Returns:
        df (pd.DataFrame): Dataframe with mfi of the asset calculated.

    """

    typical_price = (df[high] + df[low] + df[close]) / 3
    money_flow = typical_price * df[volume]
    typical_price_diff = typical_price.diff()
    df.loc[typical_price_diff > 0, "positive_money_flow"] = 1
    df.loc[typical_price_diff <= 0, "negative_money_flow"] = -1
    df["positive_money_flow"] *= money_flow
    df["negative_money_flow"] *= money_flow
    df = df.fillna(0)
    n_pos_money_flow = (
        df.loc[1:, "positive_money_flow"].rolling(window=n).sum()
    )
    n_neg_money_flow = (
        df.loc[1:, "negative_money_flow"].rolling(window=n).sum()
    )
    mfi_ratio = n_pos_money_flow / -n_neg_money_flow
    df[mfi] = 100 - (100 / (1 + mfi_ratio))
    df.drop(
        ["positive_money_flow", "negative_money_flow"], axis=1, inplace=True
    )
    df = df.dropna().reset_index(drop=True)

    return df