{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":3288,"databundleVersionId":31051,"sourceType":"competition"}],"dockerImageVersionId":30732,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np\nimport pandas as pd \nimport dask.dataframe as dd\nimport matplotlib.pyplot as plt\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.decomposition import TruncatedSVD\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.compose import ColumnTransformer\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.preprocessing import StandardScaler, OneHotEncoder\nfrom sklearn.linear_model import LogisticRegression\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# Загрузка данных с использованием Dask с указанием типов данных\ntrain = dd.read_csv('/kaggle/input/event-recommendation-engine-challenge/train.csv')\ntest = dd.read_csv('/kaggle/input/event-recommendation-engine-challenge/test.csv')\nusers = dd.read_csv('/kaggle/input/event-recommendation-engine-challenge/users.csv', dtype={'birthyear': 'object', 'timezone': 'float64'})\nuser_friends = dd.read_csv('/kaggle/input/event-recommendation-engine-challenge/user_friends.csv.gz')\nevents = dd.read_csv('/kaggle/input/event-recommendation-engine-challenge/events.csv.gz', dtype={'city': 'object', 'country': 'object', 'state': 'object', 'zip': 'object'})\nevent_attendees = dd.read_csv('/kaggle/input/event-recommendation-engine-challenge/event_attendees.csv.gz')\n\n# Предобработка данных с использованием Dask\ntrain['timestamp'] = dd.to_datetime(train['timestamp'], errors='coerce')\ntest['timestamp'] = dd.to_datetime(test['timestamp'], errors='coerce')\nusers['joinedAt'] = dd.to_datetime(users['joinedAt'], errors='coerce')\nevents['start_time'] = dd.to_datetime(events['start_time'], errors='coerce')\nusers['birthyear'] = dd.to_numeric(users['birthyear'], errors='coerce')\n\n# Преобразование данных в Pandas DataFrame для предобработки и обучения модели\ntrain_pd = train.compute()\ntest_pd = test.compute()\nusers_pd = users.compute()\nuser_friends_pd = user_friends.compute()\nevents_pd = events.compute()\nevent_attendees_pd = event_attendees.compute()\n\nprint(\"Train Data Info\")\nprint(train_pd.info())\nprint(\"\\nTest Data Info\")\nprint(test_pd.info())\nprint(\"\\nUsers Data Info\")\nprint(users_pd.info())\nprint(\"\\nUser Friends Data Info\")\nprint(user_friends_pd.info())\nprint(\"\\nEvents Data Info\")\nprint(events_pd.info())\nprint(\"\\nEvent Attendees Data Info\")\nprint(event_attendees_pd.info())\n\n\nprint(\"\\nTrain Data Statistics\")\nprint(train_pd.describe())\nprint(\"\\nTest Data Statistics\")\nprint(test_pd.describe())\nprint(\"\\nUsers Data Statistics\")\nprint(users_pd.describe())\nprint(\"\\nEvents Data Statistics\")\nprint(events_pd.describe())\n\n# Visualizing missing values\ndef plot_missing_values(df, title):\n    missing = df.isnull().mean()\n    missing = missing[missing > 0]\n    missing.sort_values(inplace=True)\n    missing.plot.bar()\n    plt.title(title)\n    plt.show()\n\nplot_missing_values(train_pd, \"Missing Values in Train Data\")\nplot_missing_values(test_pd, \"Missing Values in Test Data\")\nplot_missing_values(users_pd, \"Missing Values in Users Data\")\nplot_missing_values(events_pd, \"Missing Values in Events Data\")\n\n\ntrain_pd['interested'].value_counts().plot(kind='bar', title='Distribution of Interested and Not Interested')\nplt.show()\n\n\nencoder = ColumnTransformer([\n    ('user', OneHotEncoder(handle_unknown='ignore'), ['user']),\n    ('event', OneHotEncoder(handle_unknown='ignore'), ['event'])\n], remainder='passthrough')\n\n# Подготовка данных для модели\nX = train_pd[['user', 'event']]\ny = train_pd['interested']\n\n# Разделение данных на тренировочные и тестовые наборы\nX_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42, shuffle=True)\n\n# Создание и обучение модели\nmodel = Pipeline(steps=[\n    ('encoder', encoder),\n    ('imputer', SimpleImputer(strategy='most_frequent')),\n    ('scaler', StandardScaler(with_mean=False)),\n    ('svd', TruncatedSVD(n_components=50)),\n    ('classifier', LogisticRegression())\n])\n\nmodel.fit(X_train, y_train)\n\n# Генерация рекомендаций для тестового набора\nX_test = test_pd[['user', 'event']]\ntest_pd['prediction'] = model.predict(X_test)\n\n# Преобразование рекомендаций в удобный формат\ndef generate_recommendations(df, user_col, event_col, pred_col, n=200):\n    recommendations = df.sort_values(by=[user_col, pred_col], ascending=[True, False])\\\n                        .groupby(user_col).head(n)\n    return recommendations.groupby(user_col)[event_col].apply(lambda x: ' '.join(map(str, x))).reset_index()\n\nrecommendations = generate_recommendations(test_pd, 'user', 'event', 'prediction')\n\n# Сохранение результатов в CSV файл\nrecommendations.columns = ['User', 'Events']\nrecommendations.to_csv('/kaggle/working/submission.csv', index=False)\nprint(\"Файл submission создан.\")\n","metadata":{"execution":{"iopub.status.busy":"2024-06-29T15:59:29.153770Z","iopub.execute_input":"2024-06-29T15:59:29.154286Z","iopub.status.idle":"2024-06-29T16:01:07.066075Z","shell.execute_reply.started":"2024-06-29T15:59:29.154248Z","shell.execute_reply":"2024-06-29T16:01:07.064760Z"},"trusted":true},"execution_count":null,"outputs":[]}]}