#python #pandas #numpy
#python #панды #numpy
Вопрос:
Предположим, у меня есть вызываемые временные ряды значений X
.
И теперь я хочу знать первый индекс, после которого Y
будут достигнуты значения некоторых других рядов X
. Или, другими словами, для каждого индекса i
я хочу знать первый индекс, j
после которого строка, образованная X
from j-1
to j
, пересекает значение Y
at i
.
Ниже приведен примерный набор example X
, Y
series, показывающий результирующие значения для Z
. Длина этих рядов всегда одинакова:
X | Y | Z
2 | 3 | 2
2 | 3 | NaN
4 | 4.5 | 3
5 | 5 | NaN
4 | 5 | NaN
3 | 2 | 6
1 | 2 | NaN
Сделайте pandas
или numpy
предложите что-нибудь, что поможет в этом? Эта функция будет выполняться на больших наборах данных, поэтому я не могу использовать циклы python.
Комментарии:
1. Всегда ли две серии имеют одинаковую форму (длину)?
2. Дайте мне знать, правильно ли я понял @quant . Возможно, большая выборка была бы более удобной
3. @Erfan да, они всегда одинаковы.
Ответ №1:
Используйте numpy broadcasting
путем сравнения со shifted
значениями, затем получите индексы первых True
значений с помощью DataFrame.idxmax
с небольшим улучшением — добавлен NaN
столбец для получения NaN
, если все False
значения в строке и последнее удаление дублируют значения:
a = df['X']
b = df['Y']
a1 = a.values
a2 = a.shift(-1).ffill().values
b1 = b.values[:, None]
arr = (((a1 < b1) amp; (a2 > b1)) | ((a1 > b1) amp; (a2 < b1)))
df = pd.DataFrame(arr)
df[np.nan] = True
out = df.idxmax(axis=1) 1
out = out.mask(out.duplicated())
print (out)
0 2.0
1 NaN
2 3.0
3 NaN
4 NaN
5 6.0
6 NaN
dtype: float64
Комментарии:
1. Это потрясающе.
2. Очень умный. Приветствую это!