【问题标题】:finding minimum value between 2 conditions in a data frame在数据框中找到两个条件之间的最小值
【发布时间】:2019-06-11 23:14:14
【问题描述】:

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

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

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

当移动平均线发生交叉时,即今天 5EMA > 10EMA 但 昨天 5EMA

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']

这是一个示例输出

enter image description here

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

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

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

【问题讨论】:

  • 您能否提供一个示例输入/输出来帮助我们理解您的问题?例如,您的输入/输出df 是什么样的。
  • 我强烈建议您将第二个问题“我也想要...”放在单独的问答中。每个问题只能是一个问题。
  • 嗨,我添加了一个示例输出作为链接。你能打开示例输出吗?

标签: python pandas dataframe


【解决方案1】:

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)

【讨论】:

    猜你喜欢
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2013-11-10
    相关资源
    最近更新 更多