我是Python的新手,我正在研究该问题,但遇到许多错误。 首先,我有3个excel文件,我需要从每个excel中找到最高的3个值。然后,我需要取每个3个最大值的平均值。之后,我需要绘制平均值,excel的名称必须在Y轴上,平均值必须在X轴上。
我有最大值和平均值,没有任何错误,但是我需要彼此联系并得到一张图表。我写了这些代码,但是没有用。如何解决错误? 谢谢。
import numpy as np
import xlrd
book = xlrd.open_workbook("inc.xlsx")
sheet = book.sheet_by_index(0)
def inc_follow_up():
col = 1
return max(sheet.col_values(col, start_rowx=2, end_rowx=1441)[:3])
def inc_avg():
sum(inc_follow_up()) / len(inc_follow_up())
import xlrd
book = xlrd.open_workbook('mok.xlsx')
sheet = book.sheet_by_index(0)
def mok_follow_up():
col = 1
return max(sheet.col_values(col, start_rowx=2, end_rowx=1441)[:3])
def mok_avg():
sum(mok_follow_up()) / len(mok_follow_up())
import xlrd
book = xlrd.open_workbook('sok.xlsx')
sheet = book.sheet_by_index(0)
def sok_follow_up():
col = 1
return max(sheet.col_values(col, start_rowx=2, end_rowx=1441)[:3])
def sok_avg():
sum(sok_follow_up()) / len(sok_follow_up())
plt.plot(inc_avg["Significant wave height (cm)"],inc, color='green', label="Inc")
plt.plot(mok_avg["Significant wave height (cm)"], mok, color='green', label="Mok")
plt.plot(sok_avg["Significant wave height (cm)"], sok, color='green', label="Sok")
plt.title("Free")
plt.ylabel("Significant wave height (cm)")
plt.xlabel("inc","mok","sok")
plt.legend()
plt.show()
答案 0 :(得分:1)
问题:
所以我想我现在了解您正在尝试做的事情,并且我将尽力解决您的小问题。但是,正如我所看到的,您的小代码摘录充满了次要和主要的缺陷,您将需要更加熟悉python的基础知识,否则就会遇到问题。但是以后会有更多……这是我的“解决方案”(希望它能起作用):
首先将所有导入语句放在脚本的顶部(某些例外除外),然后将matplotlib实际导入为plt:
import numpy as np
import matplotlib.pyplot as plt
import xlrd
然后,您似乎想要一个从某些列表中返回多个最大值的函数。让我们这样做:
def nLargest(ls, n):
'''return the n largest entries in ls'''
return list(reversed(sorted(ls)[-n:]))
上面的这个函数有两个参数:列表和应该返回的最大值。它首先使用“ sorted(ls)”(从最低到最高)对数据进行排序,并使用“ [-n:]”获取最后的“ n”个元素。 然后将列表反转(从最高到最低)并返回。
现在只需定义一些值,加载数据并计算所需的值:
sheetIndex = 0
col = 1
start = 2
end = 1441
book = xlrd.open_workbook("inc.xlsx")
sheet = book.sheet_by_index(sheetIndex)
incData = sheet.col_values(col, start_rowx=start, end_rowx=end)
book = xlrd.open_workbook('mok.xlsx')
sheet = book.sheet_by_index(sheetIndex)
mokData = sheet.col_values(col, start_rowx=start, end_rowx=end)
book = xlrd.open_workbook('sok.xlsx')
sheet = book.sheet_by_index(sheetIndex)
sokData = sheet.col_values(col, start_rowx=start, end_rowx=end)
averages = [np.average(nLargest(incData, 3)), # use numpy for averaging
np.average(nLargest(mokData, 3)),
np.average(nLargest(sokData, 3))]
最后以您想要的方式绘制它:
vals = [1., 2., 3.]
plt.plot(vals, averages)
plt.xticks(vals, ["inc","mok","sok"])
plt.title("Free")
plt.ylabel("Significant wave height (cm)")
plt.xlabel("source files")
plt.show()
所有其他问题
现在,我想花一些时间查看您的原始代码,我将只批评我喜欢的地方:
def follow_up():
col = 1
return max(sheet.col_values(col, start_rowx=2, end_rowx=1441)[:3])
说实话,这个函数(以及大多数其他函数)让我感到非常畏缩...您不应更改或真正访问函数内部的全局变量。函数调用本身应包含该函数将需要的大多数数据(或至少包含获取数据的所有信息)。您编写了两次三个函数,它们实际上在不同的数据集上执行相同的操作。这就是函数的用途,您只需要编写一个函数并将其用于所有数据,就有点像这样:
def follow_up(sheet, col, start, end, n):
'''This function will still not work but at least it's a function...'''
return max(sheet.col_values(col, start_rowx=start, end_rowx=end)[:n])
然后,您将多次执行“导入xlrd”。没必要。 您的绘图还需要第二或第三眼。在实际使用它们之前,请务必至少阅读一点使用的库的参考手册。
资料来源:
https://xlrd.readthedocs.io/en/latest/api.html
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html
这些网站上有很多信息和示例。