├── .gitignore ├── Build-a-Dataset.ipynb ├── Crypto-Tutorials ├── Classification-Crypto.ipynb ├── FB-Prophet-Crypto-Tutorial.ipynb ├── FBProphet-Twitter-Sentiment.ipynb ├── HMM-Crypto.ipynb ├── Intraday-Trading-FBProphet.ipynb ├── Linear-Regression-Crypto.ipynb └── NewsSentiment-TimeSeries-Crypto.ipynb ├── Dating-Algo.ipynb ├── README.md ├── Selenium-Tutorial.ipynb ├── Send-Emails-with-Python.ipynb └── Stock-Market-Tutorials ├── Analyze-Fundamental-Data.ipynb ├── Financial-News-Backtest.ipynb ├── Tweet-Sentiments-Stocks.ipynb ├── Twitter-Trading-Strat.ipynb ├── autoBacktest.ipynb └── classAutoBacktest.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | 131 | # Files 132 | *.csv 133 | *.DS_Store 134 | -------------------------------------------------------------------------------- /Crypto-Tutorials/HMM-Crypto.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Hidden Markov Models for Crypto" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 26, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "from hmmlearn.hmm import MultinomialHMM\n", 17 | "import yfinance as yf\n", 18 | "import numpy as np\n", 19 | "\n" 20 | ] 21 | }, 22 | { 23 | "cell_type": "code", 24 | "execution_count": 4, 25 | "metadata": {}, 26 | "outputs": [], 27 | "source": [ 28 | "# Designating the Crypto\n", 29 | "ticker = yf.Ticker(\"BTC-USD\")\n", 30 | "\n", 31 | "# Getting all price history\n", 32 | "price_history = ticker.history(period=\"max\")" 33 | ] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": 54, 38 | "metadata": {}, 39 | "outputs": [], 40 | "source": [ 41 | "seq = price_history.pct_change().applymap(lambda x: 1 if x>0 else 0).drop(['Dividends', \"Stock Splits\"], axis=1).dropna().astype(int)" 42 | ] 43 | }, 44 | { 45 | "cell_type": "code", 46 | "execution_count": 55, 47 | "metadata": {}, 48 | "outputs": [], 49 | "source": [ 50 | "x = np.reshape(np.array(seq['Close'][:40][::-1]), (-1,1))" 51 | ] 52 | }, 53 | { 54 | "cell_type": "code", 55 | "execution_count": 56, 56 | "metadata": {}, 57 | "outputs": [ 58 | { 59 | "data": { 60 | "text/plain": [ 61 | "MultinomialHMM(n_components=2, random_state=RandomState(MT19937) at 0x1069C7A40)" 62 | ] 63 | }, 64 | "execution_count": 56, 65 | "metadata": {}, 66 | "output_type": "execute_result" 67 | } 68 | ], 69 | "source": [ 70 | "model = MultinomialHMM(n_components=2)\n", 71 | "\n", 72 | "model.fit(x)" 73 | ] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "execution_count": 57, 78 | "metadata": {}, 79 | "outputs": [], 80 | "source": [ 81 | "y = np.reshape(np.array(seq['Close'][40:45][::-1]), (-1,1))" 82 | ] 83 | }, 84 | { 85 | "cell_type": "code", 86 | "execution_count": 58, 87 | "metadata": {}, 88 | "outputs": [ 89 | { 90 | "data": { 91 | "text/plain": [ 92 | "array([1, 1, 0, 1, 0])" 93 | ] 94 | }, 95 | "execution_count": 58, 96 | "metadata": {}, 97 | "output_type": "execute_result" 98 | } 99 | ], 100 | "source": [ 101 | "model.predict(y)" 102 | ] 103 | }, 104 | { 105 | "cell_type": "code", 106 | "execution_count": 60, 107 | "metadata": {}, 108 | "outputs": [ 109 | { 110 | "ename": "AttributeError", 111 | "evalue": "'MultinomialHMM' object has no attribute 'means_'", 112 | "output_type": "error", 113 | "traceback": [ 114 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 115 | "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", 116 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmeans_\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", 117 | "\u001b[0;31mAttributeError\u001b[0m: 'MultinomialHMM' object has no attribute 'means_'" 118 | ] 119 | } 120 | ], 121 | "source": [ 122 | "model.means_" 123 | ] 124 | }, 125 | { 126 | "cell_type": "code", 127 | "execution_count": null, 128 | "metadata": {}, 129 | "outputs": [], 130 | "source": [] 131 | } 132 | ], 133 | "metadata": { 134 | "kernelspec": { 135 | "display_name": "Python 3", 136 | "language": "python", 137 | "name": "python3" 138 | }, 139 | "language_info": { 140 | "codemirror_mode": { 141 | "name": "ipython", 142 | "version": 3 143 | }, 144 | "file_extension": ".py", 145 | "mimetype": "text/x-python", 146 | "name": "python", 147 | "nbconvert_exporter": "python", 148 | "pygments_lexer": "ipython3", 149 | "version": "3.9.1" 150 | } 151 | }, 152 | "nbformat": 4, 153 | "nbformat_minor": 4 154 | } 155 | -------------------------------------------------------------------------------- /Dating-Algo.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Dating Algorithm Recommender System" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "# libraries\n", 17 | "import pandas as pd\n", 18 | "import random\n", 19 | "import numpy as np" 20 | ] 21 | }, 22 | { 23 | "cell_type": "markdown", 24 | "metadata": {}, 25 | "source": [ 26 | "# Creating Data" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": {}, 32 | "source": [ 33 | "## Profile Questions" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": 74, 39 | "metadata": {}, 40 | "outputs": [ 41 | { 42 | "data": { 43 | "text/html": [ 44 | "
\n", 45 | "\n", 58 | "\n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | "
Q1Q2Q3Q4Q5
id
m0ECAAA
m1AAEAA
m2BCADB
m3BCEDC
m4CDDBB
..................
m995DDDEC
m996DEBEE
m997CEDCE
m998DEDEA
m999BEEDA
\n", 168 | "

1000 rows × 5 columns

\n", 169 | "
" 170 | ], 171 | "text/plain": [ 172 | " Q1 Q2 Q3 Q4 Q5\n", 173 | "id \n", 174 | "m0 E C A A A\n", 175 | "m1 A A E A A\n", 176 | "m2 B C A D B\n", 177 | "m3 B C E D C\n", 178 | "m4 C D D B B\n", 179 | "... .. .. .. .. ..\n", 180 | "m995 D D D E C\n", 181 | "m996 D E B E E\n", 182 | "m997 C E D C E\n", 183 | "m998 D E D E A\n", 184 | "m999 B E E D A\n", 185 | "\n", 186 | "[1000 rows x 5 columns]" 187 | ] 188 | }, 189 | "metadata": {}, 190 | "output_type": "display_data" 191 | }, 192 | { 193 | "data": { 194 | "text/html": [ 195 | "
\n", 196 | "\n", 209 | "\n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \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 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | "
Q1Q2Q3Q4Q5
id
w0BABEA
w1BEEAA
w2EEBDE
w3EECBA
w4AEDBC
..................
w995CCAEE
w996EABBD
w997DDDAC
w998CDDED
w999BDBBE
\n", 319 | "

1000 rows × 5 columns

\n", 320 | "
" 321 | ], 322 | "text/plain": [ 323 | " Q1 Q2 Q3 Q4 Q5\n", 324 | "id \n", 325 | "w0 B A B E A\n", 326 | "w1 B E E A A\n", 327 | "w2 E E B D E\n", 328 | "w3 E E C B A\n", 329 | "w4 A E D B C\n", 330 | "... .. .. .. .. ..\n", 331 | "w995 C C A E E\n", 332 | "w996 E A B B D\n", 333 | "w997 D D D A C\n", 334 | "w998 C D D E D\n", 335 | "w999 B D B B E\n", 336 | "\n", 337 | "[1000 rows x 5 columns]" 338 | ] 339 | }, 340 | "metadata": {}, 341 | "output_type": "display_data" 342 | } 343 | ], 344 | "source": [ 345 | "# Creating a Dataset of men and women\n", 346 | "men = pd.DataFrame()\n", 347 | "\n", 348 | "women = pd.DataFrame()\n", 349 | "\n", 350 | "# Number of users\n", 351 | "num = 1000\n", 352 | "\n", 353 | "# Dating profile questions for each\n", 354 | "qs = ['Q1', 'Q2', 'Q3', 'Q4', 'Q5']\n", 355 | "\n", 356 | "# Answers to profile questions\n", 357 | "ans = ['A', 'B', 'C', 'D', 'E']\n", 358 | "\n", 359 | "for q in qs:\n", 360 | " \n", 361 | " # Making them categorical for preprocessing later\n", 362 | " men[q] = pd.Categorical(random.choices(ans, k=num), categories=ans)\n", 363 | " \n", 364 | " women[q] = pd.Categorical(random.choices(ans, k=num), categories=ans)\n", 365 | " \n", 366 | " # IDs\n", 367 | " men['id'] = [\"m\"+str(i) for i in range(num)]\n", 368 | " \n", 369 | " women['id'] = [\"w\"+str(i) for i in range(num)]\n", 370 | " \n", 371 | "# Setting index\n", 372 | "men.set_index('id', inplace=True)\n", 373 | "\n", 374 | "women.set_index('id', inplace=True)\n", 375 | "\n", 376 | "# Showing the DFs\n", 377 | "display(men)\n", 378 | "\n", 379 | "display(women)" 380 | ] 381 | }, 382 | { 383 | "cell_type": "markdown", 384 | "metadata": {}, 385 | "source": [ 386 | "## Swipe Behavior" 387 | ] 388 | }, 389 | { 390 | "cell_type": "code", 391 | "execution_count": 75, 392 | "metadata": {}, 393 | "outputs": [ 394 | { 395 | "data": { 396 | "text/html": [ 397 | "
\n", 398 | "\n", 411 | "\n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | " \n", 599 | " \n", 600 | " \n", 601 | " \n", 602 | " \n", 603 | " \n", 604 | " \n", 605 | " \n", 606 | " \n", 607 | " \n", 608 | " \n", 609 | " \n", 610 | " \n", 611 | " \n", 612 | " \n", 613 | " \n", 614 | " \n", 615 | " \n", 616 | " \n", 617 | " \n", 618 | " \n", 619 | " \n", 620 | " \n", 621 | " \n", 622 | " \n", 623 | " \n", 624 | " \n", 625 | " \n", 626 | " \n", 627 | " \n", 628 | " \n", 629 | " \n", 630 | " \n", 631 | " \n", 632 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | " \n", 640 | " \n", 641 | " \n", 642 | " \n", 643 | " \n", 644 | " \n", 645 | " \n", 646 | " \n", 647 | " \n", 648 | " \n", 649 | " \n", 650 | " \n", 651 | " \n", 652 | " \n", 653 | " \n", 654 | " \n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | " \n", 659 | " \n", 660 | " \n", 661 | " \n", 662 | " \n", 663 | " \n", 664 | " \n", 665 | " \n", 666 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | " \n", 674 | " \n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | " \n", 722 | " \n", 723 | " \n", 724 | " \n", 725 | " \n", 726 | " \n", 727 | " \n", 728 | "
idw0w1w2w3w4w5w6w7w8w9...w990w991w992w993w994w995w996w997w998w999
id
m011101unseen10unseen1...unseen0100unseen0unseen10
m1unseen01unseenunseenunseenunseen110...0unseenunseen10unseenunseenunseen00
m201unseenunseenunseen11unseen10...unseenunseen0010011unseen
m30unseenunseenunseen01unseen1unseenunseen...unseen0unseenunseenunseen1unseenunseen0unseen
m4unseen101unseen01unseen0unseen...1unseenunseen0011110
..................................................................
m9950unseenunseen1unseen111unseen0...10unseenunseen10unseen110
m996unseen01100unseen010...unseen0unseen0100111
m9970unseenunseen00unseen0111...unseenunseenunseenunseen0unseen11unseen0
m99810101unseen0110...unseen1unseenunseen1100unseen0
m9990unseen111unseen0101...unseen0101unseen0unseen01
\n", 729 | "

1000 rows × 1000 columns

\n", 730 | "
" 731 | ], 732 | "text/plain": [ 733 | "id w0 w1 w2 w3 w4 w5 w6 w7 w8 \\\n", 734 | "id \n", 735 | "m0 1 1 1 0 1 unseen 1 0 unseen \n", 736 | "m1 unseen 0 1 unseen unseen unseen unseen 1 1 \n", 737 | "m2 0 1 unseen unseen unseen 1 1 unseen 1 \n", 738 | "m3 0 unseen unseen unseen 0 1 unseen 1 unseen \n", 739 | "m4 unseen 1 0 1 unseen 0 1 unseen 0 \n", 740 | "... ... ... ... ... ... ... ... ... ... \n", 741 | "m995 0 unseen unseen 1 unseen 1 1 1 unseen \n", 742 | "m996 unseen 0 1 1 0 0 unseen 0 1 \n", 743 | "m997 0 unseen unseen 0 0 unseen 0 1 1 \n", 744 | "m998 1 0 1 0 1 unseen 0 1 1 \n", 745 | "m999 0 unseen 1 1 1 unseen 0 1 0 \n", 746 | "\n", 747 | "id w9 ... w990 w991 w992 w993 w994 w995 w996 \\\n", 748 | "id ... \n", 749 | "m0 1 ... unseen 0 1 0 0 unseen 0 \n", 750 | "m1 0 ... 0 unseen unseen 1 0 unseen unseen \n", 751 | "m2 0 ... unseen unseen 0 0 1 0 0 \n", 752 | "m3 unseen ... unseen 0 unseen unseen unseen 1 unseen \n", 753 | "m4 unseen ... 1 unseen unseen 0 0 1 1 \n", 754 | "... ... ... ... ... ... ... ... ... ... \n", 755 | "m995 0 ... 1 0 unseen unseen 1 0 unseen \n", 756 | "m996 0 ... unseen 0 unseen 0 1 0 0 \n", 757 | "m997 1 ... unseen unseen unseen unseen 0 unseen 1 \n", 758 | "m998 0 ... unseen 1 unseen unseen 1 1 0 \n", 759 | "m999 1 ... unseen 0 1 0 1 unseen 0 \n", 760 | "\n", 761 | "id w997 w998 w999 \n", 762 | "id \n", 763 | "m0 unseen 1 0 \n", 764 | "m1 unseen 0 0 \n", 765 | "m2 1 1 unseen \n", 766 | "m3 unseen 0 unseen \n", 767 | "m4 1 1 0 \n", 768 | "... ... ... ... \n", 769 | "m995 1 1 0 \n", 770 | "m996 1 1 1 \n", 771 | "m997 1 unseen 0 \n", 772 | "m998 0 unseen 0 \n", 773 | "m999 unseen 0 1 \n", 774 | "\n", 775 | "[1000 rows x 1000 columns]" 776 | ] 777 | }, 778 | "execution_count": 75, 779 | "metadata": {}, 780 | "output_type": "execute_result" 781 | } 782 | ], 783 | "source": [ 784 | "# Creating match ratings between users\n", 785 | "ratings = pd.DataFrame(index=men.index, columns=women.index)\n", 786 | "\n", 787 | "for i in ratings.columns:\n", 788 | " ratings[i] = random.choices([0,1,\"unseen\"], k=num)\n", 789 | " \n", 790 | "ratings" 791 | ] 792 | }, 793 | { 794 | "cell_type": "markdown", 795 | "metadata": {}, 796 | "source": [ 797 | "# Finding Similar Users" 798 | ] 799 | }, 800 | { 801 | "cell_type": "markdown", 802 | "metadata": {}, 803 | "source": [ 804 | "### Finding Users who had the most unseen\n", 805 | "Will make recommendations for them." 806 | ] 807 | }, 808 | { 809 | "cell_type": "code", 810 | "execution_count": 12, 811 | "metadata": {}, 812 | "outputs": [ 813 | { 814 | "data": { 815 | "text/plain": [ 816 | "1 327\n", 817 | "0 284\n", 818 | "unseen 389\n", 819 | "Name: m543, dtype: int64" 820 | ] 821 | }, 822 | "execution_count": 12, 823 | "metadata": {}, 824 | "output_type": "execute_result" 825 | } 826 | ], 827 | "source": [ 828 | "# Man\n", 829 | "m_user = ratings.T.apply(pd.Series.value_counts).T.sort_values(\n", 830 | " by=\"unseen\", \n", 831 | " ascending=False\n", 832 | ").iloc[0]\n", 833 | "\n", 834 | "m_user" 835 | ] 836 | }, 837 | { 838 | "cell_type": "code", 839 | "execution_count": 10, 840 | "metadata": {}, 841 | "outputs": [ 842 | { 843 | "data": { 844 | "text/plain": [ 845 | "1 318\n", 846 | "0 301\n", 847 | "unseen 381\n", 848 | "Name: w261, dtype: int64" 849 | ] 850 | }, 851 | "execution_count": 10, 852 | "metadata": {}, 853 | "output_type": "execute_result" 854 | } 855 | ], 856 | "source": [ 857 | "# Woman\n", 858 | "w_user = ratings.apply(pd.Series.value_counts).T.sort_values(by=\"unseen\", ascending=False).iloc[0]\n", 859 | "\n", 860 | "w_user" 861 | ] 862 | }, 863 | { 864 | "cell_type": "markdown", 865 | "metadata": {}, 866 | "source": [ 867 | "## Users that haven't been seen yet by the user above" 868 | ] 869 | }, 870 | { 871 | "cell_type": "code", 872 | "execution_count": 13, 873 | "metadata": {}, 874 | "outputs": [ 875 | { 876 | "data": { 877 | "text/plain": [ 878 | "Index(['w2', 'w6', 'w8', 'w9', 'w16', 'w17', 'w18', 'w19', 'w21', 'w24',\n", 879 | " ...\n", 880 | " 'w976', 'w979', 'w981', 'w985', 'w988', 'w989', 'w991', 'w997', 'w998',\n", 881 | " 'w999'],\n", 882 | " dtype='object', name='id', length=389)" 883 | ] 884 | }, 885 | "execution_count": 13, 886 | "metadata": {}, 887 | "output_type": "execute_result" 888 | } 889 | ], 890 | "source": [ 891 | "# Man's unseen users \n", 892 | "m_nrate = ratings.T[ratings.T[m_user.name]==\"unseen\"].index\n", 893 | "\n", 894 | "m_nrate" 895 | ] 896 | }, 897 | { 898 | "cell_type": "code", 899 | "execution_count": 14, 900 | "metadata": {}, 901 | "outputs": [ 902 | { 903 | "data": { 904 | "text/plain": [ 905 | "Index(['m0', 'm6', 'm10', 'm14', 'm23', 'm24', 'm26', 'm27', 'm29', 'm30',\n", 906 | " ...\n", 907 | " 'm968', 'm969', 'm970', 'm976', 'm978', 'm979', 'm980', 'm982', 'm986',\n", 908 | " 'm992'],\n", 909 | " dtype='object', name='id', length=381)" 910 | ] 911 | }, 912 | "execution_count": 14, 913 | "metadata": {}, 914 | "output_type": "execute_result" 915 | } 916 | ], 917 | "source": [ 918 | "# Woman's unseen users \n", 919 | "w_nrate = ratings[ratings[w_user.name]==\"unseen\"].index\n", 920 | "\n", 921 | "w_nrate" 922 | ] 923 | }, 924 | { 925 | "cell_type": "markdown", 926 | "metadata": {}, 927 | "source": [ 928 | "## Top 10 Similar Users" 929 | ] 930 | }, 931 | { 932 | "cell_type": "markdown", 933 | "metadata": {}, 934 | "source": [ 935 | "__Simple Data Preprocessing__" 936 | ] 937 | }, 938 | { 939 | "cell_type": "code", 940 | "execution_count": 15, 941 | "metadata": {}, 942 | "outputs": [], 943 | "source": [ 944 | "# First need to replace the answers with their numerical values\n", 945 | "n_men = men.apply(lambda x: x.cat.codes)\n", 946 | "\n", 947 | "n_women = women.apply(lambda x: x.cat.codes)" 948 | ] 949 | }, 950 | { 951 | "cell_type": "code", 952 | "execution_count": 16, 953 | "metadata": {}, 954 | "outputs": [ 955 | { 956 | "data": { 957 | "text/html": [ 958 | "
\n", 959 | "\n", 972 | "\n", 973 | " \n", 974 | " \n", 975 | " \n", 976 | " \n", 977 | " \n", 978 | " \n", 979 | " \n", 980 | " \n", 981 | " \n", 982 | " \n", 983 | " \n", 984 | " \n", 985 | " \n", 986 | " \n", 987 | " \n", 988 | " \n", 989 | " \n", 990 | " \n", 991 | " \n", 992 | " \n", 993 | " \n", 994 | " \n", 995 | " \n", 996 | " \n", 997 | " \n", 998 | " \n", 999 | " \n", 1000 | " \n", 1001 | " \n", 1002 | " \n", 1003 | " \n", 1004 | " \n", 1005 | " \n", 1006 | " \n", 1007 | " \n", 1008 | " \n", 1009 | " \n", 1010 | " \n", 1011 | " \n", 1012 | " \n", 1013 | " \n", 1014 | " \n", 1015 | " \n", 1016 | " \n", 1017 | " \n", 1018 | " \n", 1019 | " \n", 1020 | " \n", 1021 | " \n", 1022 | " \n", 1023 | " \n", 1024 | " \n", 1025 | " \n", 1026 | " \n", 1027 | " \n", 1028 | " \n", 1029 | " \n", 1030 | " \n", 1031 | " \n", 1032 | " \n", 1033 | " \n", 1034 | " \n", 1035 | " \n", 1036 | " \n", 1037 | " \n", 1038 | " \n", 1039 | " \n", 1040 | " \n", 1041 | " \n", 1042 | " \n", 1043 | " \n", 1044 | " \n", 1045 | " \n", 1046 | " \n", 1047 | " \n", 1048 | " \n", 1049 | " \n", 1050 | " \n", 1051 | " \n", 1052 | " \n", 1053 | " \n", 1054 | " \n", 1055 | " \n", 1056 | " \n", 1057 | " \n", 1058 | " \n", 1059 | " \n", 1060 | " \n", 1061 | " \n", 1062 | " \n", 1063 | " \n", 1064 | " \n", 1065 | " \n", 1066 | " \n", 1067 | " \n", 1068 | " \n", 1069 | " \n", 1070 | " \n", 1071 | " \n", 1072 | " \n", 1073 | " \n", 1074 | " \n", 1075 | " \n", 1076 | " \n", 1077 | " \n", 1078 | " \n", 1079 | " \n", 1080 | " \n", 1081 | "
Q1Q2Q3Q4Q5
id
m031030
m101321
m241342
m342031
m414133
..................
m99502410
m99610034
m99733422
m99812040
m99923123
\n", 1082 | "

