Как вы находите среднее число конкретных чисел в CSV-файле? - PullRequest
0 голосов
/ 05 декабря 2018
with open('sortedsimpsons_episodes.csv') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    print("Season 1")
    for idx,row in enumerate(csv_reader):
        if idx>=1 and idx<=13:
            print(f'"{row[1]}" is an episode in season {row[4]}, that has {row[7]} million views and an imdb rating of {row[9]}')

viewsAverage = round((30.3 + 30.4 + 27.6 + 33.5 + 31.2 + 27.1 + 26.7 + 25.4 + 20.2 + 27.4 + 28 + 27.1 + 27.5) / 13,2)
imdbAverage = round((7.4 + 8.3 + 7.9 + 7.5 + 7.8 + 7.9 + 8.2 + 7.8 + 7.8 + 7.6 + 7.7 + 8.1 + 7.5) / 13,2)
print("The average amount of views in season 1 is: "+str(viewsAverage)+ " million.")
print("The average imdb rating of season 1 is: " +str(imdbAverage))
csv_file.close()

CSV-файл:

"Krusty Gets Busted" is an episode in season 1, that has 30.4 million views and an imdb rating of 8.3.
"The Call of the Simpsons" is an episode in season 1, that has 27.6 million views and an imdb rating of 7.9.
"Life on the Fast Lane" is an episode in season 1, that has 33.5 million views and an imdb rating of 7.5.
"The Crepes of Wrath" is an episode in season 1, that has 31.2 million views and an imdb rating of 7.8.
"Some Enchanted Evening" is an episode in season 1, that has 27.1 million views and an imdb rating of 7.9.
"Simpsons Roasting on an Open Fire" is an episode in season 1, that has 26.7 million views and an imdb rating of 8.2.
"Bart the Genius" is an episode in season 1, that has 24.5 million views and an imdb rating of 7.8.
"There's No Disgrace Like Home" is an episode in season 1, that has 26.2 million views and an imdb rating of 7.8.
"Moaning Lisa" is an episode in season 1, that has 27.4 million views and an imdb rating of 7.6.
"The Telltale Head" is an episode in season 1, that has 28 million views and an imdb rating of 7.7.
"Bart the General" is an episode in season 1, that has 27.1 million views and an imdb rating of 8.1.
"Homer's Odyssey" is an episode in season 1, that has 27.5 million views and an imdb rating of 7.5.
"Bart Gets an "F"" is an episode in season 2, that has 33.6 million views and an imdb rating of 8.2.
"Two Cars in Every Garage and Three Eyes on Every Fish" is an episode in season 2, that has 26.1 million views and an imdb rating of 8.1.
"Dead Putting Society" is an episode in season 2, that has 25.4 million views and an imdb rating of 8.
"Bart the Daredevil" is an episode in season 2, that has 26.2 million views and an imdb rating of 8.4.

Когда весь файл печатается на python, он длинный.Это продолжается 27 сезонов.Я хочу найти средние значения просмотров и рейтинга для каждого сезона, и я знаю только, как сделать это вручную, как показано в коде выше.Код работает и печатает именно то, что я хочу, но выполнение этого способа займет у меня навсегда.Как найти среднее количество просмотров за сезон, не вводя все цифры вручную?

Ответы [ 5 ]

0 голосов
/ 05 декабря 2018

Ваш входной файл не в правильном формате CSV.Тем не менее, с небольшим ремонтом, чтобы избежать проблем, которые могут привести к сбою во встроенном модуле csv, его можно использовать.Основная хитрость заключается в рассмотрении пробелов в разделителе.Это означает, что csv.reader будет возвращать что-то подобное для каждой строки файла.Первая строка указывает индекс каждого элемента:

     0        1     2      3         4      5       6       7      8       9       10        11       12    13     14       15      16     17
['"title"', 'is', 'an', 'episode', 'in', 'season', '1,', 'that', 'has', '30.4', 'million', 'views', 'and', 'an', 'imdb', 'rating', 'of', '8.3.']
['"title"', 'is', 'an', 'episode', 'in', 'season', '1,', 'that', 'has', '27.6', 'million', 'views', 'and', 'an', 'imdb', 'rating', 'of', '7.9.']

Это применимо, за исключением того, что есть пара полей, в конце которых есть дополнительные символы, такие как . и ,, что препятствует их действиюPython литералы.Это достигается путем удаления последнего символа этих строк поля.

Код:

from ast import literal_eval
from collections import namedtuple
import csv
from itertools import groupby
from operator import attrgetter, itemgetter
import itertools


# Data definition of fields.
FIELDS =     'title', 'season', 'views', 'rating' # Field names.
INDICES =       0,       6,        9,       17    # Index of each field.
TRUNCATE =               6,                 17    # Last char removal.

def parse(field):
    try:
        return literal_eval(field)  # Interpret as a Python literal.
    except Exception:
        return field # Assume it's an unquoted string.

# Create list or records made from fields of interest in csv file.
Record = namedtuple('Record', FIELDS)
records = []
with open('sortedsimpsons_episodes.csv', newline='') as csv_file:
    for row in csv.reader(csv_file, delimiter=' '):
        for index in TRUNCATE:  # Strip trailing char from designated fields.
            row[index] = row[index][:-1]
        raw_data = itemgetter(*INDICES)(row)  # Raw string data in each field.
        # Convert raw field string data to desired types.
        values = (parse(field) for field in raw_data)
        records.append(Record(*values))

