在数据框中找到两个条件之间的最小值

时间:2019-01-17 17:26:16

标签: python pandas dataframe

我对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']的最小值。 / p>

我需要一列df ['check'],例如, df ['check'] ='up',如果当前df ['min']>上一个df ['min']

这是示例输出

enter image description here

在样本输出中,当发生第三次“交叉”时,第三次与第二次交叉之间的df ['low']最小值(在本例中为“ 11”)大于df [的最小值] '低']在第一个十字和第二个十字之间(在本例中为'8')。因此,df ['check'] ='up'

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

每次df ['cross'] ='cross'时,我都需要像这样连续生成df ['check']的值

1 个答案:

答案 0 :(得分:0)

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)