1000 rows × 5 columns

\n", 1083 | "
" 1084 | ], 1085 | "text/plain": [ 1086 | " Q1 Q2 Q3 Q4 Q5\n", 1087 | "id \n", 1088 | "m0 3 1 0 3 0\n", 1089 | "m1 0 1 3 2 1\n", 1090 | "m2 4 1 3 4 2\n", 1091 | "m3 4 2 0 3 1\n", 1092 | "m4 1 4 1 3 3\n", 1093 | "... .. .. .. .. ..\n", 1094 | "m995 0 2 4 1 0\n", 1095 | "m996 1 0 0 3 4\n", 1096 | "m997 3 3 4 2 2\n", 1097 | "m998 1 2 0 4 0\n", 1098 | "m999 2 3 1 2 3\n", 1099 | "\n", 1100 | "[1000 rows x 5 columns]" 1101 | ] 1102 | }, 1103 | "metadata": {}, 1104 | "output_type": "display_data" 1105 | }, 1106 | { 1107 | "data": { 1108 | "text/html": [ 1109 | "
\n", 1110 | "\n", 1123 | "\n", 1124 | " \n", 1125 | " \n", 1126 | " \n", 1127 | " \n", 1128 | " \n", 1129 | " \n", 1130 | " \n", 1131 | " \n", 1132 | " \n", 1133 | " \n", 1134 | " \n", 1135 | " \n", 1136 | " \n", 1137 | " \n", 1138 | " \n", 1139 | " \n", 1140 | " \n", 1141 | " \n", 1142 | " \n", 1143 | " \n", 1144 | " \n", 1145 | " \n", 1146 | " \n", 1147 | " \n", 1148 | " \n", 1149 | " \n", 1150 | " \n", 1151 | " \n", 1152 | " \n", 1153 | " \n", 1154 | " \n", 1155 | " \n", 1156 | " \n", 1157 | " \n", 1158 | " \n", 1159 | " \n", 1160 | " \n", 1161 | " \n", 1162 | " \n", 1163 | " \n", 1164 | " \n", 1165 | " \n", 1166 | " \n", 1167 | " \n", 1168 | " \n", 1169 | " \n", 1170 | " \n", 1171 | " \n", 1172 | " \n", 1173 | " \n", 1174 | " \n", 1175 | " \n", 1176 | " \n", 1177 | " \n", 1178 | " \n", 1179 | " \n", 1180 | " \n", 1181 | " \n", 1182 | " \n", 1183 | " \n", 1184 | " \n", 1185 | " \n", 1186 | " \n", 1187 | " \n", 1188 | " \n", 1189 | " \n", 1190 | " \n", 1191 | " \n", 1192 | " \n", 1193 | " \n", 1194 | " \n", 1195 | " \n", 1196 | " \n", 1197 | " \n", 1198 | " \n", 1199 | " \n", 1200 | " \n", 1201 | " \n", 1202 | " \n", 1203 | " \n", 1204 | " \n", 1205 | " \n", 1206 | " \n", 1207 | " \n", 1208 | " \n", 1209 | " \n", 1210 | " \n", 1211 | " \n", 1212 | " \n", 1213 | " \n", 1214 | " \n", 1215 | " \n", 1216 | " \n", 1217 | " \n", 1218 | " \n", 1219 | " \n", 1220 | " \n", 1221 | " \n", 1222 | " \n", 1223 | " \n", 1224 | " \n", 1225 | " \n", 1226 | " \n", 1227 | " \n", 1228 | " \n", 1229 | " \n", 1230 | " \n", 1231 | " \n", 1232 | "
Q1Q2Q3Q4Q5
id
w040042
w130132
w242231
w300331
w432212
..................
w99532423
w99622421
w99744410
w99811324
w99920242
\n", 1233 | "

1000 rows × 5 columns

\n", 1234 | "
" 1235 | ], 1236 | "text/plain": [ 1237 | " Q1 Q2 Q3 Q4 Q5\n", 1238 | "id \n", 1239 | "w0 4 0 0 4 2\n", 1240 | "w1 3 0 1 3 2\n", 1241 | "w2 4 2 2 3 1\n", 1242 | "w3 0 0 3 3 1\n", 1243 | "w4 3 2 2 1 2\n", 1244 | "... .. .. .. .. ..\n", 1245 | "w995 3 2 4 2 3\n", 1246 | "w996 2 2 4 2 1\n", 1247 | "w997 4 4 4 1 0\n", 1248 | "w998 1 1 3 2 4\n", 1249 | "w999 2 0 2 4 2\n", 1250 | "\n", 1251 | "[1000 rows x 5 columns]" 1252 | ] 1253 | }, 1254 | "metadata": {}, 1255 | "output_type": "display_data" 1256 | } 1257 | ], 1258 | "source": [ 1259 | "display(n_men)\n", 1260 | "display(n_women)" 1261 | ] 1262 | }, 1263 | { 1264 | "cell_type": "code", 1265 | "execution_count": 17, 1266 | "metadata": {}, 1267 | "outputs": [ 1268 | { 1269 | "data": { 1270 | "text/plain": [ 1271 | "id\n", 1272 | "m869 1.000000\n", 1273 | "m935 1.000000\n", 1274 | "m564 1.000000\n", 1275 | "m543 1.000000\n", 1276 | "m470 1.000000\n", 1277 | "m812 0.976803\n", 1278 | "m945 0.963087\n", 1279 | "m405 0.963087\n", 1280 | "m308 0.963087\n", 1281 | "m311 0.963087\n", 1282 | "dtype: float64" 1283 | ] 1284 | }, 1285 | "execution_count": 17, 1286 | "metadata": {}, 1287 | "output_type": "execute_result" 1288 | } 1289 | ], 1290 | "source": [ 1291 | "# Similar men\n", 1292 | "m_sim = n_men.T.corrwith(\n", 1293 | " n_men.T[m_user.name]\n", 1294 | ").sort_values(\n", 1295 | " ascending=False\n", 1296 | ")[1:11]\n", 1297 | "\n", 1298 | "m_sim" 1299 | ] 1300 | }, 1301 | { 1302 | "cell_type": "code", 1303 | "execution_count": 18, 1304 | "metadata": {}, 1305 | "outputs": [ 1306 | { 1307 | "data": { 1308 | "text/plain": [ 1309 | "id\n", 1310 | "w441 1.000000\n", 1311 | "w676 1.000000\n", 1312 | "w169 0.979958\n", 1313 | "w617 0.968822\n", 1314 | "w302 0.966988\n", 1315 | "w788 0.966988\n", 1316 | "w986 0.966988\n", 1317 | "w652 0.966988\n", 1318 | "w431 0.964286\n", 1319 | "w519 0.945611\n", 1320 | "dtype: float64" 1321 | ] 1322 | }, 1323 | "execution_count": 18, 1324 | "metadata": {}, 1325 | "output_type": "execute_result" 1326 | } 1327 | ], 1328 | "source": [ 1329 | "# Simliar women\n", 1330 | "w_sim = n_women.T.corrwith(n_women.T[w_user.name]).sort_values(ascending=False)[1:11]\n", 1331 | "\n", 1332 | "w_sim" 1333 | ] 1334 | }, 1335 | { 1336 | "cell_type": "markdown", 1337 | "metadata": {}, 1338 | "source": [ 1339 | "## The Similar Users' Ratings for the Unseen Users" 1340 | ] 1341 | }, 1342 | { 1343 | "cell_type": "code", 1344 | "execution_count": 19, 1345 | "metadata": {}, 1346 | "outputs": [ 1347 | { 1348 | "data": { 1349 | "text/html": [ 1350 | "
\n", 1351 | "\n", 1364 | "\n", 1365 | " \n", 1366 | " \n", 1367 | " \n", 1368 | " \n", 1369 | " \n", 1370 | " \n", 1371 | " \n", 1372 | " \n", 1373 | " \n", 1374 | " \n", 1375 | " \n", 1376 | " \n", 1377 | " \n", 1378 | " \n", 1379 | " \n", 1380 | " \n", 1381 | " \n", 1382 | " \n", 1383 | " \n", 1384 | " \n", 1385 | " \n", 1386 | " \n", 1387 | " \n", 1388 | " \n", 1389 | " \n", 1390 | " \n", 1391 | " \n", 1392 | " \n", 1393 | " \n", 1394 | " \n", 1395 | " \n", 1396 | " \n", 1397 | " \n", 1398 | " \n", 1399 | " \n", 1400 | " \n", 1401 | " \n", 1402 | " \n", 1403 | " \n", 1404 | " \n", 1405 | " \n", 1406 | " \n", 1407 | " \n", 1408 | " \n", 1409 | " \n", 1410 | " \n", 1411 | " \n", 1412 | " \n", 1413 | " \n", 1414 | " \n", 1415 | " \n", 1416 | " \n", 1417 | " \n", 1418 | " \n", 1419 | " \n", 1420 | " \n", 1421 | " \n", 1422 | " \n", 1423 | " \n", 1424 | " \n", 1425 | " \n", 1426 | " \n", 1427 | " \n", 1428 | " \n", 1429 | " \n", 1430 | " \n", 1431 | " \n", 1432 | " \n", 1433 | " \n", 1434 | " \n", 1435 | " \n", 1436 | " \n", 1437 | " \n", 1438 | " \n", 1439 | " \n", 1440 | " \n", 1441 | " \n", 1442 | " \n", 1443 | " \n", 1444 | " \n", 1445 | " \n", 1446 | " \n", 1447 | " \n", 1448 | " \n", 1449 | " \n", 1450 | " \n", 1451 | " \n", 1452 | " \n", 1453 | " \n", 1454 | " \n", 1455 | " \n", 1456 | " \n", 1457 | " \n", 1458 | " \n", 1459 | " \n", 1460 | " \n", 1461 | " \n", 1462 | " \n", 1463 | " \n", 1464 | " \n", 1465 | " \n", 1466 | " \n", 1467 | " \n", 1468 | " \n", 1469 | " \n", 1470 | " \n", 1471 | " \n", 1472 | " \n", 1473 | " \n", 1474 | " \n", 1475 | " \n", 1476 | " \n", 1477 | " \n", 1478 | " \n", 1479 | " \n", 1480 | " \n", 1481 | " \n", 1482 | " \n", 1483 | " \n", 1484 | " \n", 1485 | " \n", 1486 | " \n", 1487 | " \n", 1488 | " \n", 1489 | " \n", 1490 | " \n", 1491 | " \n", 1492 | " \n", 1493 | " \n", 1494 | " \n", 1495 | " \n", 1496 | " \n", 1497 | " \n", 1498 | " \n", 1499 | " \n", 1500 | " \n", 1501 | " \n", 1502 | " \n", 1503 | " \n", 1504 | " \n", 1505 | " \n", 1506 | " \n", 1507 | " \n", 1508 | " \n", 1509 | " \n", 1510 | " \n", 1511 | " \n", 1512 | " \n", 1513 | " \n", 1514 | " \n", 1515 | " \n", 1516 | " \n", 1517 | " \n", 1518 | " \n", 1519 | " \n", 1520 | " \n", 1521 | " \n", 1522 | " \n", 1523 | " \n", 1524 | " \n", 1525 | " \n", 1526 | " \n", 1527 | " \n", 1528 | " \n", 1529 | " \n", 1530 | " \n", 1531 | " \n", 1532 | " \n", 1533 | " \n", 1534 | " \n", 1535 | " \n", 1536 | " \n", 1537 | " \n", 1538 | " \n", 1539 | " \n", 1540 | " \n", 1541 | " \n", 1542 | " \n", 1543 | " \n", 1544 | " \n", 1545 | " \n", 1546 | " \n", 1547 | " \n", 1548 | " \n", 1549 | " \n", 1550 | " \n", 1551 | " \n", 1552 | " \n", 1553 | " \n", 1554 | " \n", 1555 | " \n", 1556 | " \n", 1557 | " \n", 1558 | " \n", 1559 | " \n", 1560 | " \n", 1561 | " \n", 1562 | " \n", 1563 | " \n", 1564 | " \n", 1565 | " \n", 1566 | " \n", 1567 | " \n", 1568 | " \n", 1569 | " \n", 1570 | " \n", 1571 | " \n", 1572 | " \n", 1573 | " \n", 1574 | " \n", 1575 | " \n", 1576 | " \n", 1577 | " \n", 1578 | " \n", 1579 | " \n", 1580 | " \n", 1581 | " \n", 1582 | " \n", 1583 | " \n", 1584 | " \n", 1585 | " \n", 1586 | " \n", 1587 | " \n", 1588 | " \n", 1589 | " \n", 1590 | " \n", 1591 | " \n", 1592 | " \n", 1593 | " \n", 1594 | " \n", 1595 | " \n", 1596 | " \n", 1597 | " \n", 1598 | " \n", 1599 | " \n", 1600 | " \n", 1601 | " \n", 1602 | " \n", 1603 | " \n", 1604 | " \n", 1605 | " \n", 1606 | " \n", 1607 | " \n", 1608 | " \n", 1609 | " \n", 1610 | " \n", 1611 | " \n", 1612 | " \n", 1613 | " \n", 1614 | " \n", 1615 | " \n", 1616 | " \n", 1617 | " \n", 1618 | " \n", 1619 | " \n", 1620 | " \n", 1621 | " \n", 1622 | " \n", 1623 | " \n", 1624 | " \n", 1625 | " \n", 1626 | " \n", 1627 | " \n", 1628 | " \n", 1629 | " \n", 1630 | " \n", 1631 | " \n", 1632 | " \n", 1633 | " \n", 1634 | " \n", 1635 | " \n", 1636 | " \n", 1637 | " \n", 1638 | " \n", 1639 | " \n", 1640 | " \n", 1641 | " \n", 1642 | " \n", 1643 | " \n", 1644 | " \n", 1645 | " \n", 1646 | " \n", 1647 | " \n", 1648 | " \n", 1649 | " \n", 1650 | " \n", 1651 | " \n", 1652 | " \n", 1653 | " \n", 1654 | " \n", 1655 | " \n", 1656 | " \n", 1657 | "
idw2w6w8w9w16w17w18w19w21w24...w976w979w981w985w988w989w991w997w998w999
id
m869111unseenunseen0unseenunseen1unseen...0unseenunseen110000unseen
m93510010unseen110unseen...unseen0unseenunseen1unseenunseen1unseen0
m5641unseen1unseen1unseenunseen0unseen1...0unseen10100unseenunseenunseen
m543unseenunseenunseenunseenunseenunseenunseenunseenunseenunseen...unseenunseenunseenunseenunseenunseenunseenunseenunseenunseen
m4701unseen01unseenunseen1unseen00...0unseen00unseenunseenunseen11unseen
m8120unseenunseen101100unseen...10unseenunseen10unseenunseenunseen1
m9450unseen00101unseen1unseen...1unseen01unseenunseenunseen100
m405unseen00unseen100unseenunseen1...1unseen10unseen00unseen00
m3080unseen0unseen1011unseen1...0unseenunseen0101unseenunseen1
m311010unseen01unseenunseen01...0unseen1111unseen010
\n", 1658 | "

10 rows × 389 columns

\n", 1659 | "
" 1660 | ], 1661 | "text/plain": [ 1662 | "id w2 w6 w8 w9 w16 w17 w18 w19 w21 \\\n", 1663 | "id \n", 1664 | "m869 1 1 1 unseen unseen 0 unseen unseen 1 \n", 1665 | "m935 1 0 0 1 0 unseen 1 1 0 \n", 1666 | "m564 1 unseen 1 unseen 1 unseen unseen 0 unseen \n", 1667 | "m543 unseen unseen unseen unseen unseen unseen unseen unseen unseen \n", 1668 | "m470 1 unseen 0 1 unseen unseen 1 unseen 0 \n", 1669 | "m812 0 unseen unseen 1 0 1 1 0 0 \n", 1670 | "m945 0 unseen 0 0 1 0 1 unseen 1 \n", 1671 | "m405 unseen 0 0 unseen 1 0 0 unseen unseen \n", 1672 | "m308 0 unseen 0 unseen 1 0 1 1 unseen \n", 1673 | "m311 0 1 0 unseen 0 1 unseen unseen 0 \n", 1674 | "\n", 1675 | "id w24 ... w976 w979 w981 w985 w988 w989 w991 \\\n", 1676 | "id ... \n", 1677 | "m869 unseen ... 0 unseen unseen 1 1 0 0 \n", 1678 | "m935 unseen ... unseen 0 unseen unseen 1 unseen unseen \n", 1679 | "m564 1 ... 0 unseen 1 0 1 0 0 \n", 1680 | "m543 unseen ... unseen unseen unseen unseen unseen unseen unseen \n", 1681 | "m470 0 ... 0 unseen 0 0 unseen unseen unseen \n", 1682 | "m812 unseen ... 1 0 unseen unseen 1 0 unseen \n", 1683 | "m945 unseen ... 1 unseen 0 1 unseen unseen unseen \n", 1684 | "m405 1 ... 1 unseen 1 0 unseen 0 0 \n", 1685 | "m308 1 ... 0 unseen unseen 0 1 0 1 \n", 1686 | "m311 1 ... 0 unseen 1 1 1 1 unseen \n", 1687 | "\n", 1688 | "id w997 w998 w999 \n", 1689 | "id \n", 1690 | "m869 0 0 unseen \n", 1691 | "m935 1 unseen 0 \n", 1692 | "m564 unseen unseen unseen \n", 1693 | "m543 unseen unseen unseen \n", 1694 | "m470 1 1 unseen \n", 1695 | "m812 unseen unseen 1 \n", 1696 | "m945 1 0 0 \n", 1697 | "m405 unseen 0 0 \n", 1698 | "m308 unseen unseen 1 \n", 1699 | "m311 0 1 0 \n", 1700 | "\n", 1701 | "[10 rows x 389 columns]" 1702 | ] 1703 | }, 1704 | "execution_count": 19, 1705 | "metadata": {}, 1706 | "output_type": "execute_result" 1707 | } 1708 | ], 1709 | "source": [ 1710 | "# Similar mens' ratings\n", 1711 | "msim_rate = ratings.loc[list(m_sim.index)][m_nrate]\n", 1712 | "\n", 1713 | "msim_rate" 1714 | ] 1715 | }, 1716 | { 1717 | "cell_type": "code", 1718 | "execution_count": 20, 1719 | "metadata": {}, 1720 | "outputs": [ 1721 | { 1722 | "data": { 1723 | "text/html": [ 1724 | "
\n", 1725 | "\n", 1738 | "\n", 1739 | " \n", 1740 | " \n", 1741 | " \n", 1742 | " \n", 1743 | " \n", 1744 | " \n", 1745 | " \n", 1746 | " \n", 1747 | " \n", 1748 | " \n", 1749 | " \n", 1750 | " \n", 1751 | " \n", 1752 | " \n", 1753 | " \n", 1754 | " \n", 1755 | " \n", 1756 | " \n", 1757 | " \n", 1758 | " \n", 1759 | " \n", 1760 | " \n", 1761 | " \n", 1762 | " \n", 1763 | " \n", 1764 | " \n", 1765 | " \n", 1766 | " \n", 1767 | " \n", 1768 | " \n", 1769 | " \n", 1770 | " \n", 1771 | " \n", 1772 | " \n", 1773 | " \n", 1774 | " \n", 1775 | " \n", 1776 | " \n", 1777 | " \n", 1778 | " \n", 1779 | " \n", 1780 | " \n", 1781 | " \n", 1782 | " \n", 1783 | " \n", 1784 | " \n", 1785 | " \n", 1786 | " \n", 1787 | " \n", 1788 | " \n", 1789 | " \n", 1790 | " \n", 1791 | " \n", 1792 | " \n", 1793 | " \n", 1794 | " \n", 1795 | " \n", 1796 | " \n", 1797 | " \n", 1798 | " \n", 1799 | " \n", 1800 | " \n", 1801 | " \n", 1802 | " \n", 1803 | " \n", 1804 | " \n", 1805 | " \n", 1806 | " \n", 1807 | " \n", 1808 | " \n", 1809 | " \n", 1810 | " \n", 1811 | " \n", 1812 | " \n", 1813 | " \n", 1814 | " \n", 1815 | " \n", 1816 | " \n", 1817 | " \n", 1818 | " \n", 1819 | " \n", 1820 | " \n", 1821 | " \n", 1822 | " \n", 1823 | " \n", 1824 | " \n", 1825 | " \n", 1826 | " \n", 1827 | " \n", 1828 | " \n", 1829 | " \n", 1830 | " \n", 1831 | " \n", 1832 | " \n", 1833 | " \n", 1834 | " \n", 1835 | " \n", 1836 | " \n", 1837 | " \n", 1838 | " \n", 1839 | " \n", 1840 | " \n", 1841 | " \n", 1842 | " \n", 1843 | " \n", 1844 | " \n", 1845 | " \n", 1846 | " \n", 1847 | " \n", 1848 | " \n", 1849 | " \n", 1850 | " \n", 1851 | " \n", 1852 | " \n", 1853 | " \n", 1854 | " \n", 1855 | " \n", 1856 | " \n", 1857 | " \n", 1858 | " \n", 1859 | " \n", 1860 | " \n", 1861 | " \n", 1862 | " \n", 1863 | " \n", 1864 | " \n", 1865 | " \n", 1866 | " \n", 1867 | " \n", 1868 | " \n", 1869 | " \n", 1870 | " \n", 1871 | " \n", 1872 | " \n", 1873 | " \n", 1874 | " \n", 1875 | " \n", 1876 | " \n", 1877 | " \n", 1878 | " \n", 1879 | " \n", 1880 | " \n", 1881 | " \n", 1882 | " \n", 1883 | " \n", 1884 | " \n", 1885 | " \n", 1886 | " \n", 1887 | " \n", 1888 | " \n", 1889 | " \n", 1890 | " \n", 1891 | " \n", 1892 | " \n", 1893 | " \n", 1894 | " \n", 1895 | " \n", 1896 | " \n", 1897 | " \n", 1898 | " \n", 1899 | " \n", 1900 | " \n", 1901 | " \n", 1902 | " \n", 1903 | " \n", 1904 | " \n", 1905 | " \n", 1906 | " \n", 1907 | " \n", 1908 | " \n", 1909 | " \n", 1910 | " \n", 1911 | " \n", 1912 | " \n", 1913 | " \n", 1914 | " \n", 1915 | " \n", 1916 | " \n", 1917 | " \n", 1918 | " \n", 1919 | " \n", 1920 | " \n", 1921 | " \n", 1922 | " \n", 1923 | " \n", 1924 | " \n", 1925 | " \n", 1926 | " \n", 1927 | " \n", 1928 | " \n", 1929 | " \n", 1930 | " \n", 1931 | " \n", 1932 | " \n", 1933 | " \n", 1934 | " \n", 1935 | " \n", 1936 | " \n", 1937 | " \n", 1938 | " \n", 1939 | " \n", 1940 | " \n", 1941 | " \n", 1942 | " \n", 1943 | " \n", 1944 | " \n", 1945 | " \n", 1946 | " \n", 1947 | " \n", 1948 | " \n", 1949 | " \n", 1950 | " \n", 1951 | " \n", 1952 | " \n", 1953 | " \n", 1954 | " \n", 1955 | " \n", 1956 | " \n", 1957 | " \n", 1958 | " \n", 1959 | " \n", 1960 | " \n", 1961 | " \n", 1962 | " \n", 1963 | " \n", 1964 | " \n", 1965 | " \n", 1966 | " \n", 1967 | " \n", 1968 | " \n", 1969 | " \n", 1970 | " \n", 1971 | " \n", 1972 | " \n", 1973 | " \n", 1974 | " \n", 1975 | " \n", 1976 | " \n", 1977 | " \n", 1978 | " \n", 1979 | " \n", 1980 | " \n", 1981 | " \n", 1982 | " \n", 1983 | " \n", 1984 | " \n", 1985 | " \n", 1986 | " \n", 1987 | " \n", 1988 | " \n", 1989 | " \n", 1990 | " \n", 1991 | " \n", 1992 | " \n", 1993 | " \n", 1994 | " \n", 1995 | " \n", 1996 | " \n", 1997 | " \n", 1998 | " \n", 1999 | " \n", 2000 | " \n", 2001 | " \n", 2002 | " \n", 2003 | " \n", 2004 | " \n", 2005 | " \n", 2006 | " \n", 2007 | " \n", 2008 | " \n", 2009 | " \n", 2010 | " \n", 2011 | " \n", 2012 | " \n", 2013 | " \n", 2014 | " \n", 2015 | " \n", 2016 | " \n", 2017 | " \n", 2018 | " \n", 2019 | " \n", 2020 | " \n", 2021 | " \n", 2022 | " \n", 2023 | " \n", 2024 | " \n", 2025 | " \n", 2026 | " \n", 2027 | " \n", 2028 | " \n", 2029 | " \n", 2030 | " \n", 2031 | "
idm0m6m10m14m23m24m26m27m29m30...m968m969m970m976m978m979m980m982m986m992
id
w44100100unseenunseenunseenunseenunseen...unseenunseen0unseen1unseen0unseenunseen0
w676unseenunseen00unseenunseen01unseen1...1unseenunseen0110unseen0unseen
w1691011unseen1unseen011...unseen011unseen11011
w61711unseen110unseen011...0unseenunseen00unseenunseen00unseen
w3021unseen1unseenunseenunseen0unseen00...011011unseenunseenunseenunseen
w78811unseenunseenunseenunseen011unseen...11unseenunseen000001
w986unseenunseen1unseen11unseen1unseenunseen...00unseen1111001
w652unseen0unseen00unseen0unseen1unseen...0unseenunseen010100unseen
w431101110unseen0unseen1...unseen00100unseen11unseen
w519unseen11unseenunseen11unseen1unseen...010unseen11unseen100
\n", 2032 | "

