Как мне найти индекс, по которому данное значение будет достигнуто / пересечено другой серией? - PullRequest
7 голосов
/ 19 апреля 2019

Предположим, у меня есть временной ряд значений, называемый X.

А теперь я хочу узнать первый индекс, после которого значения некоторых других рядов Y будут достигнуты X. Или по-другому, для каждого индекса i я хочу знать первый индекс j после , который пересекает линия, образованная X от j-1 до j значение Y при i.

Ниже приведен пример набора примеров 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 Ответ

4 голосов
/ 19 апреля 2019

Используйте 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) & (a2 > b1)) | ((a1 > b1) & (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...