доступ к скаляру в кадре данных в каждом цикле итерации

#pandas #numpy #ta-lib

Вопрос:

У меня есть фрейм данных криптокоины в формате:

 time open high low close volume TM 0 1618617600000 61342.7 61730.9 61268.7 61648.8 82.523952 5 1 1618618500000 61648.9 61695.3 61188.4 61333.2 72.375605 5 2 1618619400000 61333.1 61396.4 61144.2 61200.0 52.882392 5 3 1618620300000 61200.0 61509.4 61199.9 61446.2 48.429485 5 4 1618621200000 61446.2 61764.7 61446.2 61647.4 83.822974 5 ... ... ... ... ... ... ... .. 19213 1635909300000 63006.2 63087.2 62935.0 63081.9 35.265568 26 19214 1635910200000 63081.9 63214.5 62950.1 63084.0 41.213263 30 19215 1635911100000 63084.0 63236.0 63027.6 63213.9 32.429295 21 19216 1635912000000 63213.8 63213.8 63021.5 63024.1 47.032509 19 19217 1635912900000 63024.1 63091.4 62852.1 62970.7 84.098123 16  

Я хочу рассчитать скользящую среднюю цены закрытия с различным периодом времени, период времени взят из столбца TM. Я буду использовать библиотеку talib/ta. эффективность необходима, поэтому я попробовал применить и np.где:

 dataframe['DMA'] = dataframe.apply(lambda x: ta.MA(dataframe['close'], timeperiod=dataframe['TM']), axis=0)  

и

 dataframe['DMA'] = np.where(dataframe['TM'].values , ta.MA(dataframe['close'], timeperiod=dataframe['TM'].values), )  

оба возвращают ошибку:

Ошибка типа: только массивы размером 1 могут быть преобразованы в скаляры Python

что, как я полагал, произошло timeperiod= dataframe['TM'].values отчасти. и если я использую dataframe['TM'].values[0] , только первое значение, равное 5, применяется ко всему циклу итерации. Как я могу получить доступ к скаляру ячейки в TM векторизованным способом, не повторяя индекс или не используя for_loop.

Вывод моего желания: в конце выходного кадра данных есть еще один столбец, названный DMA, и последние 3 строки должны быть такими

 ............... DMA   19215 ..... ta.MA(dataframe['close'], timeperiod = 21)  19216 ..... ta.MA(dataframe['close'], timeperiod = 19)  19217 ..... ta.MA(dataframe['close'], timeperiod = 16)  
  • в индексе 19215 я хочу рассчитать скользящую среднюю последних 21 цен закрытия
  • в индексе 19216 я хочу рассчитать скользящую среднюю последних 19 цен закрытия
  • в индексе 19216 я хочу рассчитать скользящую среднюю последних 16 цен закрытия

Ценю ваше время.

Комментарии:

1. Что вы подразумеваете под «различным периодом времени»? Временной интервал не должен быть исправлен, как MA10, MA100 и т. Д.?

2. Я хочу динамический временной интервал, на рынке с высокой волатильностью, более короткий временной интервал и на рынке с большим диапазоном. например: 10 свечей против 45 свечей

3. Можете ли вы привести пример ввода и ожидаемый результат, пожалуйста (только для закрытия столбца)?

4. Я добавил вывод желания в конце вышеупомянутого поста