10 rows × 381 columns

\n", 2033 | "
" 2034 | ], 2035 | "text/plain": [ 2036 | "id m0 m6 m10 m14 m23 m24 m26 m27 m29 \\\n", 2037 | "id \n", 2038 | "w441 0 0 1 0 0 unseen unseen unseen unseen \n", 2039 | "w676 unseen unseen 0 0 unseen unseen 0 1 unseen \n", 2040 | "w169 1 0 1 1 unseen 1 unseen 0 1 \n", 2041 | "w617 1 1 unseen 1 1 0 unseen 0 1 \n", 2042 | "w302 1 unseen 1 unseen unseen unseen 0 unseen 0 \n", 2043 | "w788 1 1 unseen unseen unseen unseen 0 1 1 \n", 2044 | "w986 unseen unseen 1 unseen 1 1 unseen 1 unseen \n", 2045 | "w652 unseen 0 unseen 0 0 unseen 0 unseen 1 \n", 2046 | "w431 1 0 1 1 1 0 unseen 0 unseen \n", 2047 | "w519 unseen 1 1 unseen unseen 1 1 unseen 1 \n", 2048 | "\n", 2049 | "id m30 ... m968 m969 m970 m976 m978 m979 m980 \\\n", 2050 | "id ... \n", 2051 | "w441 unseen ... unseen unseen 0 unseen 1 unseen 0 \n", 2052 | "w676 1 ... 1 unseen unseen 0 1 1 0 \n", 2053 | "w169 1 ... unseen 0 1 1 unseen 1 1 \n", 2054 | "w617 1 ... 0 unseen unseen 0 0 unseen unseen \n", 2055 | "w302 0 ... 0 1 1 0 1 1 unseen \n", 2056 | "w788 unseen ... 1 1 unseen unseen 0 0 0 \n", 2057 | "w986 unseen ... 0 0 unseen 1 1 1 1 \n", 2058 | "w652 unseen ... 0 unseen unseen 0 1 0 1 \n", 2059 | "w431 1 ... unseen 0 0 1 0 0 unseen \n", 2060 | "w519 unseen ... 0 1 0 unseen 1 1 unseen \n", 2061 | "\n", 2062 | "id m982 m986 m992 \n", 2063 | "id \n", 2064 | "w441 unseen unseen 0 \n", 2065 | "w676 unseen 0 unseen \n", 2066 | "w169 0 1 1 \n", 2067 | "w617 0 0 unseen \n", 2068 | "w302 unseen unseen unseen \n", 2069 | "w788 0 0 1 \n", 2070 | "w986 0 0 1 \n", 2071 | "w652 0 0 unseen \n", 2072 | "w431 1 1 unseen \n", 2073 | "w519 1 0 0 \n", 2074 | "\n", 2075 | "[10 rows x 381 columns]" 2076 | ] 2077 | }, 2078 | "execution_count": 20, 2079 | "metadata": {}, 2080 | "output_type": "execute_result" 2081 | } 2082 | ], 2083 | "source": [ 2084 | "# Similar womens' ratings\n", 2085 | "wsim_rate = ratings[list(w_sim.index)].T[w_nrate]\n", 2086 | "\n", 2087 | "wsim_rate" 2088 | ] 2089 | }, 2090 | { 2091 | "cell_type": "markdown", 2092 | "metadata": {}, 2093 | "source": [ 2094 | "# Comparing Methods of Prediction" 2095 | ] 2096 | }, 2097 | { 2098 | "cell_type": "code", 2099 | "execution_count": 43, 2100 | "metadata": {}, 2101 | "outputs": [ 2102 | { 2103 | "data": { 2104 | "text/html": [ 2105 | "
\n", 2106 | "\n", 2119 | "\n", 2120 | " \n", 2121 | " \n", 2122 | " \n", 2123 | " \n", 2124 | " \n", 2125 | " \n", 2126 | " \n", 2127 | " \n", 2128 | " \n", 2129 | " \n", 2130 | " \n", 2131 | " \n", 2132 | " \n", 2133 | " \n", 2134 | " \n", 2135 | " \n", 2136 | " \n", 2137 | " \n", 2138 | " \n", 2139 | " \n", 2140 | " \n", 2141 | " \n", 2142 | " \n", 2143 | " \n", 2144 | " \n", 2145 | " \n", 2146 | " \n", 2147 | " \n", 2148 | " \n", 2149 | " \n", 2150 | " \n", 2151 | " \n", 2152 | " \n", 2153 | " \n", 2154 | " \n", 2155 | " \n", 2156 | " \n", 2157 | " \n", 2158 | " \n", 2159 | " \n", 2160 | " \n", 2161 | " \n", 2162 | " \n", 2163 | " \n", 2164 | " \n", 2165 | " \n", 2166 | " \n", 2167 | " \n", 2168 | " \n", 2169 | " \n", 2170 | " \n", 2171 | " \n", 2172 | " \n", 2173 | " \n", 2174 | " \n", 2175 | " \n", 2176 | " \n", 2177 | " \n", 2178 | " \n", 2179 | " \n", 2180 | " \n", 2181 | " \n", 2182 | " \n", 2183 | " \n", 2184 | " \n", 2185 | " \n", 2186 | " \n", 2187 | " \n", 2188 | " \n", 2189 | " \n", 2190 | " \n", 2191 | " \n", 2192 | " \n", 2193 | " \n", 2194 | " \n", 2195 | " \n", 2196 | " \n", 2197 | " \n", 2198 | " \n", 2199 | " \n", 2200 | " \n", 2201 | " \n", 2202 | "
avgfreqmedian
id
w20.5000000.00.5
w60.5000000.00.5
w80.2500000.00.0
w90.7500001.01.0
w160.5714291.01.0
............
w9890.1666670.00.0
w9910.2500000.00.0
w9970.6000001.01.0
w9980.4000000.00.0
w9990.3333330.00.0
\n", 2203 | "

389 rows × 3 columns

\n", 2204 | "
" 2205 | ], 2206 | "text/plain": [ 2207 | " avg freq median\n", 2208 | "id \n", 2209 | "w2 0.500000 0.0 0.5\n", 2210 | "w6 0.500000 0.0 0.5\n", 2211 | "w8 0.250000 0.0 0.0\n", 2212 | "w9 0.750000 1.0 1.0\n", 2213 | "w16 0.571429 1.0 1.0\n", 2214 | "... ... ... ...\n", 2215 | "w989 0.166667 0.0 0.0\n", 2216 | "w991 0.250000 0.0 0.0\n", 2217 | "w997 0.600000 1.0 1.0\n", 2218 | "w998 0.400000 0.0 0.0\n", 2219 | "w999 0.333333 0.0 0.0\n", 2220 | "\n", 2221 | "[389 rows x 3 columns]" 2222 | ] 2223 | }, 2224 | "execution_count": 43, 2225 | "metadata": {}, 2226 | "output_type": "execute_result" 2227 | } 2228 | ], 2229 | "source": [ 2230 | "# Man predictions\n", 2231 | "m_predict = pd.DataFrame()\n", 2232 | "\n", 2233 | "# Filling the unseen value with NaNs for calculation purposes\n", 2234 | "msim_rate.replace(\n", 2235 | " \"unseen\", \n", 2236 | " np.nan, \n", 2237 | " inplace=True\n", 2238 | ")\n", 2239 | "\n", 2240 | "# Average\n", 2241 | "m_predict['avg'] = msim_rate.mean()\n", 2242 | "\n", 2243 | "# Frequency\n", 2244 | "m_predict['freq'] = msim_rate.mode().T[0]\n", 2245 | "\n", 2246 | "# Median\n", 2247 | "m_predict['median'] = msim_rate.median()\n", 2248 | "\n", 2249 | "m_predict" 2250 | ] 2251 | }, 2252 | { 2253 | "cell_type": "code", 2254 | "execution_count": 44, 2255 | "metadata": {}, 2256 | "outputs": [ 2257 | { 2258 | "data": { 2259 | "text/html": [ 2260 | "
\n", 2261 | "\n", 2274 | "\n", 2275 | " \n", 2276 | " \n", 2277 | " \n", 2278 | " \n", 2279 | " \n", 2280 | " \n", 2281 | " \n", 2282 | " \n", 2283 | " \n", 2284 | " \n", 2285 | " \n", 2286 | " \n", 2287 | " \n", 2288 | " \n", 2289 | " \n", 2290 | " \n", 2291 | " \n", 2292 | " \n", 2293 | " \n", 2294 | " \n", 2295 | " \n", 2296 | " \n", 2297 | " \n", 2298 | " \n", 2299 | " \n", 2300 | " \n", 2301 | " \n", 2302 | " \n", 2303 | " \n", 2304 | " \n", 2305 | " \n", 2306 | " \n", 2307 | " \n", 2308 | " \n", 2309 | " \n", 2310 | " \n", 2311 | " \n", 2312 | " \n", 2313 | " \n", 2314 | " \n", 2315 | " \n", 2316 | " \n", 2317 | " \n", 2318 | " \n", 2319 | " \n", 2320 | " \n", 2321 | " \n", 2322 | " \n", 2323 | " \n", 2324 | " \n", 2325 | " \n", 2326 | " \n", 2327 | " \n", 2328 | " \n", 2329 | " \n", 2330 | " \n", 2331 | " \n", 2332 | " \n", 2333 | " \n", 2334 | " \n", 2335 | " \n", 2336 | " \n", 2337 | " \n", 2338 | " \n", 2339 | " \n", 2340 | " \n", 2341 | " \n", 2342 | " \n", 2343 | " \n", 2344 | " \n", 2345 | " \n", 2346 | " \n", 2347 | " \n", 2348 | " \n", 2349 | " \n", 2350 | " \n", 2351 | " \n", 2352 | " \n", 2353 | " \n", 2354 | " \n", 2355 | " \n", 2356 | " \n", 2357 | "
avgfreqmedian
id
m00.8333331.01.0
m60.4285710.00.0
m100.8571431.01.0
m140.5000000.00.5
m230.6000001.01.0
............
m9790.6250001.01.0
m9800.5000000.00.5
m9820.2857140.00.0
m9860.2500000.00.0
m9920.6000001.01.0
\n", 2358 | "

381 rows × 3 columns

