Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 寻找最高值_Python_Max - Fatal编程技术网

Python 寻找最高值

Python 寻找最高值,python,max,Python,Max,所以我现在使用循环搜索我的csv数据,找到一组天的“高”和“低”值,然后计算每天的平均值。根据这些平均值,我想找到其中最高的一个,但我一直很难做到这一点。这就是我目前拥有的 for row in reversed(list(reader1)): openNAS, closeNAS = row['Open'], row['Close'] highNAS, lowNAS = row['High'], row['Low'] dateNAS = row['Date'] a

所以我现在使用循环搜索我的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 = {}
然后计算平均值,并将其插入本条:

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 最类似于现有解决方案的方法是在计算平均值时创建一个列表,然后从该列表中获取最大值。基于您的示例,代码如下所示:

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包可以轻松有效地完成这项工作。我不能百分之百确定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]

我不确定我是否满足了您的所有要求,但您是否会将
averageNAS
放在
列表中,然后在
for
循环完成后在该列表中添加
max
?许多潜在的解决方案。保留一个变量,
maxAVG
,当您发现一个更高的变量时更新它,同时保留一个变量,
bestNAS
,当您发现一个平均值高于最大值时,将整行分配给它。@tdelaney您能写一个代码的快速示例吗?我现在是一个真正的编码新手,我通过查看示例和解释来学习它为什么有效或为什么无效。在您的第一个解决方案中,可以在
for
-循环之后而不是在循环内部找到最大值。@MSeifert我试图使第一个解决方案对问题中的代码进行最小的更改,但我同意,在循环之外这样做是有道理的。