├── README.md ├── meli2021 ├── 19_xgb_barely_tuned_yt.ipynb ├── 32_baseline_yt.ipynb ├── 61_active_model_yt.ipynb ├── README └── utils.py └── multiple_time_series ├── README └── workshop_notebook.ipynb /README.md: -------------------------------------------------------------------------------- 1 | # english_tutorials -------------------------------------------------------------------------------- /meli2021/19_xgb_barely_tuned_yt.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "75638528-4609-4ee2-93c9-28538579e471", 7 | "metadata": {}, 8 | "outputs": [], 9 | "source": [ 10 | "import pandas as pd\n", 11 | "import numpy as np\n", 12 | "import utils\n", 13 | "\n", 14 | "from sklearn.model_selection import GroupKFold, KFold\n", 15 | "from sklearn.linear_model import LinearRegression\n", 16 | "from sklearn.ensemble import RandomForestRegressor\n", 17 | "from sklearn.metrics import mean_squared_error\n", 18 | "from xgboost import XGBRegressor\n", 19 | "import tweedie\n", 20 | "\n", 21 | "\n", 22 | "from importlib import reload\n", 23 | "reload(utils)\n", 24 | "from skopt import gp_minimize" 25 | ] 26 | }, 27 | { 28 | "cell_type": "code", 29 | "execution_count": 2, 30 | "id": "3be069d6-c17e-43a2-8252-2acf5e9c26ad", 31 | "metadata": {}, 32 | "outputs": [], 33 | "source": [ 34 | "train = pd.read_parquet(\"./train/0.parquet\")\n", 35 | "train['date'] = pd.to_datetime(train['date'])\n", 36 | "train['fold'] = train['date'].dt.month" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 3, 42 | "id": "b9975ad7-ff3a-4b58-9d4c-b1435d0c5535", 43 | "metadata": {}, 44 | "outputs": [ 45 | { 46 | "data": { 47 | "text/html": [ 48 | "
\n", 49 | "\n", 62 | "\n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | "
skudatesold_quantitycurrent_pricecurrencylisting_typeshipping_logistic_typeshipping_paymentminutes_activeitem_domain_idsite_idfold
04648012021-02-010156.78REAclassicfulfillmentfree_shipping1440.0MLB-NEBULIZERSMLB2
14648012021-02-020156.78REAclassicfulfillmentfree_shipping1440.0MLB-NEBULIZERSMLB2
24648012021-02-030156.78REAclassicfulfillmentfree_shipping1440.0MLB-NEBULIZERSMLB2
34648012021-02-040156.78REAclassicfulfillmentfree_shipping1440.0MLB-NEBULIZERSMLB2
44648012021-02-051156.78REAclassicfulfillmentfree_shipping1440.0MLB-NEBULIZERSMLB2
\n", 158 | "
" 159 | ], 160 | "text/plain": [ 161 | " sku date sold_quantity current_price currency listing_type \\\n", 162 | "0 464801 2021-02-01 0 156.78 REA classic \n", 163 | "1 464801 2021-02-02 0 156.78 REA classic \n", 164 | "2 464801 2021-02-03 0 156.78 REA classic \n", 165 | "3 464801 2021-02-04 0 156.78 REA classic \n", 166 | "4 464801 2021-02-05 1 156.78 REA classic \n", 167 | "\n", 168 | " shipping_logistic_type shipping_payment minutes_active item_domain_id \\\n", 169 | "0 fulfillment free_shipping 1440.0 MLB-NEBULIZERS \n", 170 | "1 fulfillment free_shipping 1440.0 MLB-NEBULIZERS \n", 171 | "2 fulfillment free_shipping 1440.0 MLB-NEBULIZERS \n", 172 | "3 fulfillment free_shipping 1440.0 MLB-NEBULIZERS \n", 173 | "4 fulfillment free_shipping 1440.0 MLB-NEBULIZERS \n", 174 | "\n", 175 | " site_id fold \n", 176 | "0 MLB 2 \n", 177 | "1 MLB 2 \n", 178 | "2 MLB 2 \n", 179 | "3 MLB 2 \n", 180 | "4 MLB 2 " 181 | ] 182 | }, 183 | "execution_count": 3, 184 | "metadata": {}, 185 | "output_type": "execute_result" 186 | } 187 | ], 188 | "source": [ 189 | "train.head()" 190 | ] 191 | }, 192 | { 193 | "cell_type": "code", 194 | "execution_count": 3, 195 | "id": "smaller-boulder", 196 | "metadata": {}, 197 | "outputs": [], 198 | "source": [ 199 | "test = pd.read_csv(\"test_data.csv\", index_col=0).squeeze()" 200 | ] 201 | }, 202 | { 203 | "cell_type": "code", 204 | "execution_count": 4, 205 | "id": "finnish-canadian", 206 | "metadata": {}, 207 | "outputs": [ 208 | { 209 | "data": { 210 | "text/plain": [ 211 | "sku int64\n", 212 | "date datetime64[ns]\n", 213 | "sold_quantity int64\n", 214 | "current_price float64\n", 215 | "currency object\n", 216 | "listing_type object\n", 217 | "shipping_logistic_type object\n", 218 | "shipping_payment object\n", 219 | "minutes_active float64\n", 220 | "item_domain_id object\n", 221 | "site_id object\n", 222 | "fold int64\n", 223 | "dtype: object" 224 | ] 225 | }, 226 | "execution_count": 4, 227 | "metadata": {}, 228 | "output_type": "execute_result" 229 | } 230 | ], 231 | "source": [ 232 | "train.dtypes" 233 | ] 234 | }, 235 | { 236 | "cell_type": "code", 237 | "execution_count": 5, 238 | "id": "fc10499b-4c46-4f7e-a88e-a4233fb05504", 239 | "metadata": {}, 240 | "outputs": [ 241 | { 242 | "data": { 243 | "text/html": [ 244 | "
\n", 245 | "\n", 258 | "\n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | "
skudatesold_quantitycurrent_pricecurrencylisting_typeshipping_logistic_typeshipping_paymentminutes_activeitem_domain_idsite_idfold
04648012021-02-010156.78REAclassicfulfillmentfree_shipping1440.0MLB-NEBULIZERSMLB2
14648012021-02-020156.78REAclassicfulfillmentfree_shipping1440.0MLB-NEBULIZERSMLB2
24648012021-02-030156.78REAclassicfulfillmentfree_shipping1440.0MLB-NEBULIZERSMLB2
34648012021-02-040156.78REAclassicfulfillmentfree_shipping1440.0MLB-NEBULIZERSMLB2
44648012021-02-051156.78REAclassicfulfillmentfree_shipping1440.0MLB-NEBULIZERSMLB2
\n", 354 | "
" 355 | ], 356 | "text/plain": [ 357 | " sku date sold_quantity current_price currency listing_type \\\n", 358 | "0 464801 2021-02-01 0 156.78 REA classic \n", 359 | "1 464801 2021-02-02 0 156.78 REA classic \n", 360 | "2 464801 2021-02-03 0 156.78 REA classic \n", 361 | "3 464801 2021-02-04 0 156.78 REA classic \n", 362 | "4 464801 2021-02-05 1 156.78 REA classic \n", 363 | "\n", 364 | " shipping_logistic_type shipping_payment minutes_active item_domain_id \\\n", 365 | "0 fulfillment free_shipping 1440.0 MLB-NEBULIZERS \n", 366 | "1 fulfillment free_shipping 1440.0 MLB-NEBULIZERS \n", 367 | "2 fulfillment free_shipping 1440.0 MLB-NEBULIZERS \n", 368 | "3 fulfillment free_shipping 1440.0 MLB-NEBULIZERS \n", 369 | "4 fulfillment free_shipping 1440.0 MLB-NEBULIZERS \n", 370 | "\n", 371 | " site_id fold \n", 372 | "0 MLB 2 \n", 373 | "1 MLB 2 \n", 374 | "2 MLB 2 \n", 375 | "3 MLB 2 \n", 376 | "4 MLB 2 " 377 | ] 378 | }, 379 | "execution_count": 5, 380 | "metadata": {}, 381 | "output_type": "execute_result" 382 | } 383 | ], 384 | "source": [ 385 | "train.head()" 386 | ] 387 | }, 388 | { 389 | "cell_type": "code", 390 | "execution_count": 6, 391 | "id": "refined-string", 392 | "metadata": {}, 393 | "outputs": [], 394 | "source": [ 395 | "cats = ['item_domain_id', 'currency', 'listing_type', 'shipping_logistic_type', 'shipping_payment', 'site_id']" 396 | ] 397 | }, 398 | { 399 | "cell_type": "code", 400 | "execution_count": 7, 401 | "id": "99b8015a-8c95-4936-9ba6-9d655aa19848", 402 | "metadata": {}, 403 | "outputs": [], 404 | "source": [ 405 | "from category_encoders import OrdinalEncoder\n", 406 | "enc = OrdinalEncoder(cats)\n", 407 | "train = enc.fit_transform(train)" 408 | ] 409 | }, 410 | { 411 | "cell_type": "code", 412 | "execution_count": 8, 413 | "id": "monthly-general", 414 | "metadata": {}, 415 | "outputs": [], 416 | "source": [ 417 | "def gen_tr_ts():\n", 418 | " for fold in [2,3]:\n", 419 | " ts = train[train['fold'] != fold]['date'].max()\n", 420 | " ts = train[(train['fold'] != fold) & (train['date'] == ts)].index\n", 421 | " yield train.index[train['fold'] == fold], ts, fold\n", 422 | "\n", 423 | " " 424 | ] 425 | }, 426 | { 427 | "cell_type": "code", 428 | "execution_count": null, 429 | "id": "bdb25520-ed36-4c4c-a9fe-23387cb3f918", 430 | "metadata": {}, 431 | "outputs": [ 432 | { 433 | "name": "stdout", 434 | "output_type": "stream", 435 | "text": [ 436 | "Iteration No: 1 started. Evaluating function at random point.\n", 437 | "[0.09871192514273254, 9, 0.16531200313642108, 0.9491364637917304, 1.2337280871824563, 120]\n", 438 | "8.619976237016095\n", 439 | "8.863340114023996\n", 440 | "Iteration No: 1 ended. Evaluation done at random point.\n", 441 | "Time taken: 164.3399\n", 442 | "Function value obtained: 8.7417\n", 443 | "Current minimum: 8.7417\n", 444 | "Iteration No: 2 started. Evaluating function at random point.\n", 445 | "[0.0059678992438367785, 7, 0.8919851637254288, 0.8116798250174155, 1.3101407817629525, 158]\n", 446 | "8.969453535454983\n", 447 | "9.180772268605745\n", 448 | "Iteration No: 2 ended. Evaluation done at random point.\n", 449 | "Time taken: 161.5522\n", 450 | "Function value obtained: 9.0751\n", 451 | "Current minimum: 8.7417\n", 452 | "Iteration No: 3 started. Evaluating function at random point.\n", 453 | "[0.007707362534461022, 3, 0.5309725180523154, 0.8725658221213098, 1.4526327599071185, 130]\n", 454 | "9.148086951536671\n" 455 | ] 456 | } 457 | ], 458 | "source": [ 459 | "def tune(params):\n", 460 | " print(params)\n", 461 | " features = [\"current_price\", \"minutes_active\"] + cats\n", 462 | "\n", 463 | " mean_rps = 0.\n", 464 | " for tr,ts, fold in gen_tr_ts():\n", 465 | " #print(tr.shape, ts.shape)\n", 466 | " X = train[features]\n", 467 | " y = train['sold_quantity']\n", 468 | "\n", 469 | " Xtr = X.iloc[tr]\n", 470 | " ytr = y.iloc[tr]\n", 471 | " Xval = X.iloc[ts]\n", 472 | " yval = y.iloc[ts]\n", 473 | "\n", 474 | " #mdl = LinearRegression(normalize=True)\n", 475 | " #mdl = RandomForestRegressor(n_estimators=100, random_state=0, n_jobs=6)\n", 476 | " mdl = XGBRegressor(n_estimators=1000, learning_rate=params[0],\n", 477 | " max_depth=params[1],\n", 478 | " subsample=params[2],\n", 479 | " colsample_bytree=params[3],\n", 480 | " tweedie_variance_power=params[4],\n", 481 | " min_child_weight=params[5],\n", 482 | " random_state=0, objective=\"reg:tweedie\", \n", 483 | " base_score=1e-3,\n", 484 | " tree_method='gpu_hist')\n", 485 | " mdl.fit(Xtr, ytr)\n", 486 | " p = mdl.predict(Xval)\n", 487 | "\n", 488 | "\n", 489 | " ## EVAL\n", 490 | " pp = train[train['fold'] != fold][['sku', 'date', 'sold_quantity']]\n", 491 | " pp['stock'] = pp['sku'].map(test)\n", 492 | " pp = pp.sort_values([\"sku\",\"date\"])\n", 493 | " pp['cumulative_y'] = pp.groupby(\"sku\")['sold_quantity'].cumsum()\n", 494 | "\n", 495 | " pp = pp.dropna(subset=['stock'])\n", 496 | " pp['stockout_y'] = pp['cumulative_y'] >= pp['stock']\n", 497 | "\n", 498 | " first_so_y = pp[pp['stockout_y']].groupby(\"sku\").first()\n", 499 | " days_to_so_y = (first_so_y[\"date\"] - pp[\"date\"].min()) / np.timedelta64(1, 'D')\n", 500 | " days_to_so_y = days_to_so_y.reindex(pp['sku'].unique()).fillna(30.).clip(1,30)\n", 501 | "\n", 502 | "\n", 503 | " ppp = train.iloc[ts][['sku']]\n", 504 | " #p[~np.isfinite(p)] = 17.\n", 505 | " ppp['p'] = p\n", 506 | " ppp['stock'] = ppp['sku'].map(test)\n", 507 | " ppp = ppp.dropna(subset=['stock'])\n", 508 | " ppp['days_to_so'] = (ppp['stock'] / ppp['p']).astype(int).fillna(30.).clip(1,30)\n", 509 | " days_to_so_p = ppp[['sku', 'days_to_so']].set_index(\"sku\").squeeze().reindex(days_to_so_y.index) \n", 510 | "\n", 511 | " days_to_so_p2 = utils.pred_list_to_tweedie(days_to_so_p, phi=2, p=1.5)\n", 512 | " \n", 513 | " #tweedie distribution -> [0.05, 0.07, ... .13, 0.12]\n", 514 | "\n", 515 | " rps = utils.rps(days_to_so_y, days_to_so_p2, probs=True)\n", 516 | " mean_rps += rps\n", 517 | " print(rps)\n", 518 | " return mean_rps / 2\n", 519 | "\n", 520 | "space = [(1e-3, 1e-1, 'log-uniform'),\n", 521 | " (1, 10),\n", 522 | " (0.05, 0.95),\n", 523 | " (0.05, 0.95),\n", 524 | " (1.0,1.99),\n", 525 | " (1,300)]\n", 526 | "res = gp_minimize(tune, space, random_state=1, verbose=1)\n", 527 | "\n", 528 | " " 529 | ] 530 | }, 531 | { 532 | "cell_type": "code", 533 | "execution_count": null, 534 | "id": "pretty-literature", 535 | "metadata": {}, 536 | "outputs": [], 537 | "source": [ 538 | "# 15a \n", 539 | "# Mean CV 9.0805\n", 540 | "# LB 6.2598\n", 541 | "\n", 542 | "\n", 543 | "Iteration No: 2 started. Evaluating function at random point.\n", 544 | "[0.003936128001463711, 2, 0.29539066512210194, 0.47989860558921493, 1.8040470414877383, 145]\n", 545 | "6.131413939395725\n", 546 | "6.4664243315180086\n", 547 | "Iteration No: 2 ended. Evaluation done at random point.\n", 548 | "Time taken: 91.9157\n", 549 | "Function value obtained: 6.2989\n", 550 | "Current minimum: 6.2989" 551 | ] 552 | }, 553 | { 554 | "cell_type": "markdown", 555 | "id": "comfortable-hypothesis", 556 | "metadata": {}, 557 | "source": [ 558 | "# sub" 559 | ] 560 | }, 561 | { 562 | "cell_type": "code", 563 | "execution_count": 10, 564 | "id": "dominant-machine", 565 | "metadata": {}, 566 | "outputs": [ 567 | { 568 | "name": "stdout", 569 | "output_type": "stream", 570 | "text": [ 571 | "True\n" 572 | ] 573 | } 574 | ], 575 | "source": [ 576 | "test_df = train[train['date'] == \"2021-03-31\"]\n", 577 | "test_df = test_df[test_df['sku'].isin(test.index)]\n", 578 | "print(np.all(test_df['sku'] == test.index))\n", 579 | "\n", 580 | "features = [\"current_price\", \"minutes_active\"] + cats\n", 581 | "params = [0.003936128001463711, 2, 0.29539066512210194, 0.47989860558921493, 1.8040470414877383, 145]\n", 582 | "mdl = XGBRegressor(n_estimators=1000, learning_rate=params[0],\n", 583 | " max_depth=params[1],\n", 584 | " subsample=params[2],\n", 585 | " colsample_bytree=params[3],\n", 586 | " tweedie_variance_power=params[4],\n", 587 | " min_child_weight=params[5],\n", 588 | " random_state=0, objective=\"reg:tweedie\", \n", 589 | " base_score=1e-3,\n", 590 | " tree_method='gpu_hist')\n", 591 | "mdl.fit(train[features], train['sold_quantity'])\n", 592 | "p = mdl.predict(test_df[features])" 593 | ] 594 | }, 595 | { 596 | "cell_type": "code", 597 | "execution_count": 14, 598 | "id": "important-rugby", 599 | "metadata": {}, 600 | "outputs": [], 601 | "source": [ 602 | "spp = test_df[['sku']].copy()\n", 603 | "spp['p'] = p\n", 604 | "spp['stock'] = spp['sku'].map(test)\n", 605 | "spp['days_to_so'] = (spp['stock'] / spp['p']).fillna(30.).clip(1,30).astype(int)\n" 606 | ] 607 | }, 608 | { 609 | "cell_type": "code", 610 | "execution_count": 15, 611 | "id": "excess-porter", 612 | "metadata": {}, 613 | "outputs": [ 614 | { 615 | "data": { 616 | "text/plain": [ 617 | "1.0" 618 | ] 619 | }, 620 | "execution_count": 15, 621 | "metadata": {}, 622 | "output_type": "execute_result" 623 | } 624 | ], 625 | "source": [ 626 | "test.index.isin(spp['sku']).mean()" 627 | ] 628 | }, 629 | { 630 | "cell_type": "code", 631 | "execution_count": 16, 632 | "id": "joint-reservation", 633 | "metadata": {}, 634 | "outputs": [], 635 | "source": [ 636 | "prob_array = utils.pred_list_to_tweedie(spp['days_to_so'].values, phi=2., p=1.5)\n", 637 | "pd.set_option(\"display.max_columns\", 31)\n", 638 | "pd.DataFrame(prob_array).round(4).to_csv(\"19.csv.gz\", header=False, index=False, compression=\"gzip\")" 639 | ] 640 | }, 641 | { 642 | "cell_type": "code", 643 | "execution_count": 18, 644 | "id": "fitting-hamilton", 645 | "metadata": {}, 646 | "outputs": [ 647 | { 648 | "data": { 649 | "text/html": [ 650 | "
\n", 651 | "\n", 664 | "\n", 665 | " \n", 666 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | " \n", 674 | " \n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | " \n", 722 | " \n", 723 | " \n", 724 | " \n", 725 | " \n", 726 | " \n", 727 | " \n", 728 | " \n", 729 | " \n", 730 | " \n", 731 | " \n", 732 | " \n", 733 | " \n", 734 | " \n", 735 | " \n", 736 | " \n", 737 | " \n", 738 | " \n", 739 | " \n", 740 | " \n", 741 | " \n", 742 | " \n", 743 | " \n", 744 | " \n", 745 | " \n", 746 | " \n", 747 | " \n", 748 | " \n", 749 | " \n", 750 | " \n", 751 | " \n", 752 | " \n", 753 | " \n", 754 | " \n", 755 | " \n", 756 | " \n", 757 | " \n", 758 | " \n", 759 | " \n", 760 | " \n", 761 | " \n", 762 | " \n", 763 | " \n", 764 | " \n", 765 | " \n", 766 | " \n", 767 | " \n", 768 | " \n", 769 | " \n", 770 | " \n", 771 | " \n", 772 | " \n", 773 | " \n", 774 | " \n", 775 | " \n", 776 | " \n", 777 | " \n", 778 | " \n", 779 | " \n", 780 | " \n", 781 | " \n", 782 | " \n", 783 | " \n", 784 | " \n", 785 | " \n", 786 | " \n", 787 | " \n", 788 | " \n", 789 | " \n", 790 | " \n", 791 | " \n", 792 | " \n", 793 | " \n", 794 | " \n", 795 | " \n", 796 | " \n", 797 | " \n", 798 | " \n", 799 | " \n", 800 | " \n", 801 | " \n", 802 | " \n", 803 | " \n", 804 | " \n", 805 | " \n", 806 | " \n", 807 | " \n", 808 | " \n", 809 | " \n", 810 | " \n", 811 | " \n", 812 | " \n", 813 | " \n", 814 | " \n", 815 | " \n", 816 | " \n", 817 | " \n", 818 | " \n", 819 | " \n", 820 | " \n", 821 | " \n", 822 | " \n", 823 | " \n", 824 | " \n", 825 | " \n", 826 | " \n", 827 | " \n", 828 | " \n", 829 | " \n", 830 | " \n", 831 | " \n", 832 | " \n", 833 | " \n", 834 | " \n", 835 | " \n", 836 | " \n", 837 | " \n", 838 | " \n", 839 | " \n", 840 | " \n", 841 | " \n", 842 | " \n", 843 | " \n", 844 | " \n", 845 | " \n", 846 | " \n", 847 | " \n", 848 | " \n", 849 | " \n", 850 | " \n", 851 | " \n", 852 | " \n", 853 | " \n", 854 | " \n", 855 | " \n", 856 | " \n", 857 | " \n", 858 | " \n", 859 | " \n", 860 | " \n", 861 | " \n", 862 | " \n", 863 | " \n", 864 | " \n", 865 | " \n", 866 | " \n", 867 | " \n", 868 | " \n", 869 | " \n", 870 | " \n", 871 | " \n", 872 | " \n", 873 | " \n", 874 | " \n", 875 | " \n", 876 | " \n", 877 | " \n", 878 | " \n", 879 | " \n", 880 | " \n", 881 | " \n", 882 | " \n", 883 | " \n", 884 | " \n", 885 | " \n", 886 | " \n", 887 | " \n", 888 | " \n", 889 | " \n", 890 | " \n", 891 | " \n", 892 | " \n", 893 | " \n", 894 | " \n", 895 | " \n", 896 | " \n", 897 | " \n", 898 | " \n", 899 | " \n", 900 | " \n", 901 | " \n", 902 | " \n", 903 | " \n", 904 | " \n", 905 | " \n", 906 | " \n", 907 | " \n", 908 | " \n", 909 | " \n", 910 | " \n", 911 | " \n", 912 | " \n", 913 | " \n", 914 | " \n", 915 | " \n", 916 | " \n", 917 | " \n", 918 | " \n", 919 | " \n", 920 | " \n", 921 | " \n", 922 | " \n", 923 | " \n", 924 | " \n", 925 | " \n", 926 | " \n", 927 | " \n", 928 | " \n", 929 | " \n", 930 | " \n", 931 | " \n", 932 | " \n", 933 | " \n", 934 | " \n", 935 | " \n", 936 | " \n", 937 | " \n", 938 | " \n", 939 | " \n", 940 | " \n", 941 | " \n", 942 | " \n", 943 | " \n", 944 | " \n", 945 | " \n", 946 | " \n", 947 | " \n", 948 | " \n", 949 | " \n", 950 | " \n", 951 | " \n", 952 | " \n", 953 | " \n", 954 | " \n", 955 | " \n", 956 | " \n", 957 | " \n", 958 | " \n", 959 | " \n", 960 | " \n", 961 | " \n", 962 | " \n", 963 | " \n", 964 | " \n", 965 | " \n", 966 | " \n", 967 | " \n", 968 | " \n", 969 | " \n", 970 | " \n", 971 | " \n", 972 | " \n", 973 | " \n", 974 | " \n", 975 | " \n", 976 | " \n", 977 | " \n", 978 | " \n", 979 | " \n", 980 | " \n", 981 | " \n", 982 | " \n", 983 | " \n", 984 | " \n", 985 | " \n", 986 | " \n", 987 | " \n", 988 | " \n", 989 | " \n", 990 | " \n", 991 | " \n", 992 | " \n", 993 | " \n", 994 | " \n", 995 | " \n", 996 | " \n", 997 | " \n", 998 | " \n", 999 | " \n", 1000 | " \n", 1001 | " \n", 1002 | " \n", 1003 | " \n", 1004 | " \n", 1005 | " \n", 1006 | " \n", 1007 | " \n", 1008 | " \n", 1009 | " \n", 1010 | " \n", 1011 | " \n", 1012 | " \n", 1013 | " \n", 1014 | " \n", 1015 | " \n", 1016 | " \n", 1017 | " \n", 1018 | " \n", 1019 | " \n", 1020 | " \n", 1021 | " \n", 1022 | " \n", 1023 | " \n", 1024 | " \n", 1025 | " \n", 1026 | " \n", 1027 | " \n", 1028 | " \n", 1029 | " \n", 1030 | " \n", 1031 | " \n", 1032 | " \n", 1033 | " \n", 1034 | " \n", 1035 | " \n", 1036 | " \n", 1037 | " \n", 1038 | " \n", 1039 | " \n", 1040 | " \n", 1041 | " \n", 1042 | " \n", 1043 | " \n", 1044 | " \n", 1045 | " \n", 1046 | " \n", 1047 | " \n", 1048 | " \n", 1049 | " \n", 1050 | " \n", 1051 | " \n", 1052 | " \n", 1053 | " \n", 1054 | " \n", 1055 | " \n", 1056 | " \n", 1057 | " \n", 1058 | " \n", 1059 | " \n", 1060 | " \n", 1061 | " \n", 1062 | " \n", 1063 | " \n", 1064 | " \n", 1065 | "
01234567891011121314151617181920212223242526272829
00.02150.01450.01750.02040.02330.02590.02840.03070.03280.03460.03620.03750.03860.03950.04010.04050.04070.04070.04050.04020.03970.03900.03830.03740.03640.03540.03430.03310.03190.0307
10.01610.01110.01370.01620.01880.02130.02380.02610.02840.03050.03250.03430.03590.03730.03860.03970.04060.04130.04180.04220.04240.04240.04230.04210.04170.04120.04060.03990.03910.0383
20.01610.01110.01370.01620.01880.02130.02380.02610.02840.03050.03250.03430.03590.03730.03860.03970.04060.04130.04180.04220.04240.04240.04230.04210.04170.04120.04060.03990.03910.0383
30.01610.01110.01370.01620.01880.02130.02380.02610.02840.03050.03250.03430.03590.03730.03860.03970.04060.04130.04180.04220.04240.04240.04230.04210.04170.04120.04060.03990.03910.0383
40.01610.01110.01370.01620.01880.02130.02380.02610.02840.03050.03250.03430.03590.03730.03860.03970.04060.04130.04180.04220.04240.04240.04230.04210.04170.04120.04060.03990.03910.0383
.............................................................................................
5514670.01610.01110.01370.01620.01880.02130.02380.02610.02840.03050.03250.03430.03590.03730.03860.03970.04060.04130.04180.04220.04240.04240.04230.04210.04170.04120.04060.03990.03910.0383
5514680.01610.01110.01370.01620.01880.02130.02380.02610.02840.03050.03250.03430.03590.03730.03860.03970.04060.04130.04180.04220.04240.04240.04230.04210.04170.04120.04060.03990.03910.0383
5514690.01610.01110.01370.01620.01880.02130.02380.02610.02840.03050.03250.03430.03590.03730.03860.03970.04060.04130.04180.04220.04240.04240.04230.04210.04170.04120.04060.03990.03910.0383
5514700.03990.02560.02960.03310.03610.03860.04050.04190.04290.04340.04350.04320.04270.04180.04070.03940.03790.03640.03470.03300.03120.02940.02760.02590.02420.02250.02090.01930.01780.0164
5514710.01610.01110.01370.01620.01880.02130.02380.02610.02840.03050.03250.03430.03590.03730.03860.03970.04060.04130.04180.04220.04240.04240.04230.04210.04170.04120.04060.03990.03910.0383
\n", 1066 | "

551472 rows × 30 columns

\n", 1067 | "
" 1068 | ], 1069 | "text/plain": [ 1070 | " 0 1 2 3 4 5 6 7 \\\n", 1071 | "0 0.0215 0.0145 0.0175 0.0204 0.0233 0.0259 0.0284 0.0307 \n", 1072 | "1 0.0161 0.0111 0.0137 0.0162 0.0188 0.0213 0.0238 0.0261 \n", 1073 | "2 0.0161 0.0111 0.0137 0.0162 0.0188 0.0213 0.0238 0.0261 \n", 1074 | "3 0.0161 0.0111 0.0137 0.0162 0.0188 0.0213 0.0238 0.0261 \n", 1075 | "4 0.0161 0.0111 0.0137 0.0162 0.0188 0.0213 0.0238 0.0261 \n", 1076 | "... ... ... ... ... ... ... ... ... \n", 1077 | "551467 0.0161 0.0111 0.0137 0.0162 0.0188 0.0213 0.0238 0.0261 \n", 1078 | "551468 0.0161 0.0111 0.0137 0.0162 0.0188 0.0213 0.0238 0.0261 \n", 1079 | "551469 0.0161 0.0111 0.0137 0.0162 0.0188 0.0213 0.0238 0.0261 \n", 1080 | "551470 0.0399 0.0256 0.0296 0.0331 0.0361 0.0386 0.0405 0.0419 \n", 1081 | "551471 0.0161 0.0111 0.0137 0.0162 0.0188 0.0213 0.0238 0.0261 \n", 1082 | "\n", 1083 | " 8 9 10 11 12 13 14 15 \\\n", 1084 | "0 0.0328 0.0346 0.0362 0.0375 0.0386 0.0395 0.0401 0.0405 \n", 1085 | "1 0.0284 0.0305 0.0325 0.0343 0.0359 0.0373 0.0386 0.0397 \n", 1086 | "2 0.0284 0.0305 0.0325 0.0343 0.0359 0.0373 0.0386 0.0397 \n", 1087 | "3 0.0284 0.0305 0.0325 0.0343 0.0359 0.0373 0.0386 0.0397 \n", 1088 | "4 0.0284 0.0305 0.0325 0.0343 0.0359 0.0373 0.0386 0.0397 \n", 1089 | "... ... ... ... ... ... ... ... ... \n", 1090 | "551467 0.0284 0.0305 0.0325 0.0343 0.0359 0.0373 0.0386 0.0397 \n", 1091 | "551468 0.0284 0.0305 0.0325 0.0343 0.0359 0.0373 0.0386 0.0397 \n", 1092 | "551469 0.0284 0.0305 0.0325 0.0343 0.0359 0.0373 0.0386 0.0397 \n", 1093 | "551470 0.0429 0.0434 0.0435 0.0432 0.0427 0.0418 0.0407 0.0394 \n", 1094 | "551471 0.0284 0.0305 0.0325 0.0343 0.0359 0.0373 0.0386 0.0397 \n", 1095 | "\n", 1096 | " 16 17 18 19 20 21 22 23 \\\n", 1097 | "0 0.0407 0.0407 0.0405 0.0402 0.0397 0.0390 0.0383 0.0374 \n", 1098 | "1 0.0406 0.0413 0.0418 0.0422 0.0424 0.0424 0.0423 0.0421 \n", 1099 | "2 0.0406 0.0413 0.0418 0.0422 0.0424 0.0424 0.0423 0.0421 \n", 1100 | "3 0.0406 0.0413 0.0418 0.0422 0.0424 0.0424 0.0423 0.0421 \n", 1101 | "4 0.0406 0.0413 0.0418 0.0422 0.0424 0.0424 0.0423 0.0421 \n", 1102 | "... ... ... ... ... ... ... ... ... \n", 1103 | "551467 0.0406 0.0413 0.0418 0.0422 0.0424 0.0424 0.0423 0.0421 \n", 1104 | "551468 0.0406 0.0413 0.0418 0.0422 0.0424 0.0424 0.0423 0.0421 \n", 1105 | "551469 0.0406 0.0413 0.0418 0.0422 0.0424 0.0424 0.0423 0.0421 \n", 1106 | "551470 0.0379 0.0364 0.0347 0.0330 0.0312 0.0294 0.0276 0.0259 \n", 1107 | "551471 0.0406 0.0413 0.0418 0.0422 0.0424 0.0424 0.0423 0.0421 \n", 1108 | "\n", 1109 | " 24 25 26 27 28 29 \n", 1110 | "0 0.0364 0.0354 0.0343 0.0331 0.0319 0.0307 \n", 1111 | "1 0.0417 0.0412 0.0406 0.0399 0.0391 0.0383 \n", 1112 | "2 0.0417 0.0412 0.0406 0.0399 0.0391 0.0383 \n", 1113 | "3 0.0417 0.0412 0.0406 0.0399 0.0391 0.0383 \n", 1114 | "4 0.0417 0.0412 0.0406 0.0399 0.0391 0.0383 \n", 1115 | "... ... ... ... ... ... ... \n", 1116 | "551467 0.0417 0.0412 0.0406 0.0399 0.0391 0.0383 \n", 1117 | "551468 0.0417 0.0412 0.0406 0.0399 0.0391 0.0383 \n", 1118 | "551469 0.0417 0.0412 0.0406 0.0399 0.0391 0.0383 \n", 1119 | "551470 0.0242 0.0225 0.0209 0.0193 0.0178 0.0164 \n", 1120 | "551471 0.0417 0.0412 0.0406 0.0399 0.0391 0.0383 \n", 1121 | "\n", 1122 | "[551472 rows x 30 columns]" 1123 | ] 1124 | }, 1125 | "execution_count": 18, 1126 | "metadata": {}, 1127 | "output_type": "execute_result" 1128 | } 1129 | ], 1130 | "source": [ 1131 | "pd.read_csv(\"19.csv.gz\",header=None)#.sum(axis=1)" 1132 | ] 1133 | }, 1134 | { 1135 | "cell_type": "code", 1136 | "execution_count": null, 1137 | "id": "eleven-intelligence", 1138 | "metadata": {}, 1139 | "outputs": [], 1140 | "source": [] 1141 | } 1142 | ], 1143 | "metadata": { 1144 | "kernelspec": { 1145 | "display_name": "Python 3", 1146 | "language": "python", 1147 | "name": "python3" 1148 | }, 1149 | "language_info": { 1150 | "codemirror_mode": { 1151 | "name": "ipython", 1152 | "version": 3 1153 | }, 1154 | "file_extension": ".py", 1155 | "mimetype": "text/x-python", 1156 | "name": "python", 1157 | "nbconvert_exporter": "python", 1158 | "pygments_lexer": "ipython3", 1159 | "version": "3.8.5" 1160 | } 1161 | }, 1162 | "nbformat": 4, 1163 | "nbformat_minor": 5 1164 | } 1165 | -------------------------------------------------------------------------------- /meli2021/32_baseline_yt.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 4, 6 | "id": "75638528-4609-4ee2-93c9-28538579e471", 7 | "metadata": {}, 8 | "outputs": [], 9 | "source": [ 10 | "import pandas as pd\n", 11 | "import numpy as np\n", 12 | "import utils\n", 13 | "\n", 14 | "from sklearn.model_selection import GroupKFold, KFold\n", 15 | "from sklearn.linear_model import LinearRegression\n", 16 | "from sklearn.ensemble import RandomForestRegressor\n", 17 | "from sklearn.metrics import mean_squared_error\n", 18 | "from xgboost import XGBRegressor\n", 19 | "import tweedie\n", 20 | "\n", 21 | "from importlib import reload\n", 22 | "reload(utils)\n", 23 | "from skopt import gp_minimize\n", 24 | "%matplotlib inline" 25 | ] 26 | }, 27 | { 28 | "cell_type": "code", 29 | "execution_count": 5, 30 | "id": "3be069d6-c17e-43a2-8252-2acf5e9c26ad", 31 | "metadata": {}, 32 | "outputs": [], 33 | "source": [ 34 | "train = pd.read_parquet(\"./train/0.parquet\")\n", 35 | "train['date'] = pd.to_datetime(train['date'])\n", 36 | "train['fold'] = train['date'].dt.month" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 6, 42 | "id": "smaller-boulder", 43 | "metadata": {}, 44 | "outputs": [], 45 | "source": [ 46 | "test = pd.read_csv(\"test_data.csv\", index_col=0).squeeze()" 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": 7, 52 | "id": "finnish-canadian", 53 | "metadata": {}, 54 | "outputs": [ 55 | { 56 | "data": { 57 | "text/plain": [ 58 | "sku int64\n", 59 | "date datetime64[ns]\n", 60 | "sold_quantity int64\n", 61 | "current_price float64\n", 62 | "currency object\n", 63 | "listing_type object\n", 64 | "shipping_logistic_type object\n", 65 | "shipping_payment object\n", 66 | "minutes_active float64\n", 67 | "item_domain_id object\n", 68 | "site_id object\n", 69 | "fold int64\n", 70 | "dtype: object" 71 | ] 72 | }, 73 | "execution_count": 7, 74 | "metadata": {}, 75 | "output_type": "execute_result" 76 | } 77 | ], 78 | "source": [ 79 | "train.dtypes" 80 | ] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "execution_count": 8, 85 | "id": "fc10499b-4c46-4f7e-a88e-a4233fb05504", 86 | "metadata": {}, 87 | "outputs": [ 88 | { 89 | "data": { 90 | "text/html": [ 91 | "
\n", 92 | "\n", 105 | "\n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | "
skudatesold_quantitycurrent_pricecurrencylisting_typeshipping_logistic_typeshipping_paymentminutes_activeitem_domain_idsite_idfold
04648012021-02-010156.78REAclassicfulfillmentfree_shipping1440.0MLB-NEBULIZERSMLB2
14648012021-02-020156.78REAclassicfulfillmentfree_shipping1440.0MLB-NEBULIZERSMLB2
24648012021-02-030156.78REAclassicfulfillmentfree_shipping1440.0MLB-NEBULIZERSMLB2
34648012021-02-040156.78REAclassicfulfillmentfree_shipping1440.0MLB-NEBULIZERSMLB2
44648012021-02-051156.78REAclassicfulfillmentfree_shipping1440.0MLB-NEBULIZERSMLB2
\n", 201 | "
" 202 | ], 203 | "text/plain": [ 204 | " sku date sold_quantity current_price currency listing_type \\\n", 205 | "0 464801 2021-02-01 0 156.78 REA classic \n", 206 | "1 464801 2021-02-02 0 156.78 REA classic \n", 207 | "2 464801 2021-02-03 0 156.78 REA classic \n", 208 | "3 464801 2021-02-04 0 156.78 REA classic \n", 209 | "4 464801 2021-02-05 1 156.78 REA classic \n", 210 | "\n", 211 | " shipping_logistic_type shipping_payment minutes_active item_domain_id \\\n", 212 | "0 fulfillment free_shipping 1440.0 MLB-NEBULIZERS \n", 213 | "1 fulfillment free_shipping 1440.0 MLB-NEBULIZERS \n", 214 | "2 fulfillment free_shipping 1440.0 MLB-NEBULIZERS \n", 215 | "3 fulfillment free_shipping 1440.0 MLB-NEBULIZERS \n", 216 | "4 fulfillment free_shipping 1440.0 MLB-NEBULIZERS \n", 217 | "\n", 218 | " site_id fold \n", 219 | "0 MLB 2 \n", 220 | "1 MLB 2 \n", 221 | "2 MLB 2 \n", 222 | "3 MLB 2 \n", 223 | "4 MLB 2 " 224 | ] 225 | }, 226 | "execution_count": 8, 227 | "metadata": {}, 228 | "output_type": "execute_result" 229 | } 230 | ], 231 | "source": [ 232 | "train.head()" 233 | ] 234 | }, 235 | { 236 | "cell_type": "code", 237 | "execution_count": 9, 238 | "id": "monthly-general", 239 | "metadata": {}, 240 | "outputs": [], 241 | "source": [ 242 | "def gen_tr_ts():\n", 243 | " for fold in [2,3]:\n", 244 | " ts = train[train['fold'] != fold]['date'].max()\n", 245 | " ts = train[(train['fold'] != fold) & (train['date'] == ts)].index\n", 246 | " yield train.index[train['fold'] == fold], ts, fold\n", 247 | "\n", 248 | " " 249 | ] 250 | }, 251 | { 252 | "cell_type": "code", 253 | "execution_count": 10, 254 | "id": "bdb25520-ed36-4c4c-a9fe-23387cb3f918", 255 | "metadata": {}, 256 | "outputs": [], 257 | "source": [ 258 | "\n", 259 | "def gen_p(na=30., power=1.5):\n", 260 | " dts = list()\n", 261 | " for tr,ts, fold in gen_tr_ts():\n", 262 | "\n", 263 | " ## EVAL\n", 264 | " pp = train[train['fold'] != fold][['sku', 'date', 'sold_quantity']]\n", 265 | " pp['stock'] = pp['sku'].map(test)\n", 266 | " pp = pp.sort_values([\"sku\",\"date\"])\n", 267 | " pp['cumulative_y'] = pp.groupby(\"sku\")['sold_quantity'].cumsum()\n", 268 | "\n", 269 | " pp = pp.dropna(subset=['stock'])\n", 270 | " pp['stockout_y'] = pp['cumulative_y'] >= pp['stock']\n", 271 | "\n", 272 | " first_so_y = pp[pp['stockout_y']].groupby(\"sku\").first()\n", 273 | " days_to_so_y = (first_so_y[\"date\"] - pp[\"date\"].min()) / np.timedelta64(1, 'D')\n", 274 | " days_to_so_y = days_to_so_y.reindex(pp['sku'].unique()).fillna(na).astype(int).clip(1)\n", 275 | " dts.append(days_to_so_y)\n", 276 | "\n", 277 | " m = utils.pred_list_to_distro(dts[0], wei=False, total_days=max(na, 30), phi=2, power=power)\n", 278 | " f = utils.pred_list_to_distro(dts[1].reindex(dts[0].index).fillna(dts[0]), wei=False, total_days=max(na, 30), phi=2, power=power)\n", 279 | "\n", 280 | " m = pd.DataFrame(m,index=dts[0].index)\n", 281 | " f = pd.DataFrame(f,index=dts[0].index)\n", 282 | "\n", 283 | " p = (m + f)/2\n", 284 | "\n", 285 | " p = p.div(p.sum(axis=1), axis=0)\n", 286 | "\n", 287 | " p = p.loc[test.index]\n", 288 | " \n", 289 | " p = p.round(4)\n", 290 | "\n", 291 | " return p" 292 | ] 293 | }, 294 | { 295 | "cell_type": "code", 296 | "execution_count": 11, 297 | "id": "outer-certificate", 298 | "metadata": {}, 299 | "outputs": [], 300 | "source": [ 301 | "r = {i:gen_p(30, power=i/10) for i in range(11,20,1)}\n" 302 | ] 303 | }, 304 | { 305 | "cell_type": "code", 306 | "execution_count": 52, 307 | "id": "1834ec6c-f4e4-4272-8b08-f6a3cbadb705", 308 | "metadata": {}, 309 | "outputs": [ 310 | { 311 | "data": { 312 | "text/plain": [ 313 | "" 314 | ] 315 | }, 316 | "execution_count": 52, 317 | "metadata": {}, 318 | "output_type": "execute_result" 319 | }, 320 | { 321 | "data": { 322 | "image/png": "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\n", 323 | "text/plain": [ 324 | "
" 325 | ] 326 | }, 327 | "metadata": { 328 | "needs_background": "light" 329 | }, 330 | "output_type": "display_data" 331 | } 332 | ], 333 | "source": [ 334 | "r[11].mean(axis=0).plot()" 335 | ] 336 | }, 337 | { 338 | "cell_type": "code", 339 | "execution_count": 53, 340 | "id": "bd7c0392-db7e-4361-a7ed-64cf9a949504", 341 | "metadata": {}, 342 | "outputs": [ 343 | { 344 | "data": { 345 | "text/plain": [ 346 | "" 347 | ] 348 | }, 349 | "execution_count": 53, 350 | "metadata": {}, 351 | "output_type": "execute_result" 352 | }, 353 | { 354 | "data": { 355 | "image/png": "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\n", 356 | "text/plain": [ 357 | "
" 358 | ] 359 | }, 360 | "metadata": { 361 | "needs_background": "light" 362 | }, 363 | "output_type": "display_data" 364 | } 365 | ], 366 | "source": [ 367 | "r[12].mean(axis=0).plot()" 368 | ] 369 | }, 370 | { 371 | "cell_type": "code", 372 | "execution_count": 13, 373 | "id": "7b22e456-318b-4ab0-bf80-31807d2f268c", 374 | "metadata": {}, 375 | "outputs": [ 376 | { 377 | "data": { 378 | "text/plain": [ 379 | "" 380 | ] 381 | }, 382 | "execution_count": 13, 383 | "metadata": {}, 384 | "output_type": "execute_result" 385 | }, 386 | { 387 | "data": { 388 | "image/png": "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\n", 389 | "text/plain": [ 390 | "
" 391 | ] 392 | }, 393 | "metadata": { 394 | "needs_background": "light" 395 | }, 396 | "output_type": "display_data" 397 | } 398 | ], 399 | "source": [ 400 | "r[13].mean(axis=0).plot()" 401 | ] 402 | }, 403 | { 404 | "cell_type": "code", 405 | "execution_count": 59, 406 | "id": "2efa8e12-e62a-463a-82e4-bdca3babdcd3", 407 | "metadata": {}, 408 | "outputs": [], 409 | "source": [ 410 | "# phi=2, power=1.3, na=30\n", 411 | "r[13].round(4).to_csv(\"32b.csv.gz\", header=False, index=False, compression=\"gzip\")\n", 412 | "# LB 4.94" 413 | ] 414 | }, 415 | { 416 | "cell_type": "code", 417 | "execution_count": null, 418 | "id": "57e747a1-1d2b-4339-8be8-ffdd1c6fb0a3", 419 | "metadata": {}, 420 | "outputs": [], 421 | "source": [ 422 | "# BONUS\n", 423 | "# xgb 19 + baseline 32 / 2 - LB 4.44" 424 | ] 425 | } 426 | ], 427 | "metadata": { 428 | "kernelspec": { 429 | "display_name": "Python 3", 430 | "language": "python", 431 | "name": "python3" 432 | }, 433 | "language_info": { 434 | "codemirror_mode": { 435 | "name": "ipython", 436 | "version": 3 437 | }, 438 | "file_extension": ".py", 439 | "mimetype": "text/x-python", 440 | "name": "python", 441 | "nbconvert_exporter": "python", 442 | "pygments_lexer": "ipython3", 443 | "version": "3.8.5" 444 | } 445 | }, 446 | "nbformat": 4, 447 | "nbformat_minor": 5 448 | } 449 | -------------------------------------------------------------------------------- /meli2021/61_active_model_yt.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "7fe10a1f-3c36-4466-89c5-5dc2622daf87", 7 | "metadata": {}, 8 | "outputs": [], 9 | "source": [ 10 | "import pandas as pd\n", 11 | "%matplotlib inline\n", 12 | "import numpy as np\n", 13 | "from matplotlib import pyplot as plt" 14 | ] 15 | }, 16 | { 17 | "cell_type": "code", 18 | "execution_count": null, 19 | "id": "c171946b-edfc-4a51-90fe-cc483428228f", 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "Y -> how many days until this product becomes active?" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": 2, 29 | "id": "84e02a3e-1668-40a5-83cd-3029def45fd8", 30 | "metadata": {}, 31 | "outputs": [], 32 | "source": [ 33 | "test = pd.read_csv(\"test_data.csv\").set_index(\"sku\").squeeze()\n", 34 | "train = pd.read_parquet(\"./train/0.parquet\")\n", 35 | "train['date'] = pd.to_datetime(train['date'])\n", 36 | "cats = ['item_domain_id', 'currency', 'listing_type', 'shipping_logistic_type', 'shipping_payment', 'site_id']\n", 37 | "for cat in cats:\n", 38 | " train[cat] = train[cat].astype(\"category\").cat.codes" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": 3, 44 | "id": "8ca0f337-197d-4a22-9191-7bef0b33b705", 45 | "metadata": {}, 46 | "outputs": [], 47 | "source": [ 48 | "train.loc[train[\"minutes_active\"] == 0, \"active\"] = 0\n", 49 | "train[\"active\"] = train[\"active\"].fillna(1)" 50 | ] 51 | }, 52 | { 53 | "cell_type": "code", 54 | "execution_count": 4, 55 | "id": "311a92d9-55b1-484d-a53b-ef755681d75c", 56 | "metadata": {}, 57 | "outputs": [ 58 | { 59 | "data": { 60 | "text/html": [ 61 | "
\n", 62 | "\n", 75 | "\n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | "
skushipping_logistic_typeshipping_paymentlisting_typecurrencycurrent_priceitem_domain_idsite_iddays_to_activedays_since_inactive
sku1.000000-0.000341-0.002559-0.000866-0.0020910.002278-0.0014390.000258-0.001643-0.001465
shipping_logistic_type-0.0003411.0000000.0741830.0407460.050840-0.089014-0.031270-0.019540-0.0094560.075642
shipping_payment-0.0025590.0741831.000000-0.0743380.107770-0.620856-0.118603-0.111873-0.012127-0.009789
listing_type-0.0008660.040746-0.0743381.0000000.152052-0.0357440.0727150.0964910.029645-0.007888
currency-0.0020910.0508400.1077700.1520521.000000-0.657856-0.422581-0.472765-0.014007-0.011959
current_price0.002278-0.089014-0.620856-0.035744-0.6578561.0000000.2678250.2745700.0143250.006590
item_domain_id-0.001439-0.031270-0.1186030.072715-0.4225810.2678251.0000000.8938190.0403630.022034
site_id0.000258-0.019540-0.1118730.096491-0.4727650.2745700.8938191.0000000.0388150.023721
days_to_active-0.001643-0.009456-0.0121270.029645-0.0140070.0143250.0403630.0388151.000000-0.118599
days_since_inactive-0.0014650.075642-0.009789-0.007888-0.0119590.0065900.0220340.023721-0.1185991.000000
\n", 224 | "
" 225 | ], 226 | "text/plain": [ 227 | " sku shipping_logistic_type shipping_payment \\\n", 228 | "sku 1.000000 -0.000341 -0.002559 \n", 229 | "shipping_logistic_type -0.000341 1.000000 0.074183 \n", 230 | "shipping_payment -0.002559 0.074183 1.000000 \n", 231 | "listing_type -0.000866 0.040746 -0.074338 \n", 232 | "currency -0.002091 0.050840 0.107770 \n", 233 | "current_price 0.002278 -0.089014 -0.620856 \n", 234 | "item_domain_id -0.001439 -0.031270 -0.118603 \n", 235 | "site_id 0.000258 -0.019540 -0.111873 \n", 236 | "days_to_active -0.001643 -0.009456 -0.012127 \n", 237 | "days_since_inactive -0.001465 0.075642 -0.009789 \n", 238 | "\n", 239 | " listing_type currency current_price item_domain_id \\\n", 240 | "sku -0.000866 -0.002091 0.002278 -0.001439 \n", 241 | "shipping_logistic_type 0.040746 0.050840 -0.089014 -0.031270 \n", 242 | "shipping_payment -0.074338 0.107770 -0.620856 -0.118603 \n", 243 | "listing_type 1.000000 0.152052 -0.035744 0.072715 \n", 244 | "currency 0.152052 1.000000 -0.657856 -0.422581 \n", 245 | "current_price -0.035744 -0.657856 1.000000 0.267825 \n", 246 | "item_domain_id 0.072715 -0.422581 0.267825 1.000000 \n", 247 | "site_id 0.096491 -0.472765 0.274570 0.893819 \n", 248 | "days_to_active 0.029645 -0.014007 0.014325 0.040363 \n", 249 | "days_since_inactive -0.007888 -0.011959 0.006590 0.022034 \n", 250 | "\n", 251 | " site_id days_to_active days_since_inactive \n", 252 | "sku 0.000258 -0.001643 -0.001465 \n", 253 | "shipping_logistic_type -0.019540 -0.009456 0.075642 \n", 254 | "shipping_payment -0.111873 -0.012127 -0.009789 \n", 255 | "listing_type 0.096491 0.029645 -0.007888 \n", 256 | "currency -0.472765 -0.014007 -0.011959 \n", 257 | "current_price 0.274570 0.014325 0.006590 \n", 258 | "item_domain_id 0.893819 0.040363 0.022034 \n", 259 | "site_id 1.000000 0.038815 0.023721 \n", 260 | "days_to_active 0.038815 1.000000 -0.118599 \n", 261 | "days_since_inactive 0.023721 -0.118599 1.000000 " 262 | ] 263 | }, 264 | "execution_count": 4, 265 | "metadata": {}, 266 | "output_type": "execute_result" 267 | } 268 | ], 269 | "source": [ 270 | "act = train[train['active'] == 1][['sku', 'date']].sort_values(\"date\")\n", 271 | "act['active_date'] = act['date']\n", 272 | "inact = train[train['active'] == 0][['sku', 'date', 'shipping_logistic_type', 'shipping_payment', \n", 273 | " 'listing_type', 'currency', 'current_price', 'item_domain_id', 'site_id']].sort_values(\"date\")\n", 274 | "all_ = pd.merge_asof(inact, act, on=['date'], direction='forward', by=['sku']).dropna(subset=['active_date'])\n", 275 | "all_['days_to_active'] = (all_['active_date'] - all_['date']) / np.timedelta64(1,'D')\n", 276 | "all_['days_since_inactive'] = (all_['date'] - all_.groupby(\"sku\")[\"date\"].transform(\"min\")) / np.timedelta64(1,'D')\n", 277 | "y = all_['days_to_active'].copy()\n", 278 | "all_.corr(method='spearman')" 279 | ] 280 | }, 281 | { 282 | "cell_type": "code", 283 | "execution_count": 5, 284 | "id": "bf5ab194-5311-4008-807e-8024a0e7b599", 285 | "metadata": {}, 286 | "outputs": [], 287 | "source": [ 288 | "import xgboost as xgb\n", 289 | "from sklearn.metrics import mean_squared_error" 290 | ] 291 | }, 292 | { 293 | "cell_type": "code", 294 | "execution_count": 6, 295 | "id": "141e9fc5-9b36-4933-bf31-317f5fa88f47", 296 | "metadata": {}, 297 | "outputs": [ 298 | { 299 | "data": { 300 | "text/plain": [ 301 | "7.689729948430816" 302 | ] 303 | }, 304 | "execution_count": 6, 305 | "metadata": {}, 306 | "output_type": "execute_result" 307 | } 308 | ], 309 | "source": [ 310 | "Xtr = all_.loc[all_['date'] < \"2021-03-01\", ['days_since_inactive', 'current_price'] + cats]\n", 311 | "Xval = all_.loc[all_['date'] >= \"2021-03-01\", ['days_since_inactive', 'current_price'] + cats]\n", 312 | "\n", 313 | "ytr = y[all_['date'] < \"2021-03-01\"]\n", 314 | "yval = y[all_['date'] >= \"2021-03-01\"]\n", 315 | "\n", 316 | "#mdl = DecisionTreeRegressor(max_depth=3)\n", 317 | "#mdl = RandomForestRegressor(n_estimators=100, max_depth=1, random_state=0, n_jobs=6)\n", 318 | "mdl = xgb.XGBRegressor(n_estimators=100, max_depth=3, learning_rate=0.1, random_state=0, n_jobs=6, tree_method='hist')\n", 319 | "mdl.fit(Xtr, ytr)\n", 320 | "p = mdl.predict(Xval)\n", 321 | "np.sqrt(mean_squared_error(yval, p))" 322 | ] 323 | }, 324 | { 325 | "cell_type": "code", 326 | "execution_count": 7, 327 | "id": "f7df5b24-3d9d-4412-864b-b0f32da1cbd9", 328 | "metadata": {}, 329 | "outputs": [ 330 | { 331 | "data": { 332 | "text/plain": [ 333 | "" 334 | ] 335 | }, 336 | "execution_count": 7, 337 | "metadata": {}, 338 | "output_type": "execute_result" 339 | }, 340 | { 341 | "data": { 342 | "image/png": "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\n", 343 | "text/plain": [ 344 | "
" 345 | ] 346 | }, 347 | "metadata": { 348 | "needs_background": "light" 349 | }, 350 | "output_type": "display_data" 351 | } 352 | ], 353 | "source": [ 354 | "Xval['p'] = p\n", 355 | "Xval['error'] = Xval['p'] - yval\n", 356 | "\n", 357 | "Xval.groupby(\"days_since_inactive\")['error'].mean().plot.bar(figsize=(15,10))" 358 | ] 359 | }, 360 | { 361 | "cell_type": "code", 362 | "execution_count": 8, 363 | "id": "638ead4d-b6bb-4c3f-a11e-ac1ee378a80c", 364 | "metadata": {}, 365 | "outputs": [], 366 | "source": [ 367 | "all_t = train[train['active'] == 0].copy()\n", 368 | "\n", 369 | "all_t['days_since_inactive'] = (all_t['date'] - all_t.groupby(\"sku\")[\"date\"].transform(\"min\")) / np.timedelta64(1,'D')\n", 370 | "all_t = all_t.groupby(\"sku\").last()\n", 371 | "all_t = all_t[all_t['date'] == \"2021-03-31\"].copy()" 372 | ] 373 | }, 374 | { 375 | "cell_type": "code", 376 | "execution_count": 9, 377 | "id": "f17ca4b5-3352-4747-88ce-b6de1fc0b480", 378 | "metadata": {}, 379 | "outputs": [ 380 | { 381 | "data": { 382 | "text/html": [ 383 | "
\n", 384 | "\n", 397 | "\n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | "
datesold_quantitycurrent_pricecurrencylisting_typeshipping_logistic_typeshipping_paymentminutes_activeitem_domain_idsite_idactivedays_since_inactive
sku
42021-03-310118.0031200.0526310.054.0
82021-03-31058.4921210.0611620.041.0
92021-03-310199.0021200.0799120.06.0
112021-03-310109.9030200.0364510.019.0
132021-03-310474.0521200.0565820.00.0
.......................................
6608972021-03-31079.0020210.0620120.058.0
6609042021-03-31098.9031210.0367810.024.0
6609072021-03-31024.6931210.0470310.056.0
6609102021-03-310480.5821200.0787820.042.0
6609152021-03-31099.9920210.0799420.058.0
\n", 598 | "

181606 rows × 12 columns

\n", 599 | "
" 600 | ], 601 | "text/plain": [ 602 | " date sold_quantity current_price currency listing_type \\\n", 603 | "sku \n", 604 | "4 2021-03-31 0 118.00 3 1 \n", 605 | "8 2021-03-31 0 58.49 2 1 \n", 606 | "9 2021-03-31 0 199.00 2 1 \n", 607 | "11 2021-03-31 0 109.90 3 0 \n", 608 | "13 2021-03-31 0 474.05 2 1 \n", 609 | "... ... ... ... ... ... \n", 610 | "660897 2021-03-31 0 79.00 2 0 \n", 611 | "660904 2021-03-31 0 98.90 3 1 \n", 612 | "660907 2021-03-31 0 24.69 3 1 \n", 613 | "660910 2021-03-31 0 480.58 2 1 \n", 614 | "660915 2021-03-31 0 99.99 2 0 \n", 615 | "\n", 616 | " shipping_logistic_type shipping_payment minutes_active \\\n", 617 | "sku \n", 618 | "4 2 0 0.0 \n", 619 | "8 2 1 0.0 \n", 620 | "9 2 0 0.0 \n", 621 | "11 2 0 0.0 \n", 622 | "13 2 0 0.0 \n", 623 | "... ... ... ... \n", 624 | "660897 2 1 0.0 \n", 625 | "660904 2 1 0.0 \n", 626 | "660907 2 1 0.0 \n", 627 | "660910 2 0 0.0 \n", 628 | "660915 2 1 0.0 \n", 629 | "\n", 630 | " item_domain_id site_id active days_since_inactive \n", 631 | "sku \n", 632 | "4 5263 1 0.0 54.0 \n", 633 | "8 6116 2 0.0 41.0 \n", 634 | "9 7991 2 0.0 6.0 \n", 635 | "11 3645 1 0.0 19.0 \n", 636 | "13 5658 2 0.0 0.0 \n", 637 | "... ... ... ... ... \n", 638 | "660897 6201 2 0.0 58.0 \n", 639 | "660904 3678 1 0.0 24.0 \n", 640 | "660907 4703 1 0.0 56.0 \n", 641 | "660910 7878 2 0.0 42.0 \n", 642 | "660915 7994 2 0.0 58.0 \n", 643 | "\n", 644 | "[181606 rows x 12 columns]" 645 | ] 646 | }, 647 | "execution_count": 9, 648 | "metadata": {}, 649 | "output_type": "execute_result" 650 | } 651 | ], 652 | "source": [ 653 | "all_t" 654 | ] 655 | }, 656 | { 657 | "cell_type": "code", 658 | "execution_count": 10, 659 | "id": "a8513a7c-3e3d-46ec-8725-b9076633ee7a", 660 | "metadata": {}, 661 | "outputs": [], 662 | "source": [ 663 | "X = all_.loc[:, ['days_since_inactive', 'current_price'] + cats]\n", 664 | "Xt = all_t.loc[:, ['days_since_inactive', 'current_price'] + cats]\n", 665 | "\n", 666 | "mdl = xgb.XGBRegressor(n_estimators=100, max_depth=3, learning_rate=0.1, random_state=0, n_jobs=6, tree_method='hist')\n", 667 | "mdl.fit(X, y)\n", 668 | "p = mdl.predict(Xt)" 669 | ] 670 | }, 671 | { 672 | "cell_type": "code", 673 | "execution_count": 11, 674 | "id": "96be5acc-dc34-4d44-9322-fc452364666c", 675 | "metadata": {}, 676 | "outputs": [], 677 | "source": [ 678 | "p2 = pd.Series(p.round(), index=Xt.index).reindex(test.index).dropna().astype(int)" 679 | ] 680 | }, 681 | { 682 | "cell_type": "code", 683 | "execution_count": 12, 684 | "id": "42bf0345-5db8-4da9-8657-b570024386d7", 685 | "metadata": {}, 686 | "outputs": [ 687 | { 688 | "data": { 689 | "text/html": [ 690 | "
\n", 691 | "\n", 704 | "\n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | " \n", 722 | " \n", 723 | " \n", 724 | " \n", 725 | " \n", 726 | " \n", 727 | " \n", 728 | " \n", 729 | " \n", 730 | " \n", 731 | " \n", 732 | " \n", 733 | " \n", 734 | " \n", 735 | " \n", 736 | " \n", 737 | " \n", 738 | " \n", 739 | " \n", 740 | " \n", 741 | " \n", 742 | " \n", 743 | " \n", 744 | " \n", 745 | " \n", 746 | " \n", 747 | " \n", 748 | " \n", 749 | " \n", 750 | " \n", 751 | " \n", 752 | " \n", 753 | " \n", 754 | " \n", 755 | " \n", 756 | " \n", 757 | " \n", 758 | " \n", 759 | " \n", 760 | " \n", 761 | " \n", 762 | " \n", 763 | " \n", 764 | " \n", 765 | " \n", 766 | " \n", 767 | " \n", 768 | " \n", 769 | " \n", 770 | " \n", 771 | " \n", 772 | " \n", 773 | " \n", 774 | " \n", 775 | " \n", 776 | " \n", 777 | " \n", 778 | " \n", 779 | " \n", 780 | " \n", 781 | " \n", 782 | " \n", 783 | " \n", 784 | " \n", 785 | " \n", 786 | "
days_since_inactivecurrent_priceitem_domain_idcurrencylisting_typeshipping_logistic_typeshipping_paymentsite_id
sku
454.0118.00526331201
841.058.49611621212
96.0199.00799121202
1119.0109.90364530201
130.0474.05565821202
\n", 787 | "
" 788 | ], 789 | "text/plain": [ 790 | " days_since_inactive current_price item_domain_id currency \\\n", 791 | "sku \n", 792 | "4 54.0 118.00 5263 3 \n", 793 | "8 41.0 58.49 6116 2 \n", 794 | "9 6.0 199.00 7991 2 \n", 795 | "11 19.0 109.90 3645 3 \n", 796 | "13 0.0 474.05 5658 2 \n", 797 | "\n", 798 | " listing_type shipping_logistic_type shipping_payment site_id \n", 799 | "sku \n", 800 | "4 1 2 0 1 \n", 801 | "8 1 2 1 2 \n", 802 | "9 1 2 0 2 \n", 803 | "11 0 2 0 1 \n", 804 | "13 1 2 0 2 " 805 | ] 806 | }, 807 | "execution_count": 12, 808 | "metadata": {}, 809 | "output_type": "execute_result" 810 | } 811 | ], 812 | "source": [ 813 | "Xt.head()" 814 | ] 815 | }, 816 | { 817 | "cell_type": "code", 818 | "execution_count": 14, 819 | "id": "b6880938-d9bf-456c-b8dd-c5f60dd293cd", 820 | "metadata": {}, 821 | "outputs": [ 822 | { 823 | "data": { 824 | "text/plain": [ 825 | "sku\n", 826 | "431262 2\n", 827 | "94157 9\n", 828 | "394886 9\n", 829 | "434156 9\n", 830 | "197550 12\n", 831 | " ..\n", 832 | "575227 10\n", 833 | "470249 10\n", 834 | "24226 10\n", 835 | "297331 10\n", 836 | "511077 10\n", 837 | "Length: 97692, dtype: int64" 838 | ] 839 | }, 840 | "execution_count": 14, 841 | "metadata": {}, 842 | "output_type": "execute_result" 843 | } 844 | ], 845 | "source": [ 846 | "p2" 847 | ] 848 | }, 849 | { 850 | "cell_type": "code", 851 | "execution_count": 13, 852 | "id": "14642acd-37f0-420c-9951-b90ce6b6f195", 853 | "metadata": {}, 854 | "outputs": [ 855 | { 856 | "name": "stdout", 857 | "output_type": "stream", 858 | "text": [ 859 | "(551472, 30)\n", 860 | "CPU times: user 2min 10s, sys: 836 ms, total: 2min 10s\n", 861 | "Wall time: 2min 10s\n" 862 | ] 863 | } 864 | ], 865 | "source": [ 866 | "%%time\n", 867 | "sub = pd.read_csv(\"45d.csv.gz\", header=None) # 4.31\n", 868 | "sub_ = sub.copy()\n", 869 | "sub_.index = test.index\n", 870 | "\n", 871 | "for sku in p2.index:\n", 872 | " s = sub_.loc[sku].copy()\n", 873 | " days = p2.loc[sku]\n", 874 | " #print(s)\n", 875 | " s.iloc[:days] = s.iloc[:days]*0.5\n", 876 | " s = s / s.sum()\n", 877 | " sub_.loc[sku, :] = s\n", 878 | "print(sub_.shape)\n", 879 | "sub_.round(4).to_csv(\"61byt.csv.gz\", header=False, index=False, compression=\"gzip\")\n", 880 | "# LB 4.2772" 881 | ] 882 | }, 883 | { 884 | "cell_type": "code", 885 | "execution_count": null, 886 | "id": "c8e7e49f-4e84-4a50-a324-76ca6abb9641", 887 | "metadata": {}, 888 | "outputs": [], 889 | "source": [] 890 | } 891 | ], 892 | "metadata": { 893 | "kernelspec": { 894 | "display_name": "Python 3", 895 | "language": "python", 896 | "name": "python3" 897 | }, 898 | "language_info": { 899 | "codemirror_mode": { 900 | "name": "ipython", 901 | "version": 3 902 | }, 903 | "file_extension": ".py", 904 | "mimetype": "text/x-python", 905 | "name": "python", 906 | "nbconvert_exporter": "python", 907 | "pygments_lexer": "ipython3", 908 | "version": "3.8.5" 909 | } 910 | }, 911 | "nbformat": 4, 912 | "nbformat_minor": 5 913 | } 914 | -------------------------------------------------------------------------------- /meli2021/README: -------------------------------------------------------------------------------- 1 | Solutions to #MeliDataChallenge 2021 2 | 3 | August 2nd, 2021 -> 19_xgb_barely_tuned gives you LB 4.64 (5th place) 4 | August 3rd, 2021 -> 32_baseline gives you LB 4.94 (7th place) 5 | 6 | If you average the predictions from 19 and 32 you get LB 4.44 (3rd place) 7 | 8 | August 9th, 2021 -> 61_active applied to the average above should give ~ LB 4.30 (4th place) 9 | 10 | Video Tutorials: https://www.youtube.com/playlist?list=PLV_itENB3unp-g1tgybj5-gs_4FGL8aA8 11 | 12 | -------------------------------------------------------------------------------- /meli2021/utils.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import pandas as pd 3 | import tweedie 4 | import scipy.stats as st 5 | 6 | def pred_list_to_prob_array(pred_list, cumulative=False, total_days=30): 7 | prob_array = np.zeros((pred_list.shape[0], total_days)) 8 | pred_list = np.clip(pred_list, 1, total_days) 9 | for row, e in enumerate(pred_list): 10 | if cumulative: 11 | prob_array[row, int(e-1)] = 1. 12 | else: 13 | prob_array[row, int(e-1):] = 1. 14 | 15 | if cumulative: 16 | prob_array = prob_array+1e-4 17 | prob_array = np.divide(prob_array, prob_array.sum(axis=1).reshape(-1,1)) 18 | prob_array = prob_array.cumsum(axis=1) 19 | 20 | return prob_array 21 | 22 | def pred_list_to_prob_array_mc(pred_list, total_days=30): 23 | prob_array = np.zeros((pred_list.shape[0], total_days)) 24 | pred_list = np.clip(pred_list, 1, total_days) 25 | for row, e in enumerate(pred_list): 26 | prob_array[row, int(e):] = 1. 27 | 28 | return prob_array 29 | 30 | def rps(y, p, probs=False, total_days=30): 31 | y_array = pred_list_to_prob_array(y, total_days=total_days) 32 | if probs: 33 | p_array = p.cumsum(axis=1) 34 | else: 35 | p_array = pred_list_to_prob_array(p, cumulative=True, total_days=total_days) 36 | return ((p_array - y_array)**2).sum(axis=1).mean() 37 | 38 | 39 | def rps_mc(y, p, probs=False, total_days=30): 40 | y_array = pred_list_to_prob_array_mc(y, total_days=total_days) 41 | if probs: 42 | p_array = p.cumsum(axis=1) 43 | return ((p_array - y_array)**2).sum(axis=1).mean() 44 | 45 | def rps_raw(y, p, probs=False): 46 | y_array = pred_list_to_prob_array(y) 47 | if probs: 48 | p_array = p.cumsum(axis=1) 49 | else: 50 | p_array = pred_list_to_prob_array(p, cumulative=True) 51 | return ((p_array - y_array)**2).sum(axis=1) 52 | 53 | 54 | def pred_list_to_tweedie(pred_list, phi=1, p=1.5): 55 | # has a bug in the first day, it's the wrong probability, but it's worse without the bug 56 | distros = dict() 57 | for mu in range(1,31): 58 | distros[mu] = [tweedie.tweedie(p=p, mu=mu, phi=phi).cdf(days) for days in range(1,31,1)] 59 | distros[mu][1:] = np.diff(distros[mu]) 60 | distros[mu] = np.round(distros[mu] / np.sum(distros[mu]), 4) 61 | 62 | prob_array = np.zeros((pred_list.shape[0], 30)) 63 | 64 | for row, mu in enumerate(pred_list): 65 | prob_array[row, :] = distros[mu]#.cumsum() 66 | #prob_array[row, -1] = 1. 67 | 68 | return prob_array 69 | 70 | 71 | 72 | def pred_list_to_distro(pred_list, wei=False, total_days=30, phi=2, power=1.5): 73 | distros = dict() 74 | for mu in range(1,total_days+1): 75 | if wei: 76 | distros[mu] = [st.norm.cdf(days, loc=mu, scale=1) for days in range(0,total_days+1,1)] 77 | else: 78 | distros[mu] = [tweedie.tweedie(p=power, mu=mu, phi=phi).cdf(days) for days in range(0,total_days+1,1)] 79 | #distros[mu] = [st.lognorm.cdf(days, s=0.5, loc=mu, scale=0.5) for days in range(0,31,1)] 80 | #distros[mu] = [st.expon.cdf(days, loc=mu, scale=0.01) for days in range(0,31,1)] 81 | #distros[mu] = [st.gengamma.cdf(days, loc=mu, scale=1, a=mu, c=1) for days in range(1,31,1)] 82 | if np.sum(distros[mu]) > 0: 83 | distros[mu] = np.diff(distros[mu]) 84 | distros[mu] = np.round(distros[mu] / np.sum(distros[mu]), 4) 85 | else: 86 | distros[mu] = distros[mu][1:] 87 | distros[mu][-1] = 1 88 | 89 | 90 | prob_array = np.zeros((pred_list.shape[0], total_days)) 91 | 92 | for row, mu in enumerate(pred_list): 93 | prob_array[row, :] = distros[mu]#.cumsum() 94 | #prob_array[row, -1] = 1. 95 | 96 | return prob_array 97 | 98 | def pred_list_to_distro_smooth(pred_list, total_days=30, phi=2, power=1.5, smooth_factor=0.3): 99 | distros = dict() 100 | for mu in range(1,total_days+1): 101 | distros[mu] = [tweedie.tweedie(p=power, mu=mu, phi=phi).cdf(days) for days in range(0,total_days+1,1)] 102 | if np.sum(distros[mu]) > 0: 103 | distros[mu] = np.diff(distros[mu]) 104 | distros[mu] = np.round(distros[mu] / np.sum(distros[mu]), 4) 105 | else: 106 | distros[mu] = distros[mu][1:] 107 | distros[mu][-1] = 1 108 | 109 | 110 | prob_array = np.zeros((pred_list.shape[0], total_days)) 111 | 112 | for row, mu in enumerate(pred_list): 113 | if mu == 1: 114 | prob_array[row, :] = (1-smooth_factor)*distros[mu] + smooth_factor*distros[mu+1] 115 | elif mu == total_days: 116 | prob_array[row, :] = smooth_factor*distros[mu-1] + (1-smooth_factor)*distros[mu] 117 | else: 118 | prob_array[row, :] = (smooth_factor/2)*distros[mu-1] + (1-smooth_factor)*distros[mu] + (smooth_factor/2)*distros[mu+1] 119 | 120 | return prob_array -------------------------------------------------------------------------------- /multiple_time_series/README: -------------------------------------------------------------------------------- 1 | Notebooks for https://youtu.be/RRd2wzMRpOc 2 | --------------------------------------------------------------------------------