\n", 2359 | "
" 2360 | ], 2361 | "text/plain": [ 2362 | " avg freq median\n", 2363 | "id \n", 2364 | "m0 0.833333 1.0 1.0\n", 2365 | "m6 0.428571 0.0 0.0\n", 2366 | "m10 0.857143 1.0 1.0\n", 2367 | "m14 0.500000 0.0 0.5\n", 2368 | "m23 0.600000 1.0 1.0\n", 2369 | "... ... ... ...\n", 2370 | "m979 0.625000 1.0 1.0\n", 2371 | "m980 0.500000 0.0 0.5\n", 2372 | "m982 0.285714 0.0 0.0\n", 2373 | "m986 0.250000 0.0 0.0\n", 2374 | "m992 0.600000 1.0 1.0\n", 2375 | "\n", 2376 | "[381 rows x 3 columns]" 2377 | ] 2378 | }, 2379 | "execution_count": 44, 2380 | "metadata": {}, 2381 | "output_type": "execute_result" 2382 | } 2383 | ], 2384 | "source": [ 2385 | "# Woman predictions\n", 2386 | "w_predict = pd.DataFrame()\n", 2387 | "\n", 2388 | "# Filling the unseen value with NaNs for calculation purposes\n", 2389 | "wsim_rate.replace(\"unseen\", np.nan, inplace=True)\n", 2390 | "\n", 2391 | "# Average\n", 2392 | "w_predict['avg'] = wsim_rate.mean()\n", 2393 | "\n", 2394 | "# Frequency\n", 2395 | "w_predict['freq'] = wsim_rate.mode().T[0]\n", 2396 | "\n", 2397 | "# Median\n", 2398 | "w_predict['median'] = wsim_rate.median()\n", 2399 | "\n", 2400 | "w_predict" 2401 | ] 2402 | }, 2403 | { 2404 | "cell_type": "markdown", 2405 | "metadata": {}, 2406 | "source": [ 2407 | "# Handling a New User" 2408 | ] 2409 | }, 2410 | { 2411 | "cell_type": "markdown", 2412 | "metadata": {}, 2413 | "source": [ 2414 | "## 1. Onboarding a New User\n", 2415 | "New user will answer questions to determine other profiles most similar to them." 2416 | ] 2417 | }, 2418 | { 2419 | "cell_type": "code", 2420 | "execution_count": 78, 2421 | "metadata": {}, 2422 | "outputs": [ 2423 | { 2424 | "data": { 2425 | "text/html": [ 2426 | "
\n", 2427 | "\n", 2440 | "\n", 2441 | " \n", 2442 | " \n", 2443 | " \n", 2444 | " \n", 2445 | " \n", 2446 | " \n", 2447 | " \n", 2448 | " \n", 2449 | " \n", 2450 | " \n", 2451 | " \n", 2452 | " \n", 2453 | " \n", 2454 | " \n", 2455 | " \n", 2456 | " \n", 2457 | " \n", 2458 | " \n", 2459 | " \n", 2460 | " \n", 2461 | "
Q1Q2Q3Q4Q5
m1000BAADE
\n", 2462 | "
" 2463 | ], 2464 | "text/plain": [ 2465 | " Q1 Q2 Q3 Q4 Q5\n", 2466 | "m1000 B A A D E" 2467 | ] 2468 | }, 2469 | "execution_count": 78, 2470 | "metadata": {}, 2471 | "output_type": "execute_result" 2472 | } 2473 | ], 2474 | "source": [ 2475 | "# Dataframe of new user\n", 2476 | "m_new_user = pd.DataFrame(\n", 2477 | " [random.choices(ans, k=5)],\n", 2478 | " columns=men.columns,\n", 2479 | " index=['m'+str(int(men.index[-1][1:])+1)] # New ID for the new user\n", 2480 | ")\n", 2481 | "\n", 2482 | "# Categorizing the answers\n", 2483 | "m_new_user = m_new_user.apply(lambda x: pd.Categorical(x, categories=ans))\n", 2484 | "\n", 2485 | "# The New User and their answers\n", 2486 | "m_new_user" 2487 | ] 2488 | }, 2489 | { 2490 | "cell_type": "markdown", 2491 | "metadata": {}, 2492 | "source": [ 2493 | "## 2. Finding Similar Users\n", 2494 | "These similar users' compatibility ratings will be used to find better recommendations for the new user." 2495 | ] 2496 | }, 2497 | { 2498 | "cell_type": "code", 2499 | "execution_count": 79, 2500 | "metadata": {}, 2501 | "outputs": [ 2502 | { 2503 | "data": { 2504 | "text/html": [ 2505 | "
\n", 2506 | "\n", 2519 | "\n", 2520 | " \n", 2521 | " \n", 2522 | " \n", 2523 | " \n", 2524 | " \n", 2525 | " \n", 2526 | " \n", 2527 | " \n", 2528 | " \n", 2529 | " \n", 2530 | " \n", 2531 | " \n", 2532 | " \n", 2533 | " \n", 2534 | " \n", 2535 | " \n", 2536 | " \n", 2537 | " \n", 2538 | " \n", 2539 | " \n", 2540 | "
Q1Q2Q3Q4Q5
m100010034
\n", 2541 | "
" 2542 | ], 2543 | "text/plain": [ 2544 | " Q1 Q2 Q3 Q4 Q5\n", 2545 | "m1000 1 0 0 3 4" 2546 | ] 2547 | }, 2548 | "execution_count": 79, 2549 | "metadata": {}, 2550 | "output_type": "execute_result" 2551 | } 2552 | ], 2553 | "source": [ 2554 | "# Categorizing the new user's answers to fit with the rest of the users\n", 2555 | "m_new_user = m_new_user.apply(lambda x: x.cat.codes, axis=1)\n", 2556 | "\n", 2557 | "m_new_user" 2558 | ] 2559 | }, 2560 | { 2561 | "cell_type": "code", 2562 | "execution_count": 80, 2563 | "metadata": {}, 2564 | "outputs": [ 2565 | { 2566 | "data": { 2567 | "text/plain": [ 2568 | "id\n", 2569 | "m401 0.974250\n", 2570 | "m8 0.973124\n", 2571 | "m695 0.963343\n", 2572 | "m523 0.963343\n", 2573 | "m945 0.963343\n", 2574 | "m768 0.956296\n", 2575 | "m380 0.954786\n", 2576 | "m325 0.953959\n", 2577 | "m232 0.943701\n", 2578 | "m508 0.941469\n", 2579 | "dtype: float64" 2580 | ] 2581 | }, 2582 | "execution_count": 80, 2583 | "metadata": {}, 2584 | "output_type": "execute_result" 2585 | } 2586 | ], 2587 | "source": [ 2588 | "# First need to replace the answers with their numerical values\n", 2589 | "n_men = men.apply(lambda x: x.cat.codes)\n", 2590 | "\n", 2591 | "# Getting the correlation score and sorting by most correlated\n", 2592 | "new_sim = n_men.corrwith(m_new_user.iloc[0], axis=1).sort_values(ascending=False)[:10]\n", 2593 | "\n", 2594 | "# The most similar users to the new user\n", 2595 | "new_sim" 2596 | ] 2597 | }, 2598 | { 2599 | "cell_type": "markdown", 2600 | "metadata": {}, 2601 | "source": [ 2602 | "## 3. Getting the Similar Users' Aggregated Ratings" 2603 | ] 2604 | }, 2605 | { 2606 | "cell_type": "code", 2607 | "execution_count": 81, 2608 | "metadata": {}, 2609 | "outputs": [ 2610 | { 2611 | "data": { 2612 | "text/plain": [ 2613 | "id\n", 2614 | "w685 1.0\n", 2615 | "w605 1.0\n", 2616 | "w75 1.0\n", 2617 | "w34 1.0\n", 2618 | "w189 1.0\n", 2619 | " ... \n", 2620 | "w817 0.0\n", 2621 | "w691 0.0\n", 2622 | "w979 0.0\n", 2623 | "w211 0.0\n", 2624 | "w254 0.0\n", 2625 | "Length: 389, dtype: float64" 2626 | ] 2627 | }, 2628 | "execution_count": 81, 2629 | "metadata": {}, 2630 | "output_type": "execute_result" 2631 | } 2632 | ], 2633 | "source": [ 2634 | "# Getting the similar users' ratings\n", 2635 | "new_sim_rate = ratings.T[new_sim.index]\n", 2636 | "\n", 2637 | "# Filling in unseen values with nan for calculation purposes\n", 2638 | "new_sim_rate.replace(\"unseen\", np.nan, inplace=True)\n", 2639 | "\n", 2640 | "# Finding top recommended based on the median of the similar users' rating\n", 2641 | "msim_rate.mean().sort_values(ascending=False)" 2642 | ] 2643 | }, 2644 | { 2645 | "cell_type": "markdown", 2646 | "metadata": {}, 2647 | "source": [ 2648 | "__These are the top recommended users that may be the most compatible with the new user__" 2649 | ] 2650 | }, 2651 | { 2652 | "cell_type": "markdown", 2653 | "metadata": {}, 2654 | "source": [ 2655 | "# Helper Functions\n", 2656 | "These functions will consolidate the process above." 2657 | ] 2658 | }, 2659 | { 2660 | "cell_type": "code", 2661 | "execution_count": 105, 2662 | "metadata": {}, 2663 | "outputs": [], 2664 | "source": [ 2665 | "def matchMan(men_df, women_df, ratings, new_man_answers, num_sim=10):\n", 2666 | " \"\"\"\n", 2667 | " This function will return the most likely compatible women based on a few given\n", 2668 | " dataframes for a new male user. Will use the top N similar users' compatibility \n", 2669 | " ratings to find the potentially most compatible women.\n", 2670 | " \"\"\"\n", 2671 | " \n", 2672 | " # First need to replace the DF answers with their numerical values\n", 2673 | " men_df = men_df.apply(lambda x: x.cat.codes)\n", 2674 | "\n", 2675 | " women_df = women_df.apply(lambda x: x.cat.codes)\n", 2676 | " \n", 2677 | " # Dataframe of new user\n", 2678 | " new_man = pd.DataFrame(\n", 2679 | " [new_man_answers],\n", 2680 | " columns=men_df.columns,\n", 2681 | " index=['m'+str(int(men_df.index[-1][1:])+1)] # Getting the new man's id \n", 2682 | " )\n", 2683 | " \n", 2684 | " # Categorical answers to the profile questions\n", 2685 | " ans = ['A', 'B', 'C', 'D', 'E']\n", 2686 | " \n", 2687 | " # Categorizing the answers\n", 2688 | " new_man = new_man.apply(\n", 2689 | " lambda x: pd.Categorical(x, categories=ans)\n", 2690 | " ).apply(\n", 2691 | " lambda x: x.cat.codes, axis=1\n", 2692 | " )\n", 2693 | " \n", 2694 | " # Getting the top N similar users\n", 2695 | " sim_men = men_df.corrwith(\n", 2696 | " new_man.iloc[0], \n", 2697 | " axis=1\n", 2698 | " ).sort_values(ascending=False)[:num_sim].index\n", 2699 | " \n", 2700 | " # Getting the similar users' ratings\n", 2701 | " sim_rate = ratings.T[sim_men]\n", 2702 | " \n", 2703 | " # Filling in unseen values with nan for calculation purposes\n", 2704 | " sim_rate.replace(\"unseen\", np.nan, inplace=True)\n", 2705 | " \n", 2706 | " # The potentially most compatible women for the new man\n", 2707 | " most_comp = sim_rate.mean(axis=1).sort_values(ascending=False)\n", 2708 | " \n", 2709 | " return most_comp" 2710 | ] 2711 | }, 2712 | { 2713 | "cell_type": "code", 2714 | "execution_count": 127, 2715 | "metadata": {}, 2716 | "outputs": [ 2717 | { 2718 | "name": "stdout", 2719 | "output_type": "stream", 2720 | "text": [ 2721 | "['E', 'C', 'D', 'A', 'E']\n" 2722 | ] 2723 | } 2724 | ], 2725 | "source": [ 2726 | "# New man's answers\n", 2727 | "new_man_answers = random.choices(ans, k=5)\n", 2728 | "\n", 2729 | "print(new_man_answers)\n", 2730 | "\n", 2731 | "recs = matchMan(\n", 2732 | " men, \n", 2733 | " women, \n", 2734 | " ratings, \n", 2735 | " new_man_answers, \n", 2736 | " num_sim=10\n", 2737 | ")" 2738 | ] 2739 | }, 2740 | { 2741 | "cell_type": "code", 2742 | "execution_count": 130, 2743 | "metadata": {}, 2744 | "outputs": [ 2745 | { 2746 | "data": { 2747 | "text/plain": [ 2748 | "id\n", 2749 | "w468 1.000000\n", 2750 | "w533 1.000000\n", 2751 | "w320 1.000000\n", 2752 | "w230 1.000000\n", 2753 | "w699 1.000000\n", 2754 | "w770 1.000000\n", 2755 | "w688 1.000000\n", 2756 | "w178 1.000000\n", 2757 | "w623 1.000000\n", 2758 | "w281 1.000000\n", 2759 | "w621 1.000000\n", 2760 | "w964 1.000000\n", 2761 | "w62 1.000000\n", 2762 | "w64 1.000000\n", 2763 | "w622 1.000000\n", 2764 | "w110 0.888889\n", 2765 | "w941 0.888889\n", 2766 | "w519 0.875000\n", 2767 | "w920 0.875000\n", 2768 | "w313 0.875000\n", 2769 | "dtype: float64" 2770 | ] 2771 | }, 2772 | "execution_count": 130, 2773 | "metadata": {}, 2774 | "output_type": "execute_result" 2775 | } 2776 | ], 2777 | "source": [ 2778 | "recs[:20]" 2779 | ] 2780 | }, 2781 | { 2782 | "cell_type": "code", 2783 | "execution_count": 107, 2784 | "metadata": {}, 2785 | "outputs": [], 2786 | "source": [ 2787 | "def matchWoman(men_df, women_df, ratings, new_woman_answers, num_sim=10):\n", 2788 | " \"\"\"\n", 2789 | " This function will return the most likely compatible men based on a few given\n", 2790 | " dataframes for a new female user. Will use the top N similar users' compatibility \n", 2791 | " ratings to find the potentially most compatible men.\n", 2792 | " \"\"\"\n", 2793 | " # First need to replace the DF answers with their numerical values\n", 2794 | " men_df = men_df.apply(lambda x: x.cat.codes)\n", 2795 | "\n", 2796 | " women_df = women_df.apply(lambda x: x.cat.codes)\n", 2797 | " \n", 2798 | " # Dataframe of new user\n", 2799 | " new_woman = pd.DataFrame(\n", 2800 | " [new_woman_answers],\n", 2801 | " columns=women_df.columns,\n", 2802 | " index=['m'+str(int(women_df.index[-1][1:])+1)] # Getting the new woman's id \n", 2803 | " )\n", 2804 | " \n", 2805 | " # Categorical answers to the profile questions\n", 2806 | " ans = ['A', 'B', 'C', 'D', 'E']\n", 2807 | " \n", 2808 | " # Categorizing the answers\n", 2809 | " new_woman = new_woman.apply(\n", 2810 | " lambda x: pd.Categorical(x, categories=ans)\n", 2811 | " ).apply(\n", 2812 | " lambda x: x.cat.codes, axis=1\n", 2813 | " )\n", 2814 | " \n", 2815 | " # Getting the top N similar users\n", 2816 | " sim_women = women_df.corrwith(\n", 2817 | " new_woman.iloc[0], \n", 2818 | " axis=1\n", 2819 | " ).sort_values(ascending=False)[:num_sim].index\n", 2820 | " \n", 2821 | " # Getting the similar users' ratings\n", 2822 | " sim_rate = ratings[sim_women]\n", 2823 | " \n", 2824 | " # Filling in unseen values with nan for calculation purposes\n", 2825 | " sim_rate.replace(\"unseen\", np.nan, inplace=True)\n", 2826 | " \n", 2827 | " # The potentially most compatible men for the new woman\n", 2828 | " most_comp = sim_rate.mean(axis=1).sort_values(ascending=False)\n", 2829 | " \n", 2830 | " return most_comp" 2831 | ] 2832 | }, 2833 | { 2834 | "cell_type": "code", 2835 | "execution_count": 110, 2836 | "metadata": {}, 2837 | "outputs": [ 2838 | { 2839 | "data": { 2840 | "text/plain": [ 2841 | "id\n", 2842 | "m625 1.0\n", 2843 | "m727 1.0\n", 2844 | "m809 1.0\n", 2845 | "m124 1.0\n", 2846 | "m652 1.0\n", 2847 | " ... \n", 2848 | "m970 0.0\n", 2849 | "m480 0.0\n", 2850 | "m296 0.0\n", 2851 | "m299 0.0\n", 2852 | "m729 0.0\n", 2853 | "Length: 1000, dtype: float64" 2854 | ] 2855 | }, 2856 | "execution_count": 110, 2857 | "metadata": {}, 2858 | "output_type": "execute_result" 2859 | } 2860 | ], 2861 | "source": [ 2862 | "# New woman's answers\n", 2863 | "new_woman_answers = random.choices(ans, k=5)\n", 2864 | "\n", 2865 | "matchWoman(\n", 2866 | " men, \n", 2867 | " women, \n", 2868 | " ratings, \n", 2869 | " new_woman_answers, \n", 2870 | " num_sim=10)" 2871 | ] 2872 | }, 2873 | { 2874 | "cell_type": "markdown", 2875 | "metadata": {}, 2876 | "source": [ 2877 | "# Predicting Compatibility Rating \n", 2878 | "Between Two Users (man and woman)" 2879 | ] 2880 | }, 2881 | { 2882 | "cell_type": "code", 2883 | "execution_count": 111, 2884 | "metadata": {}, 2885 | "outputs": [], 2886 | "source": [ 2887 | "def predictComp(m, w, men_df=men, women_df=women, ratings=ratings, num_sim=10):\n", 2888 | " \"\"\"\n", 2889 | " Compares two existing users with one another and returns\n", 2890 | " their compatibility score or at least one existing user with\n", 2891 | " a new set of answers to also return a compatibility score. \n", 2892 | " Defaults to the already established DFs.\n", 2893 | " \"\"\"\n", 2894 | " \n", 2895 | " try:\n", 2896 | " answers = list(men_df.loc[m].values)\n", 2897 | " \n", 2898 | " comp_score = matchMan(\n", 2899 | " men_df, \n", 2900 | " women_df, \n", 2901 | " ratings, \n", 2902 | " answers, \n", 2903 | " num_sim=10\n", 2904 | " )[w]\n", 2905 | " \n", 2906 | " return comp_score\n", 2907 | " \n", 2908 | " except:\n", 2909 | " answers = list(women_df.loc[w].values)\n", 2910 | " \n", 2911 | " comp_score = matchWoman(\n", 2912 | " men_df, \n", 2913 | " women_df, \n", 2914 | " ratings, \n", 2915 | " answers, \n", 2916 | " num_sim=10\n", 2917 | " )[m]\n", 2918 | " \n", 2919 | " return comp_score\n", 2920 | "\n", 2921 | " finally:\n", 2922 | " if type(m)==list:\n", 2923 | " \n", 2924 | " comp_score = matchMan(\n", 2925 | " men_df, \n", 2926 | " women_df, \n", 2927 | " ratings, \n", 2928 | " m, \n", 2929 | " num_sim=10\n", 2930 | " )[w]\n", 2931 | " \n", 2932 | " return comp_score\n", 2933 | " \n", 2934 | " elif type(w)==list:\n", 2935 | " \n", 2936 | " comp_score = matchWoman(\n", 2937 | " men_df, \n", 2938 | " women_df, \n", 2939 | " ratings, \n", 2940 | " answers, \n", 2941 | " num_sim=10\n", 2942 | " )[m]\n", 2943 | "\n", 2944 | " return comp_score" 2945 | ] 2946 | }, 2947 | { 2948 | "cell_type": "code", 2949 | "execution_count": 112, 2950 | "metadata": {}, 2951 | "outputs": [ 2952 | { 2953 | "name": "stdout", 2954 | "output_type": "stream", 2955 | "text": [ 2956 | "Two existing: 0.3333333333333333\n", 2957 | "New female user: 0.42857142857142855\n", 2958 | "New male user: 0.16666666666666666\n" 2959 | ] 2960 | } 2961 | ], 2962 | "source": [ 2963 | "# Example with two existing users\n", 2964 | "print(\"Two existing:\", predictComp('m4', 'w13'))\n", 2965 | "\n", 2966 | "\n", 2967 | "# Answers to profile questions\n", 2968 | "ans = ['A', 'B', 'C', 'D', 'E']\n", 2969 | "\n", 2970 | "# New user answers (man or woman)\n", 2971 | "new_user_ans = random.choices(ans, k=5)\n", 2972 | "\n", 2973 | "# Example with an already existing male user\n", 2974 | "print(\"New female user:\", predictComp('m20', new_user_ans))\n", 2975 | "\n", 2976 | "# Example with an already existing female user\n", 2977 | "print(\"New male user:\", predictComp(new_user_ans, 'w333'))" 2978 | ] 2979 | }, 2980 | { 2981 | "cell_type": "markdown", 2982 | "metadata": {}, 2983 | "source": [ 2984 | "# Comparing Predictions with Actual Values" 2985 | ] 2986 | }, 2987 | { 2988 | "cell_type": "markdown", 2989 | "metadata": {}, 2990 | "source": [ 2991 | "## 1. Find a Woman User\n", 2992 | "With the least amount of unseen" 2993 | ] 2994 | }, 2995 | { 2996 | "cell_type": "code", 2997 | "execution_count": 114, 2998 | "metadata": {}, 2999 | "outputs": [ 3000 | { 3001 | "data": { 3002 | "text/plain": [ 3003 | "id\n", 3004 | "m0 NaN\n", 3005 | "m1 1.0\n", 3006 | "m2 1.0\n", 3007 | "m3 NaN\n", 3008 | "m4 0.0\n", 3009 | " ... \n", 3010 | "m995 NaN\n", 3011 | "m996 1.0\n", 3012 | "m997 1.0\n", 3013 | "m998 1.0\n", 3014 | "m999 0.0\n", 3015 | "Name: w8, Length: 1000, dtype: float64" 3016 | ] 3017 | }, 3018 | "execution_count": 114, 3019 | "metadata": {}, 3020 | "output_type": "execute_result" 3021 | } 3022 | ], 3023 | "source": [ 3024 | "# Finding the right user\n", 3025 | "user = ratings.apply(pd.Series.value_counts).T.sort_values(by=\"unseen\", ascending=False).iloc[-1].name\n", 3026 | "\n", 3027 | "# Getting their ratings and filling in unseen with Nans\n", 3028 | "user_ratings = ratings[user].replace(\"unseen\", np.nan)\n", 3029 | "\n", 3030 | "user_ratings" 3031 | ] 3032 | }, 3033 | { 3034 | "cell_type": "markdown", 3035 | "metadata": {}, 3036 | "source": [ 3037 | "# 2. Getting Predictions\n", 3038 | "For this user" 3039 | ] 3040 | }, 3041 | { 3042 | "cell_type": "code", 3043 | "execution_count": 115, 3044 | "metadata": {}, 3045 | "outputs": [ 3046 | { 3047 | "data": { 3048 | "text/plain": [ 3049 | "id\n", 3050 | "m730 1.0\n", 3051 | "m35 1.0\n", 3052 | "m881 1.0\n", 3053 | "m935 1.0\n", 3054 | "m725 1.0\n", 3055 | " ... \n", 3056 | "m904 0.0\n", 3057 | "m326 0.0\n", 3058 | "m418 0.0\n", 3059 | "m610 0.0\n", 3060 | "m351 0.0\n", 3061 | "Length: 1000, dtype: float64" 3062 | ] 3063 | }, 3064 | "execution_count": 115, 3065 | "metadata": {}, 3066 | "output_type": "execute_result" 3067 | } 3068 | ], 3069 | "source": [ 3070 | "# User's answers\n", 3071 | "user_ans = list(women.loc[user].values)\n", 3072 | "\n", 3073 | "preds = matchWoman(\n", 3074 | " men, \n", 3075 | " women, \n", 3076 | " ratings, \n", 3077 | " user_ans, \n", 3078 | " num_sim=10\n", 3079 | ")\n", 3080 | "\n", 3081 | "preds" 3082 | ] 3083 | }, 3084 | { 3085 | "cell_type": "markdown", 3086 | "metadata": {}, 3087 | "source": [ 3088 | "# 3. Comparing Predictions with Actual Values" 3089 | ] 3090 | }, 3091 | { 3092 | "cell_type": "code", 3093 | "execution_count": 118, 3094 | "metadata": {}, 3095 | "outputs": [ 3096 | { 3097 | "data": { 3098 | "text/html": [ 3099 | "
\n", 3100 | "\n", 3113 | "\n", 3114 | " \n", 3115 | " \n", 3116 | " \n", 3117 | " \n", 3118 | " \n", 3119 | " \n", 3120 | " \n", 3121 | " \n", 3122 | " \n", 3123 | " \n", 3124 | " \n", 3125 | " \n", 3126 | " \n", 3127 | " \n", 3128 | " \n", 3129 | " \n", 3130 | " \n", 3131 | " \n", 3132 | " \n", 3133 | " \n", 3134 | " \n", 3135 | " \n", 3136 | " \n", 3137 | " \n", 3138 | " \n", 3139 | " \n", 3140 | " \n", 3141 | " \n", 3142 | " \n", 3143 | " \n", 3144 | " \n", 3145 | " \n", 3146 | " \n", 3147 | " \n", 3148 | " \n", 3149 | " \n", 3150 | " \n", 3151 | " \n", 3152 | " \n", 3153 | " \n", 3154 | " \n", 3155 | " \n", 3156 | " \n", 3157 | " \n", 3158 | " \n", 3159 | " \n", 3160 | " \n", 3161 | " \n", 3162 | " \n", 3163 | " \n", 3164 | " \n", 3165 | " \n", 3166 | " \n", 3167 | " \n", 3168 | " \n", 3169 | " \n", 3170 | " \n", 3171 | " \n", 3172 | " \n", 3173 | " \n", 3174 | " \n", 3175 | " \n", 3176 | " \n", 3177 | " \n", 3178 | " \n", 3179 | " \n", 3180 | " \n", 3181 | " \n", 3182 | " \n", 3183 | "
actualpreds
id
m11.00.400000
m21.00.500000
m40.00.375000
m51.00.444444
m60.00.500000
.........
m9941.00.500000
m9961.00.600000
m9971.00.600000
m9981.00.714286
m9990.00.500000
\n", 3184 | "

710 rows × 2 columns

\n", 3185 | "
" 3186 | ], 3187 | "text/plain": [ 3188 | " actual preds\n", 3189 | "id \n", 3190 | "m1 1.0 0.400000\n", 3191 | "m2 1.0 0.500000\n", 3192 | "m4 0.0 0.375000\n", 3193 | "m5 1.0 0.444444\n", 3194 | "m6 0.0 0.500000\n", 3195 | "... ... ...\n", 3196 | "m994 1.0 0.500000\n", 3197 | "m996 1.0 0.600000\n", 3198 | "m997 1.0 0.600000\n", 3199 | "m998 1.0 0.714286\n", 3200 | "m999 0.0 0.500000\n", 3201 | "\n", 3202 | "[710 rows x 2 columns]" 3203 | ] 3204 | }, 3205 | "execution_count": 118, 3206 | "metadata": {}, 3207 | "output_type": "execute_result" 3208 | } 3209 | ], 3210 | "source": [ 3211 | "# Combining both\n", 3212 | "comb = pd.concat([user_ratings, preds], axis=1).rename(columns={\"w8\":\"actual\",\n", 3213 | " 0:\"preds\"})\n", 3214 | "\n", 3215 | "# Dropping Nans\n", 3216 | "comb.dropna(inplace=True)\n", 3217 | "\n", 3218 | "comb" 3219 | ] 3220 | }, 3221 | { 3222 | "cell_type": "markdown", 3223 | "metadata": {}, 3224 | "source": [ 3225 | "## Relabeling the Predictions\n", 3226 | "Rounding the predicted values" 3227 | ] 3228 | }, 3229 | { 3230 | "cell_type": "code", 3231 | "execution_count": 122, 3232 | "metadata": {}, 3233 | "outputs": [], 3234 | "source": [ 3235 | "comb['preds'] = comb['preds'].apply(round)" 3236 | ] 3237 | }, 3238 | { 3239 | "cell_type": "code", 3240 | "execution_count": 123, 3241 | "metadata": {}, 3242 | "outputs": [ 3243 | { 3244 | "data": { 3245 | "text/html": [ 3246 | "
\n", 3247 | "\n", 3260 | "\n", 3261 | " \n", 3262 | " \n", 3263 | " \n", 3264 | " \n", 3265 | " \n", 3266 | " \n", 3267 | " \n", 3268 | " \n", 3269 | " \n", 3270 | " \n", 3271 | " \n", 3272 | " \n", 3273 | " \n", 3274 | " \n", 3275 | " \n", 3276 | " \n", 3277 | " \n", 3278 | " \n", 3279 | " \n", 3280 | " \n", 3281 | " \n", 3282 | " \n", 3283 | " \n", 3284 | " \n", 3285 | " \n", 3286 | " \n", 3287 | " \n", 3288 | " \n", 3289 | " \n", 3290 | " \n", 3291 | " \n", 3292 | " \n", 3293 | " \n", 3294 | " \n", 3295 | " \n", 3296 | " \n", 3297 | " \n", 3298 | " \n", 3299 | " \n", 3300 | " \n", 3301 | " \n", 3302 | " \n", 3303 | " \n", 3304 | " \n", 3305 | " \n", 3306 | " \n", 3307 | " \n", 3308 | " \n", 3309 | " \n", 3310 | " \n", 3311 | " \n", 3312 | " \n", 3313 | " \n", 3314 | " \n", 3315 | " \n", 3316 | " \n", 3317 | " \n", 3318 | " \n", 3319 | " \n", 3320 | " \n", 3321 | " \n", 3322 | " \n", 3323 | " \n", 3324 | " \n", 3325 | " \n", 3326 | " \n", 3327 | " \n", 3328 | " \n", 3329 | " \n", 3330 | "
actualpreds
id
m11.00
m21.00
m40.00
m51.00
m60.00
.........
m9941.00
m9961.01
m9971.01
m9981.01
m9990.00
\n", 3331 | "

710 rows × 2 columns

