У меня есть следующий DataFrame в Pandas, и я хочу проверить, больше ли значение HH, чем значение High предыдущей строки, и если оно больше, обновите значение HH предыдущих строк и замените текущее HH на Nonvalue.

Как проверить, если значение HH> High предыдущей строки и обновить, как описано выше?

enter image description here

Обратите внимание, что я не хочу сдвигать все данные в столбце (поэтому, я думаю, использование сдвига не является решением), и я просто хочу изменить один конкретный фрагмент данных на основе данных «High» предыдущей строки.

О программе:

Я пытаюсь создать программу, которая находит минимумы и максимумы указанного финансового рынка, и я использую библиотеку peakdetect https://pypi.org/project/peakdetect/?

Он просто генерирует 2D-список минимумов и максимумов:

density = 2
# Temp ref to the array of minima and maxima
high_arr = peakdetect(y_axis = 
clean_dataframe['High'],x_axis=clean_dataframe.index,lookahead=density)
low_arr = peakdetect(y_axis = 
clean_dataframe['Low'],x_axis=clean_dataframe.index,lookahead=density)

# first index is always for maxima
_hh = pd.DataFrame(high_arr[0])
_hh = _hh.rename(columns={0:'Index',1:'HH'})

# second index is always for minima
_ll = pd.DataFrame(low_arr[1])
_ll = _ll.rename(columns={0:'Index',1:'LL'})

# join all minima and maxima to the

full_df=
clean_dataframe.join(_hh.set_index('Index')).join(_ll.set_index('Index'))

«»»

Clear_dataframe результат:

Проблема в том, что некоторая LL (долина) является неточной, и иногда низкая цена предыдущей строки является правильной LL, поэтому мне нужно измерить и изменить строку LL, как указано на рисунке.

1
Mohammadreza Heidari 10 Фев 2021 в 19:37

1 ответ

Лучший ответ

Чтобы помочь вам понять, как работает сдвиг (-1), просмотрите приведенное ниже решение. Я посмотрел на изображение и создал необработанный DataFrame.

import pandas as pd
import numpy as np
df = pd.DataFrame({'Dates':['2021-02-04 19:00:00','2021-02-04 20:00:00',
                            '2021-02-04 21:00:00','2021-02-04 22:00:00',
                            '2021-02-04 23:00:00','2021-02-05 00:00:00',
                            '2021-02-05 01:00:00','2021-02-05 02:00:00'],
                   'Close':[1.19661,1.19660,1.19611,1.19643,1.19664,
                            1.19692,1.19662,1.19542],
                   'High' :[1.19679,1.19678,1.19680,1.19679,1.19688,
                            1.19721,1.19694,1.19682],
                   'Low'  :[1.19577,1.19637,1.19604,1.19590,1.19632,
                            1.19634,1.19622,1.19537],
                   'Open' :[1.19630,1.19662,1.19665,1.19613,1.19646,
                            1.19662,1.19690,1.19665],
                   'Status':['ok']*8,
                   'Volume':[2579,1858,1399,788,1437,2435,2898,2641],
                   'HH'   :[np.NaN]*5+[1.19721]+[np.NaN]*2,
                   'LL'   :[np.NaN]*8})
print (df)

#make a copy of df['High'] into df'NewHigh']
df['NewHigh'] = df['High']

#if next row in 'HH' is greater than 'High', then update 'NewHigh' with next row from 'HH'
df.loc[df['HH'].shift(-1) > df['High'],'NewHigh'] = df['HH'].shift(-1)

print (df[['Dates','High','HH','NewHigh']])

Результатом этого будет:

                 Dates     High       HH  NewHigh
0  2021-02-04 19:00:00  1.19679      NaN  1.19679
1  2021-02-04 20:00:00  1.19678      NaN  1.19678
2  2021-02-04 21:00:00  1.19680      NaN  1.19680
3  2021-02-04 22:00:00  1.19679      NaN  1.19679
4  2021-02-04 23:00:00  1.19688      NaN  1.19721 # <- This got updated
5  2021-02-05 00:00:00  1.19721  1.19721  1.19721
6  2021-02-05 01:00:00  1.19694      NaN  1.19694
7  2021-02-05 02:00:00  1.19682      NaN  1.19682

Примечание: я создал новый столбец, чтобы показать вам изменения. Вы можете напрямую обновить High. Вместо 'NewHigh' в строке df.loc вы можете указать «High». Это должно делать свое дело.

0
Joe Ferndz 10 Фев 2021 в 22:01