Как соотнести данные по индексу в списке (или CSV-файл)? - PullRequest
0 голосов
/ 07 февраля 2020

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

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

имена файлов:

  • movies.csv : содержит (через запятую) идентификатор mov ie, название mov ie и его жанры, разделенные символом |.

    Movie_ID, Movie_Title, Gender1 | Gender2 | ...

    1, История игрушек (1995), Анимация | Детская | Комедия

  • rate.csv : содержит ставку, которую пользователь сделал для конкретного mov ie. Просто запятые используются для разделения полей.

    User_ID, Movie_ID, рейтинг

    1,1193,5

  • users.csv : содержит (через запятую) идентификатор пользователя, пол («M»: мужчина, «F»: женщина) и возрастной диапазон (1: до 18, 18: от 18 до 24, 25: от 25 до 34, 35: между 35-44, 45: между 45-49, 50: между 50-55, 56: более 55).

    User_ID, Пол, Age_Range

    1, F, 1

Мой код:

def opFiles_to_list(filename):
  '''open a csv and convert it to list'''
  with open(filename, 'r', encoding = 'utf-8') as csv_file:
    reader = csv.reader(csv_file, delimiter = ",", lineterminator = '\n')
    new_list = list(reader)
  return new_list

def statistics(genre_ppl, genre_movie):
  rango = 0
  id_movie = 0
  id_user = 0
  nnew_list = []
  x = []

  if genre_ppl == 'F':
    rating_list = opFiles_to_list(rating)
    users_list = opFiles_to_list(user)
    movies_list = opFiles_to_list(movies)

    for i in movies_list:
      id_movies += 1

      for j in i:
        if j == genre_movies:
        #here I'm getting just the movies delimited by , like Comedy,
        #but not the ones that have this | separator: Comedy|Drama
          nnew_list.append(movies_list[id_movies - 1])

Ожидаемый вывод:

Input gender: M
Input movie genre: Comedy
Minor Rank 18: 2184
Rank 18-24: 11239
Rank 25-34: 22597
Rank 35-44: 11489
Rank 45-49: 5548
Rank 50-55: 4184
Major rank 56: 2066

Токовый выход:

Если я напечатаю nnew_list Я только получу фильмы, разделенные , и, например, жанра комедии, не включая те, которые разделены |, например, Comedy | Drama.

1 Ответ

0 голосов
/ 08 февраля 2020

Для решения гендерной проблемы: str.split и разделить на «|».

mov ie и идентификаторы пользователей уникальны и также используются в скорости для связи с двумя другими csv, я использую словарь с идентификатором в качестве ключа для хранения данных movies.csv и users.csv - хорошая идея для облегчения поиска.

Примерно так:

import csv

movies = {}
with open("movies.csv", 'r', encoding = 'utf-8') as csv_file:
    reader = csv.reader(csv_file, delimiter=",", lineterminator='\n')
    for id_, title, gender  in reader:
        movies[id_] = {"title": title, "gender": set(gender.split("|"))}

users = {}
with open("users.csv", 'r', encoding = 'utf-8') as csv_file:
    reader = csv.reader(csv_file, delimiter=",", lineterminator='\n')
    for id_, gender, age_range  in reader:
        users[id_] = {"age_range": age_range, "gender": gender}


genrep = input("Input genre: ")
genre_mov = input("Input movie: ")    
count = {"1": 0, "18": 0, "25": 0, "35": 0, "45": 0, "50": 0, "56": 0}

with open("rate.csv", 'r', encoding = 'utf-8') as csv_file:
    reader = csv.reader(csv_file, delimiter=",", lineterminator='\n')
    for user_id, movie_id, _  in reader:
        user = users.get(user_id)
        movie = movies.get(movie_id)
        if user["gender"] == genrep and genre_mov in movie["gender"]:
            count[user["age_range"]] += 1

print(f"Minor Rank 18: {count['1']}",
      f"Rank 18-24: {count['18']}",
      f"Rank 25-34: {count['25']}",
      f"Rank 35-44: {count['35']}",
      f"Rank 45-49: {count['45']}",
      f"Rank 50-55: {count['50']}",
      f"Mayor rank 56: {count['56']}",
      sep="\n"
      )

Каждый идентификатор присутствует в rate.csv присутствует в двух других словарях, хотя в противном случае было бы достаточно проверить, что методы dict.get не возвращают None.

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