Как мне найти индекс, по которому заданное значение будет достигнуто / пересечено другой серией?

#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. Очень умный. Приветствую это!