# necessary imports
import pandas as pd
import numpy as np
Настройка
пытается воспроизвести то, что вы сделали
Поддельные данные:
data = {'timestep1': [45,46,47,48,1000],
'timestep2': [46,47,48,49,2020],
'timestep3': [47,48,49,50,1002],
'timestep4': [50,49,48,47, 99],
'timestep5': [45,40,50,70,2500]}
Назовите столбцы, установите индекс:
df = pd.DataFrame.from_dict(data, orient='index')
df.columns = ['Open', 'High', 'Low', 'Close', 'Volume']
df.index.name = 'Dates'
Сделайте расчеты:
df['typical_price'] = (df['High'] + df['Low'] + df['Close'])/3
df['raw_money_flow'] = df['typical_price']*df['Volume']
mf = df.raw_money_flow.diff(1)
p = mf.copy()
n = mf.copy()
p[p<=0] = 0
n[n>0] = 0
windowsize=2 # example value
pmf = p.rolling(window=windowsize).mean()
nmf = abs(n.rolling(window=windowsize).mean())
mfr = pmf/nmf
df['mfi'] = 100 - (100 / (mfr +1))
df['mfi'].dropna(inplace=True)
Проблема
Теперь, если я запускаю df['mfi_70_overbought'] = np.where(df['mfi'] > 70, 1, 0)
, я получаю ту же ошибку: ValueError: Length of values does not match length of index
Решение
Если вы просто хотите иметь новый столбец, который равен 1, когда mfi больше 70, и 0, когда он не , тогда вы можете избежать numpy
и используйте инструменты pandas
.
Определите функцию, которая возвращает 1
, если ее ввод больше, чем 70
, иначе она должна вернуть 0
:
def above70(num):
return int(num > 70)
Примените это к df[mfi]
:
df['mfi'].apply(above70)
В моем примере новый столбец будет выглядеть так:
Dates
timestep3 0
timestep4 0
timestep5 1
Name: mfi, dtype: int64
Побочные проблемы
Этот новый столбец короче столбцов исходного фрейма данных (разница составляет windowsize
), поскольку ранее мы применяли rolling
и dropna
. Заполните этот столбец, если вы хотите прикрепить его к фрейму данных, или не выполняйте шаги, которые делают его короче.