\n", 3332 | "
" 3333 | ], 3334 | "text/plain": [ 3335 | " actual preds\n", 3336 | "id \n", 3337 | "m1 1.0 0\n", 3338 | "m2 1.0 0\n", 3339 | "m4 0.0 0\n", 3340 | "m5 1.0 0\n", 3341 | "m6 0.0 0\n", 3342 | "... ... ...\n", 3343 | "m994 1.0 0\n", 3344 | "m996 1.0 1\n", 3345 | "m997 1.0 1\n", 3346 | "m998 1.0 1\n", 3347 | "m999 0.0 0\n", 3348 | "\n", 3349 | "[710 rows x 2 columns]" 3350 | ] 3351 | }, 3352 | "execution_count": 123, 3353 | "metadata": {}, 3354 | "output_type": "execute_result" 3355 | } 3356 | ], 3357 | "source": [ 3358 | "comb" 3359 | ] 3360 | }, 3361 | { 3362 | "cell_type": "markdown", 3363 | "metadata": {}, 3364 | "source": [ 3365 | "## Evaluation Metrics" 3366 | ] 3367 | }, 3368 | { 3369 | "cell_type": "code", 3370 | "execution_count": 126, 3371 | "metadata": {}, 3372 | "outputs": [ 3373 | { 3374 | "name": "stdout", 3375 | "output_type": "stream", 3376 | "text": [ 3377 | "F1 Score: 0.5629139072847682\n", 3378 | "Accuracy Score: 0.6281690140845071\n" 3379 | ] 3380 | } 3381 | ], 3382 | "source": [ 3383 | "from sklearn.metrics import accuracy_score, f1_score\n", 3384 | "\n", 3385 | "acc = accuracy_score(comb['actual'], comb['preds'])\n", 3386 | "\n", 3387 | "f1 = f1_score(comb['actual'], comb['preds'])\n", 3388 | "\n", 3389 | "print(f\"F1 Score: {f1}\\nAccuracy Score: {acc}\")" 3390 | ] 3391 | }, 3392 | { 3393 | "cell_type": "markdown", 3394 | "metadata": {}, 3395 | "source": [ 3396 | "__Since the underlying dataset is random, it is hard to tell if this evaluation is truly accurate.__" 3397 | ] 3398 | }, 3399 | { 3400 | "cell_type": "code", 3401 | "execution_count": null, 3402 | "metadata": {}, 3403 | "outputs": [], 3404 | "source": [] 3405 | }, 3406 | { 3407 | "cell_type": "code", 3408 | "execution_count": null, 3409 | "metadata": {}, 3410 | "outputs": [], 3411 | "source": [] 3412 | } 3413 | ], 3414 | "metadata": { 3415 | "kernelspec": { 3416 | "display_name": "Python 3", 3417 | "language": "python", 3418 | "name": "python3" 3419 | }, 3420 | "language_info": { 3421 | "codemirror_mode": { 3422 | "name": "ipython", 3423 | "version": 3 3424 | }, 3425 | "file_extension": ".py", 3426 | "mimetype": "text/x-python", 3427 | "name": "python", 3428 | "nbconvert_exporter": "python", 3429 | "pygments_lexer": "ipython3", 3430 | "version": "3.9.1" 3431 | } 3432 | }, 3433 | "nbformat": 4, 3434 | "nbformat_minor": 4 3435 | } 3436 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Medium Tutorials and Code Walkthroughs 2 | 3 | ### [My Medium Profile Page](https://marco-santos.medium.com/membership) 4 | Learn more about the code I've written in this repository by clicking on the link above! 5 | -------------------------------------------------------------------------------- /Selenium-Tutorial.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Selenium Tutorial" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 71, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "# Importing libraries\n", 17 | "import selenium\n", 18 | "from selenium import webdriver\n", 19 | "from selenium.webdriver.common.by import By\n", 20 | "from selenium.webdriver.common.keys import Keys\n", 21 | "from selenium.webdriver.support.ui import WebDriverWait\n", 22 | "from selenium.webdriver.support import expected_conditions as EC\n", 23 | "from selenium.webdriver.chrome.options import Options\n", 24 | "import time" 25 | ] 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "metadata": {}, 30 | "source": [ 31 | "# Opening the Browser" 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 15, 37 | "metadata": {}, 38 | "outputs": [], 39 | "source": [ 40 | "# Opening the browser\n", 41 | "driver = webdriver.Chrome(\n", 42 | " executable_path=\"/Users/marcosantos/Downloads/chromedriver\"\n", 43 | ")\n", 44 | "\n", 45 | "# Designating which site to open to\n", 46 | "driver.get(\"https://www.google.com\")\n", 47 | "\n", 48 | "# Closing the browser after a bit\n", 49 | "time.sleep(1)\n", 50 | "driver.quit()" 51 | ] 52 | }, 53 | { 54 | "cell_type": "markdown", 55 | "metadata": {}, 56 | "source": [ 57 | "# Typing into Search and Hitting Enter" 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "execution_count": 72, 63 | "metadata": {}, 64 | "outputs": [], 65 | "source": [ 66 | "# Opening the browser\n", 67 | "driver = webdriver.Chrome(\n", 68 | " executable_path=\"/Users/marcosantos/Downloads/chromedriver\"\n", 69 | ")\n", 70 | "\n", 71 | "# Designating which site to open to\n", 72 | "driver.get(\"https://www.google.com\")\n", 73 | "\n", 74 | "# Pausing for a second\n", 75 | "time.sleep(1)\n", 76 | "\n", 77 | "# Typing into search and hitting enter\n", 78 | "driver.find_element_by_xpath(\n", 79 | " \"//input[@class='gLFyf gsfi']\"\n", 80 | ").send_keys(\n", 81 | " \"yahoo finance\", \n", 82 | " Keys.ENTER\n", 83 | ")\n", 84 | " \n", 85 | "# Pausing again\n", 86 | "time.sleep(1)\n", 87 | "\n", 88 | "# Closing the browser\n", 89 | "driver.quit()" 90 | ] 91 | }, 92 | { 93 | "cell_type": "markdown", 94 | "metadata": {}, 95 | "source": [ 96 | "# Clicking on the Desired Result" 97 | ] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "execution_count": 24, 102 | "metadata": {}, 103 | "outputs": [], 104 | "source": [ 105 | "# Opening the browser\n", 106 | "driver = webdriver.Chrome(\n", 107 | " executable_path=\"/Users/marcosantos/Downloads/chromedriver\"\n", 108 | ")\n", 109 | "\n", 110 | "# Designating which site to open to\n", 111 | "driver.get(\n", 112 | " \"https://www.google.com\"\n", 113 | ")\n", 114 | "\n", 115 | "# Pause\n", 116 | "time.sleep(1)\n", 117 | "\n", 118 | "# Typing into search and hitting enter\n", 119 | "driver.find_element_by_xpath(\n", 120 | " \"//input[@class='gLFyf gsfi']\"\n", 121 | ").send_keys(\n", 122 | " \"yahoo finance\", \n", 123 | " Keys.ENTER\n", 124 | ")\n", 125 | "\n", 126 | "# Pause\n", 127 | "time.sleep(1)\n", 128 | "\n", 129 | "# Clicking on the desired result\n", 130 | "driver.find_element_by_xpath(\n", 131 | " \"//div[@class='tF2Cxc']\"\n", 132 | ").click()\n", 133 | "\n", 134 | "# Finishing up\n", 135 | "time.sleep(1)\n", 136 | "driver.quit()" 137 | ] 138 | }, 139 | { 140 | "cell_type": "markdown", 141 | "metadata": {}, 142 | "source": [ 143 | "# Navigating the New Webpage" 144 | ] 145 | }, 146 | { 147 | "cell_type": "code", 148 | "execution_count": 73, 149 | "metadata": {}, 150 | "outputs": [], 151 | "source": [ 152 | "# Adding adblocker extension\n", 153 | "options = Options()\n", 154 | "\n", 155 | "options.add_extension(\n", 156 | " \"/Users/marcosantos/Downloads/extension_1_37_2_0.crx\"\n", 157 | ")\n", 158 | "\n", 159 | "# Opening the browser\n", 160 | "driver = webdriver.Chrome(\n", 161 | " executable_path=\"/Users/marcosantos/Downloads/chromedriver\",\n", 162 | " options=options\n", 163 | ")\n", 164 | "\n", 165 | "# Designating which site to open to\n", 166 | "driver.get(\"https://www.google.com\")\n", 167 | "\n", 168 | "time.sleep(1)\n", 169 | "# Typing into search and hitting enter\n", 170 | "driver.find_element_by_xpath(\n", 171 | " \"//input[@class='gLFyf gsfi']\").send_keys(\"yahoo finance\", \n", 172 | " Keys.ENTER)\n", 173 | "\n", 174 | "time.sleep(1)\n", 175 | "# Clicking on the desired result\n", 176 | "driver.find_element_by_xpath(\"//div[@class='tF2Cxc']\").click()\n", 177 | "\n", 178 | "time.sleep(1)\n", 179 | "# Searching a Ticker\n", 180 | "driver.find_element_by_xpath(\"//input[@id='yfin-usr-qry']\").send_keys(\"AMC\", Keys.ENTER)\n", 181 | "\n", 182 | "time.sleep(1)\n", 183 | "# Clicking Historical Data\n", 184 | "driver.find_element_by_xpath(\"//li[@data-test='HISTORICAL_DATA']\").click()\n", 185 | "\n", 186 | "time.sleep(1)\n", 187 | "# Getting historical date range\n", 188 | "driver.find_element_by_xpath(\n", 189 | " \"//*[@id='Col1-1-HistoricalDataTable-Proxy']/section/div[1]/div[1]/div[1]/div/div/div[1]/span\"\n", 190 | ").click()\n", 191 | "\n", 192 | "time.sleep(1)\n", 193 | "# Getting max historical range\n", 194 | "driver.find_element_by_xpath(\n", 195 | " \"//*[@id='dropdown-menu']/div/ul[2]/li[4]/button\"\n", 196 | ").click()\n", 197 | "\n", 198 | "time.sleep(1)\n", 199 | "# Applying the changes\n", 200 | "driver.find_element_by_xpath(\n", 201 | " \"//*[@id='Col1-1-HistoricalDataTable-Proxy']/section/div[1]/div[1]/button/span\"\n", 202 | ").click()\n", 203 | "\n", 204 | "time.sleep(1)\n", 205 | "# Downloading the file\n", 206 | "driver.find_element_by_xpath(\n", 207 | " \"//*[@id='Col1-1-HistoricalDataTable-Proxy']/section/div[1]/div[2]/span[2]/a/span\"\n", 208 | ").click()" 209 | ] 210 | }, 211 | { 212 | "cell_type": "markdown", 213 | "metadata": {}, 214 | "source": [ 215 | "# Speeding up the process" 216 | ] 217 | }, 218 | { 219 | "cell_type": "code", 220 | "execution_count": 59, 221 | "metadata": {}, 222 | "outputs": [], 223 | "source": [ 224 | "# Adding adblocker extension\n", 225 | "options = Options()\n", 226 | "\n", 227 | "options.add_extension(\n", 228 | " \"/Users/marcosantos/Downloads/extension_1_37_2_0.crx\"\n", 229 | ")\n", 230 | "\n", 231 | "# Opening the browser\n", 232 | "driver = webdriver.Chrome(\n", 233 | " executable_path=\"/Users/marcosantos/Downloads/chromedriver\",\n", 234 | " options=options\n", 235 | ")\n", 236 | "\n", 237 | "# Designating which site to open to\n", 238 | "driver.get(\"https://www.google.com\")\n", 239 | "\n", 240 | "# Typing into search and hitting enter\n", 241 | "WebDriverWait(driver, 3).until(\n", 242 | " EC.element_to_be_clickable(\n", 243 | " (By.XPATH, \"//input[@class='gLFyf gsfi']\")\n", 244 | " )).send_keys(\"yahoo finance\", Keys.ENTER)\n", 245 | "\n", 246 | "# Clicking on the desired result\n", 247 | "WebDriverWait(driver, 3).until(\n", 248 | " EC.element_to_be_clickable(\n", 249 | " (By.XPATH, \"//div[@class='tF2Cxc']\")\n", 250 | " )).click()\n", 251 | "\n", 252 | "# Searching a Ticker\n", 253 | "WebDriverWait(driver, 3).until(\n", 254 | " EC.element_to_be_clickable(\n", 255 | " (By.XPATH, \"//input[@id='yfin-usr-qry']\")\n", 256 | " )).send_keys(\"AMC\", Keys.ENTER)\n", 257 | "\n", 258 | "# Clicking Historical Data\n", 259 | "WebDriverWait(driver, 3).until(\n", 260 | " EC.element_to_be_clickable(\n", 261 | " (By.XPATH, \"//li[@data-test='HISTORICAL_DATA']\")\n", 262 | " )).click()\n", 263 | "\n", 264 | "# Getting historical date range\n", 265 | "WebDriverWait(driver, 3).until(\n", 266 | " EC.element_to_be_clickable(\n", 267 | " (By.XPATH, \n", 268 | " \"//*[@id='Col1-1-HistoricalDataTable-Proxy']/section/div[1]/div[1]/div[1]/div/div/div[1]/span\")\n", 269 | " )).click()\n", 270 | "\n", 271 | "# Getting max historical range\n", 272 | "WebDriverWait(driver, 3).until(\n", 273 | " EC.element_to_be_clickable(\n", 274 | " (By.XPATH, \"//*[@id='dropdown-menu']/div/ul[2]/li[4]/button\")\n", 275 | " )).click()\n", 276 | "\n", 277 | "# Applying the changes\n", 278 | "WebDriverWait(driver, 3).until(\n", 279 | " EC.element_to_be_clickable(\n", 280 | " (By.XPATH, \n", 281 | " \"//*[@id='Col1-1-HistoricalDataTable-Proxy']/section/div[1]/div[1]/button/span\")\n", 282 | " )).click()\n", 283 | "\n", 284 | "# Downloading the file\n", 285 | "WebDriverWait(driver, 3).until(\n", 286 | " EC.element_to_be_clickable(\n", 287 | " (By.XPATH, \n", 288 | " \"//*[@id='Col1-1-HistoricalDataTable-Proxy']/section/div[1]/div[2]/span[2]/a/span\")\n", 289 | " )).click()\n", 290 | "\n", 291 | "# Closing the window but allowing some time for download\n", 292 | "time.sleep(1)\n", 293 | "driver.quit()" 294 | ] 295 | }, 296 | { 297 | "cell_type": "markdown", 298 | "metadata": {}, 299 | "source": [ 300 | "# Run in the background\n", 301 | "Print commands throughout for checkpoints" 302 | ] 303 | }, 304 | { 305 | "cell_type": "code", 306 | "execution_count": 79, 307 | "metadata": {}, 308 | "outputs": [ 309 | { 310 | "name": "stdout", 311 | "output_type": "stream", 312 | "text": [ 313 | "Opened Google\n", 314 | "Entered google search\n", 315 | "Clicked on google search result\n", 316 | "Entered ticker in yahoo finance search\n", 317 | "Adjusting historical date range\n", 318 | "Downloaded File!\n" 319 | ] 320 | } 321 | ], 322 | "source": [ 323 | "# Initiating options\n", 324 | "options = Options()\n", 325 | "\n", 326 | "# Performing without GUI\n", 327 | "options.headless = True\n", 328 | "options.add_argument(\"--window-size=1920,1200\")\n", 329 | "\n", 330 | "# Accepting downloads without GUI\n", 331 | "options.add_experimental_option(\"prefs\", {\n", 332 | " \"download.default_directory\": r\"/Users/marcosantos/Downloads\",\n", 333 | " \"download.prompt_for_download\": False,\n", 334 | " \"download.directory_upgrade\": True,\n", 335 | " \"safebrowsing_for_trusted_sources_enabled\": False,\n", 336 | " \"safebrowsing.enabled\": False\n", 337 | "})\n", 338 | "\n", 339 | "# The browser\n", 340 | "driver = webdriver.Chrome(\n", 341 | " executable_path=\"/Users/marcosantos/Downloads/chromedriver\",\n", 342 | " options=options\n", 343 | ")\n", 344 | "\n", 345 | "# Designating which site to open to\n", 346 | "driver.get(\"https://www.google.com\")\n", 347 | "print(\"Opened Google\")\n", 348 | "\n", 349 | "# Typing into search\n", 350 | "WebDriverWait(driver, 3).until(\n", 351 | " EC.element_to_be_clickable(\n", 352 | " (By.XPATH, \"//input[@class='gLFyf gsfi']\")\n", 353 | " )).send_keys(\"yahoo finance\", Keys.ENTER)\n", 354 | "print(\"Entered google search\")\n", 355 | "\n", 356 | "# Clicking on the desired result\n", 357 | "WebDriverWait(driver, 3).until(\n", 358 | " EC.element_to_be_clickable(\n", 359 | " (By.XPATH, \"//div[@class='tF2Cxc']\")\n", 360 | " )).click()\n", 361 | "print(\"Clicked on google search result\")\n", 362 | "\n", 363 | "# Searching a Ticker\n", 364 | "WebDriverWait(driver, 3).until(\n", 365 | " EC.element_to_be_clickable(\n", 366 | " (By.XPATH, \"//input[@id='yfin-usr-qry']\")\n", 367 | " )).send_keys(\"amc\", Keys.ENTER)\n", 368 | "print(\"Entered ticker in yahoo finance search\")\n", 369 | "\n", 370 | "# Clicking Historical Data\n", 371 | "WebDriverWait(driver, 3).until(\n", 372 | " EC.element_to_be_clickable(\n", 373 | " (By.XPATH, \"//li[@data-test='HISTORICAL_DATA']\")\n", 374 | " )).click()\n", 375 | "print(\"Adjusting historical date range\")\n", 376 | "\n", 377 | "# Getting historical date range\n", 378 | "WebDriverWait(driver, 3).until(\n", 379 | " EC.element_to_be_clickable(\n", 380 | " (By.XPATH, \n", 381 | " \"//*[@id='Col1-1-HistoricalDataTable-Proxy']/section/div[1]/div[1]/div[1]/div/div/div[1]/span\")\n", 382 | " )).click()\n", 383 | "\n", 384 | "# Getting max historical range\n", 385 | "WebDriverWait(driver, 3).until(\n", 386 | " EC.element_to_be_clickable(\n", 387 | " (By.XPATH, \"//*[@id='dropdown-menu']/div/ul[2]/li[4]/button\")\n", 388 | " )).click()\n", 389 | "\n", 390 | "# Applying the changes\n", 391 | "WebDriverWait(driver, 3).until(\n", 392 | " EC.element_to_be_clickable(\n", 393 | " (By.XPATH, \n", 394 | " \"//*[@id='Col1-1-HistoricalDataTable-Proxy']/section/div[1]/div[1]/button/span\")\n", 395 | " )).click()\n", 396 | "\n", 397 | "# Downloading the file\n", 398 | "WebDriverWait(driver, 3).until(\n", 399 | " EC.element_to_be_clickable(\n", 400 | " (By.XPATH, \n", 401 | " \"//*[@id='Col1-1-HistoricalDataTable-Proxy']/section/div[1]/div[2]/span[2]/a/span\")\n", 402 | " )).click()\n", 403 | "print(\"Downloaded File!\")\n", 404 | "\n", 405 | "# Closing the window but allowing some time for download\n", 406 | "time.sleep(1)\n", 407 | "driver.quit()" 408 | ] 409 | }, 410 | { 411 | "cell_type": "code", 412 | "execution_count": null, 413 | "metadata": {}, 414 | "outputs": [], 415 | "source": [] 416 | } 417 | ], 418 | "metadata": { 419 | "kernelspec": { 420 | "display_name": "Python 3", 421 | "language": "python", 422 | "name": "python3" 423 | }, 424 | "language_info": { 425 | "codemirror_mode": { 426 | "name": "ipython", 427 | "version": 3 428 | }, 429 | "file_extension": ".py", 430 | "mimetype": "text/x-python", 431 | "name": "python", 432 | "nbconvert_exporter": "python", 433 | "pygments_lexer": "ipython3", 434 | "version": "3.9.1" 435 | } 436 | }, 437 | "nbformat": 4, 438 | "nbformat_minor": 4 439 | } 440 | -------------------------------------------------------------------------------- /Send-Emails-with-Python.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Use Python to Send an Email" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "## 1. Install SendGrid" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 1, 20 | "metadata": {}, 21 | "outputs": [ 22 | { 23 | "name": "stdout", 24 | "output_type": "stream", 25 | "text": [ 26 | "Requirement already satisfied: sendgrid in /Users/marcosantos/miniforge3/lib/python3.9/site-packages (6.8.0)\n", 27 | "Requirement already satisfied: starkbank-ecdsa>=1.0.0 in /Users/marcosantos/miniforge3/lib/python3.9/site-packages (from sendgrid) (1.1.1)\n", 28 | "Requirement already satisfied: python-http-client>=3.2.1 in /Users/marcosantos/miniforge3/lib/python3.9/site-packages (from sendgrid) (3.3.2)\n" 29 | ] 30 | } 31 | ], 32 | "source": [ 33 | "# Installing sendgrid\n", 34 | "!pip install sendgrid" 35 | ] 36 | }, 37 | { 38 | "cell_type": "markdown", 39 | "metadata": {}, 40 | "source": [ 41 | "## 2. Import SendGrid Libraries and Setting the API Key" 42 | ] 43 | }, 44 | { 45 | "cell_type": "code", 46 | "execution_count": 12, 47 | "metadata": {}, 48 | "outputs": [], 49 | "source": [ 50 | "from sendgrid import SendGridAPIClient\n", 51 | "from sendgrid.helpers.mail import Mail\n", 52 | "\n", 53 | "# Importing and assigning the api key\n", 54 | "with open(\"../sendGrid-API.txt\", \"r\") as f:\n", 55 | " api_key = f.read()\n", 56 | " \n", 57 | "# Using the api key with the sendgrid client\n", 58 | "sg = SendGridAPIClient(api_key)" 59 | ] 60 | }, 61 | { 62 | "cell_type": "markdown", 63 | "metadata": {}, 64 | "source": [ 65 | "## 3. Setting the Email Variables" 66 | ] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "execution_count": 4, 71 | "metadata": {}, 72 | "outputs": [], 73 | "source": [ 74 | "sender = \"example@yahoo.com\"\n", 75 | "\n", 76 | "recipient = \"example@gmail.com\"\n", 77 | "\n", 78 | "subject = \"Hey Check Out This Test Email!\"\n", 79 | "\n", 80 | "content = \"I just sent this email with Python. So cool!\"" 81 | ] 82 | }, 83 | { 84 | "cell_type": "markdown", 85 | "metadata": {}, 86 | "source": [ 87 | "## 4. Constructing the Email" 88 | ] 89 | }, 90 | { 91 | "cell_type": "code", 92 | "execution_count": 15, 93 | "metadata": {}, 94 | "outputs": [], 95 | "source": [ 96 | "email = Mail(\n", 97 | " from_email=sender,\n", 98 | " to_emails=recipient,\n", 99 | " subject=subject,\n", 100 | " html_content=content\n", 101 | ")" 102 | ] 103 | }, 104 | { 105 | "cell_type": "markdown", 106 | "metadata": {}, 107 | "source": [ 108 | "## 5. Sending the Email" 109 | ] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "execution_count": 17, 114 | "metadata": {}, 115 | "outputs": [ 116 | { 117 | "name": "stdout", 118 | "output_type": "stream", 119 | "text": [ 120 | "\n" 121 | ] 122 | } 123 | ], 124 | "source": [ 125 | "response = sg.send(email)\n", 126 | "\n", 127 | "# Printing out the response \n", 128 | "print(response.status_code)" 129 | ] 130 | }, 131 | { 132 | "cell_type": "markdown", 133 | "metadata": {}, 134 | "source": [ 135 | "## 6. Putting it all together" 136 | ] 137 | }, 138 | { 139 | "cell_type": "code", 140 | "execution_count": 13, 141 | "metadata": {}, 142 | "outputs": [], 143 | "source": [ 144 | "def sendMyEmail(sender, recipient, subject, content):\n", 145 | " \"\"\"\n", 146 | " Takes in email details to send an email to whoever.\n", 147 | " \"\"\"\n", 148 | " # Sendgrid client\n", 149 | " email = Mail(\n", 150 | " from_email=sender,\n", 151 | " to_emails=recipient,\n", 152 | " subject=subject,\n", 153 | " html_content=content\n", 154 | " )\n", 155 | " \n", 156 | " # Sending the email \n", 157 | " response = sg.send(email)\n", 158 | " \n", 159 | " # Returning either a successful message or not\n", 160 | " if response.status_code==202:\n", 161 | " return \"Email has been accepted!\"\n", 162 | " \n", 163 | " return \"Email wasn't sent\"" 164 | ] 165 | }, 166 | { 167 | "cell_type": "code", 168 | "execution_count": 14, 169 | "metadata": {}, 170 | "outputs": [ 171 | { 172 | "data": { 173 | "text/plain": [ 174 | "'Email has been accepted!'" 175 | ] 176 | }, 177 | "execution_count": 14, 178 | "metadata": {}, 179 | "output_type": "execute_result" 180 | } 181 | ], 182 | "source": [ 183 | "# New Variables\n", 184 | "sender = \"example@intuily.com\"\n", 185 | "\n", 186 | "recipient = \"example@gmail.com\"\n", 187 | "\n", 188 | "subject = \"Hey Check Out This New Test Email!\"\n", 189 | "\n", 190 | "# With some html formatting\n", 191 | "content = \"\"\"\n", 192 | " Hey!\n", 193 | " \n", 194 | "

