{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":31254,"databundleVersionId":3103714,"sourceType":"competition"}],"dockerImageVersionId":31040,"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 matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.metrics.pairwise import cosine_similarity\nfrom sklearn.preprocessing import LabelEncoder\nfrom scipy.sparse import csr_matrix\nimport warnings\nwarnings.filterwarnings(\"ignore\", category=RuntimeWarning)\n\n#Optimizing Data\ndef optimize(df):\n    for col in df.columns:\n        col_type = df[col].dtypes\n        if col_type == object:\n            if df[col].nunique() / len(df) < 0.5:\n                df[col] = df[col].astype(\"category\")\n        elif np.issubdtype(col_type, np.integer):\n            df[col] = pd.to_numeric(df[col], downcast=\"integer\")\n        elif np.issubdtype(col_type, np.floating):\n            df[col] = pd.to_numeric(df[col], downcast=\"float\")\n    return df\n\n\n\n\n#Load Datasets\ntransactions = pd.read_csv(\"/kaggle/input/h-and-m-personalized-fashion-recommendations/transactions_train.csv\", \n                           dtype={ \"customer_id\": \"category\", \"article_id\": \"int32\", \"price\": \"float32\", \"sales_channel_id\": \"int8\"}, \n                           parse_dates=[\"t_dat\"])\ncustomers = pd.read_csv(\"/kaggle/input/h-and-m-personalized-fashion-recommendations/customers.csv\")\narticles = pd.read_csv(\"/kaggle/input/h-and-m-personalized-fashion-recommendations/articles.csv\")\n\ntransactions = optimize(transactions)\ncustomers = optimize(customers)\narticles = optimize(articles)\n\n\n#Preview\nprint(transactions.head())\nprint(customers.head())\nprint(articles.head())\n\n#Data Cleaning\n#Parse date column\ntransactions['t_dat'] = pd.to_datetime(transactions['t_dat'])\n\n#Check for missing values\nprint(transactions.isnull().sum())\nprint(customers.isnull().sum())\nprint(articles.isnull().sum())\n\n#Drop duplicates if any\ntransactions.drop_duplicates(inplace=True)\ncustomers.drop_duplicates(inplace=True)\narticles.drop_duplicates(inplace=True)\n\n#Merge datasets\nmerged = transactions.merge(articles, on='article_id', how='left')\nmerged = merged.merge(customers, on='customer_id', how='left')\n\n#Feature Engineering\n\n#1. Most popular articles\npopular_articles = transactions['article_id'].value_counts().head(10)\nprint(\"Top 10 most bought articles:\\n\", popular_articles)\n\n#2. Frequency of purchase per customer\npurchase_freq = transactions.groupby('customer_id', observation = True)['article_id'].count()\nprint(purchase_freq.describe())\n\n#3. Product age\narticles['product_code'] = articles['product_code'].astype(str)\narticles['product_age'] = 2025 - articles['prod_name'].str.extract(r'(\\d{4})').fillna(2020).astype(int)\n\n#4. User-Item Interaction Matrix\nuser_encoder = LabelEncoder()\nitem_encoder = LabelEncoder()\n\ntransactions['user'] = user_encoder.fit_transform(transactions['customer_id'])\ntransactions['item'] = item_encoder.fit_transform(transactions['article_id'])\n\ninteraction_matrix = csr_matrix((np.ones(len(transactions)), \n                                 (transactions['user'], transactions['item'])))\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Baseline: Popularity-based Recommender\n\n#Get top N popular items\ntop_n = 5\ntop_articles = transactions['article_id'].value_counts().head(top_n).index.tolist()\n\n#Recommend same top-N items to all users\npopular_recommendations = {\n    user: top_articles for user in transactions['customer_id'].unique()\n}\n\n#Collaborative Filtering\n\n#Reuse interaction_matrix from Part 1\nuser_similarity = cosine_similarity(interaction_matrix)\n\n#Recommend based on similar users\ndef recommend_cf(user_id, top_k=5):\n    user_idx = user_encoder.transform([user_id])[0]\n    sim_scores = user_similarity[user_idx]\n    top_users = np.argsort(sim_scores)[::-1][1:6]  # Exclude self\n\n    item_scores = interaction_matrix[top_users].sum(axis=0).A1\n    top_items_idx = np.argsort(item_scores)[::-1][:top_k]\n    \n    return item_encoder.inverse_transform(top_items_idx)\n\n#Example for one user\nsample_user = transactions['customer_id'].iloc[0]\ncf_recommendations = recommend_cf(sample_user)\nprint(f\"CF Recommendations for user {sample_user}:\\n{cf_recommendations}\")\n\n#Evaluate (Precision@k - simple version)\ndef precision_at_k(actual, predicted, k=5):\n    return len(set(actual[:k]) & set(predicted[:k])) / k\n\n# Dummy example evaluation\nactual_purchases = transactions[transactions['customer_id'] == sample_user]['article_id'].unique().tolist()\nprecision = precision_at_k(actual_purchases, cf_recommendations, k=5)\nprint(f\"Precision@5 for user {sample_user}: {precision:.2f}\")\n","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}