【问题标题】:Finding the highest value寻找最高价值
【发布时间】:2016-06-28 23:38:14
【问题描述】:

因此,我目前正在使用循环搜索我的 csv 数据以查找一组天的“高”和“低”值,然后计算每天的平均值。有了这些平均值,我想找到其中最高的一个,但我一直很难做到。这是我目前拥有的。

for row in reversed(list(reader1)):
    openNAS, closeNAS = row['Open'], row['Close']
    highNAS, lowNAS = row['High'], row['Low']
    dateNAS = row['Date']
    averageNAS = (float(highNAS) + float(lowNAS)) / 2
    bestNAS = max(averageNAS)

我确实意识到 max(averageNAS) 不起作用,因为 averageNAS 不是一个列表,而且由于在 csv 文件中找不到平均值,所以我也不能使用 max(row['Average'])

当找到最高平均值时,我还希望能够包含它的日期,以便我的程序可以打印出最高平均值发生的日期。提前致谢。

【问题讨论】:

  • 我不确定我是否能满足您的所有要求,但您不会将averageNAS 放在list 中,然后在for 循环完成后在该列表中执行max ?
  • 许多潜在的解决方案。保留一个变量maxAVG,并在找到更高的变量时更新它,还保留一个变量bestNAS,并在找到平均更高的变量时将整个分配给它超过最大值。
  • @tdelaney 你能写一个简单的代码示例吗?我现在在编码方面是一个真正的新手,我通过查看示例和解释为什么它有效或为什么无效来学习。

标签: python max


【解决方案1】:

一个可能的解决方案是创建一个平均值字典,其中日期是键,平均值是值:

averageNAS = {}

然后计算平均值并将其插入此问题:

for row in reversed(list(reader1)):
    highNAS, lowNAS = row['High'], row['Low']
    dateNAS = row['Date']
    averageNAS[dateNAS] = (float(highNAS) + float(lowNAS)) / 2 # Insertion

现在您可以通过查找最高值获得最大值:

import operator
bestNAS = max(averageNAS.items(), key=operator.itemgetter(1))

结果将是一个元组:

# (1, 8.0)

这意味着第1天具有最高平均值。平均为8。

如果您不需要这一天,那么您可以创建列表而不是字典并附加到它。这使得找到最大的比特更容易:

averageNAS = []
for ...
    averageNAS.append((float(highNAS) + float(lowNAS)) / 2)
bestNAS = max(averageNAS)

【讨论】:

    【解决方案2】:

    我想到了一些解决方案。

    解决方案 1

    与现有解决方案最相似的方法是在计算平均值时创建一个平均值列表,然后从该列表中取最大值。根据您的示例,代码如下所示:

    averageNAS = []
    for row in reversed(list(reader1)):
        openNAS, closeNAS = row['Open'], row['Close']
        highNAS, lowNAS = row['High'], row['Low']
        dateNAS = row['Date']
        averageNAS.append((float(highNAS) + float(lowNAS)) / 2)
    
    # the maximum of the list only needs to be done once (at the end)
    bestNAS = max(averageNAS)
    

    解决方案 2

    除了创建一个完整的列表之外,您还可以只维护一个变量,该变量包含您迄今为止“看到”的最大平均 NAS,以及与之关联的 dateNAS。这看起来像:

    bestNAS = float('-inf')
    bestNASdate = None
    for row in reversed(list(reader1)):
        openNAS, closeNAS = row['Open'], row['Close']
        highNAS, lowNAS = row['High'], row['Low']
        dateNAS = row['Date']
        averageNAS = (float(highNAS) + float(lowNAS)) / 2
        if averageNAS > bestNAS:
            bestNAS = averageNAS
            bestNASdate = dateNAS
    

    解决方案 3

    如果您想使用包作为解决方案,我相当肯定 pandas 包可以轻松高效地做到这一点。我不能 100% 确定 pandas 语法是准确的,但该库拥有完成此操作所需的一切。它基于 numpy,因此操作比普通 python 循环更快/更高效。

    from pandas import DataFrame, read_csv
    import pandas as pd
    df = pd.read_csv(r'file location')
    df['averageNAS'] = df[["High", "Low"]].mean(axis=1)
    bestNASindex = df['averageNAS'].argmax() # 90% sure this is the right syntax
    bestNAS = df['averageNAS'][bestNASindex]
    bestNASdate = df['date'][bestNASindex]
    

    【讨论】:

    • 在您的第一个解决方案中,可以在 for-loop 之后而不是在其中找到最大值。
    • @MSeifert 我试图使第一个解决方案对问题中的代码进行最小的更改,但我同意,在循环之外执行它是有意义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多