所以我现在正在使用循环来搜索我的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'])
。
当找到最高平均值时,我也希望能够包括它的日期,所以我的程序可以打印出发生最高平均值的日期。提前谢谢。
答案 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)
有一些解决方案可以想到。
与您现有解决方案最相似的方法是在计算平均值时创建平均值列表,然后从该列表中获取最大值。根据您的示例,代码看起来像这样:
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)
您可以只维护一个您已经看过的最大平均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
如果您想使用软件包作为解决方案,我相当确定 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]