#python #pandas #numpy
#python #pandas #numpy
Вопрос:
Учитывая следующее:
toy = pd.DataFrame({
'price': [100, 103, 107, 105, 99, 96, 98, 103],
'barrier': [102, 102, 102,102,102,102, 102, 102],
'date': ['2020-02-28', '2020-03-01', '2020-03-02','2020-03-03', '2020-03-04', '2020-
03-05', '2020-03-06', '2020-03-07']})
toy['date'] = pd.to_datetime(toy['date']) #just make datetime obj
toy['rets'] = np.log(toy['price']/toy['price'].shift(1))
toy['ret_cum'] = toy['rets'].cumsum()
toy['loop'] = [0, 103, 0, 0, 99, 0, 0, 103] #some signal
toy['inten'] = 0.0 #initialize
Я хотел toy['inten']
бы быть max(toy['ret_cum'].iloc[1,4])
, когда цикл равен 99 (т.Е. 0.067 ..), Затем min(toy['ret_cum'].iloc[5,7])
(т.е. -0.0408), когда цикл равен 103 и так далее.
В более общем плане, np.where(toy['loop'] != 0)
дает (1,4,7) … и я хотел бы проверить максимальные уровни, достигнутые в интервале от 1 до 4, затем от 5 до 7 и т.д.
Комментарии:
1. Вы хотите найти минимальные или максимальные значения в интервале? Пожалуйста, укажите ожидаемый результат.
2. Я сделал 🙂 «когда цикл равен 99, вывод должен быть 0.067 .. затем min(toy [‘ret_cum’].iloc [5,7]) (т.е. -0.0408), когда цикл равен 103 и так далее. Спасибо
3. неясно, чего вы хотите, лучше, если вы включите желаемый результат в вопрос, т.е. конечные значения
intent
столбца.4. Почему равно
toy.loc[1,'inten']
нулю. В чем здесь логика?5. toy.loc[1, ‘inten’] — это начало серии, и для генерации сигнала недостаточно данных. Однако начиная с loc[4, ‘inten’] и далее следует генерировать, как указано выше.
Ответ №1:
Хорошо, это может сработать. Он чередуется между min и max, поскольку конкретные критерии для этого не были предоставлены.
start = -1
stop = -1
count = 0
for i in toy.index:
if stop > max(toy.index):
break
if toy.loc[i, "loop"] != 0:
if count == 0:
start = i
else:
stop = i
if count % 2 == 0:
toy.loc[i, "inten"] = toy.loc[start:stop, "ret_cum"].min()
else:
toy.loc[i, "inten"] = toy.loc[start:stop, "ret_cum"].max()
start = stop 1
count = 1
Вывод —
price barrier date rets ret_cum loop inten
0 100 102 2020-02-28 NaN NaN 0 0.000000
1 103 102 2020-03-01 0.029559 0.029559 103 0.000000
2 107 102 2020-03-02 0.038100 0.067659 0 0.000000
3 105 102 2020-03-03 -0.018868 0.048790 0 0.000000
4 99 102 2020-03-04 -0.058841 -0.010050 99 0.067659
5 96 102 2020-03-05 -0.030772 -0.040822 0 0.000000
6 98 102 2020-03-06 0.020619 -0.020203 0 0.000000
7 103 102 2020-03-07 0.049762 0.029559 103 -0.040822
Комментарии:
1. Спасибо, Марк. И если в конечном итоге индекс становится объектом datetime toy[‘date’], тогда я могу просто перейти с toy.loc[i, ‘loop’] на toy[‘loop’].iloc[i] и так далее.
2. Конечно. Pandas обладает множеством интересных функций datetime. Один из них, на который вы могли бы обратить внимание, — это .rolling() для локального min / max. pandas.pydata.org/docs/reference/api /. … Resampler — еще одна группа, ориентированная на дату и время: pandas.pydata.org/docs/reference/api /…