Python最大3个值,平均值和绘图

时间:2018-11-12 08:36:45

标签: python excel pandas matplotlib xlrd

我是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()

1 个答案:

答案 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

这些网站上有很多信息和示例。