{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## H&M Personalized Fashion Recommendations\n<br>\n\n### Özet : \n\n   <font size=\"3\">Bu yarışma da bizden verilen dataset' leri kullanılarak her bir müşteri için 7 ürün olacak şekilde ürün tavsiyesi oluşturmamız isteniyor.</font>\n<br>\n\n### Çalışma Yöntemi : \n<br>\n\n   <font size=\"3\"> Bir mağazada satılan ürünlerin alan kişilerin özelliklerini gruplar isek, o gruba dahil olan kişilerin o ürünü almaya yatkın olacağını farz edebiliriz. Çözüm sürecimizde de bu yaklaşımı sürdürerek her bir ürünü alan kişilerin özelliklerini alıp ürünlerimizi sınıflandıracak ve her bir müşteri için tahminde bulunacağız. Bu tahminleri de müşterinin geçmişte almış olduğu ürünlerden hangi gruba girdiğini bulup, o grupta en fazla satın alınan ürünleri vererek gerçekleştireceğiz. Bu tahminleri verirken müşterinin en son satın aldığı ürünün değerini yok etmemek için, ilk 4 ürün için sadece son ürünü satın almış ayrı bir müşteri gibi davranıp, geri kalan 3 ürün için de diğer satın almış olduğu ürünleri kullanacağız. Eğer müşterimiz sadece 1 ürün almış ise, 1 müşteri olarak davranıp bütün ürünleri o sınıftan getireceğiz. Bu ayrım ile bilgiyi alt bloklarda anlattım</font>\n<br>\n\n### Çözüm Yöntemi : \n<br>\n\n<font size=\"3\">1. Her bir ürünü alan kullanıcıların özelliklerini içerek şekilde bir DF oluşturup, bu bilgiler ile\n           sınıflandırma işlemi yapılacak.</font><br>\n<font size=\"3\">2. Sonrasında her bir müşterinin bilgileri bu modele verilip sınıfı bulunacak.</font><br>\n<font size=\"3\">3. Bulunduğu sınıf içinde bulunan ürünlerden ilk dört tanesi son satın alınan üründen, geri kalan 3 tanesi diğer almış olduğu ürünlerden olacak şekilde tahminler oluşturulacak.</font>\n\n<br>\n\n### Verisetleri : \n<br>\n\n<font size=\"3\"> Elimizde 4 çeşit veri seti bulunuyor. Bunlar sırayla \"articles, customers, ssample_submission, transactions_train\" dır.\n*     <font size=\"3\">articles : Ürünler ve bunların özelliklerini bulunduran dataset' imizdir.</font>\n*     <font size=\"3\">customers : Müşteri bilgilerini içeren dataset' imizdir.</font>\n*     <font size=\"3\">sample_submission : İstenen verinin örnek dataset' idir.</font>\n*     <font size=\"3\">transactions_train : Müşteriler ve yaptığı satın alımın bilgilerini içeren dataset' imizdir.</font>\n</font>\n<br>\n\n### İşlem Basamakları :\n<br>\n\n\n<font size=\"3\">1. &nbsp;&nbsp;Adım :  <a href=#articlesImport>Verilerin İçeriye Alınması</a></font><br>\n<font size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;   1.1.  <a href=#articlesImport>Articles İmport</a></font><br>\n<font size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;   1.2.  <a href=#customersImport>Customers İmport</a></font><br>\n<font size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;   1.3.  <a href=#sampleSubmissionImport>Sample Submission İmport</a></font><br>\n<font size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;   1.4.  <a href=#transactionsImport>Transactions İmport</a></font><br>\n<font size=\"3\">2. &nbsp;&nbsp;Adım : <a href=#transactionsPreprocessing>Transactions DF PreProcessing</a></font><br>\n<font size=\"3\">3. &nbsp;&nbsp;Adım : <a href=#transactionsCustomerArticlesDF>Transactions-Customer-Articles DF Oluşturulması</a></font><br>\n<font size=\"3\">4. &nbsp;&nbsp;Adım : <a href=#customersPrePro>Customers DF PreProcessing</a></font><br>\n<font size=\"3\">5. &nbsp;&nbsp;Adım : <a href=#customersFeatureEngineering>Customers DF Feature Engineering</a></font><br>\n<font size=\"3\">6. &nbsp;&nbsp;Adım : <a href=#articlesCustomerDF>Articles-Customers DF Oluşturulması</a></font><br>\n<font size=\"3\">7. &nbsp;&nbsp;Adım : <a href=#articlesPreProcessing>Articles DF PreProcessing</a></font><br>\n<font size=\"3\">8. &nbsp;&nbsp;Adım : <a href=#articlesCustomerValuesDF>ArticlesCustomerValues DF Oluşturulması</a></font><br>\n<font size=\"3\">9. &nbsp;&nbsp;Adım : <a href=#articlesDFMerge>ArticlesCustomerValues ile ArticlesMost DF' lerini birleştirilmesi</a></font><br>\n<font size=\"3\">10. Adım : <a href=#articlesDFFeatureEngineering>Articles DF' leri Feature Engineering</a></font><br>\n<font size=\"3\">11. Adım : <a href=#classification>Sınıflandırma İşlemleri ( K-Means, LightGBM )</a></font><br>\n<font size=\"3\">12. Adım : <a href=#model>Model Oluşturma Aşamaları</a></font><br>\n<font size=\"3\">13. Adım : <a href=#customerSubmission>Tahmin İşlemleri</a></font><br>\n<br>\n    \n    \n    ","metadata":{}},{"cell_type":"markdown","source":"<a id='articlesImport' style=\"color:black\" /></a>\n# Verilerin İçeriye Alınması","metadata":{}},{"cell_type":"markdown","source":"<a id='articlesImport' style=\"color:black\" /></a>\n# Articles İmport\n<font size=\"3\">Articles datamızı içeriye alıyoruz.</font>","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport statsmodels.api as sm\nimport matplotlib.pyplot as plt\nimport scipy.stats as stats\nimport seaborn as sns\nsns.set()\nraw_csv_data = pd.read_csv(\"../input/h-and-m-personalized-fashion-recommendations/articles.csv\")\npd.set_option('display.max_columns',30 )\ndf_articles_root = raw_csv_data.copy()\ndf_customers_root_checkpoint = df_articles_root.copy()\ndf_articles_root.head()","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id='customersImport' style=\"color:black\" /></a>\n# Customers İmport\n<font size=\"3\">Müşteri dataset' ini içeriye alıyoruz</font>","metadata":{}},{"cell_type":"code","source":"raw_csv_data = pd.read_csv(\"../input/h-and-m-personalized-fashion-recommendations/customers.csv\")\ndf_customers_root = raw_csv_data.copy()\n# df_customers_root = df_customers_root.head(500)\ndf_customers_root\ndf_customers_root_checkpoint = df_customers_root.copy()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id='sampleSubmissionImport' style=\"color:black\" /></a>\n# Sample Submission İmport\n<font size=\"3\">Sample submission dataset' ini içeriye alıyoruz</font>","metadata":{}},{"cell_type":"code","source":"raw_csv_data = pd.read_csv(\"../input/h-and-m-personalized-fashion-recommendations/sample_submission.csv\")\ndf_sampleSubmission_root = raw_csv_data.copy()\n# display(df)\ndf_sampleSubmission_root.head()","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a name='bookmark' />","metadata":{}},{"cell_type":"markdown","source":"<a id='transactionsImport' style=\"color:black\" /></a>\n# Transactions İmport\n<font size=\"3\">Transactions dataset' ini içeriye alıyoruz</font>","metadata":{}},{"cell_type":"code","source":"\nraw_csv_data = pd.read_csv(\"../input/h-and-m-personalized-fashion-recommendations/transactions_train.csv\")\ndf_transactionsTrain_root = raw_csv_data.copy()\ndf_transactionsTrain_root = df_transactionsTrain_root.head(10000)\ndf_transactionsTrain_root_checkpoint = df_transactionsTrain_root.copy()\ndf_transactionsTrain_root","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id='transactionsPreprocessing' style=\"color:black\" /></a>\n# Transactions Preprocessing","metadata":{}},{"cell_type":"code","source":"df_transactionsTrain_root_chkpoint = df_transactionsTrain_root.copy()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_transactionsTrain_root.isnull().sum()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_transactionsTrain_root['t_dat'].value_counts()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Son alınan ürünü ayrı alacağımız için işlemlerimizi sıralayacağım. Bu yüzden tarih değişkenimi tarih\ntipine çeviriyorum</font>","metadata":{}},{"cell_type":"markdown","source":"<font size=\"3\">Verilen dataset içerisinde bütün tarihler aynı, ben örnek olması açısından böyle yapıyorum</font>","metadata":{}},{"cell_type":"code","source":"df_transactionsTrain_root.info()","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_transactionsTrain_root['t_dat'] = pd.to_datetime(df_transactionsTrain_root['t_dat'])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_transactionsTrain_root.info()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_transactionsTrain_root.sort_values(by='t_dat',ascending=False)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id='transactionsCustomerArticlesDF' style=\"color:black\" /></a>\n# TransactionsCustomerArticles DF Oluşturulması","metadata":{}},{"cell_type":"markdown","source":"<font size=\"3\">Müşteriler ve aldıkları ürünlerin olduğu tablomu oluşturuyorum</font>","metadata":{}},{"cell_type":"code","source":"df_transactionsTrain_root_chkpoint = df_transactionsTrain_root.copy()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Benzersiz müşteri sayısı</font>","metadata":{}},{"cell_type":"code","source":"df_transactionsTrain_root['customer_id'].unique().size","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">İşlemleri müşteri id bilgisine göre grupluyorum</font>","metadata":{}},{"cell_type":"code","source":"df_groupedCustomerTransactions = df_transactionsTrain_root.groupby([\"customer_id\"],as_index=False)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Örnek olarak bir müşterinin DF' sinin gösterimi</font>","metadata":{}},{"cell_type":"code","source":"df_groupedCustomerTransactions.get_group(\"000058a12d5b43e67d225668fa1f8d618c13dc232df0cad8ffe7ad4a1091e318\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Alım yapan her müşterinin 1 kere olduğu tablomu oluşturuyorum. Bu tabloya grupladığım müşterimin \n     ürünleri ile birleştireceğim.</font>","metadata":{}},{"cell_type":"code","source":"df_TRS_TR_OneCus = df_transactionsTrain_root.drop_duplicates(subset=['customer_id'])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_TRS_TR_OneCus","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Müşterinin satın aldığı ürünleri koyacağım sütunumu yerleştiriyorum.\n     Bazen denemek için tekrar çalıştırdığımda hata verdiği için try-except yapısını kullanıyorum.</font>","metadata":{}},{"cell_type":"code","source":"try:\n    df_TRS_TR_OneCus.insert(len(df_TRS_TR_OneCus.columns), 'articles', [None] * len(df_TRS_TR_OneCus))\nexcept:\n    print(\"Already created\")\n","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_TRS_TR_OneCus","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">İşlem yapan her bir müşterinin aldığı ürünleri, grupladığım işlem DF inden alıp, yine aynı tabloda bulunun articles sütununa koyuyorum</font>     \n     ","metadata":{}},{"cell_type":"code","source":"def get_article_indexes(val):\n    groupArticles = df_groupedCustomerTransactions.get_group(val)['article_id'].reset_index()\n    groupArticles = groupArticles.drop(['index'],axis=1)\n    groupArticles = groupArticles.to_numpy()\n    groupArticles = np.reshape(groupArticles, groupArticles.size)\n    \n    df_TRS_TR_OneCus.loc[df_TRS_TR_OneCus['customer_id'] == val,'articles'] = ','.join(map(str, groupArticles))","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_TRS_TR_OneCus['customer_id'].apply(get_article_indexes)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Artık kullanmayacağım gereksiz değişkenlere ait sütunları kaldırıyorum.</font>          ","metadata":{}},{"cell_type":"code","source":"df_TRS_TR_OneCus = df_TRS_TR_OneCus.drop(['sales_channel_id','price','t_dat','article_id'],axis=1,errors = 'ignore')\n# df_transactionsTrain_nonDuplicates\ndf_TRS_TR_OneCus","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Yedekleme amacıyla cp oluşturuyorum. Bunu genellikle yapacağım. DF Hazır</font>\n","metadata":{}},{"cell_type":"code","source":"df_TRS_TR_OneCus_checkpoint = df_TRS_TR_OneCus.copy()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_TRS_TR_OneCus","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id='customersPrePro' style=\"color:black\" /></a>\n# Customers PreProcessing","metadata":{}},{"cell_type":"code","source":"# (PreProcessing)\ndf_customers_root_PreProcessing_checkpoint  = df_customers_root.copy()\ndf_customers_root","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">postal_code değişkenini kullanmayacağım için kaldırıyorum</font>","metadata":{}},{"cell_type":"code","source":"df_customers_root = df_customers_root.drop(['postal_code'],axis=1,errors='ignore')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Boş değerler olduğunu görüyorum ve kategorik değişkenlerimi doldurmaya başlıyorum</font>","metadata":{}},{"cell_type":"code","source":"df_customers_root.isnull().sum()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for col in df_customers_root:\n    if(col == 'customer_id'):\n        continue\n    print(df_customers_root[col].unique())","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_customers_root.info()","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"df_customers_root[\"FN\"].fillna(0,inplace = True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_customers_root[\"Active\"].fillna(0,inplace = True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_customers_root[\"club_member_status\"].fillna('EMPTY',inplace = True)\ndf_customers_root['club_member_status'].replace('LEFT CLUB', 'LEFT_CLUB', inplace=True)\ndf_customers_root['club_member_status'].replace('PRE-CREATE', 'PRE_CREATE', inplace=True)\n","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_customers_root['club_member_status'].value_counts()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for col in df_customers_root:\n    if(col == 'customer_id'):\n        continue\n    print(df_customers_root[col].unique())","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_customers_root[\"fashion_news_frequency\"].fillna('EMPTY',inplace = True)\ndf_customers_root['fashion_news_frequency'].replace('NONE', 'EMPTY', inplace=True)\ndf_customers_root['fashion_news_frequency'].replace('None', 'EMPTY', inplace=True)","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for col in df_customers_root:\n    if(col == 'customer_id'):\n        continue\n    print(df_customers_root[col].unique())","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Yaş değerimde uç değerler bulunmadığı için ortalama ile doldurabilirim. Ortalama ile dolduruyorum</font>","metadata":{}},{"cell_type":"code","source":"df_customers_root[\"age\"].fillna(df_customers_root[\"age\"].mean(),inplace = True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_customers_root.isnull().sum()","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for col in df_customers_root:\n    if(col == 'customer_id'):\n        continue\n    print(df_customers_root[col].unique())","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_customers_root","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id='customersFeatureEngineering' style=\"color:black\" /></a>\n# Customers Feature Engineering","metadata":{}},{"cell_type":"code","source":"df_customers_root = pd.get_dummies(df_customers_root, columns = [\"club_member_status\"], prefix = [\"CMS\"])","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_customers_root =pd.get_dummies(df_customers_root, columns = [\"fashion_news_frequency\"], prefix = [\"FNF\"])","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_customers_root","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_customers_root.isnull().sum()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id='articlesCustomerDF' style=\"color:black\" /></a>\n# Articles-Customers DF Oluşturulması","metadata":{}},{"cell_type":"code","source":"df_merged_transactionsCustomer = pd.merge(df_transactionsTrain_root,df_customers_root,on='customer_id'\n                                         ,how='left')\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_merged_transactionsCustomer","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Satın alınan ürünleri alan kişiler için grupluyorum.</font>","metadata":{}},{"cell_type":"code","source":"df_groupedBuyingArticles = df_merged_transactionsCustomer.groupby([\"article_id\"],as_index=False)\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_merged_transactionsCustomer_checkpoint = df_merged_transactionsCustomer.copy()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_merged_transactionsCustomer.isnull().sum()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_groupedBuyingArticles[[\"price\"]].aggregate(\"mean\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"   \n<font size=\"3\">Ürünü satın alan müşterilerin özelliklerinin ort. alıyorum. Mesela 0.3 cms_active var ise, alan kişilerin \n10' undan 3 ü aktif demektir.</font>     ","metadata":{}},{"cell_type":"code","source":"# pd.set_option('display.max_rows', 50)\ndf_groupedBuyingArticles[[\"CMS_ACTIVE\",\"CMS_EMPTY\",\"CMS_LEFT_CLUB\",\"CMS_PRE_CREATE\",\n                    \"FNF_EMPTY\",\"FNF_Monthly\",\"FNF_Regularly\",]].mean()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_groupedBuyingArticles[[\"age\"]].aggregate(\"mean\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_groupedBuyingArticles[[\"FN\"]].aggregate(\"mean\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_groupedBuyingArticlesValues = df_groupedBuyingArticles[[\"price\"]].aggregate(\"mean\")\ncacheArr = df_groupedBuyingArticles[[\"customer_id\"]].count().sort_values('customer_id', ascending=False)\ncacheArr2 = df_groupedBuyingArticles[[\"FN\"]].aggregate(\"mean\")\ncacheArr3 = df_groupedBuyingArticles[[\"Active\"]].aggregate(\"mean\")\ncacheArr4 = df_groupedBuyingArticles[[\"age\"]].aggregate(\"mean\")\ncacheArr5 = df_groupedBuyingArticles[[\"CMS_ACTIVE\",\"CMS_EMPTY\",\"CMS_LEFT_CLUB\",\"CMS_PRE_CREATE\",\n                    \"FNF_EMPTY\",\"FNF_Monthly\",\"FNF_Regularly\",]].mean()\ndf_groupedBuyingArticlesValues = pd.merge(df_groupedBuyingArticlesValues,cacheArr, how='outer')\ndf_groupedBuyingArticlesValues = pd.merge(df_groupedBuyingArticlesValues,cacheArr2, how='outer')\ndf_groupedBuyingArticlesValues = pd.merge(df_groupedBuyingArticlesValues,cacheArr3, how='outer')\ndf_groupedBuyingArticlesValues = pd.merge(df_groupedBuyingArticlesValues,cacheArr4, how='outer')\ndf_groupedBuyingArticlesValues = pd.merge(df_groupedBuyingArticlesValues,cacheArr5, how='outer').sort_values('customer_id', ascending=False)\n\ndf_groupedBuyingArticlesValues\n\n\n\n","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Iki dataframe hazır hale geldi.</font>","metadata":{}},{"cell_type":"code","source":"display(df_TRS_TR_OneCus)\ndisplay(df_groupedBuyingArticlesValues)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Şimdi bu ürünleri alan kişilerin diğer aldığı ürünlerin özelliklerini gösteren DF oluşturacağım</font>","metadata":{}},{"cell_type":"markdown","source":"<a id='articlesPreProcessing' style=\"color:black\" /></a>\n# Articles PreProcessing","metadata":{}},{"cell_type":"code","source":"df_merged_transactionsCustomer","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_articles_root.isnull().sum()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Ürün açıklamalarını ve resimleri kullanmayacağım. Çünkü ürün tablosundaki detay benim için fazlasıyla yeterli.</font>","metadata":{}},{"cell_type":"code","source":"df_articles_root = df_articles_root.drop(['detail_desc'],axis=1, errors = 'ignore')\ndf_articles_root","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_articles_all = df_articles_root.copy()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for col in df_articles_all:\n#     print(col)\n    if(col == 'article_id' ):\n        continue\n    print(col)\n    print(df_articles_all[col].unique())\n    print(df_articles_all[col].unique().size)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"\n<font size=\"3\">Promotion/ Other /Offer değerine ait iki name değişkenim var. Bu durumu düzeltiyorum</font>","metadata":{}},{"cell_type":"code","source":"df_articles_all.loc[df_articles_all.department_name == 'Promotion/ Other /Offer','department_name'] = \"PromotionOtherOffer\"\ndf_articles_all.loc[df_articles_all.department_name == 'Promotion/Other/Offer','department_name'] = \"PromotionOtherOffer\"\n","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for col in df_articles_all:\n#     print(col)\n    if(col == 'article_id' ):\n        continue\n    print(col)\n    print(df_articles_all[col].unique())\n    print(df_articles_all[col].unique().size)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"\n<font size=\"3\">Burada bulunan ürün kodu gibi değerler _name olarak kategorik şekilde ifade edildiği için kaldırabilirim. o yüzden kaldırıyorum.</font>","metadata":{}},{"cell_type":"code","source":"df_articles_all = df_articles_all.drop(['product_code','product_type_no','graphical_appearance_no',\n                                     'colour_group_code','perceived_colour_value_id',\n                                     'perceived_colour_master_id','department_no',\n                                     'index_group_no','index_code','section_no','garment_group_no'],axis=1,errors='ignore')\n\ndf_articles_all","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Buradaki değişkenler ile dummies değişken oluşturacağım için içinde kabul edilmeyen ifadeler olmaması gerekiyor. o yüzden bu harfleri kaldırıyorum.</font>","metadata":{}},{"cell_type":"code","source":"import re\ncache_df = df_articles_all.copy()\nfor col in cache_df:\n    if(col.endswith(\"_name\")):\n        cache_df[col] = cache_df[col].transform(lambda x:re.sub('[^A-Za-z0-9_]+', '', x))\ndf_articles_all = cache_df\ndf_articles_all","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Ürün tablosunu şekillendirirken işlem gücü fazla gerektiği için sadece satın alınan ürünleri kullanmak için\n     tabloyu azaltıyorum. Yapmak zorunda değiliz. Sadece çok süre alacağı için böyle yaptım. Gerçek hayatta böyle\n     yapmamalıyız.</font>","metadata":{}},{"cell_type":"markdown","source":"<font size=\"3\">df_merged_transactionsCustomer içinde sadece müşteriler ve article id' leri bulunuyordu. Burada bana sadece bu tablo\n     da bulunan article id' ye sahip olan satırları getir dedik. 100000 satır kadar kazanç sağladım</font>","metadata":{}},{"cell_type":"code","source":"df_reduced_article = df_articles_all[df_articles_all['article_id'].isin(df_merged_transactionsCustomer['article_id'])]\ndf_reduced_article","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id='articlesCustomerValuesDF' style=\"color:black\" /></a>\n# ArticlesCustomerValues DF' leri Oluşturulması","metadata":{}},{"cell_type":"code","source":"df_TransactionsForArticles = df_merged_transactionsCustomer.copy()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Satın alınan her ürünün 1 kere olduğu DF mi oluşturuyorum</font>","metadata":{}},{"cell_type":"code","source":"df_transactionsOnlyOneArt = df_TransactionsForArticles.drop_duplicates(subset=['article_id'])","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_transactionsArtGrouped = df_TransactionsForArticles.groupby([\"article_id\"],as_index=False)\n","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Görüldüğü üzere ikisinin de eleman sayısı aynı</font>","metadata":{}},{"cell_type":"code","source":"pd.set_option('display.max_colwidth', 50)\ndisplay(df_transactionsOnlyOneArt[['article_id']])\ndisplay(df_transactionsOnlyOneArt)","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"\n<font size=\"3\">Her bir ürünü alan müşterilerin diğer aldığı ürünleri getiren DF oluşturduk. base_article_id bizim ana ürünümüzün id' si oluyor. Diğer sütunlar o ürünü almış olan müşterilerin diğer aldığı ürünleri gösteriyor</font>","metadata":{}},{"cell_type":"code","source":"\nclass Articles:\n    df_articles = None\n    df_articleAndCustomerMost = None\n    \n    # o ürünü alan müşterinin aldığı ürünleri getirir.\n    \n    def get_customer_most(self,val):\n        \n        articles = df_TRS_TR_OneCus[df_TRS_TR_OneCus.customer_id == val]['articles'].to_numpy()\n        articles = np.fromstring(articles[0], dtype=np.int64, sep=',')\n        articles = np.int64(articles)\n        return df_reduced_article[df_reduced_article['article_id'].isin(articles)]\n\n\n     # ürünü alan müşterilen aldığı ürünleri getirip ana ürün id' si ile birleştirir.\n    \n    def get_article_customers(self,val):\n        self.df_articles = pd.DataFrame()\n        vals = df_transactionsArtGrouped.get_group(int(val))\n        i = 0\n    \n        for customer_id in vals['customer_id']:\n            two = self.get_customer_most(customer_id)\n            \n            if(self.df_articles.empty):\n                self.df_articles = two\n            else:\n                self.df_articles = pd.concat([self.df_articles,two])\n        \n        self.df_articles.insert(0, 'base_article_id', val)\n        if(self.df_articleAndCustomerMost.empty):\n            self.df_articleAndCustomerMost = self.df_articles.copy(deep=True)\n        else:\n            self.df_articleAndCustomerMost = pd.concat([self.df_articleAndCustomerMost,self.df_articles])\n            \n                        \n                \n    def build(self,arr,head):\n        self.df_articleAndCustomerMost = pd.DataFrame()\n        if(head == 0):\n            arr.apply(self.get_article_customers)\n        else:\n            arr.head(head).apply(self.get_article_customers)\n        \n        \n\na = Articles()             \na.build(df_transactionsOnlyOneArt['article_id'],0)\n\ndisplay(a.df_articleAndCustomerMost)\n                                                              ","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"\n<font size=\"3\">Yedek alıp, sınıf değişkenimizi dışarıya alıyorum.</font>","metadata":{}},{"cell_type":"code","source":"df_articleAndCustomerMost_checkpoint = a.df_articleAndCustomerMost.copy()\ndf_articleAndCustomerMost = a.df_articleAndCustomerMost\ndf_articleAndCustomerMost","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_articleAndCustomerMost.info()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Ana ürün id bilgisine göre alınmış olan ürünleri grupluyorum.</font>","metadata":{}},{"cell_type":"code","source":"df_articleAndCustomerMost_Grouped = df_articleAndCustomerMost.groupby([\"base_article_id\"],as_index=False)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Mesela \"355569001\" id sine sahip olan ürünümüzü alan müşterilerin diğer almış oldukları ürünler</font>","metadata":{}},{"cell_type":"code","source":"df_articleAndCustomerMost_Grouped.get_group(355569001)","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Ana ürüne özellik bulacağım için onun DF' ini oluşturuyorum</font>","metadata":{}},{"cell_type":"code","source":"df_baseArticleOnly = df_articleAndCustomerMost.drop_duplicates(subset=['base_article_id'])\ndf_baseArticleOnly","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"\n<font size=\"3\">Ana ürünün yanında alınmış olan ürünlerin en çok tekrar eden özelliklerini alıp, bunu df_baseArticleOnly ile oluşturduğum df ile birleştiriyorum. isimlerinin başına most_ prefix ini ekliyorum</font>","metadata":{}},{"cell_type":"markdown","source":"<font size=\"3\">Bunu customers tablosu ile birleştireceğim için base_article_id ismini article_id olarak değiştiriyorum</font>","metadata":{}},{"cell_type":"code","source":"class ArticleGroup:\n    \n    \n    df_article_most = None\n    base_arr = None;\n    columns = None;\n        \n   \n    def iteration(self,base_article_id,grouped_arr):\n        values = np.array([])\n        group_arr = grouped_arr.get_group(base_article_id)\n        \n        \n        for col in group_arr:\n            if(col == 'base_article_id' or col == 'article_id'):\n                continue\n            values = np.append(values, group_arr[col].value_counts().index[0])\n        values = np.insert(values,0,base_article_id)\n        \n        cache_df = pd.DataFrame([values], columns=self.columns)\n        \n        if(self.df_article_most.empty):\n            self.df_article_most = cache_df\n        else:          \n            self.df_article_most = pd.concat([self.df_article_most,cache_df])\n            \n    def build(self,arr,grouped_arr):\n        self.df_article_most = pd.DataFrame()\n        self.base_arr = arr\n        self.columns = self.base_arr.columns.tolist()\n        self.columns = ['most_' + sub for sub in self.columns]\n        del self.columns[1]\n        self.columns[0] = 'article_id'\n\n        for base_article_id in arr['base_article_id']:\n         \n            self.iteration(base_article_id,grouped_arr)\n       \n\n        \nb = ArticleGroup()\nb.build(df_baseArticleOnly,df_articleAndCustomerMost_Grouped)\nb.df_article_most\n\n\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_oneArticleMost = b.df_article_most","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_oneArticleMost.columns","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Örnek olarak 685687003 numaralı id' ye sahip ürünü alan kişilerin yanında aldığı ürünlerin en çok tekrar eden özellikleri</font>","metadata":{}},{"cell_type":"code","source":"df_oneArticleMost[df_oneArticleMost['article_id'] == \"685687003\"]","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"\n\n<font size=\"3\">Örnek olarak 685687004 numaraları ürünü alan kişiler 520 farklı ürün daha almış</font>","metadata":{}},{"cell_type":"code","source":"df_articleAndCustomerMost_Grouped['article_id'].count().sort_values('article_id', ascending=False)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"\n<font size=\"3\">  Elimizde 4 tane DF oluştu; <br>\n    <br>\n                 1. Müşteriler ve almış oldukları ürünlerin olduğu DF.<br>\n                 2. Ürünler ve onu almış olan müşterilerin özelliklerinin olduğu DF<br>\n                 3. Bir ürünü almış olan müşterilerin yanında almış olduğu ürünlerin özelliklerinin olduğu DF<br>\n                 4. Model değerlerimizi oluşturma aşamasında eksik değerleri doldurmak için kullanacağımız DF<br>\n</font>     ","metadata":{}},{"cell_type":"code","source":"display(df_TRS_TR_OneCus)\ndisplay(df_groupedBuyingArticlesValues)\ndisplay(df_oneArticleMost)\ndisplay(df_articles_all)","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id='articlesDFMerge' style=\"color:black\" /></a>\n# ArticlesCustomerValues ile ArticlesMost DF' lerini birleştirilmesi","metadata":{}},{"cell_type":"markdown","source":"<font size=\"3\">Şimdi sınıflandırma işlemleri için 2. ve 3. DF mizi birleştirmeye başlayalım</font>","metadata":{}},{"cell_type":"code","source":"df_oneArticleMost['article_id']=df_oneArticleMost['article_id'].astype('int64')\n\ndf_all_values = pd.merge(df_groupedBuyingArticlesValues,df_oneArticleMost,on='article_id'\n                         ,how='left')\ndf_all_values_CP = df_all_values.copy()\ndf_all_values","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id='articlesDFFeatureEngineering' style=\"color:black\" /></a>\n# Articles DF' leri Feature Eng.","metadata":{}},{"cell_type":"markdown","source":"<font size=\"3\">Şimdi elimizde her bir ürünün, onu almış olan müşterilerin özellikleri ve yanında almış olduğu ürünlerin \n     özelliklerinin olduğu DF bulunuyor</font>","metadata":{}},{"cell_type":"markdown","source":"\n<font size=\"3\">Modelimiz değişkenlerini standartlaştırma işlemine sokuyorum. Buraya kadar geldiyseniz bunları anlatmama gerek olduğunu düşünmüyorum. :)</font>","metadata":{}},{"cell_type":"code","source":"from sklearn import preprocessing \npd.set_option('display.float_format', lambda x: '%.2f' % x)\nnp.set_printoptions(formatter={'float': lambda x: \"{0:0.6f}\".format(x)})","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"\n<font size=\"3\">Burada min, max değerleri saklamamın nedeni, bir müşteri için sınıfını istediğimde yaşını ve fiyatını normalleştirirken bu değerler lazım olacağındandır</font>","metadata":{}},{"cell_type":"code","source":"max_age = df_all_values['age'].max()","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"min_age = df_all_values['age'].min()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"max_price = df_all_values['price'].max()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"min_price = df_all_values['price'].min()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cache = np.array(df_all_values.loc[:,'age']).reshape(-1, 1)\nscaler = preprocessing.MinMaxScaler(feature_range = (0,1))\ndf_all_values['age'] = scaler.fit_transform(cache)\ndisplay(scaler.fit_transform(cache))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ncache = np.array(df_all_values.loc[:,'price']).reshape(-1, 1)\nscaler = preprocessing.MinMaxScaler(feature_range = (0,1))\ndf_all_values['price'] = scaler.fit_transform(cache)\ndisplay(scaler.fit_transform(cache))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Article id değerini modelde kullanmayacağımdan ve ürünün hangi sınıfa girdiğini görmek istediğimden article\n     id değerini index yapıyorum</font>","metadata":{}},{"cell_type":"code","source":"df_all_values = df_all_values.set_index('article_id')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_all_values","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Ürün adı değeri her ürün için değişken olduğundan bize bir fayda sağlamayacaktır. Ürünün satın alma adedi de modelimiz için kullanmayacağımızdan onları kaldırıyorum.</font>","metadata":{}},{"cell_type":"code","source":"df_all_values_IncCustomerPrirce = df_all_values.copy()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_all_values_CP2 = df_all_values.copy()\n\ndf_all_values = df_all_values.drop(['customer_id'],axis=1)\ndf_all_values = df_all_values.drop(['most_prod_name'],axis=1)\ndf_all_values\n\n","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Tüm kategorik değişkenlerimin adları</font>","metadata":{}},{"cell_type":"code","source":"for col in df_all_values:\n    if(col == 'price' or col == 'age' or col == 'CMS_ACTIVE' or col == 'CMS_EMPTY'\n       or col == 'CMS_LEFT_CLUB' or col == 'CMS_PRE_CREATE' or col == 'FNF_EMPTY'\n       or col == 'FNF_Monthly' or col == 'FNF_Regularly'):\n        continue\n    print(col)\n    print(df_all_values[col].unique())","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_all_values.columns","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Dummies değişkenleri oluşturuyorum</font>","metadata":{}},{"cell_type":"markdown","source":"<font size=\"3\">Dummies değişkenleri oluşturma aşamasında 'drop=First' yapmamanın nedeni, müşteri için tahmin <br> yapıldığında,tekrardan dummies değişken oluşturma aşamasında buradaki değişken bilgisinin korunamamasıdır. Yani burada<br>\n               kaldırılan bir değişken, tahmin aşamasında tablomda olabilir. Bundan dolayı kaldırmıyorum.<br>\n</font>","metadata":{}},{"cell_type":"code","source":"df_all_values = pd.get_dummies(df_all_values, columns = [\"most_product_type_name\"], prefix = [\"MPTN\"])\ndf_all_values = pd.get_dummies(df_all_values, columns = [\"most_product_group_name\"], prefix = [\"MPGN\"])\ndf_all_values = pd.get_dummies(df_all_values, columns = [\"most_graphical_appearance_name\"], prefix = [\"GAN\"])\ndf_all_values = pd.get_dummies(df_all_values, columns = [\"most_colour_group_name\"], prefix = [\"CGN\"])\ndf_all_values = pd.get_dummies(df_all_values, columns = [\"most_perceived_colour_value_name\"], prefix = [\"PCVN\"])\ndf_all_values = pd.get_dummies(df_all_values, columns = [\"most_perceived_colour_master_name\"], prefix = [\"PCMN\"])\ndf_all_values = pd.get_dummies(df_all_values, columns = [\"most_department_name\"], prefix = [\"DN\"])\ndf_all_values = pd.get_dummies(df_all_values, columns = [\"most_index_name\"], prefix = [\"IN\"])\ndf_all_values = pd.get_dummies(df_all_values, columns = [\"most_index_group_name\"], prefix = [\"IGN\"])\ndf_all_values = pd.get_dummies(df_all_values, columns = [\"most_section_name\"], prefix = [\"SN\"])\ndf_all_values = pd.get_dummies(df_all_values, columns = [\"most_garment_group_name\"], prefix = [\"GGN\"])\n\ndf_articles_all = pd.get_dummies(df_articles_all, columns = [\"product_type_name\"], prefix = [\"MPTN\"])\ndf_articles_all = pd.get_dummies(df_articles_all, columns = [\"product_group_name\"], prefix = [\"MPGN\"])\ndf_articles_all = pd.get_dummies(df_articles_all, columns = [\"graphical_appearance_name\"], prefix = [\"GAN\"])\ndf_articles_all = pd.get_dummies(df_articles_all, columns = [\"colour_group_name\"], prefix = [\"CGN\"])\ndf_articles_all = pd.get_dummies(df_articles_all, columns = [\"perceived_colour_value_name\"], prefix = [\"PCVN\"])\ndf_articles_all = pd.get_dummies(df_articles_all, columns = [\"perceived_colour_master_name\"], prefix = [\"PCMN\"])\ndf_articles_all = pd.get_dummies(df_articles_all, columns = [\"department_name\"], prefix = [\"DN\"])\ndf_articles_all = pd.get_dummies(df_articles_all, columns = [\"index_name\"], prefix = [\"IN\"])\ndf_articles_all = pd.get_dummies(df_articles_all, columns = [\"index_group_name\"], prefix = [\"IGN\"])\ndf_articles_all = pd.get_dummies(df_articles_all, columns = [\"section_name\"], prefix = [\"SN\"])\ndf_articles_all = pd.get_dummies(df_articles_all, columns = [\"garment_group_name\"], prefix = [\"GGN\"])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_all_values","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Müşteri bilgileri oluşturulduğunda eksik kalan sütunların doldurulması için tüm sütunların bulunduğu <br> df_articles_all df' ini oluşturduk. Yukarıda anlatmış olduğum sebepten dolayı.</font>","metadata":{}},{"cell_type":"code","source":"df_articles_all = df_articles_all.set_index('article_id')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_articles_all = df_articles_all.drop(['prod_name'],axis=1)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_articles_all","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Eksik kalan sütunları doldurmak ve olmayanları oluşturmak için kullanacağım bilgilerimi oluşturdum.\n               Bu verinin kullanımını ilerleyen blokta yapacağım.</font>","metadata":{}},{"cell_type":"code","source":"temp_articles = df_articles_all.reset_index(drop=True).copy()\nexample_modelData = temp_articles.iloc[:1].copy()\nexample_modelData.loc[:] = 0\nexample_modelData","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"example_modelData","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"example_data = pd.concat([example_modelData]*df_all_values.shape[0])\ndifferent_cols = example_data.columns.difference(df_all_values.columns)\nexample_data = example_data[different_cols]\nexample_data = example_data.reset_index(drop=True)\ndf_all_values.reset_index(inplace=True)\ndf_all_values = pd.concat([df_all_values,example_data],axis=1)\ndf_all_values = df_all_values.set_index('article_id',drop=True)\ndf_all_values    ","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">  Elimizde 5 tane DF oluştu; <br>\n    <br>\n                 1. Müşteriler ve almış oldukları ürünlerin olduğu DF.<br>\n                 2. Ürünler ve onu almış olan müşterilerin özelliklerinin olduğu DF<br>\n                 3. Bir ürünü almış olan müşterilerin yanında almış olduğu ürünlerin özelliklerinin olduğu DF<br>\n                 4. Model değerlerimizi oluşturma aşamasında eksik değerleri doldurmak için kullanacağımız DF<br>\n                 5. Modelleştirme aşamasında kullancağım DF <br>\n</font>     ","metadata":{}},{"cell_type":"code","source":"display(df_TRS_TR_OneCus)\ndisplay(df_groupedBuyingArticlesValues)\ndisplay(df_oneArticleMost)\ndisplay(df_articles_all)\ndisplay(df_all_values)","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"\n<a id='classification' style=\"color:black\" /></a>\n# Sınıflandırma İşlemleri","metadata":{}},{"cell_type":"markdown","source":"\n<font size=\"3\">Kümeleme işlemi yapacağız ama çok fazla değişkenimiz olduğu için bunları indirgiyorum. İndirdiğim değişkenlerim ile küme sayısını bulacağım.</font>","metadata":{}},{"cell_type":"code","source":"from sklearn.decomposition import PCA\nfrom sklearn.preprocessing import scale \nfrom sklearn.metrics import mean_squared_error, r2_score\nimport statsmodels.formula.api as smf\nfrom sklearn.cluster import KMeans\nfrom yellowbrick.cluster import KElbowVisualizer\nfrom sklearn.model_selection import train_test_split, GridSearchCV, cross_val_score\nfrom sklearn.metrics import confusion_matrix, accuracy_score, classification_report\nfrom sklearn.metrics import roc_auc_score,roc_curve\nfrom sklearn import preprocessing ","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = df_all_values.copy()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Ilk olarak 19 değişken diye başlangıç değeri verdim sonuçlara bakalım</font>","metadata":{}},{"cell_type":"code","source":"pca = PCA(n_components=19)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_reduced_train = pca.fit_transform(X)\nprint(pca.explained_variance_ratio_)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Değerlerimiz çok az çıktı yükseltiyorum</font>","metadata":{}},{"cell_type":"code","source":"pca = PCA(n_components=400)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_reduced_train = pca.fit_transform(X)\n# print(pca.explained_variance_ratio_)\nprint(np.cumsum(np.round(pca.explained_variance_ratio_, decimals = 4)*100)[0:135])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">135 değişken ile %95 oranında varyansı açıklayabiliyorum. Bu değeri kullanacağım</font>","metadata":{}},{"cell_type":"code","source":"pca = PCA(n_components=135)\nX_reduced_train = pca.fit_transform(X)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">TR - Örnek olarak 1. satır değişkenlerimin PCA sonrası değerleri</font>","metadata":{}},{"cell_type":"code","source":"X_reduced_train[0:1,:]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Ürünlerimi kümlere ayırıyorum</font>","metadata":{}},{"cell_type":"code","source":"kmeans = KMeans()\nvisualizer = KElbowVisualizer(kmeans, k=(2,100))\nvisualizer.fit(X_reduced_train) \nvisualizer.poof()  ","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Elbow ile ideal küme sayısını bulabiliriz. Yöntem bize 31 değerinin ideal küme sayısı olduğunu bildiriyor. 31 değerini seçiyorum. Dosyayı buraya yükleyip çalıştırdığım zaman farklı değerler olabiliyor. Ben yaptığımda 31 buldum. Siz burada gördüğünüz k değerini kabul edin.</font>","metadata":{}},{"cell_type":"code","source":"kmeans = KMeans()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cluster = KMeans(n_clusters = 31)\nk_fit = kmeans.fit(X_reduced_train)\ncluster = k_fit.labels_\ncluster","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X['cluster'] = cluster","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_all_values_clustered_checkpoint = X.copy()\ndf_all_values_clustered = X.copy()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">\n     Şöyle diyoruz;\n     A kişisu şu özelliklere sahip olarak X ürününü alıyor.\n     Algoritmada kişileri grupluyor ve şunu söylüyor.\n     Senin özelliklerin Y ürününü alan kişiye benziyor.\n     Y ürününü seversinz</font>","metadata":{}},{"cell_type":"code","source":"df_all_values_clustered","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Ürün, küme sayısı ve alınma sayısını gösteren DF oluşturuyorum. Tahmin aşamasında kullanacağım</font>","metadata":{}},{"cell_type":"code","source":"# df_all_values_clustered['']\ndf_article_cluster = pd.DataFrame({\n    'cluster' : df_all_values_clustered['cluster']\n})\ndf_article_cluster = df_article_cluster.reset_index()\ndf_article_cluster\n\n\ndf_article_cluster = pd.merge(df_article_cluster,df_groupedBuyingArticlesValues.loc[:,['customer_id','article_id']],on='article_id'\n                                         ,how='left')\ncolumns = df_article_cluster.columns.tolist()\ncolumns[2] = 'buying_count'\ndf_article_cluster.columns = columns\ndf_article_cluster\n","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Şimdi modelimi kurmak için Train-Test değerlerimi oluşturuyorum</font>","metadata":{}},{"cell_type":"code","source":"X = df_all_values_clustered.drop(['cluster'] , axis=1)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y = df_all_values_clustered['cluster']","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train, X_test, y_train, y_test = train_test_split(X, \n                                                    y, \n                                                    test_size=0.25, \n                                                    random_state=42)\n\nprint(\"X_train\", X_train.shape)\n\nprint(\"y_train\",y_train.shape)\n\nprint(\"X_test\",X_test.shape)\n\nprint(\"y_test\",y_test.shape)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id='model' style=\"color:black\" /></a>\n# Model Oluşturma Aşamaları","metadata":{}},{"cell_type":"markdown","source":"<font size=\"3\">Model Oluşturuyorum. LightGBM kullanacağım. Performans bakımından bilgisayarıma en uygunu bu/font>","metadata":{}},{"cell_type":"code","source":"from lightgbm import LGBMClassifier","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lgbm_model = LGBMClassifier().fit(X_train, y_train)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred = lgbm_model.predict(X_test)\naccuracy_score(y_test, y_pred)","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Değerimizin çok iyi çıkması beni şaşırttı. Ben alışkanlık olduğu için genede bir model tuning yapacağım</font>","metadata":{}},{"cell_type":"code","source":"# Example\n# lgbm_params = {\n#         'n_estimators': [100, 500, 1000, 2000],\n#         'subsample': [0.6, 0.8, 1.0],\n#         'max_depth': [3, 4, 5,6],\n#         'learning_rate': [0.1,0.01,0.02,0.05],\n#         \"min_child_samples\": [5,10,20]}","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lgbm_params = {\n        'n_estimators': [100, 500],\n        'subsample': [0.6],\n        'max_depth': [3, 4],\n        'learning_rate': [0.02,0.05],\n        \"min_child_samples\": [10,20]}","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lgbm = LGBMClassifier()\n\nlgbm_cv_model = GridSearchCV(lgbm, lgbm_params, \n                             cv = 10, \n                             n_jobs = -1, \n                             verbose = 2)\n\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lgbm_cv_model.fit(X_train, y_train)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"{'learning_rate': 0.02,\n 'max_depth': 4,\n 'min_child_samples': 20,\n 'n_estimators': 500,\n 'subsample': 0.6}","metadata":{}},{"cell_type":"code","source":"lgbm_cv_model.best_params_","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Çok az bir miktarda değerimizi yükselttik.</font>","metadata":{}},{"cell_type":"code","source":"y_pred = lgbm_cv_model.predict(X_test)\naccuracy_score(y_test, y_pred)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Şu ana kadar hazıladığımız DF' ler.</font>","metadata":{}},{"cell_type":"code","source":"display(df_TRS_TR_OneCus)\ndisplay(df_groupedBuyingArticlesValues)\ndisplay(df_oneArticleMost)\ndisplay(df_all_values)\ndisplay(df_articles_all)\ndisplay(df_article_cluster)\n","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id='customerSubmission' style=\"color:black\" /></a>\n# Tahmin İşlemleri\n","metadata":{}},{"cell_type":"markdown","source":"<font size=\"3\">Tahmin aşamasına geçiyoruz</font>","metadata":{}},{"cell_type":"markdown","source":"<font size=\"3\">Bir müşterinin tahmin aşamasınadaki bilgilerini oluşturmak için kullanacağım DF' i hazırlıyorum. Bunu<br>\n               hazırlamayak df_customer_root ile de yapabilirdik.</font>","metadata":{}},{"cell_type":"code","source":"df_customersWithProperties = pd.merge(df_transactionsTrain_root,df_customers_root,on='customer_id'\n                                         ,how='left')\ndf_customersWithProperties = df_customersWithProperties.sort_values('t_dat', ascending=False)\ndf_customersWithProperties","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Örnek olarak bir müşterinin aldığı ürünlerin çekilmesi</font>","metadata":{}},{"cell_type":"markdown","source":"<font size=\"3\">Örnek olarak 2. satırdaki müşterimi kullanacağım</font>","metadata":{}},{"cell_type":"code","source":"df_TRS_TR_OneCus.iloc[2,:]['customer_id']","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"articles = df_TRS_TR_OneCus.iloc[2,:]['articles']\narticles = articles.split(',')\ndisplay(articles)\ndf_ad = pd.DataFrame(articles,columns = ['articles'])\ndisplay(df_ad)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_ad['articles']=df_ad['articles'].astype('int64')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_reduced_article[df_reduced_article['article_id'].isin(df_ad['articles'].to_numpy())]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Bir müşterinin tahmin aşamasında kullanacağım aldığı ürün bilgilerini hazırlayan sınıfımı oluşturuyorum</font>","metadata":{}},{"cell_type":"code","source":"\n\nclass CustomerMostArticles:\n    \n    df_base = None\n    df_customersWithArticlesList = None\n    df_reduced_article = None\n    customer_id = None\n    \n    def __init__(self,customer_id,customersWithArticlesList,article_list):\n        self.customer_id = customer_id;\n        self.customersWithArticlesList = customersWithArticlesList.copy()\n        self.df_reduced_article = article_list.copy()\n        \n        \n        \n    def build(self):\n\n    \n        row = self.customersWithArticlesList[self.customersWithArticlesList['customer_id'] == self.customer_id]\n\n        df_first = None\n        df_others = None\n        df_others_grouped = None\n        df_customersWithArticlesList = None\n        customerArticles = self.customerArticles(row)\n        customerArticlesDetails = self.getCustomerArticlesDetails(customerArticles)\n        customerArticlesDetails = self.dropRedundant(customerArticlesDetails)\n            \n#         print(customerArticlesDetails.shape)\n        if(customerArticlesDetails.shape[0] == 1):\n            \n            df_first  = customerArticlesDetails.iloc[0:1]\n            df_first = self.createFirst(df_first)\n            df_first = df_first.reset_index(drop=True)\n            return df_first\n        else:\n            \n            df_first  = customerArticlesDetails.iloc[0:1]\n            df_others = customerArticlesDetails[1:len(customerArticlesDetails)]\n            df_others_grouped = df_others.groupby([\"article_id\"],as_index=False)\n            df_customersMost = self.getMost(df_others)\n            df_first = self.createFirst(df_first)\n            articles = pd.concat([df_first,df_customersMost]).reset_index(drop=True)\n            return articles\n            \n            \n        \n    def customerArticles(self,row):\n        articles = row['articles'].tolist()\n        articles = articles[0].split(',')\n        for i in range(0, len(articles)):\n            articles[i] = int(articles[i])\n        return articles\n        \n        \n    def getCustomerArticlesDetails(self,articlesList):    \n               \n        return df_reduced_article[df_reduced_article['article_id'].isin(articlesList)]\n        \n    def dropRedundant(self,df):\n        return df.drop(['product_code','product_type_no','graphical_appearance_no',\n                                     'colour_group_code','perceived_colour_value_id',\n                                     'perceived_colour_master_id','department_no','prod_name',\n                                     'index_group_no','index_code','section_no','garment_group_no','detail_desc'],axis=1,errors='ignore')\n    \n    def getMost(self,others_arr):\n        df_article_most = pd.DataFrame()\n        columns = others_arr.columns.tolist()\n        del columns[0]\n        columns = ['most_' + sub for sub in columns]\n        values = np.array([])\n        for col in others_arr:\n            if(col == 'base_article_id' or col == 'article_id'):\n                continue\n            values = np.append(values, others_arr[col].value_counts().index[0])\n        cache_df = pd.DataFrame([values],columns = columns)\n        return cache_df\n    \n    def createFirst(self,first_row):\n       \n        first_row = first_row.drop(['article_id'], axis=1)\n        columns = first_row.columns.tolist()\n        first_row.columns = ['most_' + sub for sub in columns]\n        \n        values = np.array([])\n        for col in first_row:\n            \n            if(col == 'base_article_id' or col == 'article_id'):\n                continue\n            values = np.append(values, first_row[col].value_counts().index[0])\n            \n        \n        cache_df = pd.DataFrame([values],columns = first_row.columns)\n        return cache_df\n    ","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Örnek olarak bir müşterinin bilgileri</font>","metadata":{}},{"cell_type":"markdown","source":"<font size=\"3\">Örnek bir müşteri id almak - Kendiniz denemek istersiniz kullanın.</font>","metadata":{}},{"cell_type":"markdown","source":"\n<font size=\"3\">Gönderdiğiniz müşterinin head ile belirttiğim alan içerisinde olup olmadığına dikkat edin.</font>","metadata":{}},{"cell_type":"code","source":"print(df_customersWithProperties.sample().iloc[0]['customer_id'])\ndf_customersWithProperties[df_customersWithProperties.customer_id == df_customersWithProperties.sample().iloc[0]['customer_id']]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_customerArticleMost = CustomerMostArticles(\"00083cda041544b2fbb0e0d2905ad17da7cf1007526fb4c73235dccbbc132280\",\n                                              df_TRS_TR_OneCus.head(5),df_reduced_article).build()\ndf_customerArticleMost","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Bir müşterinin tahmin aşamasında kullanacağım müşteri bilgilerini hazırlayan sınıfımı oluşturuyorum</font>","metadata":{}},{"cell_type":"code","source":"class CustomerInfo:\n    \n    customerWithProperties = None\n    customersWithProperties = None\n    customer_id = None\n    \n    def __init__(self,customer_id,customersWithProperties):\n        self.customersWithProperties = customersWithProperties.copy()\n        self.customerWithProperties = customersWithProperties.drop_duplicates(subset=['customer_id'])\n        self.customer_id = customer_id\n        \n    def build(self):\n        \n        row = self.customerWithProperties[self.customerWithProperties['customer_id'] == self.customer_id]\n        customer_id = self.customer_id\n        \n#       customer_id = \"2648daf1914c9ab1404629a8dfe1f9e58ce5fdd3da5a0d00816c71ea70999825\"\n\n\n        customerData = self.customersWithProperties[self.customersWithProperties.customer_id == customer_id]\n        customerData = customerData.reset_index(drop=True)\n#         display(customerData['age'])\n        if(customerData.shape[0] > 1):\n            customerData['age'] = customerData['age'].mean()\n            customerData['price'] = customerData['price'].mean()\n        customerData = customerData.drop(['t_dat','sales_channel_id','postal_code'],axis=1,errors='ignore')\n        customerData = customerData.iloc[0:1]\n        customerData = pd.concat([customerData]*2).reset_index(drop=True)\n        return customerData\n#         display(customerData)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Örnek olarak bir müşterinin bilgileri. Neden 2 satır yaptığımızı yukarıda bildirmiştim.</font>","metadata":{}},{"cell_type":"code","source":"df_customer_info = CustomerInfo(\"2648daf1914c9ab1404629a8dfe1f9e58ce5fdd3da5a0d00816c71ea70999825\",df_customersWithProperties).build()\ndf_customer_info","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pd.set_option('display.float_format', lambda x: '%.2f' % x)\nnp.set_printoptions(formatter={'float': lambda x: \"{0:0.6f}\".format(x)})","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Örnek olarak birleştirilecek bilgi tablolarının gösterimi.</font>","metadata":{}},{"cell_type":"code","source":"df_customer_info","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_customerArticleMost","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Birleştirme işleminin yapılacağı sınıfımı hazılıyorum.</font>","metadata":{}},{"cell_type":"code","source":"class CustomerDataCreate:\n    \n    df_all_values = None\n    customer_df = None\n    articles_df = None\n    max_price = None\n    min_price = None\n    max_age = None\n    min_age = None\n    model_data = None\n    example_data = None\n    \n    def __init__(self,customer_data,articles_data,max_price,min_price,max_age,min_age,example_data):\n        \n        self.customer_df = customer_data\n        self.articles_df = articles_data\n        self.max_price = max_price\n        self.min_price = min_price\n        self.max_age = max_age\n        self.min_age = min_age\n#         self.build()\n        self.example_data = example_data\n        \n        \n        \n    def build(self):\n\n        self.df_all_values = pd.concat([self.customer_df,self.articles_df],axis=1)  \n\n        self.df_all_values['age'] = self.df_all_values['age'].apply(self.normalizeAge)\n        self.df_all_values['price'] = self.df_all_values['price'].apply(self.normalizePrice)\n        return self.df_all_values\n    \n    def createModelData(self):\n        \n        model_data = self.df_all_values.drop(['customer_id'],axis=1)\n        model_data = pd.get_dummies(model_data, columns = [\"most_product_type_name\"], prefix = [\"MPTN\"])\n        \n        model_data = pd.get_dummies(model_data, columns = [\"most_product_group_name\"], prefix = [\"MPGN\"])\n        model_data = pd.get_dummies(model_data, columns = [\"most_graphical_appearance_name\"], prefix = [\"GAN\"])\n        model_data = pd.get_dummies(model_data, columns = [\"most_colour_group_name\"], prefix = [\"CGN\"])\n        model_data = pd.get_dummies(model_data, columns = [\"most_perceived_colour_value_name\"], prefix = [\"PCVN\"])\n        model_data = pd.get_dummies(model_data, columns = [\"most_perceived_colour_master_name\"], prefix = [\"PCMN\"])\n        model_data = pd.get_dummies(model_data, columns = [\"most_department_name\"], prefix = [\"DN\"])\n        model_data = pd.get_dummies(model_data, columns = [\"most_index_name\"], prefix = [\"IN\"])\n        model_data = pd.get_dummies(model_data, columns = [\"most_index_group_name\"], prefix = [\"IGN\"])\n        model_data = pd.get_dummies(model_data, columns = [\"most_section_name\"], prefix = [\"SN\"])\n        model_data = pd.get_dummies(model_data, columns = [\"most_garment_group_name\"], prefix = [\"GGN\"])\n        \n\n        # example_modelData kullanımı\n        \n        \n        self.example_data = pd.concat([self.example_data]*2)\n\n        different_cols = self.example_data.columns.difference(model_data.columns)\n        self.example_data = self.example_data[different_cols]\n        self.example_data = self.example_data.reset_index(drop=True)\n        \n        model_data = pd.concat([model_data,self.example_data],axis=1)\n        model_data = model_data.set_index('article_id',drop=True)\n        return model_data\n\n        \n    def normalizeAge(self,val):\n        return (val-self.min_age)/(self.max_age-self.min_age)\n        \n    def normalizePrice(self,val):\n        return (val-self.min_price)/(self.max_price-self.min_price)\n        \n        \ncustomerData = CustomerDataCreate(df_customer_info,df_customerArticleMost,max_price,min_price,max_age,min_age,example_modelData)\noneCustomerData = customerData.build()\noneCustomerModelData = customerData.createModelData()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Yukarıda oluşturmuş olduğum, dummy değişken oluşturulduğunda eksik bilgileri tamamlamak için kullanacağım\n              veri gösterimi. Bu bilgi sayesinde dummy değişkenler oluşturulduktan sonra modelim için eksik kalan bilgileri\n              dolduruyorum</font>","metadata":{}},{"cell_type":"code","source":"example_modelData","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Bir müşterinin bilgilerini birleştirilmiş hali ve modele sokulacak halinin gösterimi</font>","metadata":{}},{"cell_type":"code","source":"display(oneCustomerData)","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"display(oneCustomerModelData)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Bir müşterinin örnek olarak tahmini</font>","metadata":{}},{"cell_type":"code","source":"y_pred = lgbm_cv_model.predict(oneCustomerModelData)\n# accuracy_score(y_test, y_pred)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_article_cluster[df_article_cluster.cluster == 1]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Yukarıda yazdığım tüm sınıfları birleştirip verilen müşteri bilgilerini göre tahmin yapacak ana<br>\n sınıfı yazıyorum.</font>","metadata":{}},{"cell_type":"code","source":"class createCustomerPrediction:\n    \n    \n    instance_CustomerMostArticles = None\n    instance_CustomerInfo = None\n    instance_CustomerDataCreate = None\n    model = None\n    articleWithCluster = None\n    customerWithPredictions = None\n\n    def __init__(self,CustomerMostArticles,CustomerInfo,CustomerDataCreate,model,articleWithCluster):\n        self.instance_CustomerMostArticles = CustomerMostArticles\n        self.instance_CustomerInfo = CustomerInfo\n        self.instance_CustomerDataCreate = CustomerDataCreate\n        self.articleWithCluster = articleWithCluster\n        self.model = model\n        self.customerWithPredictions = pd.DataFrame()\n    \n    def letsPrediction(self,transactionsOneCustomer,articleList,customersWithProperties,\n                      max_price,min_price,max_age,min_age,example_modelData):\n        \n        transactionsOneCustomer = transactionsOneCustomer.reset_index(drop=True)\n        \n        for index in range(len(transactionsOneCustomer.head(5))):\n            row = transactionsOneCustomer.loc[index]\n            \n            df_customerArticleMost = self.instance_CustomerMostArticles(row['customer_id'],transactionsOneCustomer\n                                                                        ,articleList).build()\n            df_customer_info = self.instance_CustomerInfo(row['customer_id'],customersWithProperties).build()\n            \n            customerData = self.instance_CustomerDataCreate(df_customer_info,\n                                              df_customerArticleMost,max_price,min_price,max_age,min_age,example_modelData)        \n            oneCustomerData = customerData.build()\n            oneCustomerModelData = customerData.createModelData()\n            prediction = self.createPrediction(oneCustomerModelData)\n\n            prediction = ','.join(map(str, prediction))\n            cache_df = pd.DataFrame([[row['customer_id'],prediction]], columns=['customer_id','predictions'])\n        \n            if(self.customerWithPredictions.empty):\n                self.customerWithPredictions = cache_df\n            else:          \n                self.customerWithPredictions = pd.concat([self.customerWithPredictions,cache_df])\n                \n                \n    def getPredictions(self):\n        self.customerWithPredictions = self.customerWithPredictions.reset_index(drop=True)\n        return self.customerWithPredictions\n    \n    def createPrediction(self,modelData):\n        prediction = self.model.predict(modelData)\n        return self.getArticles(prediction)\n    \n    def getArticles(self,prediction):\n        self.articleWithCluster\n        first_items = self.articleWithCluster[self.articleWithCluster.cluster == prediction[0]][:4]['article_id'].values\n        if(prediction[0] == prediction[1]):\n            last_items = self.articleWithCluster[self.articleWithCluster.cluster == prediction[1]][4:8]['article_id'].values\n        else:\n            last_items = self.articleWithCluster[self.articleWithCluster.cluster == prediction[1]][:3]['article_id'].values\n\n        return [*first_items,*last_items]\n            \n    \n    \n    \n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Tahminlerim :)</font>","metadata":{}},{"cell_type":"code","source":"prediction = createCustomerPrediction(CustomerMostArticles,CustomerInfo,CustomerDataCreate,lgbm_cv_model,df_article_cluster)\nprediction.letsPrediction(df_TRS_TR_OneCus,df_reduced_article,df_customersWithProperties,\n                      max_price,min_price,max_age,min_age,example_modelData)\nprediction.getPredictions()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Müşterinin almış olduğu ürünlerden oluşan tablomuz</font>","metadata":{}},{"cell_type":"code","source":"df_TRS_TR_OneCus","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"3\">Örnek olması açısından 1 müşteri için almış olduğu ürünleri ve tahminlerimizi gösterelim</font>","metadata":{}},{"cell_type":"code","source":"df_TRS_TR_OneCus.loc[0]['customer_id']","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.image as mpimg\nPATH = \"../input/h-and-m-personalized-fashion-recommendations/images/\"\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def showPrediction(customer_id,predictionsDF,transactionsDF, rows=2, columns=7, figsize=(20,10)):\n\n    predictions = predictionsDF.loc[0]['predictions'].split(\",\")\n    bought_items = transactionsDF.loc[0]['articles'].split(\",\")\n    f, ax = plt.subplots(rows, columns, figsize=figsize)\n    for i in range(rows):\n        index = 0\n        for j in range(columns):\n            if i==0:\n                try:\n                    img = mpimg.imread(f'{PATH}0{str(bought_items[index])[:2]}/0{int(bought_items[index])}.jpg')\n                    ax[i,j].imshow(img)\n                    ax[i,j].set_xticks([], [])\n                    ax[i,j].set_yticks([], [])\n                    ax[i,j].grid(False)\n                    ax[i,j].set_title(\"Bought\")\n                    index += 1\n                except IndexError:\n                    continue\n            else:\n                try:\n                    img = mpimg.imread(f'{PATH}0{str(predictions[index])[:2]}/0{int(predictions[index])}.jpg')\n                    ax[i,j].imshow(img)\n                    ax[i,j].set_xticks([], [])\n                    ax[i,j].set_yticks([], [])\n                    ax[i,j].grid(False)\n                    ax[i,j].set_title(\"Prediction\")\n                    index += 1\n                except IndexError:\n                    continue\n                        \n    plt.tight_layout()\n    plt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"showPrediction(\"000058a12d5b43e67d225668fa1f8d618c13dc232df0cad8ffe7ad4a1091e318\",prediction.getPredictions(),df_TRS_TR_OneCus)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"4\"> Okuduğunuz için teşekkürler. :)</font>","metadata":{}},{"cell_type":"markdown","source":"<font size=\"4\"> Ek Not : </font>\n<font size=\"4\"> Tahmin bilgilerini güzelleştirmek için bir çok kütüphane ve yöntem bulunmaktadır. Bu örneğin amacı algoritmasını ve yapısını kendimizin kurmuş olduğu bir yapı ile çözüm gerçekleştirmektir.</font>","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}