首页 > 解决方案 > 在数据框中找到两个条件之间的最小值

问题描述

我对python很陌生。我在下面有一个很长的问题。如果你们能帮助我,我将不胜感激。

我有一个大的股票价格数据框,其中 df.columns = ['open','high','low','close']

我还根据每天的收盘价计算了两个指数移动平均线 - 5EMA 和 10EMA

当移动平均线交叉发生时,即今天的 5EMA > 10EMA 但昨天的 5EMA < 10EMA,我有 df['cross']='cross' 表示发生了交叉。

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['cross']='cross' 和之前的 df['cross]='cross' 之间找到 df['low'] 的最小值。

我需要一列 df['check'] 例如,df['check'] = 'up', if current df['min'] > previous df['min']

这是一个示例输出

在此处输入图像描述

在示例输出中,当第三个'cross'出现时,df['low'] 在第三个交叉和第二个交叉(在本例中为'11')之间的最小值大于 df['low' 的最小值] 在第一个十字架和第二个十字架之间(在本例中为“8”)。所以,df['check']='up'

当第四个“交叉”发生时,第四个交叉和第三个交叉(在本例中为“10”)之间的 df['low'] 的最小值不大于第二个交叉之间的 df['low'] 的最小值交叉和第三个交叉(在本例中为“11”)。所以,df['check']='down'

每次当 df['cross']='cross' 时,我都需要像这样不断地生成 df['check'] 的值​</p>

标签: pythonpandasdataframe

解决方案


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)

推荐阅读