{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.18","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"tpu1vmV38","dataSources":[{"sourceId":105399,"databundleVersionId":12733338,"sourceType":"competition"}],"dockerImageVersionId":31089,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport gc # Garbage Collector\nimport warnings","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T21:40:33.861387Z","iopub.execute_input":"2025-07-23T21:40:33.861741Z","iopub.status.idle":"2025-07-23T21:40:33.875857Z","shell.execute_reply.started":"2025-07-23T21:40:33.861712Z","shell.execute_reply":"2025-07-23T21:40:33.866831Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"warnings.filterwarnings('ignore')\npd.set_option('display.max_columns', None)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T21:40:36.620924Z","iopub.execute_input":"2025-07-23T21:40:36.621217Z","iopub.status.idle":"2025-07-23T21:40:36.632975Z","shell.execute_reply.started":"2025-07-23T21:40:36.621191Z","shell.execute_reply":"2025-07-23T21:40:36.627180Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def reduce_mem_usage(df, verbose=True):\n    numerics = ['int16', 'int32','int64', 'float16', 'float32','flost64']\n    start_mem = df.memoty_usage().sum()/1024**2\n    int8_min = np.iinfo(np.int8).min\n    int8_max = np.iinfo(np.int8).max\n\n    int16_min = np.iinfo(np.int16).min\n    int16_max = np.iinfo(np.int16).max\n\n    int32_min = np.iinfo(np.int32).min\n    int32_max = np.iinfo(np.int32).max\n\n    int64_min = np.iinfo(np.int64).min\n    int64_max = np.iinfo(np.int64).max\n\n    float16_min = np.finfo(np.float16).min\n    float16_max = np.iinfo(np.float16).max\n    \n    float32_min = np.finfo(np.float32).min\n    float32_max = np.iinfo(np.float32).max\n    for col in df.coloms:\n        col_type = df[col].dtypes\n        if col_type in numerics:\n            c_min = df[col].min()\n            c_max = df[col].max()\n            if str(col_type)[:3] == 'int':\n                if c_min > int8_min  and c_max < int8_max:\n                    df[col] = df[col].astype(np.int8)\n                elif c_min > int16_min  and c_max < int16_max:\n                    df[col] = df[col].astype(np.int16)\n                elif c_min > int32_min  and c_max < int32_max:\n                    df[col] = df[col].astype(np.int32)\n                elif c_min > int64_min  and c_max < int64_max:\n                    df[col] = df[col].astype(np.int64)\n            else:\n                if c_min > float16_min  and c_max < float16_max:\n                    df[col] = df[col].astype(np.float16)\n                elif c_min > float32_min  and c_max < float32_max:\n                    df[col] = df[col].astype(np.float32)\n                else: \n                    df[col] = df[col].astype(np.float64)\n        end_mem = df.memory_usage().sum() / 1024 **2\n        if verbose: print(f'Mem. usage decreased to {end_mem: 5.2f} Mb ({100* (start_mem - end_mem)/start_mem: .1f})')\n        return df    \n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T21:40:39.677556Z","iopub.execute_input":"2025-07-23T21:40:39.677888Z","iopub.status.idle":"2025-07-23T21:40:39.696653Z","shell.execute_reply.started":"2025-07-23T21:40:39.677862Z","shell.execute_reply":"2025-07-23T21:40:39.691109Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"input_csv = '/kaggle/input/aeroclub-recsys-2025/train.parquet'\noutput_csv = 'ranking_sample.csv'\nouput_valid_sssion_all = 'valid_sssion_all.csv'\nouput_valid_sssion_unique = 'valid_sssion_unique.csv'","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T21:40:44.943750Z","iopub.execute_input":"2025-07-23T21:40:44.944038Z","iopub.status.idle":"2025-07-23T21:40:44.953455Z","shell.execute_reply.started":"2025-07-23T21:40:44.944014Z","shell.execute_reply":"2025-07-23T21:40:44.949464Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"label_col ='selected'\nsession_col='ranker_id'","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T21:41:41.808783Z","iopub.execute_input":"2025-07-23T21:41:41.809098Z","iopub.status.idle":"2025-07-23T21:41:41.820528Z","shell.execute_reply.started":"2025-07-23T21:41:41.809073Z","shell.execute_reply":"2025-07-23T21:41:41.814934Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df = pd.read_parquet(input_csv)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T21:40:59.519052Z","iopub.execute_input":"2025-07-23T21:40:59.519346Z","iopub.status.idle":"2025-07-23T21:41:23.987293Z","shell.execute_reply.started":"2025-07-23T21:40:59.519322Z","shell.execute_reply":"2025-07-23T21:41:23.982585Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"valid_session_all = df[df['selected'] == 1][session_col]\nvalid_session_all.to_csv(ouput_valid_sssion_all, index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T21:42:04.946713Z","iopub.execute_input":"2025-07-23T21:42:04.947007Z","iopub.status.idle":"2025-07-23T21:42:06.096548Z","shell.execute_reply.started":"2025-07-23T21:42:04.946975Z","shell.execute_reply":"2025-07-23T21:42:06.092065Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"valid_session = df[df['selected'] == 1]['ranker_id'].unique()\npd.DataFrame(valid_session_ids, columns=['ranker_id']).to_csv(ouput_valid_sssion_unique, index=False)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T21:42:59.739497Z","iopub.execute_input":"2025-07-23T21:42:59.739862Z","iopub.status.idle":"2025-07-23T21:43:00.857071Z","shell.execute_reply.started":"2025-07-23T21:42:59.739833Z","shell.execute_reply":"2025-07-23T21:43:00.853272Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport random\n\n# === Пути ===\ninput_parquet = '/kaggle/input/aeroclub-recsys-2025/train.parquet'\noutput_csv = 'ranking_sample.csv'\nouput_valid_sssion_all = 'valid_sssion_all.csv'\nouput_valid_sssion_unique = 'valid_sssion_unique.csv'\n\ndef create_ranking_sample(df: pd.DataFrame, session_col='ranker_id', label_col='selected', max_items_per_session=10, num_sessions=100):\n    result_sessions = []\n\n    # Получаем уникальные сессии с выбранным вариантом\n    valid_sessions = df[df[label_col] == 1][session_col].unique()\n    sampled_sessions = random.sample(list(valid_sessions), min(num_sessions, len(valid_sessions)))\n\n    for session_id in sampled_sessions:\n        session_df = df[df[session_col] == session_id]\n\n        chosen = session_df[session_df[label_col] == 1]\n        if chosen.empty:\n            continue\n\n        distractors = session_df[session_df[label_col] == 0]\n        distractors_sample = distractors.sample(n=min(max_items_per_session - 1, len(distractors)), random_state=42)\n\n        new_session = pd.concat([chosen, distractors_sample])\n        result_sessions.append(new_session)\n\n    final_df = pd.concat(result_sessions).reset_index(drop=True)\n    return final_df\n\n# === Генерация подвыборки из 100 сессий ===\nfiltered_df = create_ranking_sample(df, session_col='ranker_id', label_col='selected', max_items_per_session=10, num_sessions=100)\nfiltered_df.to_csv(output_csv, index=False)\n\nprint(f\"✅ Сохранено:\\n- {output_csv} — срез 100 сессий\\n- {ouput_valid_sssion_all} — все строки сессий с выбором\\n- {ouput_valid_sssion_unique} — список уникальных ranker_id\")\n","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}