├── 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 | " sku | \n",
67 | " date | \n",
68 | " sold_quantity | \n",
69 | " current_price | \n",
70 | " currency | \n",
71 | " listing_type | \n",
72 | " shipping_logistic_type | \n",
73 | " shipping_payment | \n",
74 | " minutes_active | \n",
75 | " item_domain_id | \n",
76 | " site_id | \n",
77 | " fold | \n",
78 | "
\n",
79 | " \n",
80 | " \n",
81 | " \n",
82 | " 0 | \n",
83 | " 464801 | \n",
84 | " 2021-02-01 | \n",
85 | " 0 | \n",
86 | " 156.78 | \n",
87 | " REA | \n",
88 | " classic | \n",
89 | " fulfillment | \n",
90 | " free_shipping | \n",
91 | " 1440.0 | \n",
92 | " MLB-NEBULIZERS | \n",
93 | " MLB | \n",
94 | " 2 | \n",
95 | "
\n",
96 | " \n",
97 | " 1 | \n",
98 | " 464801 | \n",
99 | " 2021-02-02 | \n",
100 | " 0 | \n",
101 | " 156.78 | \n",
102 | " REA | \n",
103 | " classic | \n",
104 | " fulfillment | \n",
105 | " free_shipping | \n",
106 | " 1440.0 | \n",
107 | " MLB-NEBULIZERS | \n",
108 | " MLB | \n",
109 | " 2 | \n",
110 | "
\n",
111 | " \n",
112 | " 2 | \n",
113 | " 464801 | \n",
114 | " 2021-02-03 | \n",
115 | " 0 | \n",
116 | " 156.78 | \n",
117 | " REA | \n",
118 | " classic | \n",
119 | " fulfillment | \n",
120 | " free_shipping | \n",
121 | " 1440.0 | \n",
122 | " MLB-NEBULIZERS | \n",
123 | " MLB | \n",
124 | " 2 | \n",
125 | "
\n",
126 | " \n",
127 | " 3 | \n",
128 | " 464801 | \n",
129 | " 2021-02-04 | \n",
130 | " 0 | \n",
131 | " 156.78 | \n",
132 | " REA | \n",
133 | " classic | \n",
134 | " fulfillment | \n",
135 | " free_shipping | \n",
136 | " 1440.0 | \n",
137 | " MLB-NEBULIZERS | \n",
138 | " MLB | \n",
139 | " 2 | \n",
140 | "
\n",
141 | " \n",
142 | " 4 | \n",
143 | " 464801 | \n",
144 | " 2021-02-05 | \n",
145 | " 1 | \n",
146 | " 156.78 | \n",
147 | " REA | \n",
148 | " classic | \n",
149 | " fulfillment | \n",
150 | " free_shipping | \n",
151 | " 1440.0 | \n",
152 | " MLB-NEBULIZERS | \n",
153 | " MLB | \n",
154 | " 2 | \n",
155 | "
\n",
156 | " \n",
157 | "
\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 | " sku | \n",
263 | " date | \n",
264 | " sold_quantity | \n",
265 | " current_price | \n",
266 | " currency | \n",
267 | " listing_type | \n",
268 | " shipping_logistic_type | \n",
269 | " shipping_payment | \n",
270 | " minutes_active | \n",
271 | " item_domain_id | \n",
272 | " site_id | \n",
273 | " fold | \n",
274 | "
\n",
275 | " \n",
276 | " \n",
277 | " \n",
278 | " 0 | \n",
279 | " 464801 | \n",
280 | " 2021-02-01 | \n",
281 | " 0 | \n",
282 | " 156.78 | \n",
283 | " REA | \n",
284 | " classic | \n",
285 | " fulfillment | \n",
286 | " free_shipping | \n",
287 | " 1440.0 | \n",
288 | " MLB-NEBULIZERS | \n",
289 | " MLB | \n",
290 | " 2 | \n",
291 | "
\n",
292 | " \n",
293 | " 1 | \n",
294 | " 464801 | \n",
295 | " 2021-02-02 | \n",
296 | " 0 | \n",
297 | " 156.78 | \n",
298 | " REA | \n",
299 | " classic | \n",
300 | " fulfillment | \n",
301 | " free_shipping | \n",
302 | " 1440.0 | \n",
303 | " MLB-NEBULIZERS | \n",
304 | " MLB | \n",
305 | " 2 | \n",
306 | "
\n",
307 | " \n",
308 | " 2 | \n",
309 | " 464801 | \n",
310 | " 2021-02-03 | \n",
311 | " 0 | \n",
312 | " 156.78 | \n",
313 | " REA | \n",
314 | " classic | \n",
315 | " fulfillment | \n",
316 | " free_shipping | \n",
317 | " 1440.0 | \n",
318 | " MLB-NEBULIZERS | \n",
319 | " MLB | \n",
320 | " 2 | \n",
321 | "
\n",
322 | " \n",
323 | " 3 | \n",
324 | " 464801 | \n",
325 | " 2021-02-04 | \n",
326 | " 0 | \n",
327 | " 156.78 | \n",
328 | " REA | \n",
329 | " classic | \n",
330 | " fulfillment | \n",
331 | " free_shipping | \n",
332 | " 1440.0 | \n",
333 | " MLB-NEBULIZERS | \n",
334 | " MLB | \n",
335 | " 2 | \n",
336 | "
\n",
337 | " \n",
338 | " 4 | \n",
339 | " 464801 | \n",
340 | " 2021-02-05 | \n",
341 | " 1 | \n",
342 | " 156.78 | \n",
343 | " REA | \n",
344 | " classic | \n",
345 | " fulfillment | \n",
346 | " free_shipping | \n",
347 | " 1440.0 | \n",
348 | " MLB-NEBULIZERS | \n",
349 | " MLB | \n",
350 | " 2 | \n",
351 | "
\n",
352 | " \n",
353 | "
\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 | " 0 | \n",
669 | " 1 | \n",
670 | " 2 | \n",
671 | " 3 | \n",
672 | " 4 | \n",
673 | " 5 | \n",
674 | " 6 | \n",
675 | " 7 | \n",
676 | " 8 | \n",
677 | " 9 | \n",
678 | " 10 | \n",
679 | " 11 | \n",
680 | " 12 | \n",
681 | " 13 | \n",
682 | " 14 | \n",
683 | " 15 | \n",
684 | " 16 | \n",
685 | " 17 | \n",
686 | " 18 | \n",
687 | " 19 | \n",
688 | " 20 | \n",
689 | " 21 | \n",
690 | " 22 | \n",
691 | " 23 | \n",
692 | " 24 | \n",
693 | " 25 | \n",
694 | " 26 | \n",
695 | " 27 | \n",
696 | " 28 | \n",
697 | " 29 | \n",
698 | "
\n",
699 | " \n",
700 | " \n",
701 | " \n",
702 | " 0 | \n",
703 | " 0.0215 | \n",
704 | " 0.0145 | \n",
705 | " 0.0175 | \n",
706 | " 0.0204 | \n",
707 | " 0.0233 | \n",
708 | " 0.0259 | \n",
709 | " 0.0284 | \n",
710 | " 0.0307 | \n",
711 | " 0.0328 | \n",
712 | " 0.0346 | \n",
713 | " 0.0362 | \n",
714 | " 0.0375 | \n",
715 | " 0.0386 | \n",
716 | " 0.0395 | \n",
717 | " 0.0401 | \n",
718 | " 0.0405 | \n",
719 | " 0.0407 | \n",
720 | " 0.0407 | \n",
721 | " 0.0405 | \n",
722 | " 0.0402 | \n",
723 | " 0.0397 | \n",
724 | " 0.0390 | \n",
725 | " 0.0383 | \n",
726 | " 0.0374 | \n",
727 | " 0.0364 | \n",
728 | " 0.0354 | \n",
729 | " 0.0343 | \n",
730 | " 0.0331 | \n",
731 | " 0.0319 | \n",
732 | " 0.0307 | \n",
733 | "
\n",
734 | " \n",
735 | " 1 | \n",
736 | " 0.0161 | \n",
737 | " 0.0111 | \n",
738 | " 0.0137 | \n",
739 | " 0.0162 | \n",
740 | " 0.0188 | \n",
741 | " 0.0213 | \n",
742 | " 0.0238 | \n",
743 | " 0.0261 | \n",
744 | " 0.0284 | \n",
745 | " 0.0305 | \n",
746 | " 0.0325 | \n",
747 | " 0.0343 | \n",
748 | " 0.0359 | \n",
749 | " 0.0373 | \n",
750 | " 0.0386 | \n",
751 | " 0.0397 | \n",
752 | " 0.0406 | \n",
753 | " 0.0413 | \n",
754 | " 0.0418 | \n",
755 | " 0.0422 | \n",
756 | " 0.0424 | \n",
757 | " 0.0424 | \n",
758 | " 0.0423 | \n",
759 | " 0.0421 | \n",
760 | " 0.0417 | \n",
761 | " 0.0412 | \n",
762 | " 0.0406 | \n",
763 | " 0.0399 | \n",
764 | " 0.0391 | \n",
765 | " 0.0383 | \n",
766 | "
\n",
767 | " \n",
768 | " 2 | \n",
769 | " 0.0161 | \n",
770 | " 0.0111 | \n",
771 | " 0.0137 | \n",
772 | " 0.0162 | \n",
773 | " 0.0188 | \n",
774 | " 0.0213 | \n",
775 | " 0.0238 | \n",
776 | " 0.0261 | \n",
777 | " 0.0284 | \n",
778 | " 0.0305 | \n",
779 | " 0.0325 | \n",
780 | " 0.0343 | \n",
781 | " 0.0359 | \n",
782 | " 0.0373 | \n",
783 | " 0.0386 | \n",
784 | " 0.0397 | \n",
785 | " 0.0406 | \n",
786 | " 0.0413 | \n",
787 | " 0.0418 | \n",
788 | " 0.0422 | \n",
789 | " 0.0424 | \n",
790 | " 0.0424 | \n",
791 | " 0.0423 | \n",
792 | " 0.0421 | \n",
793 | " 0.0417 | \n",
794 | " 0.0412 | \n",
795 | " 0.0406 | \n",
796 | " 0.0399 | \n",
797 | " 0.0391 | \n",
798 | " 0.0383 | \n",
799 | "
\n",
800 | " \n",
801 | " 3 | \n",
802 | " 0.0161 | \n",
803 | " 0.0111 | \n",
804 | " 0.0137 | \n",
805 | " 0.0162 | \n",
806 | " 0.0188 | \n",
807 | " 0.0213 | \n",
808 | " 0.0238 | \n",
809 | " 0.0261 | \n",
810 | " 0.0284 | \n",
811 | " 0.0305 | \n",
812 | " 0.0325 | \n",
813 | " 0.0343 | \n",
814 | " 0.0359 | \n",
815 | " 0.0373 | \n",
816 | " 0.0386 | \n",
817 | " 0.0397 | \n",
818 | " 0.0406 | \n",
819 | " 0.0413 | \n",
820 | " 0.0418 | \n",
821 | " 0.0422 | \n",
822 | " 0.0424 | \n",
823 | " 0.0424 | \n",
824 | " 0.0423 | \n",
825 | " 0.0421 | \n",
826 | " 0.0417 | \n",
827 | " 0.0412 | \n",
828 | " 0.0406 | \n",
829 | " 0.0399 | \n",
830 | " 0.0391 | \n",
831 | " 0.0383 | \n",
832 | "
\n",
833 | " \n",
834 | " 4 | \n",
835 | " 0.0161 | \n",
836 | " 0.0111 | \n",
837 | " 0.0137 | \n",
838 | " 0.0162 | \n",
839 | " 0.0188 | \n",
840 | " 0.0213 | \n",
841 | " 0.0238 | \n",
842 | " 0.0261 | \n",
843 | " 0.0284 | \n",
844 | " 0.0305 | \n",
845 | " 0.0325 | \n",
846 | " 0.0343 | \n",
847 | " 0.0359 | \n",
848 | " 0.0373 | \n",
849 | " 0.0386 | \n",
850 | " 0.0397 | \n",
851 | " 0.0406 | \n",
852 | " 0.0413 | \n",
853 | " 0.0418 | \n",
854 | " 0.0422 | \n",
855 | " 0.0424 | \n",
856 | " 0.0424 | \n",
857 | " 0.0423 | \n",
858 | " 0.0421 | \n",
859 | " 0.0417 | \n",
860 | " 0.0412 | \n",
861 | " 0.0406 | \n",
862 | " 0.0399 | \n",
863 | " 0.0391 | \n",
864 | " 0.0383 | \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 | " 551467 | \n",
901 | " 0.0161 | \n",
902 | " 0.0111 | \n",
903 | " 0.0137 | \n",
904 | " 0.0162 | \n",
905 | " 0.0188 | \n",
906 | " 0.0213 | \n",
907 | " 0.0238 | \n",
908 | " 0.0261 | \n",
909 | " 0.0284 | \n",
910 | " 0.0305 | \n",
911 | " 0.0325 | \n",
912 | " 0.0343 | \n",
913 | " 0.0359 | \n",
914 | " 0.0373 | \n",
915 | " 0.0386 | \n",
916 | " 0.0397 | \n",
917 | " 0.0406 | \n",
918 | " 0.0413 | \n",
919 | " 0.0418 | \n",
920 | " 0.0422 | \n",
921 | " 0.0424 | \n",
922 | " 0.0424 | \n",
923 | " 0.0423 | \n",
924 | " 0.0421 | \n",
925 | " 0.0417 | \n",
926 | " 0.0412 | \n",
927 | " 0.0406 | \n",
928 | " 0.0399 | \n",
929 | " 0.0391 | \n",
930 | " 0.0383 | \n",
931 | "
\n",
932 | " \n",
933 | " 551468 | \n",
934 | " 0.0161 | \n",
935 | " 0.0111 | \n",
936 | " 0.0137 | \n",
937 | " 0.0162 | \n",
938 | " 0.0188 | \n",
939 | " 0.0213 | \n",
940 | " 0.0238 | \n",
941 | " 0.0261 | \n",
942 | " 0.0284 | \n",
943 | " 0.0305 | \n",
944 | " 0.0325 | \n",
945 | " 0.0343 | \n",
946 | " 0.0359 | \n",
947 | " 0.0373 | \n",
948 | " 0.0386 | \n",
949 | " 0.0397 | \n",
950 | " 0.0406 | \n",
951 | " 0.0413 | \n",
952 | " 0.0418 | \n",
953 | " 0.0422 | \n",
954 | " 0.0424 | \n",
955 | " 0.0424 | \n",
956 | " 0.0423 | \n",
957 | " 0.0421 | \n",
958 | " 0.0417 | \n",
959 | " 0.0412 | \n",
960 | " 0.0406 | \n",
961 | " 0.0399 | \n",
962 | " 0.0391 | \n",
963 | " 0.0383 | \n",
964 | "
\n",
965 | " \n",
966 | " 551469 | \n",
967 | " 0.0161 | \n",
968 | " 0.0111 | \n",
969 | " 0.0137 | \n",
970 | " 0.0162 | \n",
971 | " 0.0188 | \n",
972 | " 0.0213 | \n",
973 | " 0.0238 | \n",
974 | " 0.0261 | \n",
975 | " 0.0284 | \n",
976 | " 0.0305 | \n",
977 | " 0.0325 | \n",
978 | " 0.0343 | \n",
979 | " 0.0359 | \n",
980 | " 0.0373 | \n",
981 | " 0.0386 | \n",
982 | " 0.0397 | \n",
983 | " 0.0406 | \n",
984 | " 0.0413 | \n",
985 | " 0.0418 | \n",
986 | " 0.0422 | \n",
987 | " 0.0424 | \n",
988 | " 0.0424 | \n",
989 | " 0.0423 | \n",
990 | " 0.0421 | \n",
991 | " 0.0417 | \n",
992 | " 0.0412 | \n",
993 | " 0.0406 | \n",
994 | " 0.0399 | \n",
995 | " 0.0391 | \n",
996 | " 0.0383 | \n",
997 | "
\n",
998 | " \n",
999 | " 551470 | \n",
1000 | " 0.0399 | \n",
1001 | " 0.0256 | \n",
1002 | " 0.0296 | \n",
1003 | " 0.0331 | \n",
1004 | " 0.0361 | \n",
1005 | " 0.0386 | \n",
1006 | " 0.0405 | \n",
1007 | " 0.0419 | \n",
1008 | " 0.0429 | \n",
1009 | " 0.0434 | \n",
1010 | " 0.0435 | \n",
1011 | " 0.0432 | \n",
1012 | " 0.0427 | \n",
1013 | " 0.0418 | \n",
1014 | " 0.0407 | \n",
1015 | " 0.0394 | \n",
1016 | " 0.0379 | \n",
1017 | " 0.0364 | \n",
1018 | " 0.0347 | \n",
1019 | " 0.0330 | \n",
1020 | " 0.0312 | \n",
1021 | " 0.0294 | \n",
1022 | " 0.0276 | \n",
1023 | " 0.0259 | \n",
1024 | " 0.0242 | \n",
1025 | " 0.0225 | \n",
1026 | " 0.0209 | \n",
1027 | " 0.0193 | \n",
1028 | " 0.0178 | \n",
1029 | " 0.0164 | \n",
1030 | "
\n",
1031 | " \n",
1032 | " 551471 | \n",
1033 | " 0.0161 | \n",
1034 | " 0.0111 | \n",
1035 | " 0.0137 | \n",
1036 | " 0.0162 | \n",
1037 | " 0.0188 | \n",
1038 | " 0.0213 | \n",
1039 | " 0.0238 | \n",
1040 | " 0.0261 | \n",
1041 | " 0.0284 | \n",
1042 | " 0.0305 | \n",
1043 | " 0.0325 | \n",
1044 | " 0.0343 | \n",
1045 | " 0.0359 | \n",
1046 | " 0.0373 | \n",
1047 | " 0.0386 | \n",
1048 | " 0.0397 | \n",
1049 | " 0.0406 | \n",
1050 | " 0.0413 | \n",
1051 | " 0.0418 | \n",
1052 | " 0.0422 | \n",
1053 | " 0.0424 | \n",
1054 | " 0.0424 | \n",
1055 | " 0.0423 | \n",
1056 | " 0.0421 | \n",
1057 | " 0.0417 | \n",
1058 | " 0.0412 | \n",
1059 | " 0.0406 | \n",
1060 | " 0.0399 | \n",
1061 | " 0.0391 | \n",
1062 | " 0.0383 | \n",
1063 | "
\n",
1064 | " \n",
1065 | "
\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 | " sku | \n",
110 | " date | \n",
111 | " sold_quantity | \n",
112 | " current_price | \n",
113 | " currency | \n",
114 | " listing_type | \n",
115 | " shipping_logistic_type | \n",
116 | " shipping_payment | \n",
117 | " minutes_active | \n",
118 | " item_domain_id | \n",
119 | " site_id | \n",
120 | " fold | \n",
121 | "
\n",
122 | " \n",
123 | " \n",
124 | " \n",
125 | " 0 | \n",
126 | " 464801 | \n",
127 | " 2021-02-01 | \n",
128 | " 0 | \n",
129 | " 156.78 | \n",
130 | " REA | \n",
131 | " classic | \n",
132 | " fulfillment | \n",
133 | " free_shipping | \n",
134 | " 1440.0 | \n",
135 | " MLB-NEBULIZERS | \n",
136 | " MLB | \n",
137 | " 2 | \n",
138 | "
\n",
139 | " \n",
140 | " 1 | \n",
141 | " 464801 | \n",
142 | " 2021-02-02 | \n",
143 | " 0 | \n",
144 | " 156.78 | \n",
145 | " REA | \n",
146 | " classic | \n",
147 | " fulfillment | \n",
148 | " free_shipping | \n",
149 | " 1440.0 | \n",
150 | " MLB-NEBULIZERS | \n",
151 | " MLB | \n",
152 | " 2 | \n",
153 | "
\n",
154 | " \n",
155 | " 2 | \n",
156 | " 464801 | \n",
157 | " 2021-02-03 | \n",
158 | " 0 | \n",
159 | " 156.78 | \n",
160 | " REA | \n",
161 | " classic | \n",
162 | " fulfillment | \n",
163 | " free_shipping | \n",
164 | " 1440.0 | \n",
165 | " MLB-NEBULIZERS | \n",
166 | " MLB | \n",
167 | " 2 | \n",
168 | "
\n",
169 | " \n",
170 | " 3 | \n",
171 | " 464801 | \n",
172 | " 2021-02-04 | \n",
173 | " 0 | \n",
174 | " 156.78 | \n",
175 | " REA | \n",
176 | " classic | \n",
177 | " fulfillment | \n",
178 | " free_shipping | \n",
179 | " 1440.0 | \n",
180 | " MLB-NEBULIZERS | \n",
181 | " MLB | \n",
182 | " 2 | \n",
183 | "
\n",
184 | " \n",
185 | " 4 | \n",
186 | " 464801 | \n",
187 | " 2021-02-05 | \n",
188 | " 1 | \n",
189 | " 156.78 | \n",
190 | " REA | \n",
191 | " classic | \n",
192 | " fulfillment | \n",
193 | " free_shipping | \n",
194 | " 1440.0 | \n",
195 | " MLB-NEBULIZERS | \n",
196 | " MLB | \n",
197 | " 2 | \n",
198 | "
\n",
199 | " \n",
200 | "
\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": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAD4CAYAAADhNOGaAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3de3xU5Z348c83twm5cUkCCQkQ7iRcVIwoXmupFusFdVGxrqVdd6lt/bXddtt1f9ta6/72Yl9d21dXty31Uqq1aLFWrFS84KW1iIT7XQNyCUkghACZhEwyyff3x5zgmE7IJJnJZOZ8369XXjlzzpmT53Hk+c75Ps95HlFVjDHGuFdSrAtgjDEmtiwQGGOMy1kgMMYYl7NAYIwxLmeBwBhjXC4l1gXojby8PC0pKYl1MYwxJq5s2LDhmKrmd3c8rgJBSUkJFRUVsS6GMcbEFRE5cLbjlhoyxhiXs0BgjDEuZ4HAGGNczgKBMca4XFiBQETmi8geEakUkXtDHPeIyDPO8XUiUhJ0bJaIrBWRHSKyTUTSnf1vOtfc7PyMjFSljDHGhK/HUUMikgw8AlwFVAHrRWSlqu4MOu0uoEFVJ4nIIuBB4DYRSQGeAu5U1S0ikgu0Bb3vDlW1YUDGGBND4dwRzAEqVXWfqrYCy4EFXc5ZACxztlcA80REgKuBraq6BUBV61W1PTJFN8YYEwnhBIIi4FDQ6ypnX8hzVNUPnARygSmAishqEdkoIt/u8r4nnLTQd53A8VdEZImIVIhIRV1dXRjF7bvTre38tuIQNjW3McZNot1ZnAJcCtzh/L5JROY5x+5Q1ZnAZc7PnaEuoKpLVbVcVcvz87t9MC4iXt11hG+t2MqmQyei+neMMWYwCScQHAbGBL0udvaFPMfpFxgK1BO4e3hbVY+pajOwCpgNoKqHnd+NwNMEUlAxdep0oPtiZ/WpGJfEGGMGTjiBYD0wWUTGi0gasAhY2eWclcBiZ3shsEYD+ZXVwEwRyXACxBXAThFJEZE8ABFJBa4Dtve/Ov3j9fkB2FVjgcAY4x49jhpSVb+I3EOgUU8GHlfVHSLyAFChqiuBx4AnRaQSOE4gWKCqDSLyEIFgosAqVX1JRDKB1U4QSAZeA34Rhfr1irclEAh21zbGuCTGGDNwwpp0TlVXEUjrBO+7L2i7Bbilm/c+RWAIafC+JuD83hY22jrvCHbXnKKjQ0lKCtl/bYwxCcWeLA7SGQiaWts51NAc49IYY8zAsEAQpMnnp/MmYFeNpYeMMe5ggSCI1+dnyqhsksQ6jI0x7hFXC9NEm9fnJz/bQ2t7hwUCY4xr2B1BEG+LnyxPCqUFOeyqtUBgjHEHCwRBvD4/mZ4USguzOXT8NI0tbT2/yRhj4pwFgiBen3NHUJgDwB57nsAY4wIWCByqSpPPT3b6R4HA+gmMMW5ggcBxuq2dDoVMTwqFQ9PJSU9hpw0hNca4gAUCR+f0ElmeFESE0sIcdluHsTHGBSwQOBp9HwUCgNLCHPbUNtLRYWsTGGMSmwUCR1OXQFBWmENzazsHjttUE8aYxGaBwHEmNZQeCATTCrOBwAR0xhiTyCwQOLxd7ghsqgljjFtYIHB0DQTpqclMyM+ykUPGmIRngcDRGQgyPR9Nv1RamGN3BMaYhBdWIBCR+SKyR0QqReTeEMc9IvKMc3ydiJQEHZslImtFZIeIbBORdGf/+c7rShH5iYjEdBWYzkCQnf5RIJhWkM3hE6c5ZVNNGGMSWI+BQESSgUeAa4Ay4HYRKety2l1Ag6pOAn4EPOi8N4XA6mR3q+p04BNAZ6v6U+AfgMnOz/z+VqY/vC1+kpMET8pH/0nKnCeMd1t6yBiTwMK5I5gDVKrqPlVtBZYDC7qcswBY5myvAOY53/CvBraq6hYAVa1X1XYRKQRyVPVdZ5H7XwE3RqA+fdbkzDMUfGNiU00YY9wgnEBQBBwKel3l7At5jqr6gZNALjAFUBFZLSIbReTbQedX9XBNAERkiYhUiEhFXV1dGMXtm0YnEAQbleNheEaqPWFsjElo0V6YJgW4FLgAaAZeF5ENBAJFWFR1KbAUoLy8PGqP+XauRRBMRJhWkGMjh4wxCS2cO4LDwJig18XOvpDnOP0CQ4F6At/031bVY6raDKwCZjvnF/dwzQHV1Oo/8zBZsMBUE6dot6kmjDEJKpxAsB6YLCLjRSQNWASs7HLOSmCxs70QWOPk/lcDM0UkwwkQVwA7VbUGOCUiFzl9CZ8DXohAffrM2+L/2NDRTqWF2bS0dbC/vikGpTLGmOjrMRA4Of97CDTqu4BnVXWHiDwgIjc4pz0G5IpIJfAN4F7nvQ3AQwSCyWZgo6q+5Lzny8CjQCWwF/hjxGrVB16fn+yQgcBGDhljEltYfQSquopAWid4331B2y3ALd289ykCQ0i77q8AZvSmsNHkDdFZDDBpZBbJScKumlNcO6swBiUzxpjosieLHd2lhtJTk5mYn2lDSI0xCcsCAdDRoTS1tofsLAabasIYk9gsEBAYMQSQ5UkOeXxaQQ7VJ1s42WxTTRhjEo8FAqDJ1w5Alic15PFSZ22CXfZgmTEmAVkgALy+wDf97lJDZTbVhDEmgVkgALxn7ghCp4bysz3kZqbZEFJjTEKyQEDQMpXdpIZEhGmF2ZYaMsYkJAsEfJQayuzmjgCgtCCHPbWN+Ns7BqpYxhgzICwQ8FFqKLubOwIIDCH1+W2qCWNM4rFAAHhbzt5ZDMFrE1g/gTEmsVggAJpaA3cEZ0sNTRyZSYoz1YQxxiQSCwRAY4uftOQkPCndBwJPSjKTRmZZIDDGJBwLBAQ6i892N9CptDCH3bWWGjLGJBYLBASeLD5b/0CnaQXZ1Jxs4URz6wCUyhhjBoYFAgKpocy0ngNBZ4fxTksPGWMSSFiBQETmi8geEakUkXtDHPeIyDPO8XUiUuLsLxGR0yKy2fn5WdB73nSu2XlsZKQq1VtNPj/ZYdwR2MghY0wi6rH1E5Fk4BHgKgJrEK8XkZWqujPotLuABlWdJCKLgAeB25xje1X13G4uf4ezQE1MeX1+8rLSejwvP9tDXpaH3XZHYIxJIOHcEcwBKlV1n6q2AsuBBV3OWQAsc7ZXAPOctYjjgtcXelGaUEptqgljTIIJJxAUAYeCXlc5+0Ke46xxfBLIdY6NF5FNIvKWiFzW5X1POGmh78YycHjDTA1BID30/hGvTTVhjEkY0e4srgHGqup5BBa1f1pEcpxjd6jqTOAy5+fOUBcQkSUiUiEiFXV1dVEppDfMzmII3BG0+jvYd8ymmjDGJIZwAsFhYEzQ62JnX8hzRCQFGArUq6pPVesBVHUDsBeY4rw+7PxuBJ4mkIL6K6q6VFXLVbU8Pz8/3HqFrb1DOd0W3vBRCO4wtvSQMSYxhBMI1gOTRWS8iKQBi4CVXc5ZCSx2thcCa1RVRSTf6WxGRCYAk4F9IpIiInnO/lTgOmB7/6vTe15f5xTU4QWCCXlZpCaLjRwyxiSMHls/VfWLyD3AaiAZeFxVd4jIA0CFqq4EHgOeFJFK4DiBYAFwOfCAiLQBHcDdqnpcRDKB1U4QSAZeA34R6cqFo7eBIC0liUkjs+2OwBiTMMJq/VR1FbCqy777grZbgFtCvO854LkQ+5uA83tb2Gho6gwEYaaGINBP8E7lsWgVyRhjBpTrnyxudFYnC3f4KATWMD5yysfxJptqwhgT/1wfCDrvCLJ7EQimFViHsTEmcbg+EHj7mBoCCwTGmMRggcAJBOE+RwCQm+VhZLbHJp8zxiQECwROH0G4TxZ3Ki3MsSGkxpiEYIHA1/vOYoCy0TlUHm2k1W9TTRhj4pvrA0GTz48nJYnU5N79pygtzKGtXak86o1SyYwxZmC4PhA09mLCuWBlNtWEMSZBuD4QNPViCupg4/MySU9Nsg5jY0zcc30g8Lb4w55eIlhykjC1IMfuCIwxcc/1gaCxj3cEAGWF2eysOYWqRrhUxhgzcFwfCJp8/l49VRysrDCHE81t1J5qiXCpjDFm4Lg+EPRmmcquOtcm2Flt6SFjTPxyfSBo8vl7Nb1EsGk2csgYkwBcHwgaW/qeGsrypDAuN8NGDhlj4pqrA0Fbewc+f0efU0MApQU21YQxJr6FFQhEZL6I7BGRShG5N8Rxj4g84xxfJyIlzv4SETktIpudn58Fved8EdnmvOcnIiKRqlS4mnq5OlkoZaNz2F/fdOZaxhgTb3oMBM6aw48A1wBlwO0iUtbltLuABlWdBPwIeDDo2F5VPdf5uTto/0+BfyCwjvFkYH7fq9E3nYvS9CcQlBbmoAq7a+2uwBgTn8K5I5gDVKrqPlVtBZYDC7qcswBY5myvAOad7Ru+iBQCOar6rgYG4f8KuLHXpe+nptber0XQVdloZ+SQ9RMYY+JUOIGgCDgU9LrK2RfyHFX1AyeBXOfYeBHZJCJvichlQedX9XBNAERkiYhUiEhFXV1dGMUNnzcCdwSjh6aTk55iI4eMMXEr2p3FNcBYVT0P+AbwtIjk9OYCqrpUVctVtTw/Pz+ihWvs4xTUwUSEstE59iyBMSZuhRMIDgNjgl4XO/tCniMiKcBQoF5VfapaD6CqG4C9wBTn/OIerhl1Z9Yr7kdqCAL9BHtqG2nvsKkmjDHxJ5xAsB6YLCLjRSQNWASs7HLOSmCxs70QWKOqKiL5TmczIjKBQKfwPlWtAU6JyEVOX8LngBciUJ9e6UwN9eeOAAJTTZxua2d/fVMkimWMMQOqx0Dg5PzvAVYDu4BnVXWHiDwgIjc4pz0G5IpIJYEUUOcQ08uBrSKymUAn8t2qetw59mXgUaCSwJ3CHyNUp7B5IzB8FD6aasL6CYwx8SisFlBVVwGruuy7L2i7BbglxPueA57r5poVwIzeFDbSIhUIJo/KIiVJ2Fl9iutmjY5E0YwxZsC4+slib4ufIanJJCf171k2T0oyk0Zm2R2BMSYuuToQNLX2fcK5rsoKc+xZAmNMXHJ1IGjs4+pkoZQW5nDklI96ry8i1zPGmIHi6kDQ5ItcIOh8wtgmoDPGxBtXBwJvBAOBjRwyxsQrlweC9n4/Q9BpRGYaBTnp1k9gjIk7Lg8Ebf1+qjhYaWG23REYY+KOuwNBi59MT3LErlc2OofKo158/vaIXdMYY6LN1YGgyddOlic1YtcrLczB36F8cMQbsWsaY0y0uTYQ+PzttLZ3kBXJOwLrMDbGxCHXBoImXyB9E6lRQwDjcjMZkppsHcbGmLji2kBwZlGa9MilhpKThGnWYWyMiTOuDQSNvjaAiKaGINBPsLP6FIEVOI0xZvBzbSD4KDUUuTsCCPQTnGrxU32yJaLXNcaYaHFtIPA6dwSRHD4KHz1hbEtXGmPihYsDQeCOIJIPlAFMK8hGxEYOGWPiR1iBQETmi8geEakUkXtDHPeIyDPO8XUiUtLl+FgR8YrIPwXt2y8i20Rks4hU9LcivXWmszjCqaFMTwoluZl2R2CMiRs9BgJnzeFHgGuAMuB2ESnrctpdQIOqTgJ+BDzY5fhDhF6K8kpVPVdVy3td8n6KVmoIAv0Eu2otEBhj4kM4dwRzgEpV3aeqrcByYEGXcxYAy5ztFcA8Z1F6RORG4ENgR2SKHBmdqaHMtMimhiAw59CB+mYaW9oifm1jjIm0cAJBEXAo6HWVsy/kOc5i9ycJLGafBfwz8P0Q11XgFRHZICJLuvvjIrJERCpEpKKuri6M4obH2+InMy2ZpH4uUxlK59oEe2ptbQJjzOAX7c7i+4EfqWqoyXcuVdXZBFJOXxGRy0NdQFWXqmq5qpbn5+dHrGBNvsgtU9nVmZFD1mFsjIkD4bSEh4ExQa+LnX2hzqkSkRRgKFAPXAgsFJEfAMOADhFpUdWHVfUwgKoeFZHnCaSg3u5XbXohkovSdFWQk87wjFQbOWSMiQvh3BGsByaLyHgRSQMWASu7nLMSWOxsLwTWaMBlqlqiqiXAj4H/UNWHRSRTRLIBRCQTuBrYHoH6hK0xioFARM48YWyMMYNdj4HAyfnfA6wGdgHPquoOEXlARG5wTnuMQJ9AJfAN4K+GmHYxCviziGwB3gNeUtWX+1qJvohmaggCI4d21zbib++I2t8wxphICKslVNVVwKou++4L2m4BbunhGvcHbe8DzulNQSPN2+InNzMjatcvLczB5+9gf30Tk0ZmR+3vGGNMf7n4yeIo3xGM7uwwtpFDxpjBzdWBIDtKfQQAE/OzSE0W6ycwxgx6rgwEqorX5yczioEgLSWJySNtbQJjzODnykDg83fQ3qFRTQ2BszaBBQJjzCDnykDQeGbCuegGgrLROdQ1+qhr9EX17xhjTH+4MhA0+QYmEJQWBkYLWXrIGDOYuTIQeAcoEJQ5U01YIDDGDGYWCKJoWEYao4emWz+BMWZQc2cg6OwjiHJnMQQ6jO2OwBgzmLkzEDh3BNEcPtqpbHQOe+uaaGlrj/rfMsaYvnB1IIjmA2WdZhYNpb1D2XigIep/yxhj+sLVgWAg7ggum5zPkNRkXtpWE/W/ZYwxfeHKQNDk8yMCGWmRX6+4qyFpycwrHcnL22ttJlJjzKDkykDQ2BJYi8BZVjnqrptVSH1TK+s+PD4gf88YY3rDlYEgmquThfKJqSPJSEvmD1stPWSMGXzCCgQiMl9E9ohIpYj81aIzIuIRkWec4+tEpKTL8bEi4hWRfwr3mtHUNMCBID01mU+VjuLl7TWWHjLGDDo9BgIRSQYeIbDIfBlwu4iUdTntLqBBVScBPwIe7HL8IeCPvbxm1ER75tFQrp1VSENzG2v31Q/o3zXGmJ6Ec0cwB6hU1X2q2gosBxZ0OWcBsMzZXgHMEycBLyI3Ah8CO3p5zajx+vxkD8DDZMGumJJPZloyL1l6yBgzyIQTCIqAQ0Gvq5x9Ic9x1jg+SWAN4yzgn4Hv9+GaAIjIEhGpEJGKurq6MIrbM2/LwKaGIJAeuqpsFC/vqKXN0kPGmEEk2p3F9wM/UlVvXy+gqktVtVxVy/Pz8yNSqFikhgCunTWaE81t/GWvpYeMMYNHOK3hYWBM0OtiZ1+oc6pEJAUYCtQDFwILReQHwDCgQ0RagA1hXDNqBnrUUKfLJueR7UnhD1uquWJKZIKaMcb0Vzh3BOuBySIyXkTSgEXAyi7nrAQWO9sLgTUacJmqlqhqCfBj4D9U9eEwrxkVqjrgo4Y6daaHVu+opdVv6SFjzODQYyBwcv73AKuBXcCzqrpDRB4QkRuc0x4j0CdQCXwDOOtw0O6u2fdqhO90WzsdOjAzj4Zy7axCTrX4eafyWEz+vjHGdBVWa6iqq4BVXfbdF7TdAtzSwzXu7+maA8E7QMtUdufSyXlkp6fwh601XDltZEzKYIwxwVz3ZHHjAC1K0x1PSjJXlxXwys5afH6bmtoYE3uuCwQDtV7x2Vw3q5DGFj9//sDSQ8aY2HNdIOhMDcVi+GinSyblkZOeYg+XGWMGBfcFgs5FaWLUWQyQlpLEp6cX8OrOI7ZymTEm5lwbCGKZGoLA6KFGn58/WXrIGBNjrg0EsUwNQSA9NHRIKi9trY5pOYwxxrWBIJapIYDU5CTmW3rIGDMIuC8QtPhJThI8KbGv+rWzCmlqbeet9yMzmZ4xxvRF7FvDAdY5vcRALVN5NnMn5jI8I9VGDxljYsp1gaAxRvMMhZKanMT8GQW8tsvSQ8aY2HFdIIjVhHPduXbmaJpb23lzz9FYF8UY41KuCwRenz9mE86FctGEEYzITLOF7Y0xMeO+QNASm0VpupPipIde33WU062WHjLGDDz3BQKfn+xBFAgArptZyOm2dt6w9JAxJgZcGQgyPcmxLsbHzBk/grysNBs9ZIyJCdcFgiZfO1me1FgX42POpId2H6G51R/r4hhjXCasQCAi80Vkj4hUishfrT4mIh4RecY5vk5ESpz9c0Rks/OzRURuCnrPfhHZ5hyriFSFzqajQwddZ3Gna2eOpqWtgzW7LT1kjBlYPbaIIpIMPAJcBVQB60VkparuDDrtLqBBVSeJyCLgQeA2YDtQrqp+ESkEtojIi85SlQBXquqAzbrW1No54dzgSg1BID2Un+3hN+8d5LpZo2NdHGNiTlVp9Pk5eqqFI6d8HG9qpUMVgA5VVAn8OOcqgIKiZKenkpflIT/bQ15W2qB5iHSwCuer8RygUlX3AYjIcmABEBwIFgD3O9srgIdFRFS1OeicdAKfWcw0+QKjcgZbagggOUm4+4qJ/NsfdvLW+3VcMSU/1kUyJqqaW/3sqW3k8InT1J5s4WijjyOnWj623RyhkXTpqUlBgcFzZrsgJ51phdlMK8gmI23wZQoGSjg1LwIOBb2uAi7s7hzn2/9JIBc4JiIXAo8D44A7g+4GFHhFRBT4uaouDfXHRWQJsARg7NixYVWqO15fG8Cg6yzudOdF41j2l/3856pdXDopj+Qk+wZj4p+qUtVwml01p9hV08ju2lPsqjnFgePNaNBXw7SUJApy0hmV46FsdA6fnDaSUTkeRuWkMyonnRGZaSSJIAICiAgCZ/YBZ36fOu3nmNdHXaOPY15f0HYrB+ub2XiggePNrWf+vgiMz8uktDCHssIcykbnML0wh/xsjyvuJKIeAlV1HTBdREqBZSLyR2ex+0tV9bCIjAReFZHdqvp2iPcvBZYClJeX9+uOwuvcEcR65tHupKUk8e35U7nn6U08t6GKWy8YE+siGdMrqsr7R7xsONDgNPyn2FPbeGatcBEYNyKD0sIcbjqvmGmF2ZTkZjIqx8PQIamRa3SH93yKv72DmpMt7HTKubP6FFurTnxs9F5uZhplowPB4cIJI7h4Yh7pqYPzi2R/hNMiHgaCW6RiZ1+oc6pEJAUYCtQHn6Cqu0TEC8wAKlT1sLP/qIg8TyAF9VeBIJI6l6kcjKmhTtfOLOTRMR/y36/u4bpzCl19u2oGP1Vlb10Ta/fV8+7eet7dV099UysA2Z4UphVmc9PsIqYV5FBamM2UUdmD5oHOlOQkxozIYMyIDD49veDM/pOn29jdGRycu5gn/rKfn7+9j/TUJC6ZmMcnS0fyyWkjKRw6JIY1iJxwPpH1wGQRGU+gwV8EfLbLOSuBxcBaYCGwRlXVec8hJ100DpgG7BeRTCBJVRud7auBByJTpe4N9tQQBG53v3NtKQt/tpZH//QhX503OdZFMuYMVeVAfTNr99Wz1mn4jzb6ACgcms4VU/K5aGIuF43PZcyIIXGZVhk6JJULJ+Ry4YTcM/t8/nbWf9jAa7uO8PruI7zujO4rK8xhnhMUzikeRlKcpnN7DAROI34PsBpIBh5X1R0i8gCBb/YrgceAJ0WkEjhOIFgAXArcKyJtQAfwZVU9JiITgOed/0lSgKdV9eVIV66rM6mhQXxHAFBeMoL50wv4+Vt7uX3OWPKzPbEuknGxlrZ2/vzBMVbvqOWdymNUn2wBID/bw9wJucydmMvcCbmMy82Iy4Y/HJ6UZC6dnMelk/P43vVl7K3z8vquo7y++yj/++Ze/mdNJXlZaXxi6kg+VTqKK6fl40kZvF84uxLVmA7k6ZXy8nKtqOj7Iwe/fOdD7n9xJxu+8ylyswZ34/rhsSaueugtbrtgDP9+08xYF8e4jNfn543dR3l5Ry1v7j5KU2s72ekpXDY5j7kT85g7IZeJ+ZkJ2/D3xonmVt56v441u4/y5p46Tp5uY+iQVK4/p5CbZxdz3phhMf/vJCIbVLW8u+ODI1k3QJqcoWiD8YGyrsbnZXLHhWN5at1BvnBJCZNGZse6SCbBNTS18uquI6zeXsufKo/R6u8gL8vDgvOKmD+9gIsm5JI2CFb2G2yGZaSx4NwiFpxbhL+9g7/sree5jVWs2FDFU+8eZEJeJjfPLuKm2cUUDRucfQqDv0WMoMYWP2nJSXFzy/bVeZP53cbD/Ncfd/Po4gtiXRyTgI55fazaVsPL22tZ9+Fx2juUomFDuPOiccyfUcDsscNtGHMvpCQncfmUfC6fkk9jSxt/3F7Lcxuq+OEr7/PDV95n7oRcbp5dxDUzCwfVuiiDpyQDwOtrG9QdxV3lZnn40pUT+cHLe1i7t565E3N7fpMxPWj1d/DGnqP8tqKKN/ccxd+hTBqZxZeumMj8GQVMH50T81RGIshOT+XW8jHcWj6GQ8ebeX7TYX63sYpvrdjKfS/sYP6MAu64cCzlJSNiXVR3BYImX3tcpIWC/d0l43lq7QH+Y9UuXvjKJXE7KsHE3o7qk6zYUMULm6s53tTKyGwPd102nr+ZXcyUUZZ6jKYxIzL46rzJ/J9PTmLjwQae23iYF7dU8/ymw8weO4wll0/kqrJRMbv7iq9WsZ8aW/xkxtm4/PTUZP7p01P5xrNbWLmlmhvPK4p1kUwcqff6eGFzNSs2VLGz5hRpyUlcVTaKheXFXDYpj5Rky/kPJBHh/HEjOH/cCL5zbSm/raji0T/v4+6nNjA+L5O/dwLzQD+05qpRQ7cvfRd/Rwe/vfviCJYq+jo6lOsf/jMnmtt4/ZtXJOSTjSZy2juUN3Yf5bcbDrFm91Ha2pVZxUNZeH4xN5wzmmEZabEuognib+/g5R21LH17H1urTpKbmcbii0u486JxDM+MzGdlo4aCeH1+crPi7x9BUpLwr58p5bOPrmPZX/bzxSsmxrpIZhA62tjCM+8d4jfvHaT6ZAt5WR6+cEngG+bUAkv9DFYpyUlcN2s0184s5N19x1n69l4eevV9fvrmXm4tL+auSycwNjcjumWI6tUHmSafn3FR/g8aLRdPyuPKqfk8/EYlt5aPidg3BRPfVJW1++r59bsHWb2jFn+HcumkPO67vox5paNItdRP3BCRwMN5E3PZU9vI0rf38fR7B3ny3QNcM6OQBxZMj9rzT64KBI0+/6CdcC4c//KZUub/+G1+suYDvnf99FgXx8TQyeY2Vmys4tfrDrCvromhQ1L5/MUl3HHROMbnZca6eKafphZk89+3nsO3Pj2VJ975kDf2HCU7PXozIsRvq9gH3jjsLA42ZVQ2t10whifXHmDx3BJK7B+862w5dIKn3j3Ai1uraWnr4Lyxw/jhLedw3axC6ztKQAVD0/mXz5Tyz/OnRXXEYPy2ir3U3qGcbluBNggAAA79SURBVIu/4aNd/eOnpvDC5mp+sHo3/3vH+bEujhkArf4OVm2r4Ym/7GfLoRNkpCVz03nF3HHhWGYUDY118cwAiPaw8fhuFXvB6+ucgjq+qzwyJ50ll0/gx699wHMbqvib84tjXSQTJUdPtfDUuoM8ve4gx7w+JuRncv/1Zdx8fjE5UUwTGPeJ71axF5oSJBAAfOkTE1m//zjffm4rwzJSmVc6KtZFMhGiqmw6dIJfvrOfVdtqaFflyqkjWXxxCZdNyrMHCk1UxH+rGKYzdwRxnhqCwJS4P7+znNuXvsuXf72Rp/7+Qi4YBI+pm77z+dt5aWsNy/6yny1VJ8n2pPC5uSV8bu446wsyURf/rWKYGp3VyQbL6kj9leVJ4ZdfuIBbfraWv/vlep794lxKC3NiXSzTSx+lfw5wzNvKxPxM/m3BdG6eXZww/6+awS+sQcYiMl9E9ohIpYjcG+K4R0SecY6vE5ESZ/8cEdns/GwRkZvCvWakdaaGshPoH1dulodf3TWHjLRkFj/+HoeON8e6SCZMWw6d4OvLN3HJg2v4nzUfcE7xMJ68aw6vfeMK7pxbYkHADKge/28TkWTgEeAqoApYLyIrVXVn0Gl3AQ2qOklEFgEPArcB24FyZ5WzQmCLiLwIaBjXjKjO1FCi/QMrHp7Bk3ddyC0/W8udj63jt3dfbCuaDVJt7R28vL2WJ975kI0HT5DlSeFvLxpnQ4FNzIXTKs4BKlV1H4CILAcWAMGN9gLgfmd7BfCwiIiqBn9FTScQAMK9ZkQlyqihUKaMyubxz1/AHY++y+efeI/fLLnIRpUMIg1NrTz93kGeevcANSdbGJebwfeuL2Ph+cVRfUjImHCF0yoWAYeCXlcBF3Z3jvPt/ySQCxwTkQuBx4FxwJ3O8XCuGVFep48gnp8sPpvzxw3np397Pv+wrIIlv6rgl1+YYw8Yxdie2kaeeOdDnt90GJ+/g0sn5fH/bpzBlVNH2ugfM6hEvVVU1XXAdBEpBZaJyB97834RWQIsARg7dmyfy5GoqaFgV04dyQ9vOYevP7OZry3fxCOfnW3TDA+wlrZ2Vm2rYfl7h3hv/3E8KUncPLuIz1883iZ+M4NWOK3iYWBM0OtiZ1+oc6pEJAUYCtQHn6Cqu0TEC8wI85qd71sKLIXANNRhlDekJp8fT0pSwk/CdeN5RTQ0t/L9F3fynd9v5z9vnmmrTQ2AndWnWL7+IM9vOkxji5/xeZnce800brMJAk0cCCcQrAcmi8h4Ao31IuCzXc5ZCSwG1gILgTWqqs57DjnpoHHANGA/cCKMa0ZUo8+fkP0DoXzhkvHUe1t5+I1KRmSm8e3502JdpITk9fl5cUs1y987yJaqk6SlJHHNjAIWXTCWiyaMsABs4kaPLaPTiN8DrAaSgcdVdYeIPABUqOpK4DHgSRGpBI4TaNgBLgXuFZE2oAP4sqoeAwh1zQjX7WOafP6EeJgsXN+8egrHm1v53zf3osDXPzUZT4r1GfSXqrL50AmWv3eIF7dW09zaztRR2Xzv+jJuOq/IFn0xcSmsllFVVwGruuy7L2i7BbglxPueBJ4M95rR5G1xzx0BBOY2/7cFM/C3d/DTN/fy6s4j/OfNM+0J5D46dLyZlVuqWbm5mj1HGhmSmsz15xSyaM5YzhszzL79m7jmmpax0edP6I7iUJKThB8sPIdrZhTynd9v55afreWOC8fy7fnTGDrEhi325JjXx6ptNbywuZoNBxqAwOisf79pBjecM9qGfpqE4ZqWscnnpyAnPdbFiIkrp43klX+8nIdefZ8n3vmQV3ce4fs3TGf+jAL7JtuF1+fnlR21vLC5mj9XHqO9Q5k6Kptvz5/K9bNGM2ZEfK5wZ8zZuCYQeF14RxAs05PCd68r48Zzi7j3d1v50q838qnSUTywYDqjhw2JdfFiqqWtnbffr+OFLdW8vusILW0dFA0bwpLLJ7Dg3NFMK7A5nExic03L6LbO4u7MLB7KC1+5hMff+ZCHXn2fqx56i299eip3zi0h2UUPOZ1qaeON3Ud5ZccR3txzlKbWdkZkpnHL+WNYcO5oZo8dbg99GddwTcvY6LLO4rNJSU5iyeUTuWZGIf/6++3c/+JOnt9czX/dPDOhZzA9cqqFV3ceYfWOWt7dV09bu5KX5eGGc4v49PRRXDIpL+GfMzEmFFe0jG3tHfj8HRYIuhgzIoNlX7iAlVuqeeDFnXzmJ3/ignEjuHZWIdfMKGBkAvSp7KvzsnrHEV7ZWcumgycAKMnN4O8uGc/V00dx3hj75m+MK1rGRFqdLNJEhAXnFnH55HyefPcAL22t4Xsrd3D/izuYUzKC62YVMn9GYVzMaNreoXxwtJGNB06w4UADGw828OGxJgBmFg3lm1dN4dMzCpg8Mss6yY0J4oqWsXNRGgsE3RuemcZX503mq/Mm88GRRl7aVsMfttbw3Rd28L2VO7hwfC7Xzipk/owC8rIGR1A4ebqNzYcCjf6mgw1sOnjizJxSuZlpnDd2OJ+bO46rpxdQ5PIOcWPOxhUtY1Nr4ixTORAmj8rm66Oy+dq8ybx/xMtLW6v5w7YavvP77dz3wnbmTsxlTkkuY0YMoXh4BmNGDGFUdnpUUiyqSkNzG1UNzVQ1nKaqoZl9dU1sPNjAB0e9qEKSwNSCHBacO5rzxw1n9tjhjMvNsG/9xoTJFS2jN8GWqRwoIsLUgmymFkzlH6+awu7aRlZtq+GlbTX86LX3P3ZuWnISRcOHUDz8o+AwZngGBUPTSRKhcykKdaYN7Jw98MxrVY43tZ5p7KsaTnPI+d3c2v6xvzUsI5VzxwzjulmBhv+cMcPsbs+YfnDFv55EXpRmoIgIpYU5lBbm8M2rp9LS1s7hE6c5dDyo0T4eaMRXV9dyvKm1z38r25NC8YgMxuVmcsmkPIqHZ1A8PBBYioYPsaeijYkwV7SMnYEgUReliYX01GQm5mcxMT8r5HGvz8/hhtMcOdVy5tt/Z6KmM2Mjzp7O18MyUikenmENvTEDzBUto6WGBl6WJ8VJK9liLMYMdq54esZSQ8YY0z1XBYLMNJuP3xhjunJFIGjy+RmSmmzr9xpjTAhhtYwiMl9E9ohIpYjcG+K4R0SecY6vE5ESZ/9VIrJBRLY5vz8Z9J43nWtudn5GRqpSXXltwjljjOlWj62jiCQDjwBXAVXAehFZqao7g067C2hQ1Ukisgh4ELgNOAZcr6rVIjKDwNKURUHvu0NVKyJUl27ZhHPGGNO9cO4I5gCVqrpPVVuB5cCCLucsAJY52yuAeSIiqrpJVaud/TuAISIy4PMTNLlo4XpjjOmtcAJBEXAo6HUVH/9W/7FzVNUPnARyu5zzN8BGVfUF7XvCSQt9V7qZD0BElohIhYhU1NXVhVHcvxZYlMY6io0xJpQB6T0VkekE0kVfDNp9h6rOBC5zfu4M9V5VXaqq5apanp+f36e/7/W1k+Wxh5SMMSaUcALBYWBM0OtiZ1/Ic0QkBRgK1Duvi4Hngc+p6t7ON6jqYed3I/A0gRRUVFw8MZeLJoyI1uWNMSauhZM4Xw9MFpHxBBr8RcBnu5yzElgMrAUWAmtUVUVkGPAScK+qvtN5shMshqnqMRFJBa4DXut3bbrx3evKonVpY4yJez3eETg5/3sIjPjZBTyrqjtE5AERucE57TEgV0QqgW8AnUNM7wEmAfd1GSbqAVaLyFZgM4EA84tIVswYY0x4RDvnAY4D5eXlWlER9dGmxhiTUERkg6qWd3fcHrU1xhiXs0BgjDEuZ4HAGGNczgKBMca4nAUCY4xxOQsExhjjcnE1fFRE6oADfXx7HoHZUBNFotUHEq9OiVYfSLw6JVp9IHSdxqlqt3P0xFUg6A8RqTjbONp4k2j1gcSrU6LVBxKvTolWH+hbnSw1ZIwxLmeBwBhjXM5NgWBprAsQYYlWH0i8OiVafSDx6pRo9YE+1Mk1fQTGGGNCc9MdgTHGmBAsEBhjjMslfCAQkfkiskdEKkXk3p7fMfiJyH4R2eas7xCX83KLyOMiclREtgftGyEir4rIB87v4bEsY290U5/7ReRw0Focn4llGXtDRMaIyBsislNEdojI15z98fwZdVenuPycRCRdRN4TkS1Ofb7v7B8vIuucNu8ZEUnr8VqJ3EcgIsnA+8BVQBWB1dZuV9WdMS1YP4nIfqBcVeP2QRgRuRzwAr9S1RnOvh8Ax1X1v5ygPVxV/zmW5QxXN/W5H/Cq6g9jWba+EJFCoFBVN4pINrABuBH4PPH7GXVXp1uJw89JRATIVFWvs9Ljn4GvEVgc7HequlxEfgZsUdWfnu1aiX5HMAeoVNV9qtoKLAcWxLhMBlDVt4HjXXYvAJY528sI/CONC93UJ26pao2qbnS2GwmsTlhEfH9G3dUpLmmA13mZ6vwo8ElghbM/rM8o0QNBEXAo6HUVcfzBB1HgFRHZICJLYl2YCBqlqjXOdi0wKpaFiZB7RGSrkzqKmzRKMBEpAc4D1pEgn1GXOkGcfk4ikiwim4GjwKvAXuCEs8QwhNnmJXogSFSXqups4BrgK05aIqFoIGcZ73nLnwITgXOBGuC/Y1uc3hORLOA54Ouqeir4WLx+RiHqFLefk6q2q+q5QDGBDMi0vlwn0QPBYWBM0OtiZ19cU9XDzu+jwPME/gdIBEecPG5nPvdojMvTL6p6xPmH2gH8gjj7nJy883PAr1X1d87uuP6MQtUp3j8nAFU9AbwBzAWGiUiKcyisNi/RA8F6YLLTi54GLAJWxrhM/SIimU5HFyKSCVwNbD/7u+LGSmCxs70YeCGGZem3zgbTcRNx9Dk5HZGPAbtU9aGgQ3H7GXVXp3j9nEQkX0SGOdtDCAyK2UUgICx0TgvrM0roUUMAzlCwHwPJwOOq+u8xLlK/iMgEAncBACnA0/FYJxH5DfAJAlPmHgG+B/weeBYYS2C68VtVNS46YLupzycIpBsU2A98MSi/PqiJyKXAn4BtQIez+/8SyKnH62fUXZ1uJw4/JxGZRaAzOJnAl/pnVfUBp41YDowANgF/q6q+s14r0QOBMcaYs0v01JAxxpgeWCAwxhiXs0BgjDEuZ4HAGGNczgKBMca4nAUCY4xxOQsExhjjcv8fkDheY/fT1C4AAAAASUVORK5CYII=\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 | " sku | \n",
80 | " shipping_logistic_type | \n",
81 | " shipping_payment | \n",
82 | " listing_type | \n",
83 | " currency | \n",
84 | " current_price | \n",
85 | " item_domain_id | \n",
86 | " site_id | \n",
87 | " days_to_active | \n",
88 | " days_since_inactive | \n",
89 | "
\n",
90 | " \n",
91 | " \n",
92 | " \n",
93 | " sku | \n",
94 | " 1.000000 | \n",
95 | " -0.000341 | \n",
96 | " -0.002559 | \n",
97 | " -0.000866 | \n",
98 | " -0.002091 | \n",
99 | " 0.002278 | \n",
100 | " -0.001439 | \n",
101 | " 0.000258 | \n",
102 | " -0.001643 | \n",
103 | " -0.001465 | \n",
104 | "
\n",
105 | " \n",
106 | " shipping_logistic_type | \n",
107 | " -0.000341 | \n",
108 | " 1.000000 | \n",
109 | " 0.074183 | \n",
110 | " 0.040746 | \n",
111 | " 0.050840 | \n",
112 | " -0.089014 | \n",
113 | " -0.031270 | \n",
114 | " -0.019540 | \n",
115 | " -0.009456 | \n",
116 | " 0.075642 | \n",
117 | "
\n",
118 | " \n",
119 | " shipping_payment | \n",
120 | " -0.002559 | \n",
121 | " 0.074183 | \n",
122 | " 1.000000 | \n",
123 | " -0.074338 | \n",
124 | " 0.107770 | \n",
125 | " -0.620856 | \n",
126 | " -0.118603 | \n",
127 | " -0.111873 | \n",
128 | " -0.012127 | \n",
129 | " -0.009789 | \n",
130 | "
\n",
131 | " \n",
132 | " listing_type | \n",
133 | " -0.000866 | \n",
134 | " 0.040746 | \n",
135 | " -0.074338 | \n",
136 | " 1.000000 | \n",
137 | " 0.152052 | \n",
138 | " -0.035744 | \n",
139 | " 0.072715 | \n",
140 | " 0.096491 | \n",
141 | " 0.029645 | \n",
142 | " -0.007888 | \n",
143 | "
\n",
144 | " \n",
145 | " currency | \n",
146 | " -0.002091 | \n",
147 | " 0.050840 | \n",
148 | " 0.107770 | \n",
149 | " 0.152052 | \n",
150 | " 1.000000 | \n",
151 | " -0.657856 | \n",
152 | " -0.422581 | \n",
153 | " -0.472765 | \n",
154 | " -0.014007 | \n",
155 | " -0.011959 | \n",
156 | "
\n",
157 | " \n",
158 | " current_price | \n",
159 | " 0.002278 | \n",
160 | " -0.089014 | \n",
161 | " -0.620856 | \n",
162 | " -0.035744 | \n",
163 | " -0.657856 | \n",
164 | " 1.000000 | \n",
165 | " 0.267825 | \n",
166 | " 0.274570 | \n",
167 | " 0.014325 | \n",
168 | " 0.006590 | \n",
169 | "
\n",
170 | " \n",
171 | " item_domain_id | \n",
172 | " -0.001439 | \n",
173 | " -0.031270 | \n",
174 | " -0.118603 | \n",
175 | " 0.072715 | \n",
176 | " -0.422581 | \n",
177 | " 0.267825 | \n",
178 | " 1.000000 | \n",
179 | " 0.893819 | \n",
180 | " 0.040363 | \n",
181 | " 0.022034 | \n",
182 | "
\n",
183 | " \n",
184 | " site_id | \n",
185 | " 0.000258 | \n",
186 | " -0.019540 | \n",
187 | " -0.111873 | \n",
188 | " 0.096491 | \n",
189 | " -0.472765 | \n",
190 | " 0.274570 | \n",
191 | " 0.893819 | \n",
192 | " 1.000000 | \n",
193 | " 0.038815 | \n",
194 | " 0.023721 | \n",
195 | "
\n",
196 | " \n",
197 | " days_to_active | \n",
198 | " -0.001643 | \n",
199 | " -0.009456 | \n",
200 | " -0.012127 | \n",
201 | " 0.029645 | \n",
202 | " -0.014007 | \n",
203 | " 0.014325 | \n",
204 | " 0.040363 | \n",
205 | " 0.038815 | \n",
206 | " 1.000000 | \n",
207 | " -0.118599 | \n",
208 | "
\n",
209 | " \n",
210 | " days_since_inactive | \n",
211 | " -0.001465 | \n",
212 | " 0.075642 | \n",
213 | " -0.009789 | \n",
214 | " -0.007888 | \n",
215 | " -0.011959 | \n",
216 | " 0.006590 | \n",
217 | " 0.022034 | \n",
218 | " 0.023721 | \n",
219 | " -0.118599 | \n",
220 | " 1.000000 | \n",
221 | "
\n",
222 | " \n",
223 | "
\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 | " date | \n",
402 | " sold_quantity | \n",
403 | " current_price | \n",
404 | " currency | \n",
405 | " listing_type | \n",
406 | " shipping_logistic_type | \n",
407 | " shipping_payment | \n",
408 | " minutes_active | \n",
409 | " item_domain_id | \n",
410 | " site_id | \n",
411 | " active | \n",
412 | " days_since_inactive | \n",
413 | "
\n",
414 | " \n",
415 | " sku | \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 | " 4 | \n",
433 | " 2021-03-31 | \n",
434 | " 0 | \n",
435 | " 118.00 | \n",
436 | " 3 | \n",
437 | " 1 | \n",
438 | " 2 | \n",
439 | " 0 | \n",
440 | " 0.0 | \n",
441 | " 5263 | \n",
442 | " 1 | \n",
443 | " 0.0 | \n",
444 | " 54.0 | \n",
445 | "
\n",
446 | " \n",
447 | " 8 | \n",
448 | " 2021-03-31 | \n",
449 | " 0 | \n",
450 | " 58.49 | \n",
451 | " 2 | \n",
452 | " 1 | \n",
453 | " 2 | \n",
454 | " 1 | \n",
455 | " 0.0 | \n",
456 | " 6116 | \n",
457 | " 2 | \n",
458 | " 0.0 | \n",
459 | " 41.0 | \n",
460 | "
\n",
461 | " \n",
462 | " 9 | \n",
463 | " 2021-03-31 | \n",
464 | " 0 | \n",
465 | " 199.00 | \n",
466 | " 2 | \n",
467 | " 1 | \n",
468 | " 2 | \n",
469 | " 0 | \n",
470 | " 0.0 | \n",
471 | " 7991 | \n",
472 | " 2 | \n",
473 | " 0.0 | \n",
474 | " 6.0 | \n",
475 | "
\n",
476 | " \n",
477 | " 11 | \n",
478 | " 2021-03-31 | \n",
479 | " 0 | \n",
480 | " 109.90 | \n",
481 | " 3 | \n",
482 | " 0 | \n",
483 | " 2 | \n",
484 | " 0 | \n",
485 | " 0.0 | \n",
486 | " 3645 | \n",
487 | " 1 | \n",
488 | " 0.0 | \n",
489 | " 19.0 | \n",
490 | "
\n",
491 | " \n",
492 | " 13 | \n",
493 | " 2021-03-31 | \n",
494 | " 0 | \n",
495 | " 474.05 | \n",
496 | " 2 | \n",
497 | " 1 | \n",
498 | " 2 | \n",
499 | " 0 | \n",
500 | " 0.0 | \n",
501 | " 5658 | \n",
502 | " 2 | \n",
503 | " 0.0 | \n",
504 | " 0.0 | \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 | " 660897 | \n",
523 | " 2021-03-31 | \n",
524 | " 0 | \n",
525 | " 79.00 | \n",
526 | " 2 | \n",
527 | " 0 | \n",
528 | " 2 | \n",
529 | " 1 | \n",
530 | " 0.0 | \n",
531 | " 6201 | \n",
532 | " 2 | \n",
533 | " 0.0 | \n",
534 | " 58.0 | \n",
535 | "
\n",
536 | " \n",
537 | " 660904 | \n",
538 | " 2021-03-31 | \n",
539 | " 0 | \n",
540 | " 98.90 | \n",
541 | " 3 | \n",
542 | " 1 | \n",
543 | " 2 | \n",
544 | " 1 | \n",
545 | " 0.0 | \n",
546 | " 3678 | \n",
547 | " 1 | \n",
548 | " 0.0 | \n",
549 | " 24.0 | \n",
550 | "
\n",
551 | " \n",
552 | " 660907 | \n",
553 | " 2021-03-31 | \n",
554 | " 0 | \n",
555 | " 24.69 | \n",
556 | " 3 | \n",
557 | " 1 | \n",
558 | " 2 | \n",
559 | " 1 | \n",
560 | " 0.0 | \n",
561 | " 4703 | \n",
562 | " 1 | \n",
563 | " 0.0 | \n",
564 | " 56.0 | \n",
565 | "
\n",
566 | " \n",
567 | " 660910 | \n",
568 | " 2021-03-31 | \n",
569 | " 0 | \n",
570 | " 480.58 | \n",
571 | " 2 | \n",
572 | " 1 | \n",
573 | " 2 | \n",
574 | " 0 | \n",
575 | " 0.0 | \n",
576 | " 7878 | \n",
577 | " 2 | \n",
578 | " 0.0 | \n",
579 | " 42.0 | \n",
580 | "
\n",
581 | " \n",
582 | " 660915 | \n",
583 | " 2021-03-31 | \n",
584 | " 0 | \n",
585 | " 99.99 | \n",
586 | " 2 | \n",
587 | " 0 | \n",
588 | " 2 | \n",
589 | " 1 | \n",
590 | " 0.0 | \n",
591 | " 7994 | \n",
592 | " 2 | \n",
593 | " 0.0 | \n",
594 | " 58.0 | \n",
595 | "
\n",
596 | " \n",
597 | "
\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 | " days_since_inactive | \n",
709 | " current_price | \n",
710 | " item_domain_id | \n",
711 | " currency | \n",
712 | " listing_type | \n",
713 | " shipping_logistic_type | \n",
714 | " shipping_payment | \n",
715 | " site_id | \n",
716 | "
\n",
717 | " \n",
718 | " sku | \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 | " 4 | \n",
732 | " 54.0 | \n",
733 | " 118.00 | \n",
734 | " 5263 | \n",
735 | " 3 | \n",
736 | " 1 | \n",
737 | " 2 | \n",
738 | " 0 | \n",
739 | " 1 | \n",
740 | "
\n",
741 | " \n",
742 | " 8 | \n",
743 | " 41.0 | \n",
744 | " 58.49 | \n",
745 | " 6116 | \n",
746 | " 2 | \n",
747 | " 1 | \n",
748 | " 2 | \n",
749 | " 1 | \n",
750 | " 2 | \n",
751 | "
\n",
752 | " \n",
753 | " 9 | \n",
754 | " 6.0 | \n",
755 | " 199.00 | \n",
756 | " 7991 | \n",
757 | " 2 | \n",
758 | " 1 | \n",
759 | " 2 | \n",
760 | " 0 | \n",
761 | " 2 | \n",
762 | "
\n",
763 | " \n",
764 | " 11 | \n",
765 | " 19.0 | \n",
766 | " 109.90 | \n",
767 | " 3645 | \n",
768 | " 3 | \n",
769 | " 0 | \n",
770 | " 2 | \n",
771 | " 0 | \n",
772 | " 1 | \n",
773 | "
\n",
774 | " \n",
775 | " 13 | \n",
776 | " 0.0 | \n",
777 | " 474.05 | \n",
778 | " 5658 | \n",
779 | " 2 | \n",
780 | " 1 | \n",
781 | " 2 | \n",
782 | " 0 | \n",
783 | " 2 | \n",
784 | "
\n",
785 | " \n",
786 | "
\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 |
--------------------------------------------------------------------------------