сортировать CSV-файл по годам, используя словарь (Python 3.X) - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть CSV-файл с данными фильма, который выглядит примерно так (пример):

year revenue
2013 3000
2013 4000
2013 5000
2012 1500
2012 3000
2011 2000
2011 1000

Я хочу создать новый CSV-файл со следующей информацией:

year year_freq total_rev
2013 3         12000
2012 2         4500
2011 2         3000

И т. Д.

Это мой код (только началось с обработки частоты года) ... Я застрял.

import csv
from collections import Counter
i=0
nummovies={}
yearrev={}
with open ('movies.csv', 'r') as csv_file:
    csv_reader = csv.DictReader(csv_file)
for line in csv_reader:
    try:
        if line['year'] in nummovies:
            nummovies[line['year']]+=1
        else:
            nummovies=line['year']
    except ValueError:
            i=0
for key,value in nummovies.items():
    print(key,value)

print(i)

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

@ lessreg: при условии, что данные:

data = 2013, 3000, 2013, 4000, 2013, 5000, 2012, 1500, 2012, 3000, 2011, 2000, 2011, 1000

Мы можем написать следующий код

years = [data[x] for x in range(len(data)) if x % 2 == 0]
revenues = [data[x] for x in range(len(data)) if x % 2 == 1]

def reorder(year, rev):
    YEARS = year.copy()
    REVENUE = rev.copy()
    ans = []
    for year in YEARS:
        count = YEARS.count(year)
        total_rev = 0
        for i in range(count):
            j = YEARS.index(year)
            total_rev += REVENUE[j]
            del YEARS[j], REVENUE[j]
        ans.extend([year, count, total_rev]
    return ans
0 голосов
/ 26 ноября 2018

Я предоставляю простое для чтения и понимания решение.

Поскольку вы группируете по годам, имеет смысл использовать его в качестве ключа.Значения в словаре имеют сложный тип, поскольку они имеют два свойства.Самая простая форма их группировки - использование кортежей.(В более сложных случаях могут быть классы, в которых реализована различная бизнес-логика.).

Вы пытаетесь получить доступ к записи за год, увеличить счетчик и обновить доход.Если данных нет, инициализируйте счетчик и выручку с 0.

collector = {}
for year, revenue in zip(years, revenues):
    count, total = collector.setdefault(year, (0,0)) # will return (0,0) if year is not already in the dictionary
    count += 1
    total += revenue
    collector[year] = (count, total)
0 голосов
/ 26 ноября 2018

Вот способ достижения этого.

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

  1. читать данные (я буду «издеваться» над этим шагом, поскольку вы уже реализовали его самостоятельно)
  2. сбор статистики
  3. запись статистики в файл

КакЧтобы сохранить вещи в чистоте, мы могли бы создать «основную» функцию, которая будет делать именно это:

def analyze_movie_data():
    data = read_data()
    stats = get_stats(data)
    write_stats_to_csv(stats)

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


from csv import DictWriter

def read_data():
    lines = [
        {'year': 2011, 'revenue': 1000},
        {'year': 2012, 'revenue': 2000},
        {'year': 2011, 'revenue': 3000},
        {'year': 2012, 'revenue': 4000},
        {'year': 2011, 'revenue': 5000},
    ]
    return lines


def get_stats(lines):

    def add_line(stats, line):
        year = line['year']

        if year not in stats:
            stats[year] = {'year': year, 'freq': 0, 'total_revenue': 0}

        stats[year]['freq'] += 1
        stats[year]['total_revenue'] += line['revenue']

    stats = {}
    for line in lines:
        add_line(stats, line)
    return stats


def write_stats_to_csv(stats):
    columns = ['year', 'freq', 'total_revenue']

    with open('stats.csv', 'w', newline='') as output:
        writer = DictWriter(output, columns)
        writer.writeheader()
        for year in stats:
            writer.writerow(stats[year])



def analyze_movie_data():
    data = read_data()
    stats = get_stats(data)
    write_stats_to_csv(stats)

analyze_movie_data()

Выход (тогда для моего ложного ввода):

year,freq,total_revenue
2011,3,9000
2012,2,6000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...