Как использовать Панд для расчета точек пересечения и его даты?

#python #pandas

Вопрос:

У меня есть следующие примеры данных, в которых есть столбцы даты и значения. Столбец cross_date_since-это мой ожидаемый результат. Значение value находится в диапазоне от 0 до 1. Если значение выше/ниже 0,5, cross_date_since должен быть его первой датой пересечения вверх/вниз.

Для этого я попытался использовать apply() и loop-and-loop. Они работают, но очень медленно, если данные большие. Есть ли какой-либо эффективный способ решить эту проблему?

 date      value  *cross_date_since*
2021-07-01   0.48   2021-07-01
2021-07-02   0.88   2021-07-02
2021-07-03   0.7    2021-07-02
2021-07-04   0.65   2021-07-02  
2021-07-05   0.46   2021-07-05
2021-07-06   0.22   2021-07-05
2021-07-07   0.32   2021-07-05 
2021-07-08   0.33   2021-07-05    
2021-07-09   0.54   2021-07-09 
2021-07-10   0.66   2021-07-09
2021-07-11   0.65   2021-07-09
2021-07-12   0.75   2021-07-09
...
 

Ответ №1:

Узнайте перекрестную дату и сначала заполните соответствующие значения, а затем выполните прямое заполнение с ffill :

 df.loc[df.value.gt(0.5).diff().fillna(True), 'cross_date_since'] = df.date

df
#          date  value cross_date_since
#0   2021-07-01   0.48       2021-07-01
#1   2021-07-02   0.88       2021-07-02
#2   2021-07-03   0.70              NaN
#3   2021-07-04   0.65              NaN
#4   2021-07-05   0.46       2021-07-05
#5   2021-07-06   0.22              NaN
#6   2021-07-07   0.32              NaN
#7   2021-07-08   0.33              NaN
#8   2021-07-09   0.54       2021-07-09
#9   2021-07-10   0.66              NaN
#10  2021-07-11   0.65              NaN
#11  2021-07-12   0.75              NaN

df.cross_date_since.ffill(inplace=True)
df
#          date  value cross_date_since
#0   2021-07-01   0.48       2021-07-01
#1   2021-07-02   0.88       2021-07-02
#2   2021-07-03   0.70       2021-07-02
#3   2021-07-04   0.65       2021-07-02
#4   2021-07-05   0.46       2021-07-05
#5   2021-07-06   0.22       2021-07-05
#6   2021-07-07   0.32       2021-07-05
#7   2021-07-08   0.33       2021-07-05
#8   2021-07-09   0.54       2021-07-09
#9   2021-07-10   0.66       2021-07-09
#10  2021-07-11   0.65       2021-07-09
#11  2021-07-12   0.75       2021-07-09
 

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

1. Я даже не знаю, как использовать этот метод, который может передавать последнее значение. У меня и раньше были подобные проблемы, и я использовал для этого глупую логику. Огромное спасибо. Большое подспорье для меня.