Python макс. 3 значения, среднее и построение - PullRequest
0 голосов
/ 12 ноября 2018

Я новичок в Python, я работал над этой проблемой, но столкнулся со многими ошибками. Во-первых, у меня есть 3 файла Excel, мне нужно найти 3 максимальных значения для каждого файла Excel. Затем мне нужно взять среднее значение каждого из 3 самых высоких значений. После этого мне нужно нанести на график средние значения, имя исключений должно быть на оси 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 голосов
/ 12 ноября 2018

Проблема:

Так что я думаю, что теперь я понимаю, что вы пытаетесь сделать, и я постараюсь решить вашу маленькую проблему. НО, как я вижу, ваш небольшой фрагмент кода полон мелких и серьезных недостатков, и вам нужно будет больше ознакомиться с основами 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])

Затем вы делаете "import xlrd" несколько раз. Нет необходимости в этом. Ваше построение также нуждается во втором или третьем взгляде. Обязательно прочитайте справочные руководства по библиотекам, которые вы используете, хотя бы чуть-чуть, прежде чем использовать их.

Источники:
https://xlrd.readthedocs.io/en/latest/api.html
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html

На этих сайтах много информации и примеров.

...