# Calculate and print statistics.
grouper = attrgetter('season')
records.sort(key=grouper)
for season, records in groupby(records, key=grouper):
    records = list(records)
    views_avg = sum(rec.views for rec in records) / len(records)
    imdb_avg = sum(rec.rating for rec in records) / len(records)
    print("Season {}:".format(season))
    print("  Average number of views: {:.2f} million".format(views_avg))
    print("  Average imdb rating: {:.2f}".format(imdb_avg))

Вывод:

Season 1:
  Average number of views: 28.10 million
  Average imdb rating: 7.84
Season 2:
  Average number of views: 27.82 million
  Average imdb rating: 8.17
0 голосов
/ 05 декабря 2018

Итак, это работает на сто процентов:

import numpy as np
def get_avg_rating_and_views(df):
    avg_dict = {}
    i = 0
    for data in df["Field_name_to_scan"]:
      avg_dict[i] = []
      for d in data.split(): 
         try:
            float_val = float(d)
            if len(avg_dict[i]) < 2:
                avg_dict[i].append(float_val)
         except:
            pass
      i = i + 1


    views , imdb_ratings = list(zip(*avg_dict.values()))
    avg_view = np.average(views)
    print("Average View: ",avg_view)
    avg_imdb_ratings = np.average(imdb_ratings)
    print("Imdb average Rating", avg_imdb_ratings)

df = pd.read_csv("your_csv.csv")
get_avg_rating_and_views(df) 

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

0 голосов
/ 05 декабря 2018

Почему бы во время цикла не прибавлять к итоговому значению и делить на счетчик?

viewsTotal = 0
imdbTotal = 0
total = 0
with open('sortedsimpsons_episodes.csv') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    print("Season 1")
    for idx, row in enumerate(csv_reader):
        if idx >= 1 and idx <= 13:
            viewsTotal += float(row[7])
            imdbTotal += float(row[9])
            total = idx
            print(f'"{row[1]}" is an episode in season {row[4]}, that has {row[7]} million views and an imdb rating of {row[9]}')
viewsAverage = round(viewsTotal / total,2)
imdbAverage = round(imdbTotal / total,2)
print("The average amount of views in season 1 is: "+str(viewsAverage)+ " million.")
print("The average imdb rating of season 1 is: " +str(imdbAverage))

Не уверен, что ваши нижние отпечатки и средние значения должны быть обработаны после цикла csv_file.Также вам не нужен .close (), так как 'with open ()' закрывает файл после его завершения.

0 голосов
/ 05 декабря 2018

Чтобы найти средние значения просмотров и рейтинга для каждого сезона, сначала необходимо отсортировать группу по сезонам.

Я предполагаю, что:

  • строка[1] - заголовок,
  • строка [4] - сезон,
  • строка [7] - количество просмотров,
  • строка [9] - показатель.

Итак, я думаю, у вас есть что-то вроде этого (я заменил неизвестные значения на None):

rows = [
    ('title1', None, None, None, 1, None, None, 30.4, None, 8.5),
    ('title2', None, None, None, 2, None, None, 27.5, None, 6.5),
    ('title3', None, None, None, 1, None, None, 40.2, None, 4.0),
    ('title4', None, None, None, 1, None, None, 21.9, None, 2.6),
]

Чтобы отсортировать и сгруппировать строки и извлечьзначения из строк можно использовать operator.itemgetter, например:

import operator

get_season = operator.itemgetter(4)
get_views = operator.itemgetter(7)
get_rate = operator.itemgetter(9)

Имея это в виду, вы можете рассчитать средние значения:

import itertools

rows.sort(key=get_season)
for season, group in itertools.groupby(rows, key=get_season):
    group = list(group)
    count = len(group)
    total_views = sum(get_views(row) for row in group)
    total_rate = sum(get_rate(row) for row in group)
    mean_views = total_views / count
    mean_rate = total_rate / count
    print(f"season {season} - views: {mean_views:.2f}, rate: {mean_rate:.2f}")

Вы получите:

season 1 - views: 30.83, rate: 5.03
season 2 - views: 27.50, rate: 6.50

Как описано в другом ответе, вы также можете использовать модуль статистики:

import itertools
import statistics

rows.sort(key=get_season)
for season, group in itertools.groupby(rows, key=get_season):
    group = list(group)
    mean_views = statistics.mean(get_views(row) for row in group)
    mean_rate = statistics.mean(get_rate(row) for row in group)
    print(
        f"season {season} - views: {mean_views:.2f}, rate: {mean_rate:.2f}")
0 голосов
/ 05 декабря 2018

Вы можете использовать словари для хранения списков рейтингов imdb или зрителей для каждого сезона.

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

from collections import defaultdict

ratings = defaultdict(list)
viewings = defaultdict(list)

for row in csv_reader:
    season, viewing, rating = row[4], row[7], row[9]

    ratings[season].append(rating)
    viewings[season].append(viewing)

Затем вы можете получить список оценок, например, и рассчитать среднее значение:

>>> from statistics import mean
>>> mean(ratings['season 1'])
7.807692307692307
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...