I just sent this email by using Python.

\n", 195 | " \n", 196 | "

It's so cool!

\n", 197 | "\"\"\"\n", 198 | "\n", 199 | "# Testing the function\n", 200 | "sendMyEmail(sender, recipient, subject, content)" 201 | ] 202 | }, 203 | { 204 | "cell_type": "markdown", 205 | "metadata": {}, 206 | "source": [ 207 | "## 7. Sending emails with automatically changing variables" 208 | ] 209 | }, 210 | { 211 | "cell_type": "code", 212 | "execution_count": 15, 213 | "metadata": {}, 214 | "outputs": [ 215 | { 216 | "name": "stdout", 217 | "output_type": "stream", 218 | "text": [ 219 | "Hey\n", 220 | "Hi\n", 221 | "Hello\n" 222 | ] 223 | } 224 | ], 225 | "source": [ 226 | "# Email repeatedly over a specific time interval\n", 227 | "import time\n", 228 | "\n", 229 | "# Sending a different email at three separate times\n", 230 | "for i in [\"Hey\", \"Hi\", \"Hello\"]:\n", 231 | " \n", 232 | " # Setting the variables to dynamically change\n", 233 | " sender = \"example@yahoo.com\"\n", 234 | "\n", 235 | " recipient = \"example@gmail.com\"\n", 236 | "\n", 237 | " subject = f\"{i} Check Out My Email!\"\n", 238 | "\n", 239 | " # With some html formatting\n", 240 | " content = f\"\"\"\n", 241 | " {i}!\n", 242 | "\n", 243 | "

I just sent this email by using Python.

\n", 244 | "\n", 245 | "

It's so cool!

\n", 246 | " \"\"\"\n", 247 | "\n", 248 | " # Testing the function\n", 249 | " sendMyEmail(sender, recipient, subject, content)\n", 250 | " \n", 251 | " # Waiting a bit before sending the next\n", 252 | " time.sleep(61)\n", 253 | " \n", 254 | " print(i)" 255 | ] 256 | }, 257 | { 258 | "cell_type": "code", 259 | "execution_count": null, 260 | "metadata": {}, 261 | "outputs": [], 262 | "source": [] 263 | }, 264 | { 265 | "cell_type": "code", 266 | "execution_count": null, 267 | "metadata": {}, 268 | "outputs": [], 269 | "source": [] 270 | }, 271 | { 272 | "cell_type": "code", 273 | "execution_count": null, 274 | "metadata": {}, 275 | "outputs": [], 276 | "source": [] 277 | }, 278 | { 279 | "cell_type": "code", 280 | "execution_count": null, 281 | "metadata": {}, 282 | "outputs": [], 283 | "source": [] 284 | } 285 | ], 286 | "metadata": { 287 | "kernelspec": { 288 | "display_name": "Python 3", 289 | "language": "python", 290 | "name": "python3" 291 | }, 292 | "language_info": { 293 | "codemirror_mode": { 294 | "name": "ipython", 295 | "version": 3 296 | }, 297 | "file_extension": ".py", 298 | "mimetype": "text/x-python", 299 | "name": "python", 300 | "nbconvert_exporter": "python", 301 | "pygments_lexer": "ipython3", 302 | "version": "3.9.1" 303 | } 304 | }, 305 | "nbformat": 4, 306 | "nbformat_minor": 4 307 | } 308 | -------------------------------------------------------------------------------- /Stock-Market-Tutorials/Analyze-Fundamental-Data.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Analyze Fundamental Stock Data" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "# Libraries\n", 17 | "import pandas as pd\n", 18 | "from eod import EodHistoricalData\n", 19 | "from functools import reduce\n", 20 | "from datetime import datetime, timedelta\n", 21 | "\n", 22 | "# Importing and assigning the api key\n", 23 | "with open(\"../eodHistoricalData-API.txt\", \"r\") as f:\n", 24 | " api_key = f.read()\n", 25 | " \n", 26 | "# EOD Historical Data client\n", 27 | "client = EodHistoricalData(api_key)" 28 | ] 29 | }, 30 | { 31 | "cell_type": "markdown", 32 | "metadata": {}, 33 | "source": [ 34 | "# Formatting Fundamental Data" 35 | ] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "execution_count": 2, 40 | "metadata": {}, 41 | "outputs": [], 42 | "source": [ 43 | "def getFundamentals(ticker):\n", 44 | " \"\"\"\n", 45 | " Returns the fundamental data from the financial data API. Combines the quarterly balance \n", 46 | " sheet, cash flow, income statement, and earnings for a specific stock ticker.\n", 47 | " \"\"\"\n", 48 | " \n", 49 | " # Getting data\n", 50 | " fund_data = client.get_fundamental_equity(ticker)\n", 51 | " \n", 52 | " # Financials\n", 53 | " bal = pd.DataFrame(fund_data['Financials']['Balance_Sheet']['quarterly']).T\n", 54 | " \n", 55 | " cf = pd.DataFrame(fund_data['Financials']['Cash_Flow']['quarterly']).T\n", 56 | " \n", 57 | " inc = pd.DataFrame(fund_data['Financials']['Income_Statement']['quarterly']).T\n", 58 | " \n", 59 | " # Earnings\n", 60 | " earn = pd.DataFrame(fund_data['Earnings']['History']).T\n", 61 | " \n", 62 | " # Merging them together\n", 63 | " df = reduce(\n", 64 | " lambda left,right: pd.merge(\n", 65 | " left,\n", 66 | " right,\n", 67 | " left_index=True, \n", 68 | " right_index=True, \n", 69 | " how='outer',\n", 70 | " suffixes=('', '_drop')\n", 71 | " ), \n", 72 | " [bal, cf, inc, earn]\n", 73 | " )\n", 74 | " \n", 75 | " # Dropping redundant date and duplicate columns\n", 76 | " dup_cols = [i for i in df.columns if \"date\" in i or \"Date\" in i or \"_drop\" in i]\n", 77 | " \n", 78 | " df = df.drop(dup_cols, axis=1)\n", 79 | " \n", 80 | " return df" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": 9, 86 | "metadata": {}, 87 | "outputs": [], 88 | "source": [ 89 | "def getPrices(df, ticker):\n", 90 | " \"\"\"\n", 91 | " Gets the stock price at the time for each date in the financial statements for\n", 92 | " the given ticker and dataframe of financial information.\n", 93 | " \"\"\"\n", 94 | " # Getting stock price at the time\n", 95 | " prices = client.get_prices_eod(ticker, period='d')\n", 96 | " \n", 97 | " prices = pd.DataFrame(prices).set_index('date')[['adjusted_close', 'close', 'volume']]\n", 98 | "\n", 99 | " # Converting to date time\n", 100 | " prices.index = pd.to_datetime(prices.index)\n", 101 | "\n", 102 | " # Filling in missing price data\n", 103 | " prices = prices.reindex(\n", 104 | " pd.date_range(prices.index[0], prices.index[-1]),\n", 105 | " method='ffill'\n", 106 | " )\n", 107 | " \n", 108 | " # Converting back to string for merging later\n", 109 | " prices.index = prices.index.strftime(\"%Y-%m-%d\")\n", 110 | " \n", 111 | " price_dates = [i for i in prices.index if i in df.index]\n", 112 | " \n", 113 | " prices = prices.loc[price_dates]\n", 114 | "\n", 115 | " # Joining together\n", 116 | " df = df.join(prices, how='outer')\n", 117 | " \n", 118 | " return df" 119 | ] 120 | }, 121 | { 122 | "cell_type": "code", 123 | "execution_count": 10, 124 | "metadata": {}, 125 | "outputs": [], 126 | "source": [ 127 | "def formatFundamentals(ticker, dropna=False):\n", 128 | " \"\"\"\n", 129 | " Formats the given ticker's fundamental and price data. Cleans up the data by dropping\n", 130 | " any empty/nan values if requested.\n", 131 | " \"\"\"\n", 132 | " \n", 133 | " # Getting fundamental data\n", 134 | " fund_data = getFundamentals(ticker)\n", 135 | " \n", 136 | " # Getting accompanying price data\n", 137 | " df = getPrices(fund_data, ticker)\n", 138 | " \n", 139 | " # Dropping if all items are na in respective row\n", 140 | " df = df.dropna(how='all')\n", 141 | " \n", 142 | " if dropna:\n", 143 | " # Dropping mostly nan columns and rows if requested\n", 144 | " df = df.dropna(\n", 145 | " axis=0,\n", 146 | " thresh=round(df.shape[0]*.3) # If 50% of the values in the row are Nans, drop the whole row\n", 147 | " ).dropna(\n", 148 | " axis=1,\n", 149 | " thresh=round(df.shape[1]*.3) # If 50% of the values in the columns are Nans, drop the whole column\n", 150 | " )\n", 151 | " \n", 152 | " return df" 153 | ] 154 | }, 155 | { 156 | "cell_type": "code", 157 | "execution_count": 19, 158 | "metadata": {}, 159 | "outputs": [], 160 | "source": [ 161 | "df = formatFundamentals(\"TSLA\", dropna=True)" 162 | ] 163 | }, 164 | { 165 | "cell_type": "code", 166 | "execution_count": 20, 167 | "metadata": { 168 | "collapsed": true, 169 | "jupyter": { 170 | "outputs_hidden": true 171 | } 172 | }, 173 | "outputs": [ 174 | { 175 | "data": { 176 | "text/html": [ 177 | "
\n", 178 | "\n", 191 | "\n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \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 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \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 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | " \n", 599 | " \n", 600 | " \n", 601 | " \n", 602 | " \n", 603 | " \n", 604 | " \n", 605 | " \n", 606 | " \n", 607 | " \n", 608 | " \n", 609 | " \n", 610 | " \n", 611 | " \n", 612 | " \n", 613 | " \n", 614 | " \n", 615 | " \n", 616 | " \n", 617 | " \n", 618 | " \n", 619 | " \n", 620 | " \n", 621 | " \n", 622 | " \n", 623 | " \n", 624 | " \n", 625 | " \n", 626 | " \n", 627 | " \n", 628 | " \n", 629 | " \n", 630 | " \n", 631 | " \n", 632 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | " \n", 640 | " \n", 641 | " \n", 642 | " \n", 643 | " \n", 644 | " \n", 645 | " \n", 646 | " \n", 647 | " \n", 648 | " \n", 649 | " \n", 650 | " \n", 651 | " \n", 652 | " \n", 653 | " \n", 654 | " \n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | " \n", 659 | " \n", 660 | " \n", 661 | " \n", 662 | " \n", 663 | " \n", 664 | " \n", 665 | " \n", 666 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | " \n", 674 | " \n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | " \n", 722 | " \n", 723 | " \n", 724 | " \n", 725 | " \n", 726 | " \n", 727 | " \n", 728 | " \n", 729 | " \n", 730 | " \n", 731 | " \n", 732 | " \n", 733 | " \n", 734 | " \n", 735 | " \n", 736 | " \n", 737 | " \n", 738 | " \n", 739 | " \n", 740 | " \n", 741 | " \n", 742 | " \n", 743 | " \n", 744 | " \n", 745 | " \n", 746 | " \n", 747 | " \n", 748 | " \n", 749 | " \n", 750 | " \n", 751 | " \n", 752 | " \n", 753 | " \n", 754 | " \n", 755 | " \n", 756 | " \n", 757 | " \n", 758 | " \n", 759 | " \n", 760 | " \n", 761 | " \n", 762 | " \n", 763 | " \n", 764 | " \n", 765 | " \n", 766 | " \n", 767 | " \n", 768 | " \n", 769 | " \n", 770 | " \n", 771 | " \n", 772 | " \n", 773 | " \n", 774 | " \n", 775 | " \n", 776 | " \n", 777 | " \n", 778 | " \n", 779 | " \n", 780 | " \n", 781 | " \n", 782 | " \n", 783 | " \n", 784 | " \n", 785 | " \n", 786 | " \n", 787 | " \n", 788 | " \n", 789 | " \n", 790 | " \n", 791 | " \n", 792 | " \n", 793 | " \n", 794 | " \n", 795 | " \n", 796 | " \n", 797 | " \n", 798 | " \n", 799 | " \n", 800 | " \n", 801 | " \n", 802 | " \n", 803 | " \n", 804 | " \n", 805 | " \n", 806 | " \n", 807 | " \n", 808 | " \n", 809 | " \n", 810 | " \n", 811 | " \n", 812 | " \n", 813 | " \n", 814 | " \n", 815 | " \n", 816 | " \n", 817 | " \n", 818 | " \n", 819 | " \n", 820 | " \n", 821 | " \n", 822 | " \n", 823 | " \n", 824 | " \n", 825 | " \n", 826 | " \n", 827 | " \n", 828 | " \n", 829 | " \n", 830 | " \n", 831 | " \n", 832 | " \n", 833 | " \n", 834 | " \n", 835 | " \n", 836 | " \n", 837 | " \n", 838 | " \n", 839 | " \n", 840 | " \n", 841 | " \n", 842 | " \n", 843 | " \n", 844 | " \n", 845 | " \n", 846 | " \n", 847 | " \n", 848 | " \n", 849 | " \n", 850 | " \n", 851 | " \n", 852 | " \n", 853 | " \n", 854 | " \n", 855 | " \n", 856 | " \n", 857 | " \n", 858 | " \n", 859 | " \n", 860 | " \n", 861 | " \n", 862 | " \n", 863 | " \n", 864 | " \n", 865 | " \n", 866 | " \n", 867 | " \n", 868 | " \n", 869 | " \n", 870 | " \n", 871 | " \n", 872 | " \n", 873 | " \n", 874 | " \n", 875 | " \n", 876 | " \n", 877 | " \n", 878 | " \n", 879 | " \n", 880 | " \n", 881 | " \n", 882 | " \n", 883 | " \n", 884 | " \n", 885 | " \n", 886 | " \n", 887 | " \n", 888 | " \n", 889 | " \n", 890 | " \n", 891 | " \n", 892 | " \n", 893 | " \n", 894 | " \n", 895 | " \n", 896 | " \n", 897 | " \n", 898 | " \n", 899 | " \n", 900 | " \n", 901 | " \n", 902 | " \n", 903 | " \n", 904 | " \n", 905 | " \n", 906 | " \n", 907 | " \n", 908 | " \n", 909 | " \n", 910 | " \n", 911 | " \n", 912 | " \n", 913 | " \n", 914 | " \n", 915 | " \n", 916 | " \n", 917 | " \n", 918 | " \n", 919 | " \n", 920 | " \n", 921 | " \n", 922 | " \n", 923 | " \n", 924 | " \n", 925 | " \n", 926 | " \n", 927 | " \n", 928 | " \n", 929 | " \n", 930 | " \n", 931 | " \n", 932 | " \n", 933 | " \n", 934 | " \n", 935 | " \n", 936 | " \n", 937 | " \n", 938 | " \n", 939 | " \n", 940 | " \n", 941 | " \n", 942 | " \n", 943 | " \n", 944 | " \n", 945 | " \n", 946 | " \n", 947 | " \n", 948 | " \n", 949 | " \n", 950 | " \n", 951 | " \n", 952 | " \n", 953 | " \n", 954 | " \n", 955 | " \n", 956 | " \n", 957 | " \n", 958 | " \n", 959 | " \n", 960 | " \n", 961 | " \n", 962 | " \n", 963 | " \n", 964 | " \n", 965 | " \n", 966 | " \n", 967 | " \n", 968 | " \n", 969 | " \n", 970 | " \n", 971 | " \n", 972 | " \n", 973 | " \n", 974 | " \n", 975 | " \n", 976 | " \n", 977 | " \n", 978 | " \n", 979 | " \n", 980 | " \n", 981 | " \n", 982 | " \n", 983 | " \n", 984 | " \n", 985 | " \n", 986 | " \n", 987 | " \n", 988 | " \n", 989 | " \n", 990 | " \n", 991 | " \n", 992 | " \n", 993 | " \n", 994 | " \n", 995 | " \n", 996 | " \n", 997 | " \n", 998 | " \n", 999 | " \n", 1000 | " \n", 1001 | " \n", 1002 | " \n", 1003 | " \n", 1004 | " \n", 1005 | " \n", 1006 | " \n", 1007 | " \n", 1008 | " \n", 1009 | " \n", 1010 | " \n", 1011 | " \n", 1012 | " \n", 1013 | " \n", 1014 | " \n", 1015 | " \n", 1016 | " \n", 1017 | " \n", 1018 | " \n", 1019 | " \n", 1020 | " \n", 1021 | " \n", 1022 | " \n", 1023 | " \n", 1024 | " \n", 1025 | " \n", 1026 | " \n", 1027 | " \n", 1028 | " \n", 1029 | " \n", 1030 | " \n", 1031 | " \n", 1032 | " \n", 1033 | " \n", 1034 | " \n", 1035 | " \n", 1036 | " \n", 1037 | " \n", 1038 | " \n", 1039 | " \n", 1040 | " \n", 1041 | " \n", 1042 | " \n", 1043 | " \n", 1044 | " \n", 1045 | " \n", 1046 | " \n", 1047 | " \n", 1048 | " \n", 1049 | " \n", 1050 | " \n", 1051 | " \n", 1052 | " \n", 1053 | " \n", 1054 | " \n", 1055 | " \n", 1056 | " \n", 1057 | " \n", 1058 | " \n", 1059 | " \n", 1060 | " \n", 1061 | " \n", 1062 | " \n", 1063 | " \n", 1064 | " \n", 1065 | " \n", 1066 | " \n", 1067 | " \n", 1068 | " \n", 1069 | " \n", 1070 | " \n", 1071 | " \n", 1072 | " \n", 1073 | " \n", 1074 | " \n", 1075 | " \n", 1076 | " \n", 1077 | " \n", 1078 | " \n", 1079 | " \n", 1080 | " \n", 1081 | " \n", 1082 | " \n", 1083 | " \n", 1084 | " \n", 1085 | " \n", 1086 | " \n", 1087 | " \n", 1088 | " \n", 1089 | " \n", 1090 | " \n", 1091 | " \n", 1092 | " \n", 1093 | " \n", 1094 | " \n", 1095 | " \n", 1096 | " \n", 1097 | " \n", 1098 | " \n", 1099 | " \n", 1100 | " \n", 1101 | " \n", 1102 | " \n", 1103 | " \n", 1104 | " \n", 1105 | " \n", 1106 | " \n", 1107 | " \n", 1108 | " \n", 1109 | " \n", 1110 | " \n", 1111 | " \n", 1112 | " \n", 1113 | " \n", 1114 | " \n", 1115 | " \n", 1116 | " \n", 1117 | " \n", 1118 | " \n", 1119 | " \n", 1120 | " \n", 1121 | " \n", 1122 | " \n", 1123 | " \n", 1124 | " \n", 1125 | " \n", 1126 | " \n", 1127 | " \n", 1128 | " \n", 1129 | " \n", 1130 | " \n", 1131 | " \n", 1132 | " \n", 1133 | " \n", 1134 | " \n", 1135 | " \n", 1136 | " \n", 1137 | " \n", 1138 | " \n", 1139 | " \n", 1140 | " \n", 1141 | " \n", 1142 | " \n", 1143 | " \n", 1144 | " \n", 1145 | " \n", 1146 | " \n", 1147 | " \n", 1148 | " \n", 1149 | " \n", 1150 | " \n", 1151 | " \n", 1152 | " \n", 1153 | " \n", 1154 | " \n", 1155 | " \n", 1156 | " \n", 1157 | " \n", 1158 | " \n", 1159 | " \n", 1160 | " \n", 1161 | " \n", 1162 | " \n", 1163 | " \n", 1164 | " \n", 1165 | " \n", 1166 | " \n", 1167 | " \n", 1168 | " \n", 1169 | " \n", 1170 | " \n", 1171 | " \n", 1172 | " \n", 1173 | " \n", 1174 | " \n", 1175 | " \n", 1176 | " \n", 1177 | " \n", 1178 | " \n", 1179 | " \n", 1180 | " \n", 1181 | " \n", 1182 | " \n", 1183 | " \n", 1184 | " \n", 1185 | " \n", 1186 | " \n", 1187 | " \n", 1188 | " \n", 1189 | " \n", 1190 | " \n", 1191 | " \n", 1192 | " \n", 1193 | " \n", 1194 | " \n", 1195 | " \n", 1196 | " \n", 1197 | " \n", 1198 | " \n", 1199 | " \n", 1200 | " \n", 1201 | " \n", 1202 | " \n", 1203 | " \n", 1204 | " \n", 1205 | " \n", 1206 | " \n", 1207 | " \n", 1208 | " \n", 1209 | " \n", 1210 | " \n", 1211 | " \n", 1212 | " \n", 1213 | " \n", 1214 | " \n", 1215 | " \n", 1216 | " \n", 1217 | " \n", 1218 | " \n", 1219 | " \n", 1220 | " \n", 1221 | " \n", 1222 | " \n", 1223 | " \n", 1224 | " \n", 1225 | " \n", 1226 | " \n", 1227 | " \n", 1228 | " \n", 1229 | " \n", 1230 | " \n", 1231 | " \n", 1232 | " \n", 1233 | " \n", 1234 | " \n", 1235 | " \n", 1236 | " \n", 1237 | " \n", 1238 | " \n", 1239 | " \n", 1240 | " \n", 1241 | " \n", 1242 | " \n", 1243 | " \n", 1244 | " \n", 1245 | " \n", 1246 | " \n", 1247 | " \n", 1248 | " \n", 1249 | " \n", 1250 | " \n", 1251 | " \n", 1252 | " \n", 1253 | " \n", 1254 | " \n", 1255 | " \n", 1256 | " \n", 1257 | " \n", 1258 | " \n", 1259 | " \n", 1260 | " \n", 1261 | " \n", 1262 | " \n", 1263 | " \n", 1264 | " \n", 1265 | " \n", 1266 | " \n", 1267 | " \n", 1268 | " \n", 1269 | " \n", 1270 | " \n", 1271 | " \n", 1272 | " \n", 1273 | " \n", 1274 | " \n", 1275 | " \n", 1276 | " \n", 1277 | " \n", 1278 | " \n", 1279 | " \n", 1280 | " \n", 1281 | " \n", 1282 | " \n", 1283 | " \n", 1284 | " \n", 1285 | " \n", 1286 | " \n", 1287 | " \n", 1288 | " \n", 1289 | " \n", 1290 | " \n", 1291 | " \n", 1292 | " \n", 1293 | " \n", 1294 | " \n", 1295 | " \n", 1296 | " \n", 1297 | " \n", 1298 | " \n", 1299 | " \n", 1300 | " \n", 1301 | " \n", 1302 | " \n", 1303 | " \n", 1304 | " \n", 1305 | " \n", 1306 | " \n", 1307 | " \n", 1308 | " \n", 1309 | " \n", 1310 | " \n", 1311 | " \n", 1312 | " \n", 1313 | " \n", 1314 | " \n", 1315 | " \n", 1316 | " \n", 1317 | " \n", 1318 | " \n", 1319 | " \n", 1320 | " \n", 1321 | " \n", 1322 | " \n", 1323 | " \n", 1324 | " \n", 1325 | " \n", 1326 | " \n", 1327 | " \n", 1328 | " \n", 1329 | " \n", 1330 | " \n", 1331 | " \n", 1332 | " \n", 1333 | " \n", 1334 | " \n", 1335 | " \n", 1336 | " \n", 1337 | " \n", 1338 | " \n", 1339 | " \n", 1340 | " \n", 1341 | " \n", 1342 | " \n", 1343 | " \n", 1344 | " \n", 1345 | " \n", 1346 | " \n", 1347 | " \n", 1348 | " \n", 1349 | " \n", 1350 | " \n", 1351 | " \n", 1352 | " \n", 1353 | " \n", 1354 | " \n", 1355 | " \n", 1356 | " \n", 1357 | " \n", 1358 | " \n", 1359 | " \n", 1360 | " \n", 1361 | " \n", 1362 | " \n", 1363 | " \n", 1364 | " \n", 1365 | " \n", 1366 | " \n", 1367 | " \n", 1368 | " \n", 1369 | " \n", 1370 | " \n", 1371 | " \n", 1372 | " \n", 1373 | " \n", 1374 | " \n", 1375 | " \n", 1376 | " \n", 1377 | " \n", 1378 | " \n", 1379 | " \n", 1380 | " \n", 1381 | " \n", 1382 | " \n", 1383 | " \n", 1384 | " \n", 1385 | " \n", 1386 | " \n", 1387 | " \n", 1388 | " \n", 1389 | " \n", 1390 | " \n", 1391 | " \n", 1392 | " \n", 1393 | " \n", 1394 | " \n", 1395 | " \n", 1396 | " \n", 1397 | " \n", 1398 | " \n", 1399 | " \n", 1400 | " \n", 1401 | " \n", 1402 | " \n", 1403 | " \n", 1404 | " \n", 1405 | " \n", 1406 | " \n", 1407 | " \n", 1408 | " \n", 1409 | " \n", 1410 | " \n", 1411 | " \n", 1412 | " \n", 1413 | " \n", 1414 | " \n", 1415 | " \n", 1416 | " \n", 1417 | " \n", 1418 | " \n", 1419 | " \n", 1420 | " \n", 1421 | " \n", 1422 | " \n", 1423 | " \n", 1424 | " \n", 1425 | " \n", 1426 | " \n", 1427 | " \n", 1428 | " \n", 1429 | " \n", 1430 | " \n", 1431 | " \n", 1432 | " \n", 1433 | " \n", 1434 | " \n", 1435 | " \n", 1436 | " \n", 1437 | " \n", 1438 | " \n", 1439 | " \n", 1440 | " \n", 1441 | " \n", 1442 | " \n", 1443 | " \n", 1444 | " \n", 1445 | " \n", 1446 | " \n", 1447 | " \n", 1448 | " \n", 1449 | " \n", 1450 | " \n", 1451 | " \n", 1452 | " \n", 1453 | " \n", 1454 | " \n", 1455 | " \n", 1456 | " \n", 1457 | " \n", 1458 | " \n", 1459 | " \n", 1460 | " \n", 1461 | " \n", 1462 | " \n", 1463 | " \n", 1464 | " \n", 1465 | " \n", 1466 | " \n", 1467 | " \n", 1468 | " \n", 1469 | " \n", 1470 | " \n", 1471 | " \n", 1472 | " \n", 1473 | " \n", 1474 | " \n", 1475 | " \n", 1476 | " \n", 1477 | " \n", 1478 | " \n", 1479 | " \n", 1480 | " \n", 1481 | " \n", 1482 | " \n", 1483 | " \n", 1484 | " \n", 1485 | " \n", 1486 | " \n", 1487 | " \n", 1488 | " \n", 1489 | " \n", 1490 | " \n", 1491 | " \n", 1492 | "
currency_symboltotalAssetsintangibleAssetsotherCurrentAssetstotalLiabtotalStockholderEquityotherCurrentLiabcommonStockretainedEarningsotherLiab...netIncomeFromContinuingOpsnetIncomeApplicableToCommonSharescurrencyepsActualepsEstimateepsDifferencesurprisePercentadjusted_closeclosevolume
2008-09-30None51699000.0NoneNone251413000.0NoneNoneNone-204914000.0None...NoneNoneNaNNaNNaNNaNNaNNaNNaNNaN
2008-12-31USD51699000.0None2180000.0251413000.0None71607000.07000.0-204914000.06884000.0...0.00.0NaNNaNNaNNaNNaNNaNNaNNaN
2009-03-31NoneNoneNoneNoneNoneNoneNoneNoneNoneNone...0.00.0NaNNaNNaNNaNNaNNaNNaNNaN
2009-06-30USD155916000.0NoneNone386561000.0NoneNoneNone-236412000.0None...0.00.0NaNNaNNaNNaNNaNNaNNaNNaN
2009-09-30USD155916000.0NoneNone386561000.0NoneNoneNone-236412000.0None...0.00.0NaNNaNNaNNaNNaNNaNNaNNaN
2009-12-31USD130424000.0None4222000.0383947000.065702000.041661000.07000.0-260654000.06433000.0...0.00.0NaNNaNNaNNaNNaNNaNNaNNaN
2010-03-31USD145320000.0None4537000.0101141000.039928000.040143000.08000.0-290173000.015648000.0...0.00.0NaNNaNNaNNaNNaNNaNNaNNaN
2010-06-30USD147974000.0None6745000.0457749000.09450000.041123000.08000.0-328689000.023832000.0...0.00.0USD-0.0812NoneNoneNone4.766023.83085971954.0
2010-09-30USD361621000.0None8870000.0141698000.0219923000.039727000.093000.0-363624000.015247000.0...0.00.0USD-0.3700-0.43000.060013.95354.081020.40510983125.0
2010-12-31USD386082000.014508000.010839000.0179034000.0207048000.053661000.095000.0-414982000.021145000.0...0.00.0USD-0.4700-0.50000.030065.326026.6307089235.0
2011-03-31USD407289000.014531000.012225000.0239551000.0167738000.062079000.096000.0-463922000.023670000.0...0.00.0USD-0.4400-0.51000.070013.72555.550027.75057611699.0
2011-06-30USD646155000.014508000.09507000.0297703000.0348452000.03070000.0104000.0-522826000.024431000.0...-58903000.0-58903000.0USD-0.5300-0.5100-0.0200-3.92165.826029.1304733270.0
2011-09-30USD700250000.014508000.010962000.0406132000.0294118000.02266000.0104000.0-587903000.026290000.0...-65078000.0-65078000.0USD-0.5500-0.59000.04006.77974.878024.3906680270.0
2011-12-31USD713448000.014508000.09414000.0489403000.0224045000.02345000.0104000.0-669392000.026899000.0...0.00.0USD-0.6900-0.6300-0.0600-9.52385.712028.5601699300.0
2012-03-31USD761100000.014508000.07103000.0607226000.0153874000.02594000.0105000.0-759265000.027460000.0...-89873000.0-89873000.0USD-0.7600-0.6900-0.0700-10.14497.448037.2404431560.0
2012-06-30USD776869000.014508000.06920000.0714654000.062215000.02767000.0105000.0-864871000.027253000.0...-105603000.0-105603000.0USD-0.8900-0.92000.03003.26096.258031.2905628520.0
2012-09-30USD809177000.014392000.07775000.0837052000.0-27875000.02904000.0106000.0-975674000.030761000.0...-110804000.0-110804000.0USD-0.9200-0.9000-0.0200-2.22225.856029.28021716690.0
2012-12-31USD1114190000.014267000.08438000.0989490000.0124700000.01905000.0115000.0-1065606000.038922000.0...-89933000.0-89933000.0USD-0.6500-0.5300-0.1200-22.64156.774033.8702974230.0
2013-03-31USD1143778000.014150000.011100000.0975195000.0168583000.03701000.0115000.0-1054357000.040327000.0...11248000.011248000.0USD0.12000.04000.08002007.578037.8905793260.0
2013-06-30USD1887844000.014029000.013688000.01258418000.0629426000.029781000.0121000.0-1084858000.0183884000.0...-30502000.0-30502000.0USD0.2000-0.17000.3700217.647121.4720107.36028752155.0
2013-09-30USD2166209000.013837000.027260000.01602044000.0564165000.063739000.0123000.0-1123355000.0344156000.0...-38496000.0-38496000.0USD0.02400.02200.00209.090938.6740193.37044672704.0
2013-12-31USD2416930000.013930000.027574000.01749810000.0667120000.091882000.0123000.0-1139620000.0468855000.0...-16264000.0-16264000.0USD0.06600.04200.024057.142930.0858150.42921333550.0
2014-03-31USD4500410000.013662000.048869000.03588354000.0912056000.0112740000.0124000.0-1189420000.0567172000.0...-49800000.0-49800000.0USD0.02400.02000.00402041.6900208.45041900114.0
2014-06-30USD5054463000.013541000.061536000.04102130000.0952333000.0139436000.0125000.0-1251327000.0654628000.0...-61900000.0-61900000.0USD0.02200.00800.014017548.0120240.06024168010.0
2014-09-30USD5437533000.013420000.065467000.04479439000.0958094000.0161570000.0125000.0-1326041000.0752277000.0...-74708000.0-74708000.0USD0.0040-0.00200.006030048.5360242.68021240635.0
2014-12-31USD5849251000.00.094718000.04937541000.0911710000.0191651000.0126000.0-1433682000.0953394000.0...-107632000.0-107632000.0USD-0.02600.0620-0.0880-141.935544.4820222.41012010485.0
2015-03-31USD6120030000.00.0135756000.05294033000.0825997000.0226474000.0126000.0-1587841000.01147438000.0...-154181000.0-154181000.0USD-0.0720-0.10000.02802837.7540188.77025132845.0
2015-06-30USD6468185000.00.0106430000.05752251000.0715934000.0356227000.0127000.0-1772068000.01318247000.0...-184227000.0-184227000.0USD-0.0960-0.12000.02402053.6520268.26015434675.0
2015-09-30USD7547497000.00.0133855000.06232841000.01314656000.0433697000.0131000.0-2001926000.01651495000.0...-229858000.0-229858000.0USD-0.1740-0.1000-0.0740-7449.6800248.40024647910.0
2015-12-31USD8092460000.012816000.0125229000.07003516000.01088944000.0560792000.0131000.0-2322323000.02104822000.0...-320397000.0-320397000.0USD-0.17400.0219-0.1959-894.520548.0020240.01013575190.0
2016-03-31USD9191702000.00.0153757000.08221337000.0970365000.0709043000.0134000.0-2604590000.02506683000.0...-282267000.0-282267000.0USD-0.1140-0.13440.020415.178645.9540229.77040064359.0
2016-06-30USD11868952000.00.0144678000.09348658000.02520294000.01466488000.0148000.0-2897778000.02925106000.0...-293188000.0-293188000.0USD-0.2120-0.1246-0.0874-70.144542.4560212.28024215555.0
2016-09-30USD12592397000.00.0132978000.09911909000.02680488000.01520317000.0150000.0-2875900000.03374829000.0...21878000.021878000.0USD0.14200.00450.13753055.555640.8060204.03012931365.0
2016-12-31USD22664076000.0376145000.0194465000.017125990000.04752911000.01606489000.0161000.0-2997237000.04869302000.0...-219469000.0-121337000.0USD-0.1380-0.0981-0.0399-40.672842.7380213.69023213100.0
2017-03-31USD25053726000.0388608000.0271665000.019256932000.04987719000.01706428000.0161000.0-3343187000.05392532000.0...-397181000.0-330277000.0USD-0.2660-0.1603-0.1057-65.938955.6600278.30016473200.0
2017-06-30USD26043705000.0380847000.0431870000.019828967000.05105752000.01859762000.0163000.0-3679584000.05698054000.0...-401427000.0-336397000.0USD-0.2660-0.38370.117730.675072.3220361.61029242605.0
2017-09-30USD28107074000.0372238000.0459587000.022332357000.04711480000.02181154000.0168000.0-4298960000.05803642000.0...-671163000.0-619376000.0USD-0.5840-0.4580-0.1260-27.510968.2200341.10025535410.0
2017-12-31USD28655372000.0361502000.0423688000.023420784000.04237242000.02656505000.0169000.0-4974299000.05862062000.0...-770807000.0-675350000.0USD-0.6080-0.62970.02173.446162.2700311.35018885775.0
2018-03-31USD27271429000.0346428000.0499573000.021956858000.04450695000.02150400000.0170000.0-5051292000.04079624000.0...-784627000.0-709551000.0USD-0.6700-0.70510.03514.978053.2260266.13075853754.0
2018-06-30USD27910000000.0300406000.0568856000.023182423000.03906421000.02192705000.0170000.0-5768831000.02283763000.0...-742706000.0-717539000.0USD-0.6120-0.5639-0.0481-8.529968.5900342.95032461980.0
2018-09-30USD29262713000.0291476000.0483859000.023960408000.04508838000.02081707000.0171000.0-5457315000.02285172000.0...254673000.0311516000.0USD0.5800-0.01810.59813304.419952.9540264.770168248437.0
2018-12-31USD29739614000.0282492000.0558222000.023981974000.04923243000.01925733000.0173000.0-5317832000.02317802000.0...210078000.0139483000.0USD0.38600.4035-0.0175-4.337166.5600332.80031511690.0
2019-03-31USD28912524000.0273568000.0595858000.023444902000.04605596000.03717022000.0174000.0-5923305000.02797416000.0...-667645000.0-702135000.0USD-0.5800-0.1873-0.3927-209.663655.9720279.86029956690.0
2019-06-30USD31872597000.0327358000.0697754000.025302363000.05715393000.0526758000.0179000.0-6331639000.02823616000.0...-389262000.0-408334000.0USD-0.2240-0.0794-0.1446-182.115944.6920223.46034256919.0
2019-09-30USD32795000000.0351000000.0893000000.025913000000.06040000000.0441000000.0180000.0-6188000000.02784000000.0...150000000.0143000000.0USD0.3720-0.04630.4183903.455748.1740240.87029730805.0
2019-12-31USD34309000000.0339000000.0246000000.026842000000.06618000000.03636000000.0181000.0-6083000000.02905000000.0...132000000.0113000000.0USD0.41280.35060.062217.741083.6660418.33051462299.0
2020-03-31USD37250000000.0323000000.01045000000.027210000000.09173000000.05191000000.0185000.0-6104000000.02891000000.0...68000000.016000000.0USD0.2281-0.04150.2696649.6386104.8000524.00088857449.0
2020-06-30USD38135000000.0312000000.01218000000.027411000000.09855000000.05522000000.0186000.0-6000000000.03010000000.0...129000000.0104000000.0USD0.4360-0.03210.46811458.2555215.96201079.81084592499.0
2020-09-30USD45691000000.0318000000.01238000000.028799000000.016031000000.02953000000.01000000.0-5669000000.03151000000.0...369000000.0300000000.0USD0.76000.60420.155825.7862429.0100429.01048145566.0
2020-12-31USD52148000000.0313000000.01346000000.029073000000.022225000000.03569000000.01000000.0-5399000000.04614000000.0...296000000.0270000000.0USD0.80001.0514-0.2514-23.9110705.6700705.67049649930.0
2021-03-31USD52972000000.0299000000.01542000000.029108000000.023864000000.03764000000.01000000.0-4750000000.03247000000.0...464000000.0438000000.0USD0.93000.77870.151319.4298667.9300667.93033337289.0
2021-06-30USD55146000000.0283000000.01602000000.029501000000.025645000000.04453000000.01000000.0-3608000000.03210000000.0...1178000000.01142000000.0USD1.45000.97890.471148.1254679.7000679.70018924859.0
2021-09-30USD57834000000.0269000000.01746000000.029340000000.027053000000.06274000000.01000000.0-1990000000.04851000000.0...1659000000.01618000000.0USD1.86001.61430.245715.2202775.4800775.48017956000.0
\n", 1493 | "

