python - 在数据框中找到两个条件之间的最小值
问题描述
我对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>
解决方案
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)
推荐阅读
- python - 熊猫在两个条件下像 SUMIFS 一样出色
- angularjs - 声明前使用的变量“Foo”。两个类相互依赖
- elixir - Elixir Phoenix.Route.NoRouteError
- vb.net - 如何在 SSRS 自定义代码中访问包含的文本框
- excel - 我的代码未在必填表中输入字段
- python - 如何获取python中给定输入文件的所有列表的所有标记的长度?
- javascript - 抓取页面以获取编码的 javascript 链接
- php - 为什么 $this->db->affected_rows() 返回 0?
- wpf - WPF ObjectDataProvider 参数
- xcode - Xcode 10+:如何切换到旧版构建系统?