我对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']
这是示例输出
在样本输出中,当发生第三次“交叉”时,第三次与第二次交叉之间的df ['low']最小值(在本例中为“ 11”)大于df [的最小值] '低']在第一个十字和第二个十字之间(在本例中为'8')。因此,df ['check'] ='up'
发生第四次“交叉”时,第四次交叉与第三次交叉之间的df ['low']最小值(在本例中为“ 10”)不大于df ['low']的最小值在第二个十字和第三个十字之间(在本例中为“ 11”)。因此,df ['check'] ='down'
每次df ['cross'] ='cross'时,我都需要像这样连续生成df ['check']的值
答案 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)