53 rows × 91 columns

\n", 1494 | "
" 1495 | ], 1496 | "text/plain": [ 1497 | " currency_symbol totalAssets intangibleAssets otherCurrentAssets \\\n", 1498 | "2008-09-30 None 51699000.0 None None \n", 1499 | "2008-12-31 USD 51699000.0 None 2180000.0 \n", 1500 | "2009-03-31 None None None None \n", 1501 | "2009-06-30 USD 155916000.0 None None \n", 1502 | "2009-09-30 USD 155916000.0 None None \n", 1503 | "2009-12-31 USD 130424000.0 None 4222000.0 \n", 1504 | "2010-03-31 USD 145320000.0 None 4537000.0 \n", 1505 | "2010-06-30 USD 147974000.0 None 6745000.0 \n", 1506 | "2010-09-30 USD 361621000.0 None 8870000.0 \n", 1507 | "2010-12-31 USD 386082000.0 14508000.0 10839000.0 \n", 1508 | "2011-03-31 USD 407289000.0 14531000.0 12225000.0 \n", 1509 | "2011-06-30 USD 646155000.0 14508000.0 9507000.0 \n", 1510 | "2011-09-30 USD 700250000.0 14508000.0 10962000.0 \n", 1511 | "2011-12-31 USD 713448000.0 14508000.0 9414000.0 \n", 1512 | "2012-03-31 USD 761100000.0 14508000.0 7103000.0 \n", 1513 | "2012-06-30 USD 776869000.0 14508000.0 6920000.0 \n", 1514 | "2012-09-30 USD 809177000.0 14392000.0 7775000.0 \n", 1515 | "2012-12-31 USD 1114190000.0 14267000.0 8438000.0 \n", 1516 | "2013-03-31 USD 1143778000.0 14150000.0 11100000.0 \n", 1517 | "2013-06-30 USD 1887844000.0 14029000.0 13688000.0 \n", 1518 | "2013-09-30 USD 2166209000.0 13837000.0 27260000.0 \n", 1519 | "2013-12-31 USD 2416930000.0 13930000.0 27574000.0 \n", 1520 | "2014-03-31 USD 4500410000.0 13662000.0 48869000.0 \n", 1521 | "2014-06-30 USD 5054463000.0 13541000.0 61536000.0 \n", 1522 | "2014-09-30 USD 5437533000.0 13420000.0 65467000.0 \n", 1523 | "2014-12-31 USD 5849251000.0 0.0 94718000.0 \n", 1524 | "2015-03-31 USD 6120030000.0 0.0 135756000.0 \n", 1525 | "2015-06-30 USD 6468185000.0 0.0 106430000.0 \n", 1526 | "2015-09-30 USD 7547497000.0 0.0 133855000.0 \n", 1527 | "2015-12-31 USD 8092460000.0 12816000.0 125229000.0 \n", 1528 | "2016-03-31 USD 9191702000.0 0.0 153757000.0 \n", 1529 | "2016-06-30 USD 11868952000.0 0.0 144678000.0 \n", 1530 | "2016-09-30 USD 12592397000.0 0.0 132978000.0 \n", 1531 | "2016-12-31 USD 22664076000.0 376145000.0 194465000.0 \n", 1532 | "2017-03-31 USD 25053726000.0 388608000.0 271665000.0 \n", 1533 | "2017-06-30 USD 26043705000.0 380847000.0 431870000.0 \n", 1534 | "2017-09-30 USD 28107074000.0 372238000.0 459587000.0 \n", 1535 | "2017-12-31 USD 28655372000.0 361502000.0 423688000.0 \n", 1536 | "2018-03-31 USD 27271429000.0 346428000.0 499573000.0 \n", 1537 | "2018-06-30 USD 27910000000.0 300406000.0 568856000.0 \n", 1538 | "2018-09-30 USD 29262713000.0 291476000.0 483859000.0 \n", 1539 | "2018-12-31 USD 29739614000.0 282492000.0 558222000.0 \n", 1540 | "2019-03-31 USD 28912524000.0 273568000.0 595858000.0 \n", 1541 | "2019-06-30 USD 31872597000.0 327358000.0 697754000.0 \n", 1542 | "2019-09-30 USD 32795000000.0 351000000.0 893000000.0 \n", 1543 | "2019-12-31 USD 34309000000.0 339000000.0 246000000.0 \n", 1544 | "2020-03-31 USD 37250000000.0 323000000.0 1045000000.0 \n", 1545 | "2020-06-30 USD 38135000000.0 312000000.0 1218000000.0 \n", 1546 | "2020-09-30 USD 45691000000.0 318000000.0 1238000000.0 \n", 1547 | "2020-12-31 USD 52148000000.0 313000000.0 1346000000.0 \n", 1548 | "2021-03-31 USD 52972000000.0 299000000.0 1542000000.0 \n", 1549 | "2021-06-30 USD 55146000000.0 283000000.0 1602000000.0 \n", 1550 | "2021-09-30 USD 57834000000.0 269000000.0 1746000000.0 \n", 1551 | "\n", 1552 | " totalLiab totalStockholderEquity otherCurrentLiab commonStock \\\n", 1553 | "2008-09-30 251413000.0 None None None \n", 1554 | "2008-12-31 251413000.0 None 71607000.0 7000.0 \n", 1555 | "2009-03-31 None None None None \n", 1556 | "2009-06-30 386561000.0 None None None \n", 1557 | "2009-09-30 386561000.0 None None None \n", 1558 | "2009-12-31 383947000.0 65702000.0 41661000.0 7000.0 \n", 1559 | "2010-03-31 101141000.0 39928000.0 40143000.0 8000.0 \n", 1560 | "2010-06-30 457749000.0 9450000.0 41123000.0 8000.0 \n", 1561 | "2010-09-30 141698000.0 219923000.0 39727000.0 93000.0 \n", 1562 | "2010-12-31 179034000.0 207048000.0 53661000.0 95000.0 \n", 1563 | "2011-03-31 239551000.0 167738000.0 62079000.0 96000.0 \n", 1564 | "2011-06-30 297703000.0 348452000.0 3070000.0 104000.0 \n", 1565 | "2011-09-30 406132000.0 294118000.0 2266000.0 104000.0 \n", 1566 | "2011-12-31 489403000.0 224045000.0 2345000.0 104000.0 \n", 1567 | "2012-03-31 607226000.0 153874000.0 2594000.0 105000.0 \n", 1568 | "2012-06-30 714654000.0 62215000.0 2767000.0 105000.0 \n", 1569 | "2012-09-30 837052000.0 -27875000.0 2904000.0 106000.0 \n", 1570 | "2012-12-31 989490000.0 124700000.0 1905000.0 115000.0 \n", 1571 | "2013-03-31 975195000.0 168583000.0 3701000.0 115000.0 \n", 1572 | "2013-06-30 1258418000.0 629426000.0 29781000.0 121000.0 \n", 1573 | "2013-09-30 1602044000.0 564165000.0 63739000.0 123000.0 \n", 1574 | "2013-12-31 1749810000.0 667120000.0 91882000.0 123000.0 \n", 1575 | "2014-03-31 3588354000.0 912056000.0 112740000.0 124000.0 \n", 1576 | "2014-06-30 4102130000.0 952333000.0 139436000.0 125000.0 \n", 1577 | "2014-09-30 4479439000.0 958094000.0 161570000.0 125000.0 \n", 1578 | "2014-12-31 4937541000.0 911710000.0 191651000.0 126000.0 \n", 1579 | "2015-03-31 5294033000.0 825997000.0 226474000.0 126000.0 \n", 1580 | "2015-06-30 5752251000.0 715934000.0 356227000.0 127000.0 \n", 1581 | "2015-09-30 6232841000.0 1314656000.0 433697000.0 131000.0 \n", 1582 | "2015-12-31 7003516000.0 1088944000.0 560792000.0 131000.0 \n", 1583 | "2016-03-31 8221337000.0 970365000.0 709043000.0 134000.0 \n", 1584 | "2016-06-30 9348658000.0 2520294000.0 1466488000.0 148000.0 \n", 1585 | "2016-09-30 9911909000.0 2680488000.0 1520317000.0 150000.0 \n", 1586 | "2016-12-31 17125990000.0 4752911000.0 1606489000.0 161000.0 \n", 1587 | "2017-03-31 19256932000.0 4987719000.0 1706428000.0 161000.0 \n", 1588 | "2017-06-30 19828967000.0 5105752000.0 1859762000.0 163000.0 \n", 1589 | "2017-09-30 22332357000.0 4711480000.0 2181154000.0 168000.0 \n", 1590 | "2017-12-31 23420784000.0 4237242000.0 2656505000.0 169000.0 \n", 1591 | "2018-03-31 21956858000.0 4450695000.0 2150400000.0 170000.0 \n", 1592 | "2018-06-30 23182423000.0 3906421000.0 2192705000.0 170000.0 \n", 1593 | "2018-09-30 23960408000.0 4508838000.0 2081707000.0 171000.0 \n", 1594 | "2018-12-31 23981974000.0 4923243000.0 1925733000.0 173000.0 \n", 1595 | "2019-03-31 23444902000.0 4605596000.0 3717022000.0 174000.0 \n", 1596 | "2019-06-30 25302363000.0 5715393000.0 526758000.0 179000.0 \n", 1597 | "2019-09-30 25913000000.0 6040000000.0 441000000.0 180000.0 \n", 1598 | "2019-12-31 26842000000.0 6618000000.0 3636000000.0 181000.0 \n", 1599 | "2020-03-31 27210000000.0 9173000000.0 5191000000.0 185000.0 \n", 1600 | "2020-06-30 27411000000.0 9855000000.0 5522000000.0 186000.0 \n", 1601 | "2020-09-30 28799000000.0 16031000000.0 2953000000.0 1000000.0 \n", 1602 | "2020-12-31 29073000000.0 22225000000.0 3569000000.0 1000000.0 \n", 1603 | "2021-03-31 29108000000.0 23864000000.0 3764000000.0 1000000.0 \n", 1604 | "2021-06-30 29501000000.0 25645000000.0 4453000000.0 1000000.0 \n", 1605 | "2021-09-30 29340000000.0 27053000000.0 6274000000.0 1000000.0 \n", 1606 | "\n", 1607 | " retainedEarnings otherLiab ... netIncomeFromContinuingOps \\\n", 1608 | "2008-09-30 -204914000.0 None ... None \n", 1609 | "2008-12-31 -204914000.0 6884000.0 ... 0.0 \n", 1610 | "2009-03-31 None None ... 0.0 \n", 1611 | "2009-06-30 -236412000.0 None ... 0.0 \n", 1612 | "2009-09-30 -236412000.0 None ... 0.0 \n", 1613 | "2009-12-31 -260654000.0 6433000.0 ... 0.0 \n", 1614 | "2010-03-31 -290173000.0 15648000.0 ... 0.0 \n", 1615 | "2010-06-30 -328689000.0 23832000.0 ... 0.0 \n", 1616 | "2010-09-30 -363624000.0 15247000.0 ... 0.0 \n", 1617 | "2010-12-31 -414982000.0 21145000.0 ... 0.0 \n", 1618 | "2011-03-31 -463922000.0 23670000.0 ... 0.0 \n", 1619 | "2011-06-30 -522826000.0 24431000.0 ... -58903000.0 \n", 1620 | "2011-09-30 -587903000.0 26290000.0 ... -65078000.0 \n", 1621 | "2011-12-31 -669392000.0 26899000.0 ... 0.0 \n", 1622 | "2012-03-31 -759265000.0 27460000.0 ... -89873000.0 \n", 1623 | "2012-06-30 -864871000.0 27253000.0 ... -105603000.0 \n", 1624 | "2012-09-30 -975674000.0 30761000.0 ... -110804000.0 \n", 1625 | "2012-12-31 -1065606000.0 38922000.0 ... -89933000.0 \n", 1626 | "2013-03-31 -1054357000.0 40327000.0 ... 11248000.0 \n", 1627 | "2013-06-30 -1084858000.0 183884000.0 ... -30502000.0 \n", 1628 | "2013-09-30 -1123355000.0 344156000.0 ... -38496000.0 \n", 1629 | "2013-12-31 -1139620000.0 468855000.0 ... -16264000.0 \n", 1630 | "2014-03-31 -1189420000.0 567172000.0 ... -49800000.0 \n", 1631 | "2014-06-30 -1251327000.0 654628000.0 ... -61900000.0 \n", 1632 | "2014-09-30 -1326041000.0 752277000.0 ... -74708000.0 \n", 1633 | "2014-12-31 -1433682000.0 953394000.0 ... -107632000.0 \n", 1634 | "2015-03-31 -1587841000.0 1147438000.0 ... -154181000.0 \n", 1635 | "2015-06-30 -1772068000.0 1318247000.0 ... -184227000.0 \n", 1636 | "2015-09-30 -2001926000.0 1651495000.0 ... -229858000.0 \n", 1637 | "2015-12-31 -2322323000.0 2104822000.0 ... -320397000.0 \n", 1638 | "2016-03-31 -2604590000.0 2506683000.0 ... -282267000.0 \n", 1639 | "2016-06-30 -2897778000.0 2925106000.0 ... -293188000.0 \n", 1640 | "2016-09-30 -2875900000.0 3374829000.0 ... 21878000.0 \n", 1641 | "2016-12-31 -2997237000.0 4869302000.0 ... -219469000.0 \n", 1642 | "2017-03-31 -3343187000.0 5392532000.0 ... -397181000.0 \n", 1643 | "2017-06-30 -3679584000.0 5698054000.0 ... -401427000.0 \n", 1644 | "2017-09-30 -4298960000.0 5803642000.0 ... -671163000.0 \n", 1645 | "2017-12-31 -4974299000.0 5862062000.0 ... -770807000.0 \n", 1646 | "2018-03-31 -5051292000.0 4079624000.0 ... -784627000.0 \n", 1647 | "2018-06-30 -5768831000.0 2283763000.0 ... -742706000.0 \n", 1648 | "2018-09-30 -5457315000.0 2285172000.0 ... 254673000.0 \n", 1649 | "2018-12-31 -5317832000.0 2317802000.0 ... 210078000.0 \n", 1650 | "2019-03-31 -5923305000.0 2797416000.0 ... -667645000.0 \n", 1651 | "2019-06-30 -6331639000.0 2823616000.0 ... -389262000.0 \n", 1652 | "2019-09-30 -6188000000.0 2784000000.0 ... 150000000.0 \n", 1653 | "2019-12-31 -6083000000.0 2905000000.0 ... 132000000.0 \n", 1654 | "2020-03-31 -6104000000.0 2891000000.0 ... 68000000.0 \n", 1655 | "2020-06-30 -6000000000.0 3010000000.0 ... 129000000.0 \n", 1656 | "2020-09-30 -5669000000.0 3151000000.0 ... 369000000.0 \n", 1657 | "2020-12-31 -5399000000.0 4614000000.0 ... 296000000.0 \n", 1658 | "2021-03-31 -4750000000.0 3247000000.0 ... 464000000.0 \n", 1659 | "2021-06-30 -3608000000.0 3210000000.0 ... 1178000000.0 \n", 1660 | "2021-09-30 -1990000000.0 4851000000.0 ... 1659000000.0 \n", 1661 | "\n", 1662 | " netIncomeApplicableToCommonShares currency epsActual epsEstimate \\\n", 1663 | "2008-09-30 None NaN NaN NaN \n", 1664 | "2008-12-31 0.0 NaN NaN NaN \n", 1665 | "2009-03-31 0.0 NaN NaN NaN \n", 1666 | "2009-06-30 0.0 NaN NaN NaN \n", 1667 | "2009-09-30 0.0 NaN NaN NaN \n", 1668 | "2009-12-31 0.0 NaN NaN NaN \n", 1669 | "2010-03-31 0.0 NaN NaN NaN \n", 1670 | "2010-06-30 0.0 USD -0.0812 None \n", 1671 | "2010-09-30 0.0 USD -0.3700 -0.4300 \n", 1672 | "2010-12-31 0.0 USD -0.4700 -0.5000 \n", 1673 | "2011-03-31 0.0 USD -0.4400 -0.5100 \n", 1674 | "2011-06-30 -58903000.0 USD -0.5300 -0.5100 \n", 1675 | "2011-09-30 -65078000.0 USD -0.5500 -0.5900 \n", 1676 | "2011-12-31 0.0 USD -0.6900 -0.6300 \n", 1677 | "2012-03-31 -89873000.0 USD -0.7600 -0.6900 \n", 1678 | "2012-06-30 -105603000.0 USD -0.8900 -0.9200 \n", 1679 | "2012-09-30 -110804000.0 USD -0.9200 -0.9000 \n", 1680 | "2012-12-31 -89933000.0 USD -0.6500 -0.5300 \n", 1681 | "2013-03-31 11248000.0 USD 0.1200 0.0400 \n", 1682 | "2013-06-30 -30502000.0 USD 0.2000 -0.1700 \n", 1683 | "2013-09-30 -38496000.0 USD 0.0240 0.0220 \n", 1684 | "2013-12-31 -16264000.0 USD 0.0660 0.0420 \n", 1685 | "2014-03-31 -49800000.0 USD 0.0240 0.0200 \n", 1686 | "2014-06-30 -61900000.0 USD 0.0220 0.0080 \n", 1687 | "2014-09-30 -74708000.0 USD 0.0040 -0.0020 \n", 1688 | "2014-12-31 -107632000.0 USD -0.0260 0.0620 \n", 1689 | "2015-03-31 -154181000.0 USD -0.0720 -0.1000 \n", 1690 | "2015-06-30 -184227000.0 USD -0.0960 -0.1200 \n", 1691 | "2015-09-30 -229858000.0 USD -0.1740 -0.1000 \n", 1692 | "2015-12-31 -320397000.0 USD -0.1740 0.0219 \n", 1693 | "2016-03-31 -282267000.0 USD -0.1140 -0.1344 \n", 1694 | "2016-06-30 -293188000.0 USD -0.2120 -0.1246 \n", 1695 | "2016-09-30 21878000.0 USD 0.1420 0.0045 \n", 1696 | "2016-12-31 -121337000.0 USD -0.1380 -0.0981 \n", 1697 | "2017-03-31 -330277000.0 USD -0.2660 -0.1603 \n", 1698 | "2017-06-30 -336397000.0 USD -0.2660 -0.3837 \n", 1699 | "2017-09-30 -619376000.0 USD -0.5840 -0.4580 \n", 1700 | "2017-12-31 -675350000.0 USD -0.6080 -0.6297 \n", 1701 | "2018-03-31 -709551000.0 USD -0.6700 -0.7051 \n", 1702 | "2018-06-30 -717539000.0 USD -0.6120 -0.5639 \n", 1703 | "2018-09-30 311516000.0 USD 0.5800 -0.0181 \n", 1704 | "2018-12-31 139483000.0 USD 0.3860 0.4035 \n", 1705 | "2019-03-31 -702135000.0 USD -0.5800 -0.1873 \n", 1706 | "2019-06-30 -408334000.0 USD -0.2240 -0.0794 \n", 1707 | "2019-09-30 143000000.0 USD 0.3720 -0.0463 \n", 1708 | "2019-12-31 113000000.0 USD 0.4128 0.3506 \n", 1709 | "2020-03-31 16000000.0 USD 0.2281 -0.0415 \n", 1710 | "2020-06-30 104000000.0 USD 0.4360 -0.0321 \n", 1711 | "2020-09-30 300000000.0 USD 0.7600 0.6042 \n", 1712 | "2020-12-31 270000000.0 USD 0.8000 1.0514 \n", 1713 | "2021-03-31 438000000.0 USD 0.9300 0.7787 \n", 1714 | "2021-06-30 1142000000.0 USD 1.4500 0.9789 \n", 1715 | "2021-09-30 1618000000.0 USD 1.8600 1.6143 \n", 1716 | "\n", 1717 | " epsDifference surprisePercent adjusted_close close volume \n", 1718 | "2008-09-30 NaN NaN NaN NaN NaN \n", 1719 | "2008-12-31 NaN NaN NaN NaN NaN \n", 1720 | "2009-03-31 NaN NaN NaN NaN NaN \n", 1721 | "2009-06-30 NaN NaN NaN NaN NaN \n", 1722 | "2009-09-30 NaN NaN NaN NaN NaN \n", 1723 | "2009-12-31 NaN NaN NaN NaN NaN \n", 1724 | "2010-03-31 NaN NaN NaN NaN NaN \n", 1725 | "2010-06-30 None None 4.7660 23.830 85971954.0 \n", 1726 | "2010-09-30 0.0600 13.9535 4.0810 20.405 10983125.0 \n", 1727 | "2010-12-31 0.0300 6 5.3260 26.630 7089235.0 \n", 1728 | "2011-03-31 0.0700 13.7255 5.5500 27.750 57611699.0 \n", 1729 | "2011-06-30 -0.0200 -3.9216 5.8260 29.130 4733270.0 \n", 1730 | "2011-09-30 0.0400 6.7797 4.8780 24.390 6680270.0 \n", 1731 | "2011-12-31 -0.0600 -9.5238 5.7120 28.560 1699300.0 \n", 1732 | "2012-03-31 -0.0700 -10.1449 7.4480 37.240 4431560.0 \n", 1733 | "2012-06-30 0.0300 3.2609 6.2580 31.290 5628520.0 \n", 1734 | "2012-09-30 -0.0200 -2.2222 5.8560 29.280 21716690.0 \n", 1735 | "2012-12-31 -0.1200 -22.6415 6.7740 33.870 2974230.0 \n", 1736 | "2013-03-31 0.0800 200 7.5780 37.890 5793260.0 \n", 1737 | "2013-06-30 0.3700 217.6471 21.4720 107.360 28752155.0 \n", 1738 | "2013-09-30 0.0020 9.0909 38.6740 193.370 44672704.0 \n", 1739 | "2013-12-31 0.0240 57.1429 30.0858 150.429 21333550.0 \n", 1740 | "2014-03-31 0.0040 20 41.6900 208.450 41900114.0 \n", 1741 | "2014-06-30 0.0140 175 48.0120 240.060 24168010.0 \n", 1742 | "2014-09-30 0.0060 300 48.5360 242.680 21240635.0 \n", 1743 | "2014-12-31 -0.0880 -141.9355 44.4820 222.410 12010485.0 \n", 1744 | "2015-03-31 0.0280 28 37.7540 188.770 25132845.0 \n", 1745 | "2015-06-30 0.0240 20 53.6520 268.260 15434675.0 \n", 1746 | "2015-09-30 -0.0740 -74 49.6800 248.400 24647910.0 \n", 1747 | "2015-12-31 -0.1959 -894.5205 48.0020 240.010 13575190.0 \n", 1748 | "2016-03-31 0.0204 15.1786 45.9540 229.770 40064359.0 \n", 1749 | "2016-06-30 -0.0874 -70.1445 42.4560 212.280 24215555.0 \n", 1750 | "2016-09-30 0.1375 3055.5556 40.8060 204.030 12931365.0 \n", 1751 | "2016-12-31 -0.0399 -40.6728 42.7380 213.690 23213100.0 \n", 1752 | "2017-03-31 -0.1057 -65.9389 55.6600 278.300 16473200.0 \n", 1753 | "2017-06-30 0.1177 30.6750 72.3220 361.610 29242605.0 \n", 1754 | "2017-09-30 -0.1260 -27.5109 68.2200 341.100 25535410.0 \n", 1755 | "2017-12-31 0.0217 3.4461 62.2700 311.350 18885775.0 \n", 1756 | "2018-03-31 0.0351 4.9780 53.2260 266.130 75853754.0 \n", 1757 | "2018-06-30 -0.0481 -8.5299 68.5900 342.950 32461980.0 \n", 1758 | "2018-09-30 0.5981 3304.4199 52.9540 264.770 168248437.0 \n", 1759 | "2018-12-31 -0.0175 -4.3371 66.5600 332.800 31511690.0 \n", 1760 | "2019-03-31 -0.3927 -209.6636 55.9720 279.860 29956690.0 \n", 1761 | "2019-06-30 -0.1446 -182.1159 44.6920 223.460 34256919.0 \n", 1762 | "2019-09-30 0.4183 903.4557 48.1740 240.870 29730805.0 \n", 1763 | "2019-12-31 0.0622 17.7410 83.6660 418.330 51462299.0 \n", 1764 | "2020-03-31 0.2696 649.6386 104.8000 524.000 88857449.0 \n", 1765 | "2020-06-30 0.4681 1458.2555 215.9620 1079.810 84592499.0 \n", 1766 | "2020-09-30 0.1558 25.7862 429.0100 429.010 48145566.0 \n", 1767 | "2020-12-31 -0.2514 -23.9110 705.6700 705.670 49649930.0 \n", 1768 | "2021-03-31 0.1513 19.4298 667.9300 667.930 33337289.0 \n", 1769 | "2021-06-30 0.4711 48.1254 679.7000 679.700 18924859.0 \n", 1770 | "2021-09-30 0.2457 15.2202 775.4800 775.480 17956000.0 \n", 1771 | "\n", 1772 | "[53 rows x 91 columns]" 1773 | ] 1774 | }, 1775 | "execution_count": 20, 1776 | "metadata": {}, 1777 | "output_type": "execute_result" 1778 | } 1779 | ], 1780 | "source": [ 1781 | "df" 1782 | ] 1783 | }, 1784 | { 1785 | "cell_type": "markdown", 1786 | "metadata": {}, 1787 | "source": [ 1788 | "# Getting Fundamentals from Multiple Companies" 1789 | ] 1790 | }, 1791 | { 1792 | "cell_type": "code", 1793 | "execution_count": 23, 1794 | "metadata": {}, 1795 | "outputs": [], 1796 | "source": [ 1797 | "def getMultipleFunds(tickers, api_token):\n", 1798 | " \"\"\"\n", 1799 | " Gets fundamental data from multiple stock tickers given as a list. Returns\n", 1800 | " a large dataframe containing the concatenated information for all the given\n", 1801 | " tickers.\n", 1802 | " \"\"\"\n", 1803 | " \n", 1804 | " # Verifying if the list of tickers is compatible\n", 1805 | " available = client.get_exchange_symbols(\"US\")\n", 1806 | "\n", 1807 | " available = set(i['Code'] for i in available)\n", 1808 | " \n", 1809 | " tickers = [i for i in tickers if i in available]\n", 1810 | " \n", 1811 | " if len(tickers)==0:\n", 1812 | " return \"No valid tickers found.\"\n", 1813 | " \n", 1814 | " # Iterating through the tickers\n", 1815 | " dfs = {}\n", 1816 | " \n", 1817 | " for ticker in tickers:\n", 1818 | " \n", 1819 | " dfs[ticker] = formatFundamentals(ticker)\n", 1820 | " \n", 1821 | " \n", 1822 | " return pd.concat(dfs, axis=0)\n", 1823 | " " 1824 | ] 1825 | }, 1826 | { 1827 | "cell_type": "code", 1828 | "execution_count": 24, 1829 | "metadata": {}, 1830 | "outputs": [], 1831 | "source": [ 1832 | "df = getMultipleFunds([\"asdfase\"], api_key)" 1833 | ] 1834 | }, 1835 | { 1836 | "cell_type": "code", 1837 | "execution_count": 25, 1838 | "metadata": {}, 1839 | "outputs": [ 1840 | { 1841 | "data": { 1842 | "text/plain": [ 1843 | "'No valid tickers found.'" 1844 | ] 1845 | }, 1846 | "execution_count": 25, 1847 | "metadata": {}, 1848 | "output_type": "execute_result" 1849 | } 1850 | ], 1851 | "source": [ 1852 | "df#.loc['TSLA']" 1853 | ] 1854 | }, 1855 | { 1856 | "cell_type": "code", 1857 | "execution_count": null, 1858 | "metadata": {}, 1859 | "outputs": [], 1860 | "source": [] 1861 | }, 1862 | { 1863 | "cell_type": "code", 1864 | "execution_count": null, 1865 | "metadata": {}, 1866 | "outputs": [], 1867 | "source": [] 1868 | } 1869 | ], 1870 | "metadata": { 1871 | "kernelspec": { 1872 | "display_name": "Python 3", 1873 | "language": "python", 1874 | "name": "python3" 1875 | }, 1876 | "language_info": { 1877 | "codemirror_mode": { 1878 | "name": "ipython", 1879 | "version": 3 1880 | }, 1881 | "file_extension": ".py", 1882 | "mimetype": "text/x-python", 1883 | "name": "python", 1884 | "nbconvert_exporter": "python", 1885 | "pygments_lexer": "ipython3", 1886 | "version": "3.9.1" 1887 | } 1888 | }, 1889 | "nbformat": 4, 1890 | "nbformat_minor": 4 1891 | } 1892 | --------------------------------------------------------------------------------