нахождение минимального значения между 2 условиями во фрейме данных - PullRequest
0 голосов
/ 17 января 2019

Я очень плохо знаком с Python. У меня длинный вопрос ниже. Буду очень признателен, если вы, ребята, сможете мне помочь.

У меня есть большой массив данных о ценах на акции с df.columns = ['open', 'high', 'low', 'close']

Я также вычислил две экспоненциальные скользящие средние на основе цены закрытия каждый день - 5EMA и 10EMA

Когда происходит пересечение скользящей средней, то есть 5EMA> 10EMA сегодня, но 5EMA <10EMA вчера, у меня есть df ['cross'] = 'cross', чтобы показать, что произошло кроссовер. </p>

import pandas as pd

import numpy as np

data = pd.read_csv("Nifty.csv")

df = pd.DataFrame(data)

df['5EMA'] = df['Close'].ewm(span=5).mean()

df['10EMA'] = df['Close'].ewm(span=10).mean()

condition1 = df['5EMA'].shift(1) < df['10EMA'].shift(1)

condition2 = df['5EMA'] > df['10EMA']

df['cross'] = np.where(condition1 & condition2, 'cross', None)

print(df)

Мне нужен столбец df ['min'], который определяет минимальное значение df ['low'] между этим df ['cross'] = 'cross' и предыдущим df ['cross] =' cross '.

Мне нужен столбец df ['check'], например, df ['check'] = 'up', если текущий df ['min']> предыдущий df ['min']

Вот пример вывода

введите описание изображения здесь

В выходных данных примера, когда возникает третий «крест», минимальное значение df ['low'] между третьим крестом и вторым крестом (в данном случае '11') БОЛЬШЕ, чем минимальное значение df [ «низкий»] между первым крестом и вторым крестом (в данном случае «8»). Итак, df ['check'] = 'up'

Когда происходит четвертый «крест», минимальное значение df ['low'] между четвертым крестом и третьим крестом (в данном случае '10') НЕ БОЛЬШЕ, чем минимальное значение df ['low'] между вторым крестом и третьим крестом (в данном случае «11»). Итак, df ['check'] = 'down'

Мне нужно генерировать значение df ['check'] постоянно, как это каждый раз, когда df ['cross'] = 'cross'

1 Ответ

0 голосов
/ 17 января 2019

Конструкция Python if / else не работает векторизованно с Pandas / NumPy. Здесь вы можете использовать np.where для операций со столбцами:

# CORRECT
df['cross'] = np.where(df['CO'], 'cross', None)

# INCORRECT
# df['cross'] = df.apply(lambda x: 'cross' if (df['CO'] is True) else None, axis=1)

Если вы увлечены пошаговым циклом, это возможно, но неэффективно :

df['cross'] = df.apply(lambda row: 'cross' if row['CO'] else None, axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...