├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md └── notebooks ├── ContosoFruitSales2016.xlsx ├── ContosoFruitSales2017.xlsx ├── ContosoFruitSales2018.xlsx ├── ContosoFruitSales2019.xlsx ├── ContosoFruitSales2020.xlsx └── Python 101 for MVPs.ipynb /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | * Demonstrating empathy and kindness toward other people 21 | * Being respectful of differing opinions, viewpoints, and experiences 22 | * Giving and gracefully accepting constructive feedback 23 | * Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | * Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | * The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | * Trolling, insulting or derogatory comments, and personal or political attacks 33 | * Public or private harassment 34 | * Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | * Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | email. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | https://www.contributor-covenant.org/faq. Translations are available at 128 | https://www.contributor-covenant.org/translations. 129 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Keyur Patel - MSFT 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Python Intro For MVPs 2 | 3 | Hi folks, welcome to this repro for resources on MVPs to learn and explore Python and Notebooks. Here you'll find a simple notebook to help you get started and additional examples. 4 | 5 | 6 | ## Setup 7 | To get setup, we recommend you start with the [Anconda Distribution](https://www.anaconda.com/). This will install Python, Jupyter Notebooks and a set of popular third party libaries. 8 | 9 | After running setup, clone this repo, navigate to the folder and run the command `jupyter notebook`. You can then select one of the notebooks and try running them on your own. 10 | 11 | ## Tutorials 12 | - [Python LinkedIn Learning](https://www.linkedin.com/learning/topics/python?u=3322) 13 | - [Practical Business Python](https://pbpython.com/excel-pandas-comp.html) - great blog on how to use Python in business scenarios, and examples comparing Pandas to common Excel operations 14 | - [Excel and Python LinkedIn Learning](https://www.linkedin.com/learning/using-python-with-excel/managing-excel-with-python?u=3322) 15 | - [Monte Carlo Simulations](https://pbpython.com/monte-carlo.html) 16 | - [Matplotlib examples](https://matplotlib.org/3.2.0/gallery/index.html) 17 | - [Automate the boring stuff](https://automatetheboringstuff.com/) 18 | 19 | ## Python in Excel 20 | Today, you can try a various 3rd party libraries to work with Excel data in Python. Here are a couple that we found are being used by companies today: 21 | 22 | ### XLWings 23 | https://www.xlwings.org 24 | 25 | ### PyXLL 26 | https://www.pyxll.com 27 | 28 | 29 | ## Feedback/Questions 30 | Please send feedback directly to Keyur Patel (you should have my email :)) 31 | -------------------------------------------------------------------------------- /notebooks/ContosoFruitSales2016.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keyur32/PythonIntroForMVPs/c5b935d30b454826232a6c2aa52e4b9fdd423d5e/notebooks/ContosoFruitSales2016.xlsx -------------------------------------------------------------------------------- /notebooks/ContosoFruitSales2017.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keyur32/PythonIntroForMVPs/c5b935d30b454826232a6c2aa52e4b9fdd423d5e/notebooks/ContosoFruitSales2017.xlsx -------------------------------------------------------------------------------- /notebooks/ContosoFruitSales2018.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keyur32/PythonIntroForMVPs/c5b935d30b454826232a6c2aa52e4b9fdd423d5e/notebooks/ContosoFruitSales2018.xlsx -------------------------------------------------------------------------------- /notebooks/ContosoFruitSales2019.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keyur32/PythonIntroForMVPs/c5b935d30b454826232a6c2aa52e4b9fdd423d5e/notebooks/ContosoFruitSales2019.xlsx -------------------------------------------------------------------------------- /notebooks/ContosoFruitSales2020.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keyur32/PythonIntroForMVPs/c5b935d30b454826232a6c2aa52e4b9fdd423d5e/notebooks/ContosoFruitSales2020.xlsx -------------------------------------------------------------------------------- /notebooks/Python 101 for MVPs.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Python 101 for MVPs \n", 8 | "Hello everyone. *Welcome to the Python tour at the Excel MVP Virtual summit*. \n", 9 | "\n", 10 | "First, this is a [juptyer](https://jupyter.org) notebook: \n", 11 | "\n", 12 | "The Jupyter Notebook is an open-source web application that allows you to create and share documents that contain live code, equations, visualizations and narrative text. Uses include: data cleaning and transformation, numerical simulation, statistical modeling, data visualization, machine learning, and much more.\n", 13 | "\n", 14 | "\n", 15 | "Let's explore some basics. Let's go!!\n" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 1, 21 | "metadata": {}, 22 | "outputs": [ 23 | { 24 | "name": "stdout", 25 | "output_type": "stream", 26 | "text": [ 27 | "hello world\n" 28 | ] 29 | } 30 | ], 31 | "source": [ 32 | "print(\"hello world\")" 33 | ] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": 3, 38 | "metadata": {}, 39 | "outputs": [ 40 | { 41 | "data": { 42 | "text/plain": [ 43 | "'Hello, Excel MVPS!!'" 44 | ] 45 | }, 46 | "execution_count": 3, 47 | "metadata": {}, 48 | "output_type": "execute_result" 49 | } 50 | ], 51 | "source": [ 52 | "#create a function with input and call it\n", 53 | "def say_hello(recipient):\n", 54 | " s = 'Hello, {}!'.format(recipient)\n", 55 | " return s\n", 56 | "\n", 57 | "#call the function\n", 58 | "say_hello('Excel MVPS!')\n" 59 | ] 60 | }, 61 | { 62 | "cell_type": "code", 63 | "execution_count": 4, 64 | "metadata": {}, 65 | "outputs": [ 66 | { 67 | "name": "stdout", 68 | "output_type": "stream", 69 | "text": [ 70 | "We're on time 0\n", 71 | "We're on time 1\n", 72 | "We're on time 2\n" 73 | ] 74 | } 75 | ], 76 | "source": [ 77 | "#loops\n", 78 | "for x in range(0, 3):\n", 79 | " print(\"We're on time %d\" % (x))" 80 | ] 81 | }, 82 | { 83 | "cell_type": "markdown", 84 | "metadata": {}, 85 | "source": [ 86 | "# Data wrangling \n", 87 | "\n", 88 | "Python is the most \"typical\" language for data analysis (of course we know Excel's formula language is the worlds most popular programming language). One of the reasons is due to it's awesome set of libaries. One of the most common for working with data is called *Pandas*.\n", 89 | "\n", 90 | "[Pandas](https://pandas.org) is a open source, fast and powerful library at handling data. Pandas lets you work with data across a variety of artifacts, in Excel like fashions. At core is a datastructre called the data frame, which even looks like a grid!\n", 91 | "\n", 92 | "![Pandas](https://pandas.pydata.org/docs/_images/01_table_dataframe1.svg)" 93 | ] 94 | }, 95 | { 96 | "cell_type": "code", 97 | "execution_count": 5, 98 | "metadata": {}, 99 | "outputs": [ 100 | { 101 | "data": { 102 | "text/html": [ 103 | "
\n", 104 | "\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 | "
NameAgeSex
0Braund, Mr. Owen Harris22male
1Allen, Mr. William Henry35male
2Bonnell, Miss. Elizabeth58female
\n", 147 | "
" 148 | ], 149 | "text/plain": [ 150 | " Name Age Sex\n", 151 | "0 Braund, Mr. Owen Harris 22 male\n", 152 | "1 Allen, Mr. William Henry 35 male\n", 153 | "2 Bonnell, Miss. Elizabeth 58 female" 154 | ] 155 | }, 156 | "execution_count": 5, 157 | "metadata": {}, 158 | "output_type": "execute_result" 159 | } 160 | ], 161 | "source": [ 162 | "#import the library into jupyter. Assumes libary has been pre-installled.\n", 163 | "import pandas as pd\n", 164 | "\n", 165 | "#pandas - simple example of creating a data frame from an array\n", 166 | "df = pd.DataFrame({\n", 167 | " \"Name\": [\"Braund, Mr. Owen Harris\",\n", 168 | " \"Allen, Mr. William Henry\",\n", 169 | " \"Bonnell, Miss. Elizabeth\"],\n", 170 | " \"Age\": [22, 35, 58],\n", 171 | " \"Sex\": [\"male\", \"male\", \"female\"]}\n", 172 | " )\n", 173 | "\n", 174 | "df.head()" 175 | ] 176 | }, 177 | { 178 | "cell_type": "code", 179 | "execution_count": 8, 180 | "metadata": {}, 181 | "outputs": [ 182 | { 183 | "data": { 184 | "text/html": [ 185 | "
\n", 186 | "\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 | "
accountProductSoldMonth
0ContosoApples42438October
1ContosoOranges17318October
2ContosoBananas4684October
3ContosoGrapes68786October
4ContosoApples84121November
\n", 247 | "
" 248 | ], 249 | "text/plain": [ 250 | " account Product Sold Month\n", 251 | "0 Contoso Apples 42438 October\n", 252 | "1 Contoso Oranges 17318 October\n", 253 | "2 Contoso Bananas 4684 October\n", 254 | "3 Contoso Grapes 68786 October\n", 255 | "4 Contoso Apples 84121 November" 256 | ] 257 | }, 258 | "execution_count": 8, 259 | "metadata": {}, 260 | "output_type": "execute_result" 261 | } 262 | ], 263 | "source": [ 264 | "#get contoso sales from 2018, Q3\n", 265 | "df = pd.read_excel(\"ContosoFruitSales2018.xlsx\", sheet_name=\"Q4\")\n", 266 | "\n", 267 | "#return top 10 results\n", 268 | "df.head(5)\n", 269 | "\n" 270 | ] 271 | }, 272 | { 273 | "cell_type": "code", 274 | "execution_count": 9, 275 | "metadata": {}, 276 | "outputs": [ 277 | { 278 | "data": { 279 | "text/html": [ 280 | "
\n", 281 | "\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 | "
accountProductSoldMonth
0ContosoApples71865January
1ContosoOranges92297January
2ContosoBananas23616January
3ContosoGrapes15358January
4ContosoApples24189February
5ContosoOranges63779February
6ContosoBananas69531February
7ContosoGrapes35509February
8ContosoApples76239March
9ContosoOranges72733March
10ContosoBananas81046March
11ContosoGrapes78507March
12ContosoApples88487April
13ContosoOranges21380April
14ContosoBananas89342April
\n", 412 | "
" 413 | ], 414 | "text/plain": [ 415 | " account Product Sold Month\n", 416 | "0 Contoso Apples 71865 January\n", 417 | "1 Contoso Oranges 92297 January\n", 418 | "2 Contoso Bananas 23616 January\n", 419 | "3 Contoso Grapes 15358 January\n", 420 | "4 Contoso Apples 24189 February\n", 421 | "5 Contoso Oranges 63779 February\n", 422 | "6 Contoso Bananas 69531 February\n", 423 | "7 Contoso Grapes 35509 February\n", 424 | "8 Contoso Apples 76239 March\n", 425 | "9 Contoso Oranges 72733 March\n", 426 | "10 Contoso Bananas 81046 March\n", 427 | "11 Contoso Grapes 78507 March\n", 428 | "12 Contoso Apples 88487 April\n", 429 | "13 Contoso Oranges 21380 April\n", 430 | "14 Contoso Bananas 89342 April" 431 | ] 432 | }, 433 | "execution_count": 9, 434 | "metadata": {}, 435 | "output_type": "execute_result" 436 | } 437 | ], 438 | "source": [ 439 | "#read excel file and combine all sheets into one frame\n", 440 | "df19 = pd.concat(pd.read_excel(\"ContosoFruitSales2019.xlsx\", sheet_name=None), ignore_index=True)\n", 441 | "\n", 442 | "#Get top 10\n", 443 | "df19.head(15)" 444 | ] 445 | }, 446 | { 447 | "cell_type": "code", 448 | "execution_count": 12, 449 | "metadata": {}, 450 | "outputs": [ 451 | { 452 | "data": { 453 | "text/html": [ 454 | "
\n", 455 | "\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 | "
ProductSoldMonthyear
0Apples99570January2016
1Oranges84034January2016
2Bananas15058January2016
3Grapes27598January2016
4Apples70748February2016
5Oranges1841February2016
6Bananas8901February2016
7Grapes62200February2016
8Apples79989March2016
9Oranges70740March2016
10Bananas71115March2016
11Grapes46715March2016
12Apples23334April2016
13Oranges41950April2016
14Bananas39434April2016
15Grapes92935April2016
16Apples78823May2016
17Oranges2032May2016
18Bananas62869May2016
19Grapes50047May2016
20Apples6203June2016
21Oranges4222June2016
22Bananas65264June2016
23Grapes44017June2016
24Apples79551July2016
25Oranges80975July2016
26Bananas1135July2016
27Grapes68736July2016
28Apples35040August2016
29Oranges69935August2016
...............
162Bananas81464May2019
163Grapes51971May2019
164Apples23855June2019
165Oranges39505June2019
166Bananas35115June2019
167Grapes91640June2019
168Apples70437July2019
169Oranges54404July2019
170Bananas29828July2019
171Grapes40243July2019
172Apples98316August2019
173Oranges25846August2019
174Bananas83626August2019
175Grapes17399August2019
176Apples15681September2019
177Oranges78789September2019
178Bananas35906September2019
179Grapes93161September2019
180Apples82440October2019
181Oranges35805October2019
182Bananas31209October2019
183Grapes90637October2019
184Apples1686November2019
185Oranges62390November2019
186Bananas18912November2019
187Grapes74282November2019
188Apples88092December2019
189Oranges87054December2019
190Bananas34707December2019
191Grapes32648December2019
\n", 908 | "

