├── Graph Embeddings Tutorial.ipynb ├── README.md ├── Universal Convolver Example.ipynb ├── convolver.py ├── pics ├── conv │ ├── Action.png │ ├── Adult.png │ ├── Adventure.png │ ├── Animation.png │ ├── Biography.png │ ├── Comedy.png │ ├── Crime.png │ ├── Documentary.png │ ├── Drama.png │ ├── Family.png │ ├── Fantasy.png │ ├── Film-Noir.png │ ├── Game-Show.png │ ├── History.png │ ├── Horror.png │ ├── Music.png │ ├── Musical.png │ ├── Mystery.png │ ├── News.png │ ├── Reality-TV.png │ ├── Romance.png │ ├── Sci-Fi.png │ ├── Short.png │ ├── Sport.png │ ├── Talk-Show.png │ ├── Thriller.png │ ├── War.png │ ├── Western.png │ └── anim.gif ├── lv │ ├── Action.png │ ├── Adult.png │ ├── Adventure.png │ ├── Animation.png │ ├── Biography.png │ ├── Comedy.png │ ├── Crime.png │ ├── Documentary.png │ ├── Drama.png │ ├── Family.png │ ├── Fantasy.png │ ├── Film-Noir.png │ ├── Game-Show.png │ ├── History.png │ ├── Horror.png │ ├── Music.png │ ├── Musical.png │ ├── Mystery.png │ ├── News.png │ ├── Reality-TV.png │ ├── Romance.png │ ├── Sci-Fi.png │ ├── Short.png │ ├── Sport.png │ ├── Talk-Show.png │ ├── Thriller.png │ ├── War.png │ ├── Western.png │ └── anim.gif └── verse │ ├── verse_Action.png │ ├── verse_Adult.png │ ├── verse_Adventure.png │ ├── verse_Animation.png │ ├── verse_Biography.png │ ├── verse_Comedy.png │ ├── verse_Crime.png │ ├── verse_Documentary.png │ ├── verse_Drama.png │ ├── verse_Family.png │ ├── verse_Fantasy.png │ ├── verse_Film-Noir.png │ ├── verse_Game-Show.png │ ├── verse_History.png │ ├── verse_Horror.png │ ├── verse_Music.png │ ├── verse_Musical.png │ ├── verse_Mystery.png │ ├── verse_News.png │ ├── verse_Reality-TV.png │ ├── verse_Romance.png │ ├── verse_Sci-Fi.png │ ├── verse_Short.png │ ├── verse_Sport.png │ ├── verse_Talk-Show.png │ ├── verse_Thriller.png │ ├── verse_War.png │ └── verse_Western.png ├── sql_convolution.sql └── useful_links.md /README.md: -------------------------------------------------------------------------------- 1 | # graph-stuff 2 | Things related to graphs 3 | 4 | ## Universal Convolver Example.ipynb 5 | Contains simple function to make graph convolutions with pandas and usage example. It's only aim to show the idea. Also can be easily implemented on Spark for example. 6 | 7 | ## sql_convolution.sql 8 | Same thing but in SQL 9 | 10 | ## Graph Embeddings Tutorial.ipynb 11 | How to use three methods for graph representation: LargeViz, VERSE and mentioned above graph convolutions. + Examples how to visualize results. (I also have mentioned autoencoder for dataviz at the end of the notebook. You can look [this](https://www.kaggle.com/iggisv9t/search-data-hidden-structure-with-autoencoder) for example) 12 | -------------------------------------------------------------------------------- /Universal Convolver Example.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import pandas as pd\n", 10 | "import numpy as np\n", 11 | "import matplotlib.pyplot as plt\n", 12 | "%matplotlib inline\n", 13 | "from tqdm import tqdm, tqdm_notebook" 14 | ] 15 | }, 16 | { 17 | "cell_type": "markdown", 18 | "metadata": {}, 19 | "source": [ 20 | "# Graph Convolutions on Pandas" 21 | ] 22 | }, 23 | { 24 | "cell_type": "markdown", 25 | "metadata": {}, 26 | "source": [ 27 | "## What's going on?" 28 | ] 29 | }, 30 | { 31 | "cell_type": "markdown", 32 | "metadata": {}, 33 | "source": [ 34 | "Here is an example how simple graph convolutions can be made using the power of table frameworks like pandas. There are several ways to define a convolution on graph data. Here graph convolutions are treated as a simple aggregation of neighbors for each vertex.\n", 35 | "\n", 36 | "Step by step:\n", 37 | "1. get all neighbors for each node\n", 38 | "2. apply a pooling function to the list of neigbors\n", 39 | "3. repeat if you need\n", 40 | "\n", 41 | "In this example we are given edges dataframe and nodes features. Mean function is used as a pooling. Example function is common enough, so it can be easily used for bipartite graphs. It also suitable for large graphs due to chunking." 42 | ] 43 | }, 44 | { 45 | "cell_type": "markdown", 46 | "metadata": {}, 47 | "source": [ 48 | "## Why?\n", 49 | "For the glory of Satan of course! \n", 50 | "There are a lot of cool approaches with a lot of math behind them, but most of that approaches will not work with huge graphs. Table frameworks that are able to join, groupby and aggregate give us the great power to make graph convolutions feasible at large scales." 51 | ] 52 | }, 53 | { 54 | "cell_type": "code", 55 | "execution_count": 1, 56 | "metadata": {}, 57 | "outputs": [], 58 | "source": [ 59 | "def chunker(seq, size):\n", 60 | " \"\"\"https://stackoverflow.com/a/434328\"\"\"\n", 61 | " return (seq[pos: pos + size] for pos in range(0, len(seq), size))\n", 62 | "\n", 63 | "def make_conv(edges, feats, cols, by, on, size=1000000, agg_f='mean',\n", 64 | " prefix='mean_'):\n", 65 | " \"\"\"\n", 66 | " edges -- edgelist: pandas dataframe with two columns (arguments by and on)\n", 67 | " feats -- features dataframe with key column (argument on) \n", 68 | " and features columns (argument cols)\n", 69 | " by -- column in edges to be used as source nodes\n", 70 | " on -- column in edges to be used as neighbor nodes\n", 71 | " size -- number of unique source nodes to be used in one chunk\n", 72 | " agg_f -- can be interpreted as pooling function. \n", 73 | " Pandas has several optimised functions for basic statistics,\n", 74 | " that can be passed as string arg (see pandas docs),\n", 75 | " but you also can provide any function you like\n", 76 | " prefix -- prefix for new column names \n", 77 | " \"\"\"\n", 78 | " res_feats = [] # used to stack result chunks\n", 79 | "\n", 80 | " # get chunk of unique source nodes\n", 81 | " for chunk in tqdm(chunker(edges[by].unique(), size=size), \n", 82 | " total=(len(edges[by].unique()) // size) + 1):\n", 83 | " # for each chunk we get feature matrix for neighbours\n", 84 | " temp = edges[edges[by].isin(chunk)]\\\n", 85 | " .merge(feats, on=on, how='left')\n", 86 | " # convolve and pool\n", 87 | " tempgb = temp[cols + [by, on]]\\\n", 88 | " .groupby(by).agg({col: agg_f for col in cols}).reset_index()\n", 89 | " res_feats.append(tempgb.rename(columns={c: prefix + c for c in cols}))\n", 90 | " # concat results\n", 91 | " return pd.concat(res_feats, axis=0).reset_index(drop=True)" 92 | ] 93 | }, 94 | { 95 | "cell_type": "markdown", 96 | "metadata": {}, 97 | "source": [ 98 | "Make simple graph: 101 nodes, each connected with two neighbors. Simply chain of nodes." 99 | ] 100 | }, 101 | { 102 | "cell_type": "code", 103 | "execution_count": 3, 104 | "metadata": {}, 105 | "outputs": [], 106 | "source": [ 107 | "ara = np.arange(101).reshape(-1, 1)\n", 108 | "sample = np.vstack((np.hstack((ara[:-1], ara[1:])), # forward links\n", 109 | " np.hstack((ara[1:], ara[:-1])))) # backward links" 110 | ] 111 | }, 112 | { 113 | "cell_type": "markdown", 114 | "metadata": {}, 115 | "source": [ 116 | "Make random features" 117 | ] 118 | }, 119 | { 120 | "cell_type": "code", 121 | "execution_count": 4, 122 | "metadata": {}, 123 | "outputs": [], 124 | "source": [ 125 | "feats = np.random.normal(size=(101, 10))" 126 | ] 127 | }, 128 | { 129 | "cell_type": "markdown", 130 | "metadata": {}, 131 | "source": [ 132 | "Create dataframes from arrays" 133 | ] 134 | }, 135 | { 136 | "cell_type": "code", 137 | "execution_count": 6, 138 | "metadata": {}, 139 | "outputs": [], 140 | "source": [ 141 | "edges = pd.DataFrame(sample, columns=['source', 'target'])\n", 142 | "cols = ['col{}'.format(i) for i in range(10)]\n", 143 | "feats = pd.DataFrame(feats, columns=cols)\n", 144 | "feats['target'] = ara" 145 | ] 146 | }, 147 | { 148 | "cell_type": "markdown", 149 | "metadata": {}, 150 | "source": [ 151 | "This is how the feature matrix looks like" 152 | ] 153 | }, 154 | { 155 | "cell_type": "code", 156 | "execution_count": 15, 157 | "metadata": {}, 158 | "outputs": [ 159 | { 160 | "data": { 161 | "image/png": "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\n", 162 | "text/plain": [ 163 | "
" 164 | ] 165 | }, 166 | "metadata": { 167 | "needs_background": "light" 168 | }, 169 | "output_type": "display_data" 170 | } 171 | ], 172 | "source": [ 173 | "plt.figure(figsize=(3, 8))\n", 174 | "plt.imshow(feats.values[:, :-1], cmap='jet');" 175 | ] 176 | }, 177 | { 178 | "cell_type": "markdown", 179 | "metadata": {}, 180 | "source": [ 181 | "## First convolution" 182 | ] 183 | }, 184 | { 185 | "cell_type": "code", 186 | "execution_count": 7, 187 | "metadata": {}, 188 | "outputs": [ 189 | { 190 | "name": "stderr", 191 | "output_type": "stream", 192 | "text": [ 193 | "100%|██████████| 1/1 [00:00<00:00, 67.25it/s]\n" 194 | ] 195 | } 196 | ], 197 | "source": [ 198 | "conv1 = make_conv(edges, feats, cols, 'source', 'target')" 199 | ] 200 | }, 201 | { 202 | "cell_type": "code", 203 | "execution_count": 8, 204 | "metadata": {}, 205 | "outputs": [ 206 | { 207 | "data": { 208 | "text/html": [ 209 | "
\n", 210 | "\n", 223 | "\n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \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 | "
sourcemean_col0mean_col1mean_col2mean_col3mean_col4mean_col5mean_col6mean_col7mean_col8mean_col9
000.7300850.428604-0.967305-0.927957-0.648321-1.5294370.2887420.642841-0.240322-0.686550
110.651642-0.683116-0.179200-1.0698350.8243700.202663-0.247970-0.769478-0.6040190.006299
220.7492630.077546-0.472234-1.326084-1.266701-0.9280920.0047360.990368-0.250484-0.116420
330.284014-0.788309-0.719696-0.6258510.2589560.4505870.204037-0.627669-0.277296-0.296346
441.012357-0.862818-0.838706-0.779575-1.2506860.4924400.4267470.7238310.2325880.665481
\n", 313 | "
" 314 | ], 315 | "text/plain": [ 316 | " source mean_col0 mean_col1 mean_col2 mean_col3 mean_col4 mean_col5 \\\n", 317 | "0 0 0.730085 0.428604 -0.967305 -0.927957 -0.648321 -1.529437 \n", 318 | "1 1 0.651642 -0.683116 -0.179200 -1.069835 0.824370 0.202663 \n", 319 | "2 2 0.749263 0.077546 -0.472234 -1.326084 -1.266701 -0.928092 \n", 320 | "3 3 0.284014 -0.788309 -0.719696 -0.625851 0.258956 0.450587 \n", 321 | "4 4 1.012357 -0.862818 -0.838706 -0.779575 -1.250686 0.492440 \n", 322 | "\n", 323 | " mean_col6 mean_col7 mean_col8 mean_col9 \n", 324 | "0 0.288742 0.642841 -0.240322 -0.686550 \n", 325 | "1 -0.247970 -0.769478 -0.604019 0.006299 \n", 326 | "2 0.004736 0.990368 -0.250484 -0.116420 \n", 327 | "3 0.204037 -0.627669 -0.277296 -0.296346 \n", 328 | "4 0.426747 0.723831 0.232588 0.665481 " 329 | ] 330 | }, 331 | "execution_count": 8, 332 | "metadata": {}, 333 | "output_type": "execute_result" 334 | } 335 | ], 336 | "source": [ 337 | "conv1.head()" 338 | ] 339 | }, 340 | { 341 | "cell_type": "markdown", 342 | "metadata": {}, 343 | "source": [ 344 | "First 10 columns are raw nodes features, next 10 are smoothed between neighbors. It's the same as box blur in image processing." 345 | ] 346 | }, 347 | { 348 | "cell_type": "code", 349 | "execution_count": 9, 350 | "metadata": {}, 351 | "outputs": [ 352 | { 353 | "data": { 354 | "image/png": "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\n", 355 | "text/plain": [ 356 | "
" 357 | ] 358 | }, 359 | "metadata": { 360 | "needs_background": "light" 361 | }, 362 | "output_type": "display_data" 363 | } 364 | ], 365 | "source": [ 366 | "plt.figure(figsize=(3, 8))\n", 367 | "plt.imshow(np.hstack((feats[cols].values,\n", 368 | " conv1.values[:, 1:])), cmap='jet');" 369 | ] 370 | }, 371 | { 372 | "cell_type": "code", 373 | "execution_count": 10, 374 | "metadata": {}, 375 | "outputs": [ 376 | { 377 | "data": { 378 | "text/html": [ 379 | "
\n", 380 | "\n", 393 | "\n", 394 | " \n", 395 | " \n", 396 | " \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 | "
sourcemean_col0mean_col1mean_col2mean_col3mean_col4mean_col5mean_col6mean_col7mean_col8mean_col9
000.7300850.428604-0.967305-0.927957-0.648321-1.5294370.2887420.642841-0.240322-0.686550
110.651642-0.683116-0.179200-1.0698350.8243700.202663-0.247970-0.769478-0.6040190.006299
220.7492630.077546-0.472234-1.326084-1.266701-0.9280920.0047360.990368-0.250484-0.116420
330.284014-0.788309-0.719696-0.6258510.2589560.4505870.204037-0.627669-0.277296-0.296346
441.012357-0.862818-0.838706-0.779575-1.2506860.4924400.4267470.7238310.2325880.665481
\n", 483 | "
" 484 | ], 485 | "text/plain": [ 486 | " source mean_col0 mean_col1 mean_col2 mean_col3 mean_col4 mean_col5 \\\n", 487 | "0 0 0.730085 0.428604 -0.967305 -0.927957 -0.648321 -1.529437 \n", 488 | "1 1 0.651642 -0.683116 -0.179200 -1.069835 0.824370 0.202663 \n", 489 | "2 2 0.749263 0.077546 -0.472234 -1.326084 -1.266701 -0.928092 \n", 490 | "3 3 0.284014 -0.788309 -0.719696 -0.625851 0.258956 0.450587 \n", 491 | "4 4 1.012357 -0.862818 -0.838706 -0.779575 -1.250686 0.492440 \n", 492 | "\n", 493 | " mean_col6 mean_col7 mean_col8 mean_col9 \n", 494 | "0 0.288742 0.642841 -0.240322 -0.686550 \n", 495 | "1 -0.247970 -0.769478 -0.604019 0.006299 \n", 496 | "2 0.004736 0.990368 -0.250484 -0.116420 \n", 497 | "3 0.204037 -0.627669 -0.277296 -0.296346 \n", 498 | "4 0.426747 0.723831 0.232588 0.665481 " 499 | ] 500 | }, 501 | "execution_count": 10, 502 | "metadata": {}, 503 | "output_type": "execute_result" 504 | } 505 | ], 506 | "source": [ 507 | "conv1.head()" 508 | ] 509 | }, 510 | { 511 | "cell_type": "markdown", 512 | "metadata": {}, 513 | "source": [ 514 | "## Second convolution" 515 | ] 516 | }, 517 | { 518 | "cell_type": "code", 519 | "execution_count": 11, 520 | "metadata": { 521 | "scrolled": true 522 | }, 523 | "outputs": [ 524 | { 525 | "name": "stderr", 526 | "output_type": "stream", 527 | "text": [ 528 | "100%|██████████| 1/1 [00:00<00:00, 80.04it/s]\n" 529 | ] 530 | } 531 | ], 532 | "source": [ 533 | "cols = list(conv1.columns)[1:]\n", 534 | "conv2 = make_conv(edges, conv1.rename(columns={'source': 'target'}), cols, 'source', 'target')" 535 | ] 536 | }, 537 | { 538 | "cell_type": "code", 539 | "execution_count": 12, 540 | "metadata": {}, 541 | "outputs": [ 542 | { 543 | "data": { 544 | "text/plain": [ 545 | "(101, 11)" 546 | ] 547 | }, 548 | "execution_count": 12, 549 | "metadata": {}, 550 | "output_type": "execute_result" 551 | } 552 | ], 553 | "source": [ 554 | "conv2.shape" 555 | ] 556 | }, 557 | { 558 | "cell_type": "markdown", 559 | "metadata": {}, 560 | "source": [ 561 | "First convolution features contains information about neighbors. Second step features contains information about neigbors of neighbors." 562 | ] 563 | }, 564 | { 565 | "cell_type": "code", 566 | "execution_count": 13, 567 | "metadata": {}, 568 | "outputs": [ 569 | { 570 | "data": { 571 | "image/png": "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\n", 572 | "text/plain": [ 573 | "
" 574 | ] 575 | }, 576 | "metadata": { 577 | "needs_background": "light" 578 | }, 579 | "output_type": "display_data" 580 | } 581 | ], 582 | "source": [ 583 | "plt.figure(figsize=(3, 8))\n", 584 | "plt.imshow(np.hstack((feats.values[:, :-1],\n", 585 | " conv1.values[:, 1:],\n", 586 | " conv2.values[:, 1:])), cmap='jet');" 587 | ] 588 | } 589 | ], 590 | "metadata": { 591 | "kernelspec": { 592 | "display_name": "Python 3.6", 593 | "language": "python", 594 | "name": "py36venv" 595 | }, 596 | "language_info": { 597 | "codemirror_mode": { 598 | "name": "ipython", 599 | "version": 3 600 | }, 601 | "file_extension": ".py", 602 | "mimetype": "text/x-python", 603 | "name": "python", 604 | "nbconvert_exporter": "python", 605 | "pygments_lexer": "ipython3", 606 | "version": "3.6.6" 607 | }, 608 | "toc": { 609 | "base_numbering": 1, 610 | "nav_menu": {}, 611 | "number_sections": true, 612 | "sideBar": true, 613 | "skip_h1_title": false, 614 | "title_cell": "Table of Contents", 615 | "title_sidebar": "Contents", 616 | "toc_cell": false, 617 | "toc_position": {}, 618 | "toc_section_display": true, 619 | "toc_window_display": false 620 | } 621 | }, 622 | "nbformat": 4, 623 | "nbformat_minor": 2 624 | } 625 | -------------------------------------------------------------------------------- /convolver.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import numpy as np 3 | from tqdm import tqdm 4 | 5 | def chunker(seq, size): 6 | """https://stackoverflow.com/a/434328""" 7 | return (seq[pos: pos + size] for pos in range(0, len(seq), size)) 8 | 9 | def make_conv(edges, feats, cols, by, on, size=1000000, agg_f='mean', 10 | prefix='mean_'): 11 | """ 12 | edges -- edgelist: pandas dataframe with two columns (arguments by and on) 13 | feats -- features dataframe with key column (argument on) 14 | and features columns (argument cols) 15 | by -- column in edges to be used as source nodes 16 | on -- column in edges to be used as neighbor nodes 17 | size -- number of unique source nodes to be used in one chunk 18 | agg_f -- can be interpreted as pooling function. 19 | Pandas has several optimised functions for basic statistics, 20 | that can be passed as string arg (see pandas docs), 21 | but you also can provide any function you like 22 | prefix -- prefix for new column names 23 | """ 24 | res_feats = [] # used to stack result chunks 25 | 26 | # get chunk of unique source nodes 27 | for chunk in tqdm(chunker(edges[by].unique(), size=size), 28 | total=(len(edges[by].unique()) // size) + 1): 29 | # for each chunk we get feature matrix for neighbours 30 | temp = edges[edges[by].isin(chunk)]\ 31 | .merge(feats, on=on, how='left') 32 | # convolve and pool 33 | tempgb = temp[cols + [by, on]]\ 34 | .groupby(by).agg({col: agg_f for col in cols}).reset_index() 35 | res_feats.append(tempgb.rename(columns={c: prefix + c for c in cols})) 36 | # concat results 37 | return pd.concat(res_feats, axis=0).reset_index(drop=True) 38 | -------------------------------------------------------------------------------- /pics/conv/Action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Action.png -------------------------------------------------------------------------------- /pics/conv/Adult.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Adult.png -------------------------------------------------------------------------------- /pics/conv/Adventure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Adventure.png -------------------------------------------------------------------------------- /pics/conv/Animation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Animation.png -------------------------------------------------------------------------------- /pics/conv/Biography.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Biography.png -------------------------------------------------------------------------------- /pics/conv/Comedy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Comedy.png -------------------------------------------------------------------------------- /pics/conv/Crime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Crime.png -------------------------------------------------------------------------------- /pics/conv/Documentary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Documentary.png -------------------------------------------------------------------------------- /pics/conv/Drama.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Drama.png -------------------------------------------------------------------------------- /pics/conv/Family.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Family.png -------------------------------------------------------------------------------- /pics/conv/Fantasy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Fantasy.png -------------------------------------------------------------------------------- /pics/conv/Film-Noir.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Film-Noir.png -------------------------------------------------------------------------------- /pics/conv/Game-Show.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Game-Show.png -------------------------------------------------------------------------------- /pics/conv/History.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/History.png -------------------------------------------------------------------------------- /pics/conv/Horror.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Horror.png -------------------------------------------------------------------------------- /pics/conv/Music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Music.png -------------------------------------------------------------------------------- /pics/conv/Musical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Musical.png -------------------------------------------------------------------------------- /pics/conv/Mystery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Mystery.png -------------------------------------------------------------------------------- /pics/conv/News.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/News.png -------------------------------------------------------------------------------- /pics/conv/Reality-TV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Reality-TV.png -------------------------------------------------------------------------------- /pics/conv/Romance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Romance.png -------------------------------------------------------------------------------- /pics/conv/Sci-Fi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Sci-Fi.png -------------------------------------------------------------------------------- /pics/conv/Short.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Short.png -------------------------------------------------------------------------------- /pics/conv/Sport.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Sport.png -------------------------------------------------------------------------------- /pics/conv/Talk-Show.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Talk-Show.png -------------------------------------------------------------------------------- /pics/conv/Thriller.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Thriller.png -------------------------------------------------------------------------------- /pics/conv/War.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/War.png -------------------------------------------------------------------------------- /pics/conv/Western.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/Western.png -------------------------------------------------------------------------------- /pics/conv/anim.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/conv/anim.gif -------------------------------------------------------------------------------- /pics/lv/Action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Action.png -------------------------------------------------------------------------------- /pics/lv/Adult.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Adult.png -------------------------------------------------------------------------------- /pics/lv/Adventure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Adventure.png -------------------------------------------------------------------------------- /pics/lv/Animation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Animation.png -------------------------------------------------------------------------------- /pics/lv/Biography.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Biography.png -------------------------------------------------------------------------------- /pics/lv/Comedy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Comedy.png -------------------------------------------------------------------------------- /pics/lv/Crime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Crime.png -------------------------------------------------------------------------------- /pics/lv/Documentary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Documentary.png -------------------------------------------------------------------------------- /pics/lv/Drama.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Drama.png -------------------------------------------------------------------------------- /pics/lv/Family.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Family.png -------------------------------------------------------------------------------- /pics/lv/Fantasy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Fantasy.png -------------------------------------------------------------------------------- /pics/lv/Film-Noir.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Film-Noir.png -------------------------------------------------------------------------------- /pics/lv/Game-Show.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Game-Show.png -------------------------------------------------------------------------------- /pics/lv/History.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/History.png -------------------------------------------------------------------------------- /pics/lv/Horror.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Horror.png -------------------------------------------------------------------------------- /pics/lv/Music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Music.png -------------------------------------------------------------------------------- /pics/lv/Musical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Musical.png -------------------------------------------------------------------------------- /pics/lv/Mystery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Mystery.png -------------------------------------------------------------------------------- /pics/lv/News.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/News.png -------------------------------------------------------------------------------- /pics/lv/Reality-TV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Reality-TV.png -------------------------------------------------------------------------------- /pics/lv/Romance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Romance.png -------------------------------------------------------------------------------- /pics/lv/Sci-Fi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Sci-Fi.png -------------------------------------------------------------------------------- /pics/lv/Short.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Short.png -------------------------------------------------------------------------------- /pics/lv/Sport.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Sport.png -------------------------------------------------------------------------------- /pics/lv/Talk-Show.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Talk-Show.png -------------------------------------------------------------------------------- /pics/lv/Thriller.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Thriller.png -------------------------------------------------------------------------------- /pics/lv/War.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/War.png -------------------------------------------------------------------------------- /pics/lv/Western.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/Western.png -------------------------------------------------------------------------------- /pics/lv/anim.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/lv/anim.gif -------------------------------------------------------------------------------- /pics/verse/verse_Action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Action.png -------------------------------------------------------------------------------- /pics/verse/verse_Adult.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Adult.png -------------------------------------------------------------------------------- /pics/verse/verse_Adventure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Adventure.png -------------------------------------------------------------------------------- /pics/verse/verse_Animation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Animation.png -------------------------------------------------------------------------------- /pics/verse/verse_Biography.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Biography.png -------------------------------------------------------------------------------- /pics/verse/verse_Comedy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Comedy.png -------------------------------------------------------------------------------- /pics/verse/verse_Crime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Crime.png -------------------------------------------------------------------------------- /pics/verse/verse_Documentary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Documentary.png -------------------------------------------------------------------------------- /pics/verse/verse_Drama.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Drama.png -------------------------------------------------------------------------------- /pics/verse/verse_Family.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Family.png -------------------------------------------------------------------------------- /pics/verse/verse_Fantasy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Fantasy.png -------------------------------------------------------------------------------- /pics/verse/verse_Film-Noir.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Film-Noir.png -------------------------------------------------------------------------------- /pics/verse/verse_Game-Show.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Game-Show.png -------------------------------------------------------------------------------- /pics/verse/verse_History.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_History.png -------------------------------------------------------------------------------- /pics/verse/verse_Horror.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Horror.png -------------------------------------------------------------------------------- /pics/verse/verse_Music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Music.png -------------------------------------------------------------------------------- /pics/verse/verse_Musical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Musical.png -------------------------------------------------------------------------------- /pics/verse/verse_Mystery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Mystery.png -------------------------------------------------------------------------------- /pics/verse/verse_News.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_News.png -------------------------------------------------------------------------------- /pics/verse/verse_Reality-TV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Reality-TV.png -------------------------------------------------------------------------------- /pics/verse/verse_Romance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Romance.png -------------------------------------------------------------------------------- /pics/verse/verse_Sci-Fi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Sci-Fi.png -------------------------------------------------------------------------------- /pics/verse/verse_Short.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Short.png -------------------------------------------------------------------------------- /pics/verse/verse_Sport.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Sport.png -------------------------------------------------------------------------------- /pics/verse/verse_Talk-Show.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Talk-Show.png -------------------------------------------------------------------------------- /pics/verse/verse_Thriller.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Thriller.png -------------------------------------------------------------------------------- /pics/verse/verse_War.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_War.png -------------------------------------------------------------------------------- /pics/verse/verse_Western.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iggisv9t/graph-stuff/42716c8350c1538bb1827b34832b9aea18ca6c4b/pics/verse/verse_Western.png -------------------------------------------------------------------------------- /sql_convolution.sql: -------------------------------------------------------------------------------- 1 | /* 2 | This is an example of convolutions using sql. 3 | At first we create a table with interactions between users, where "cnt" is a measure of strength of interaction. 4 | Then we create a table with user features. 5 | Temporary table is a join of these tables to get raw features of users with which id1 interacted. 6 | The last sql generated aggreagated features (convolution). 7 | You can try this here: http://sqlfiddle.com/#!9/a7818f/5 8 | */ 9 | 10 | CREATE TABLE IF NOT EXISTS `user_interactions` ( 11 | `id1` int(3) unsigned NOT NULL, 12 | `id2` int(3) unsigned NOT NULL, 13 | `cnt` int(3) NOT NULL, 14 | PRIMARY KEY (`id1`,`id2`) 15 | ) DEFAULT CHARSET=utf8; 16 | INSERT INTO `user_interactions` (`id1`, `id2`, `cnt`) VALUES 17 | (1, 2, 1), 18 | (2, 3, 5), 19 | (3, 5, 4), 20 | (1, 3, 6), 21 | (1, 4, 2), 22 | (2, 4, 8), 23 | (4, 5, 5); 24 | 25 | CREATE TABLE IF NOT EXISTS `user_features` ( 26 | `id` int(3) unsigned NOT NULL, 27 | `feat1` int(3) unsigned NOT NULL, 28 | `feat2` int(3) NOT NULL, 29 | PRIMARY KEY (`id`) 30 | ) DEFAULT CHARSET=utf8; 31 | INSERT INTO `user_features` (`id`, `feat1`, `feat2`) VALUES 32 | (1, 10, 3), 33 | (2, 20, 7), 34 | (3, 5, 30), 35 | (4, 2, 8), 36 | (5, 6, 1); 37 | 38 | create table `temp` as 39 | select id1, id2, feat1, feat2, cnt, feat1*cnt as weighted_feat1, feat2*cnt as weighted_feat2 40 | from user_interactions a 41 | join user_features b 42 | on a.id2 = b.id; 43 | 44 | select id1, avg(feat1), avg(feat2), sum(weighted_feat1) / sum(cnt) as weighted_avg_feat1, 45 | sum(weighted_feat2) / sum(cnt) as weighted_avg_feat2 46 | from temp 47 | group by id1; 48 | -------------------------------------------------------------------------------- /useful_links.md: -------------------------------------------------------------------------------- 1 | 2 | ### LargeViz 3 | [arxiv.org/abs/1602.00370](https://arxiv.org/abs/1602.00370) 4 | [github.com/lferry007/LargeVis](https://github.com/lferry007/LargeVis) 5 | ### Node2Vec 6 | [snap.stanford.edu/node2vec](http://snap.stanford.edu/node2vec/) 7 | [github.com/xgfs/node2vec-c](https://github.com/xgfs/node2vec-c) 8 | ### VERSE 9 | [tsitsul.in/publications/verse](http://tsitsul.in/publications/verse/) 10 | [github.com/xgfs/verse](https://github.com/xgfs/verse) 11 | ### Graph Convolutions 12 | List of papers about Graph Convolutional Networks: [github.com/thunlp/GNNPapers](https://github.com/thunlp/GNNPapers) 13 | Simplifying Graph Convolutional Networks: 14 | [arxiv.org/pdf/1902.07153.pdf](https://arxiv.org/pdf/1902.07153.pdf) 15 | --------------------------------------------------------------------------------