• Как подключится по ssh к кластеру (виртуальной машине), который был создан в google cloud?

    @denislysenko Автор вопроса
    ошибка была в том, что я указывал имя юзера как denislysenko0001, а нужно было указывать denislysenko, спасибо за помощь
  • Как подключится по ssh к кластеру (виртуальной машине), который был создан в google cloud?

    @denislysenko Автор вопроса
    Игорь, Спасибо, помогло, ошибка была в том, что я указывал имя юзера как denislysenko0001, а нужно было указывать denislysenko
  • Как протестировать загрузку CPU, Memory, время выполнения при запуске программы на Python?

    @denislysenko Автор вопроса
    используя python3 -m scalene get-movies.py

    получается результат в виде большой таблицы со многими показателями.
    Как можно получить результат в виде CPU - 18%, Memory - 12 MB, Time - 30 seconds?
  • Как исправить SQL скрипт?

    @denislysenko Автор вопроса
    В выражении группировки пишу r.movie_id так, как в таблице rating один и тот же movie_id встречается не один раз
  • Как заполнить таблицу sql, из файла csv используя cursor.execute?

    @denislysenko Автор вопроса
    galaxy, так и не решил эту проблему.
    из csv файла загружается в таблицу movies только 1301 строка

    я немного переписал код
    import pymysql
    from pymysql.constants import CLIENT
    import csv
    import re
    
    
    def create_connection_to_server_and_create_db(host, user, passwd, sql_script_path):
        try:
            connection = pymysql.connect(
                host = host,
                user = user,
                passwd = passwd,
                client_flag = CLIENT.MULTI_STATEMENTS
            )
            try:
                with connection.cursor() as cursor:
                    with open(sql_script_path) as file:
                        script = file.read()
                        cursor.execute(script)
                connection.commit()
                print('db was create')
            except Error as e:
                print(f"The error '{e}' occurred")
        except Error as e:
            print(f"The error '{e}' occurred")
    
    def get_connection_to_db(host, user, passwd, db_name):
        connection = None
        try:
            connection = pymysql.connect(
                host = host,
                user = user,
                passwd = passwd,
                database = db_name,
                client_flag = CLIENT.MULTI_STATEMENTS
            )
            print('Connection to MySQl_db successful')
        except Error as e:
            print(f"The error '{e}' occurred")
    
        return connection
    
    def create_table(connection, sql_script_path):
        try:
            with connection.cursor() as cursor:
                with open(sql_script_path) as file:
                    script = file.read()
                    cursor.execute(script)
                connection.commit()
        except Error as e:
            print(f"The error '{e}' occurred")
    
    def get_list_from_csv_file(csv_file_path):
        data = []
        with open(csv_file_path, encoding='utf-8') as file:
            reader = csv.reader(file, delimiter=',')
            for row in reader:
                data.append(row)
        result_data = data[1:]
        return result_data
    
    def fill_movies_table(connection, movies_data, sql_script_path):
            for movie_id, title, genres in movies_data:
                if re.search(r'\(\d{4}\)', title) is not None:
                    search_year = re.search(r'\(\d{4}\)', title)
                    result_year = search_year.group(0)[1:-1]
                    year = int(result_year)
                else:
                    year = 0
                title = title.replace("'", '`')
                title = title.replace('"', '`')
    
                with connection.cursor() as cursor:
                    with open(sql_script_path) as file:
                        script = file.read()
                        cursor.execute(script.format(int(movie_id), title[:-6], int(year), genres))
                    connection.commit()
    
    
    
    
    def main():
        create_connection_to_server_and_create_db('localhost', 'root', '12345678', './files/sql/CREATE_DATABASE_my_movies_db.sql')
        connection = get_connection_to_db('localhost', 'root', '12345678', 'my_movies_db')
        create_table(connection, './files/sql/CREATE_TABLE_movies.sql')
        create_table(connection, './files/sql/CREATE_TABLE_rating.sql')
        movies = get_list_from_csv_file('./files/csv/movies.csv')
        rating = get_list_from_csv_file('./files/csv/ratings.csv')
        fill_movies_table(connection, movies, './files/sql/FILL_MOVIES_TABLE.sql')
    
    
    
    main()
  • Как заполнить таблицу sql, из файла csv используя cursor.execute?

    @denislysenko Автор вопроса
    Slava Rozhnev, удалил с 1300 по 1302 строки

    теперь конец таблицы выглядит так:
    '1297','Real Genius ','1985'
    '1298','Pink Floyd: The Wall ','1982'
    '1299','Killing Fields, The ','1984'
    '1303','Man Who Would Be King, The ','1975'
    '1304','Butch Cassidy and the Sundance Kid ','1969'
  • Как избавиться от ошибки при заполнении таблицы через load data?

    @denislysenko Автор вопроса
    Akina,

    mysql> SELECT @@secure_file_priv;
    +--------------------+
    | @@secure_file_priv |
    +--------------------+
    |                    |
    +--------------------+
    1 row in set (0.00 sec)


    В этом проблема?
  • Как автоматизировать запуск sql скриптов?

    @denislysenko Автор вопроса
    pavelsha, Здравствуйте,

    Может тебе нужно сделать что-то вроде инсталятора? Т.е. Набор скриптов (связанный), запуск которого приведет к созданию новой БД с каким-то инициирующим наполнением.

    --да, именно это мне и нужно
  • Какой подход для фильтрации таблиц лучше?

    @denislysenko Автор вопроса
    Vindicar, Сказали использовать Mysql.
    Все равно огромное спасибо
  • Какой подход для фильтрации таблиц лучше?

    @denislysenko Автор вопроса
    Vindicar, Здравствуйте. вот код файла get-movies.py (это клиент)
    import mysql.connector
    from mysql.connector import Error
    
    def create_connection(host_name, user_name, user_password, db_name):
        connection = None
        try:
            connection = mysql.connector.connect(
                host=host_name,
                user=user_name,
                passwd=user_password,
                database=db_name
            )
            print("Connection to MySQL DB successful")
        except Error as e:
            print(f"The error '{e}' occurred")
    
        return connection
    
    connection = create_connection("localhost", "root", "12345678", "movies")
    
    def create_database(connection, query):
        cursor = connection.cursor()
        try:
            cursor.execute(query)
            print("Database created successfully")
        except Error as e:
            print(f"The error '{e}' occurred")
    
    create_database_query = "CREATE DATABASE movies"
    create_database(connection, create_database_query)
    
    
    def execute_query(connection, query):
        cursor = connection.cursor()
        try:
            cursor.execute(query)
            connection.commit()
            print("Query executed successfully")
        except Error as e:
            print(f"The error '{e}' occurred")
    
    create_movies_table = """
    CREATE TABLE IF NOT EXISTS movies (
      id INT AUTO_INCREMENT, 
      title TEXT NOT NULL, 
      genres TEXT NOT NULL, 
      PRIMARY KEY (id)
    ) ENGINE = InnoDB
    """
    
    create_rating_table = """
    CREATE TABLE IF NOT EXISTS rating (
      id INT AUTO_INCREMENT, 
      movie_id INT NOT NULL, 
      rating INT NOT NULL,
      timestamp INT NOT NULL 
      FOREIGN KEY (movie_id) REFERENCES movies (id), 
      PRIMARY KEY (id)
    ) ENGINE = InnoDB
    """
    
    execute_query(connection, create_movies_table)
    execute_query(connection, create_rating_table)


    То есть, здесь есть создание бд movies и создание двух таблиц: movies и rating. (только честно говоря возникает ошибка синтаксиса при создании таблицы rating),

    то есть, я подключаюсь к бд, которая есть на моем сервере mysql, но тот кто будет проверять это у него этой бд может и не быть, а все должно работать так : человек скачивает папку этого задания, обращается к файлу get-movies (может указывать аргументы для фильтрации) и должны выдаваться отсортированные фильмы.

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

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

    Извините, я знаю, что сам не могу нормально сформулировать то что мне нужно, но в целом, если поняли о чем идет речь, то можете отписать мне более подробно что нужно сделать
  • Какой подход для фильтрации таблиц лучше?

    @denislysenko Автор вопроса
    Vindicar, Здравствуйте, вы уже помогали мне с этим заданием, я очень благодарен за эту помощь, действительно много стало понятно. Сейчас хочу обратиться за консультацией по этому же заданию, но сейчас его нужно сделать используя подход клиент-сервер.

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

    В папке проекта должно быть разбиение на фронтенд и бекэнд. Во фронтенде - оставить парсер и вывод на экран, все остальное в бэкэнд. Работать с таблицами через mySq

    То есть, должно быть две папки:
    1)одна для клиетского консольного приложения
    2)и вторая для серверной части. все для сетапа бд

    Что должно быть в этих папках, как они между собой должны взаимодействовать?

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

    Что должно быть в папке серверной части?

    Заранее, спасибо.
  • Как записать 2 csv файла в MySQL?

    @denislysenko Автор вопроса
    Aleksandr, спасибо
  • Какой подход для фильтрации таблиц лучше?

    @denislysenko Автор вопроса
    Vindicar, Здравствуйте, сейчас уже нахожусь на финальной стадии, осталось только написать функцию для итоговой фильтрации таблицы, подскажете в каком направлении двигаться?

    import argparse
    import csv
    from collections import defaultdict
    import re
    
    parser = argparse.ArgumentParser()
    parser.add_argument('-N',
                        type=int,
                        help='the number of the highest rated films for each genre'
                        )
    parser.add_argument('-genres',
                        type=str,
                        help='filter by genre'
                        )
    parser.add_argument('-year_from',
                        type=int,
                        help='filter by year (FROM YEAR)',
                        default=1800
                        )
    parser.add_argument('-year_to',
                        type=int,
                        help='filter by year (TO YEAR)',
                        default=2025
                        )
    parser.add_argument('-regexp',
                        type=str,
                        help='filter on the movie name'
                        )
    args = parser.parse_args()
    
    
    # read movies.csv
    def read_movies_file():
        data_m = []
        with open('files/movies.csv', encoding='utf-8') as file:
            reader = csv.reader(file, delimiter=',')
            for row in reader:
                data_m.append(row)
        data_movies = data_m[1:]
        return data_movies
    data_movies = read_movies_file()
    
    # read ratings.csv
    def read_rating_file():
        data_r = []
        with open('files/ratings.csv', encoding='utf-8') as file:
            reader = csv.reader(file, delimiter=',')
            for row in reader:
                data_r.append(row)
        data_rating = data_r[1:]
        return data_rating
    data_rating = read_rating_file()
    
    
    # get averages, is a dict in which: key=str(movieID), values=middle rating.
    # and sort sort list by rating (reverse=True)
    def get_averages():
        total = defaultdict(float)
        count = defaultdict(int)
        for line in data_rating:
            total[line[1]] += float(line[2])
            count[line[1]] += 1
        # middle rating
        averages = { id: total[id]/count[id] for id in count }
        # sort list by reverse=True
        data_movies.sort(key=lambda item: averages.get(item[0], 0), reverse=True)
        return averages
    averages = get_averages()
    
    
    # make a list from geners
    def make_list_from_geners_in_data_movies():
        for i in range(len(data_movies)):
            geners_list = data_movies[i][2].split('|')
            data_movies[i][2] = geners_list
        return data_movies
    data_movies = make_list_from_geners_in_data_movies()
    
    """
    Короче, сейчас есть таблица data_movies, которая отсортирована по рейтингу (Reverse=True)
    Далее, я планирую написать функции сортировки для каждого аргумента командной строки
    И ппосле, просто применять эти функции для сортировки data_movies и выводить в консоль результат. 
    """
    
    
    
    def filter_by_year(year_from, year_to):
        result = []
        pattern = r'\(\d{4}\)'
        for i in range(len(data_movies)):
            string = data_movies[i][1]
            if re.search(pattern, string) is not None:
                year = re.search(pattern, string)
                a = year.group(0)[1:-1]
                int_year = int(a)
                if year_from <= int_year <= year_to:
                    result.append(data_movies[i])
        return result
    #filter_by_year(1999, 2001)
    
    
    def filter_by_regexp(name, data):
        result = []
        pattern = name
        for i in range(len(data)):
            string = data[i][1]
            if re.search(pattern, string) is not None:
                result.append(data[i])
        return result
    
    
    def filter_by_genres(geners, data):
        result = []
        if '|' in geners:
            geners_list = geners.split('|')
        elif '&' in geners:
            geners_list = geners.split('&')
        else:
            geners_list = geners.split()
    
        for i in range(len(geners_list)):
            gener = geners_list[i]
            for i in range(len(data)):
                if gener in data[i][2]:
                    if data[i] not in result:
                        result.append(data[i])
        return  result
    
    def print_result_to_console(data, N, geners):
        path
    
    
    
    
    
    
    def main_condition():
        result = []
        result = filter_by_year(args.year_from, args.year_to)
    
        if args.regexp is not None:
            result = filter_by_regexp(args.regexp, result)
    
        if args.genres is not None:
            result = filter_by_genres(args.genres, result)
            # !!! сейчас у нас есть отфильтрованная таблица result, но нужно вывести в консоль правильные значения
    
    if __name__ == "__main__":
        read_movies_file()
        read_rating_file()
        get_averages()
        main_condition()
        print(args)


    Есть два аргумента командной строки:
    -N - число наиболее рейтинговых фильмов для каждого жанра. опциональный
    -genres - фильтр по жанрам, задаваемый пользователем например"Comedy". может быть множественным. например, "Comedy|Adventure" или "Comedy&Adventure". опциональный

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

    вывод в консоль должен быть таким:
    Если мы пишем в консоли:
    program.py -N 3 -genres "Action&Adventure"
    То результат в консоли:

    gener, title, year, raring
    Action,xxx,xxx,xxx
    Action,xxx,xxxxxx
    Action,xxx,xxxxxx
    Adventure,xxx,xxx,xxx
    Adventure,xxx,xxx,xxx
    Adventure,xxx,xxx,xxx

    xxx - какие - то данные

    Дело в том, что я не понимаю, каким образом мне написать функцию которая бы фильтровала data_movies изходя из аргументов -N и -genres, и возвращала бы итоговую таблицу result, строки которой это нужные фильмы.

    Может подскажите, как написать функцию, которая будет фильтровать таблицу result и выводить их в консоль фильмы в нужном формате?
  • Как экранировать элемент в командной строке (модуль argpars)?

    @denislysenko Автор вопроса
    Да, я понимаю, но это нарушение требований, еще можно Romantic|Drama брать в кавычки и алгоритм будет работать, но это тоже нарушение требований
  • Какой подход для фильтрации таблиц лучше?

    @denislysenko Автор вопроса
    Vindicar, понял, спасибо, очень много стало понятно
  • Какой подход для фильтрации таблиц лучше?

    @denislysenko Автор вопроса
    Vindicar,
    2) в data_movies ID не числовые, это строки

    вот как выглядит data_movies:
    ['1', 'Toy Story (1995)', 'Adventure|Animation|Children|Comedy|Fantasy']
    ['2', 'Jumanji (1995)', 'Adventure|Children|Fantasy']
    ['3', 'Grumpier Old Men (1995)', 'Comedy|Romance']
    ['4', 'Waiting to Exhale (1995)', 'Comedy|Drama|Romance']
    ['5', 'Father of the Bride Part II (1995)', 'Comedy']
    ['6', 'Heat (1995)', 'Action|Crime|Thriller']
    ['7', 'Sabrina (1995)', 'Comedy|Romance']
    ['8', 'Tom and Huck (1995)', 'Adventure|Children']
    ...

    а так выглядит averages:
    {'1': 3.9209302325581397, '3': 3.2596153846153846, '6': 3.946078431372549, '47': 3.9753694581280787, '50': 4.237745098039215, '70': 3.5090909090909093, '101': 3.782608695652174, '110': 4.031645569620253, '151': 3.5454545454545454, '157': 2.8636363636363638,
    ...}

    3) теперь понял, буду сортировать этим способом