寻找最高价值

时间:2016-03-14 03:12:19

标签: python max

所以我现在正在使用循环来搜索我的csv数据,以找到" high"和"低"一组天的值,然后计算每天的平均值。有了这些平均值,我想找到其中最高的一个,但我一直遇到麻烦。这是我现在所拥有的。

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

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

2 个答案:

答案 0 :(得分:0)

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

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)

答案 1 :(得分:0)

有一些解决方案可以想到。

解决方案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,因此操作比vanilla 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]