Получение средних семестров с оценками с использованием файлов в Python - PullRequest
0 голосов
/ 19 февраля 2020

Я хочу написать код, который будет принимать файл оценок и возвращать среднее значение всего этого, то есть среднее задание, среднее значение по проекту, среднее значение по тесту и среднее по семестру. В этом файле в начале будет столбец, который будет «легендой» для кода. Вот пример того, как будет выглядеть файл оценки:

last, first, hw, hw, project, quiz, hw, hw, hw, quiz, hw, hw, project
#It won't also be in this order, that's what makes this hard!
Cat, Figaro, 57, 58, 71, 93, 56, 86, 90, 99, 55, 99, 88
#Not a real name lol, there would also be A LOT more names and grades

Я не могу понять, как заставить его перебирать столбцы легенды и столбца оценок, чтобы правильно оценить файл. Вот формула для оценки:

semester average = homework average * 0.2 + quiz average * 0.2 + project average * 0.6.

Вот то, что у меня есть до сих пор. Я ужасно разбираюсь с файлами, поэтому знаю только, как вызвать столбец.

def start():  
  gb_data = open('gb_data.txt','r')
  header = gb_data.readline()
  print(header.strip())

strip () в конце избавит от \ n, что происходит при смене строк. Это печатает первый столбец файла, но я хочу перебрать его и определить легенду, а не просто распечатать его. Вот как будет выглядеть возвращаемый файл:

Cat, Figaro: hw avg = 71.57, quiz avg = 96.0, proj avg = 79.5, sem avg = 81.21

Пожалуйста, помогите! Это НЕ домашнее задание, а просто проект для лучшего понимания файлов, меня зовут Скарлетт, кстати.

Ответы [ 3 ]

2 голосов
/ 19 февраля 2020

Ответ гинкула не может охватить обработку нескольких строк значений
, поэтому я пытаюсь написать код более широко, как показано ниже:

def get_header():  
    gb_data = open('gb_data.txt','r')
    header = gb_data.readline()
    return header.strip()

def get_content():  
    gb_data = open('gb_data.txt','r')
    content = gb_data.readlines()
    del content[0]
    return content

hw_pos = []
project_pos = []
quiz_pos =  []

header_list = get_header()
header_list = header_list.split(", ")
header_list_index = enumerate(header_list)
for index, target in header_list_index:
    if target == "hw":
        hw_pos.append(index)
    elif target == "quiz":
        quiz_pos.append(index)
    elif target == "project":
        project_pos.append(index)

content_list = get_content()

avg_dict = {}

for element in content_list:
    element = element.strip().split(", ")

    name = element[0] + ', ' + element[1]
    hw_avg = sum([int(element[i]) for i in hw_pos]) / len(hw_pos)
    project_avg = sum([int(element[i]) for i in project_pos]) / len(project_pos)
    quiz_avg = sum([int(element[i]) for i in quiz_pos]) / len(quiz_pos)
    avg_dict.update({name:(hw_avg, project_avg, quiz_avg)})


for name, avg in avg_dict.items():
    print(name, "hw avg : ", round(avg[0], 2), "project avg : ", round(avg[1], 2), "quiz avg : ", round(avg[2], 2))

сохранить все выходные данные в другом текстовом файле

for name, avg in avg_dict.items():
    with open("avg.txt", "a") as f:
        dataline = name + " hw avg : " + str(round(avg[0], 2)) + \
        " project avg : " + str(round(avg[1], 2)) + " quiz avg : " + str(round(avg[2], 2)) + "\n"
        f.write(dataline)
0 голосов
/ 19 февраля 2020

Возможно, вы захотите взглянуть на pandas. Тем не менее, лучше давать своим столбцам уникальные имена столбцов.

import pandas as pd

def get_avg(row):
    hw_avg = (row['hw_1'] + row['hw_1'] + row['hw_1']) / 3
    # fill in as needed
    quiz_avg = ...
    proj_avg = ...
    return hw_avg * 0.2 + quiz_avg * 0.2 + proj_avg * 0.6

# read your data
df = pd.read_csv('your-file.csv')
# 'apply' a function to each row (axis=1) in a dataframe,
# add all results to a new column called 'semester_avg'
df['semester_avg'] = df.apply(get_avg, axis=1)
0 голосов
/ 19 февраля 2020

РЕДАКТИРОВАТЬ Этот код является неправильным для нескольких строк

Вы можете попробовать следующий код:

def start():
    with open('gb_data_.txt', 'r') as f:
        keys = f.readline().strip().split(',')
        values = f.readline().strip().split(',')
        last = values[0]
        first = values[1]

        hw = [int(v) for k, v in zip(keys, values) where 'hw' in k]
        hw_avr = sum(hw) / len(hw)

        project = [int(v) for k, v in zip(keys, values) where 'project' in k]
        project_avr = sum(project) / len(project)

        quiz = [int(v) for k, v in zip(keys, values) where 'quiz' in k]
        quiz_avr = sum(quiz) / len(quiz)

        sem_avr = hw_avr * 0.2 + quiz_avr * 0.2 + project_avr * 0.2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...