192 rows × 4 columns

\n", 909 | "
" 910 | ], 911 | "text/plain": [ 912 | " Product Sold Month year\n", 913 | "0 Apples 99570 January 2016\n", 914 | "1 Oranges 84034 January 2016\n", 915 | "2 Bananas 15058 January 2016\n", 916 | "3 Grapes 27598 January 2016\n", 917 | "4 Apples 70748 February 2016\n", 918 | ".. ... ... ... ...\n", 919 | "187 Grapes 74282 November 2019\n", 920 | "188 Apples 88092 December 2019\n", 921 | "189 Oranges 87054 December 2019\n", 922 | "190 Bananas 34707 December 2019\n", 923 | "191 Grapes 32648 December 2019\n", 924 | "\n", 925 | "[192 rows x 4 columns]" 926 | ] 927 | }, 928 | "execution_count": 12, 929 | "metadata": {}, 930 | "output_type": "execute_result" 931 | } 932 | ], 933 | "source": [ 934 | "#Get Contoso Sales for past 4 years\n", 935 | "all_data = pd.DataFrame()\n", 936 | "years = [\"2016\", \"2017\", \"2018\", \"2019\"]\n", 937 | "\n", 938 | "for year in years:\n", 939 | " #get sales by year\n", 940 | " df = pd.concat(pd.read_excel(\"ContosoFruitSales\" + year + \".xlsx\", sheet_name=None), ignore_index=True)\n", 941 | "\n", 942 | " #add a year column, and set it's value\n", 943 | " df[\"year\"] = year\n", 944 | " \n", 945 | " #append the year sales to master data frame\n", 946 | " all_data = all_data.append(df,ignore_index=True)\n", 947 | " \n", 948 | "#drop the account column\n", 949 | "all_data = all_data.drop(columns=[\"account\"])\n", 950 | "all_data" 951 | ] 952 | }, 953 | { 954 | "cell_type": "markdown", 955 | "metadata": {}, 956 | "source": [ 957 | "# Data Visualizations\n", 958 | "You can use libraries to create custom data visualizations. Here we'll use a couple of popular libraries - matplotlib for basic charting and seaborn" 959 | ] 960 | }, 961 | { 962 | "cell_type": "code", 963 | "execution_count": 13, 964 | "metadata": {}, 965 | "outputs": [], 966 | "source": [ 967 | "#import the libraries. Note: you many need to \"pip install \"\n", 968 | "%matplotlib inline \n", 969 | "\n", 970 | "#import matplotlib.pyplot as plt\n", 971 | "import seaborn as sns" 972 | ] 973 | }, 974 | { 975 | "cell_type": "code", 976 | "execution_count": 14, 977 | "metadata": {}, 978 | "outputs": [ 979 | { 980 | "data": { 981 | "text/plain": [ 982 | "" 983 | ] 984 | }, 985 | "execution_count": 14, 986 | "metadata": {}, 987 | "output_type": "execute_result" 988 | }, 989 | { 990 | "data": { 991 | "image/png": "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\n", 992 | "text/plain": [ 993 | "
" 994 | ] 995 | }, 996 | "metadata": { 997 | "needs_background": "light" 998 | }, 999 | "output_type": "display_data" 1000 | } 1001 | ], 1002 | "source": [ 1003 | "#create x-y scatterhttps://localhost:8888/notebooks/notebooks/Python%20101%20for%20MVPs.ipynb#\n", 1004 | "sns.lmplot('Product', 'Sold', data=all_data, fit_reg=False)" 1005 | ] 1006 | }, 1007 | { 1008 | "cell_type": "code", 1009 | "execution_count": 16, 1010 | "metadata": {}, 1011 | "outputs": [ 1012 | { 1013 | "data": { 1014 | "text/html": [ 1015 | "
\n", 1016 | "\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 | "
xy
03233
17793
26198
3369
48189
\n", 1065 | "
" 1066 | ], 1067 | "text/plain": [ 1068 | " x y\n", 1069 | "0 32 33\n", 1070 | "1 77 93\n", 1071 | "2 61 98\n", 1072 | "3 3 69\n", 1073 | "4 81 89" 1074 | ] 1075 | }, 1076 | "execution_count": 16, 1077 | "metadata": {}, 1078 | "output_type": "execute_result" 1079 | } 1080 | ], 1081 | "source": [ 1082 | "import random as random\n", 1083 | "\n", 1084 | "#create a dataframe with random numbers\n", 1085 | "df = pd.DataFrame()\n", 1086 | "df['x'] = random.sample(range(1, 100), 25)\n", 1087 | "df['y'] = random.sample(range(1, 100), 25)\n", 1088 | "df.head()" 1089 | ] 1090 | }, 1091 | { 1092 | "cell_type": "code", 1093 | "execution_count": 19, 1094 | "metadata": {}, 1095 | "outputs": [ 1096 | { 1097 | "data": { 1098 | "text/plain": [ 1099 | "" 1100 | ] 1101 | }, 1102 | "execution_count": 19, 1103 | "metadata": {}, 1104 | "output_type": "execute_result" 1105 | }, 1106 | { 1107 | "data": { 1108 | "image/png": "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\n", 1109 | "text/plain": [ 1110 | "
" 1111 | ] 1112 | }, 1113 | "metadata": { 1114 | "needs_background": "light" 1115 | }, 1116 | "output_type": "display_data" 1117 | } 1118 | ], 1119 | "source": [ 1120 | "#create heatmap\n", 1121 | "sns.heatmap([df.x, df.y], annot=True, fmt=\"d\")" 1122 | ] 1123 | }, 1124 | { 1125 | "cell_type": "markdown", 1126 | "metadata": {}, 1127 | "source": [ 1128 | "# Analysis/ML in Python\n", 1129 | "\n", 1130 | "Python has an awesome set of data science libraries. Some popular ones are numpy, scikit-learn, tensorflow, pytorch for data processing and machine learning.\n", 1131 | "\n", 1132 | "Let's use one called Stocker. Stocker is a open source python tool that uses ANN (Artificial Nueral Network) to predict the stock's close price for the next business day: https://github.com/jcamiloangarita/stocker." 1133 | ] 1134 | }, 1135 | { 1136 | "cell_type": "code", 1137 | "execution_count": 20, 1138 | "metadata": {}, 1139 | "outputs": [ 1140 | { 1141 | "name": "stderr", 1142 | "output_type": "stream", 1143 | "text": [ 1144 | "Using TensorFlow backend.\n" 1145 | ] 1146 | }, 1147 | { 1148 | "data": { 1149 | "text/plain": [ 1150 | "[139.1, 5.64, '2020-03-19']" 1151 | ] 1152 | }, 1153 | "execution_count": 20, 1154 | "metadata": {}, 1155 | "output_type": "execute_result" 1156 | } 1157 | ], 1158 | "source": [ 1159 | "import stocker\n", 1160 | "\n", 1161 | "def predict(stock):\n", 1162 | " return stocker.predict.tomorrow(stock)\n", 1163 | "\n", 1164 | "\n", 1165 | "#imagine a UDF in Excel\n", 1166 | "predict(\"MSFT\")" 1167 | ] 1168 | } 1169 | ], 1170 | "metadata": { 1171 | "kernelspec": { 1172 | "display_name": "Python 3", 1173 | "language": "python", 1174 | "name": "python3" 1175 | }, 1176 | "language_info": { 1177 | "codemirror_mode": { 1178 | "name": "ipython", 1179 | "version": 3 1180 | }, 1181 | "file_extension": ".py", 1182 | "mimetype": "text/x-python", 1183 | "name": "python", 1184 | "nbconvert_exporter": "python", 1185 | "pygments_lexer": "ipython3", 1186 | "version": "3.7.4" 1187 | } 1188 | }, 1189 | "nbformat": 4, 1190 | "nbformat_minor": 2 1191 | } 1192 | --------------------------------------------------------------------------------