diff --git a/notebooks/.ipynb_checkpoints/switchup_scraper-checkpoint.ipynb b/notebooks/.ipynb_checkpoints/switchup_scraper-checkpoint.ipynb new file mode 100644 index 0000000..32348f0 --- /dev/null +++ b/notebooks/.ipynb_checkpoints/switchup_scraper-checkpoint.ipynb @@ -0,0 +1,1884 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "TuwSdWZlgveP" + }, + "source": [ + "# SQL Project\n", + "You were hired by Ironhack to perform an Analytics Consulting Project entitled: competitive landscape.\n", + "\n", + "Your mission is to create and populate an appropriate database with many coding schools that are our competition, as well as design an suitable queries that answer business questions of interest (to be defined by you)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hXDGm8_RgG-K" + }, + "source": [ + "**Suggested Steps in the Project:**\n", + "\n", + "\n", + "* Read this notebook and understand each function. Comment the code appropriately\n", + "\n", + "* Populate the list of schools with a wider variety of schools (how are you going to get the school ID?)\n", + "\n", + "* Take a look at the obtained dataframes. What dimensions do you have? what keys do you have? how could the different dataframes be connected?\n", + "\n", + "* Go back to the drawing board and try to create an entity relationship diagram for tables available\n", + "\n", + "* Once you have the schemas you want, you will need to:\n", + " - create the suitable SQL queries to create the tables and populate them\n", + " - run these queries using the appropriate Python connectors\n", + " \n", + "* Bonus: How will this datamodel be updated in the future? Please write auxiliary functions that test the database for data quality issues. For example: how could you make sure you only include the most recent comments when you re-run the script?\n", + "\n", + "\n", + "# Suggested Deliverables\n", + "\n", + "* 5-6 minute presentation of data model created, decision process and business analysis proposed\n", + "\n", + "* exported .sql file with the final schema\n", + "\n", + "* Supporting python files used to generate all logic\n", + "\n", + "* High level documentation explaining tables designed and focusing on update methods\n", + "\n", + "Crucial hint: check out the following tutorial:\n", + "https://www.dataquest.io/blog/sql-insert-tutorial/\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "CHQ8IJLpgBsH" + }, + "source": [ + "# you must populate this dict with the schools required -> try talking to the teaching team about this\n", + "\n", + "\n", + "schools = { \n", + "'ironhack' : 10828,\n", + "'app-academy' : 10525,\n", + "'springboard' : 11035 \n", + "}\n", + "\n", + "import re\n", + "import pandas as pd\n", + "from pandas.io.json import json_normalize\n", + "import requests\n", + "\n", + "\n", + "\n", + "def get_comments_school(school):\n", + " TAG_RE = re.compile(r'<[^>]+>')\n", + " # defines url to make api call to data -> dynamic with school if you want to scrape competition\n", + " url = \"https://www.switchup.org/chimera/v1/school-review-list?mainTemplate=school-review-list&path=%2Fbootcamps%2F\" + school + \"&isDataTarget=false&page=3&perPage=10000&simpleHtml=true&truncationLength=250\"\n", + " #makes get request and converts answer to json\n", + " # url defines the page of all the information, request is made, and information is returned to data variable\n", + " data = requests.get(url).json()\n", + " #converts json to dataframe\n", + " reviews = pd.DataFrame(data['content']['reviews'])\n", + " \n", + " #aux function to apply regex and remove tags\n", + " def remove_tags(x):\n", + " return TAG_RE.sub('',x)\n", + " reviews['review_body'] = reviews['body'].apply(remove_tags)\n", + " reviews['school'] = school\n", + " return reviews" + ], + "execution_count": 1, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "XxRrTBYVDXUk" + }, + "source": [], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "cxSFN100h6Ej", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "53481633-d00b-4176-cd08-4f8ae2e57dd6" + }, + "source": [ + "# could you write this as a list comprehension? ;)\n", + "comments = []\n", + "\n", + "for school in schools.keys():\n", + " print(school)\n", + " comments.append(get_comments_school(school))\n", + "\n", + "comments = pd.concat(comments)" + ], + "execution_count": 2, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "ironhack\n", + "app-academy\n", + "springboard\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "IL9osdr_iLZg", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "2a6446f4-cc4d-485a-d7f2-02e900137888" + }, + "source": [ + "comments" + ], + "execution_count": 3, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " id name anonymous hostProgramName \\\n", + "0 300701 Omezzine Meysour False None \n", + "1 300599 Anonymous True None \n", + "2 300597 Pim Blom False None \n", + "3 300526 Nancy Omozokpea False None \n", + "4 300130 Michiel van der merwe False None \n", + "... ... ... ... ... \n", + "1467 234894 Stephanie S. False None \n", + "1468 234877 Joe Fang False None \n", + "1469 234838 Zeina False None \n", + "1470 242681 Jean False None \n", + "1471 234178 Ben False None \n", + "\n", + " graduatingYear isAlumni jobTitle \\\n", + "0 2023.0 False Credit risk analyst \n", + "1 2023.0 False Product designer \n", + "2 2023.0 False \n", + "3 2023.0 False \n", + "4 2023.0 False Data engineer \n", + "... ... ... ... \n", + "1467 2015.0 True Website Manager-UX Lead \n", + "1468 2015.0 True UX Designer \n", + "1469 2016.0 True Senior Graphic Designer \n", + "1470 2016.0 True Lead Designer/Creative Director \n", + "1471 2016.0 True None \n", + "\n", + " tagline \\\n", + "0 Amazing experience! \n", + "1 Great bootcamp if you want to change career! \n", + "2 Great way to become a web dev \n", + "3 It was well structured and very encouraging Team \n", + "4 Awesome \n", + "... ... \n", + "1467 Excellent and comprehensive UX course \n", + "1468 Springboard helped me start my career in UX \n", + "1469 Highly recommended \n", + "1470 A way to stay current for the highly motivated! \n", + "1471 Springboard is an excellent course for self dr... \n", + "\n", + " body \\\n", + "0

Before joi... \n", + "1

My goal wa... \n", + "2

It is a in... \n", + "3

The Bootca... \n", + "4

Pros Lots ... \n", + "... ... \n", + "1467

The UX Design Wor... \n", + "1468

Just some backgro... \n", + "1469

I enjoyed the pro... \n", + "1470

This was my first... \n", + "1471

I really enjoyed ... \n", + "\n", + " rawBody ... queryDate \\\n", + "0

Before joining the bootcamp, I was skeptica... ... 2023-04-27 \n", + "1

My goal was to change career from Sales to ... ... 2023-04-25 \n", + "2

It is a intense 9 week program, but you lea... ... 2023-04-25 \n", + "3

The Bootcamp was well structured and had a ... ... 2023-04-21 \n", + "4

Pros Lots and lots of help and useful infor... ... 2023-04-11 \n", + "... ... ... ... \n", + "1467 The UX Design Workshop gave me a great underst... ... 2016-12-15 \n", + "1468 Just some background information on myself, I ... ... 2016-12-15 \n", + "1469 I enjoyed the program very much, gained a lot ... ... 2016-12-15 \n", + "1470 This was my first online experience and it did... ... 2016-12-12 \n", + "1471 I really enjoyed my time with the Springboard ... ... 2016-12-10 \n", + "\n", + " program user overallScore comments overall \\\n", + "0 Data Analytics Bootcamp {'image': None} 5.0 [] 5.0 \n", + "1 UX/UI Design Bootcamp {'image': None} 5.0 [] 5.0 \n", + "2 Web Development Bootcamp {'image': None} 4.0 [] 4.0 \n", + "3 Data Analytics Bootcamp {'image': None} 4.3 [] 5.0 \n", + "4 Cybersecurity Part-Time {'image': None} 4.3 [] 4.0 \n", + "... ... ... ... ... ... \n", + "1467 UX Design {'image': None} 5.0 [] 5.0 \n", + "1468 UX Design {'image': None} 5.0 [] 5.0 \n", + "1469 UX Design {'image': None} 3.7 [] 4.0 \n", + "1470 UX Design {'image': None} 5.0 [] 5.0 \n", + "1471 UX Design {'image': None} 4.7 [] 5.0 \n", + "\n", + " curriculum jobSupport review_body \\\n", + "0 5.0 5.0 Before joining the bootcamp, I was skeptical a... \n", + "1 5.0 5.0 My goal was to change career from Sales to Pro... \n", + "2 4.0 4.0 It is a intense 9 week program, but you learn ... \n", + "3 5.0 3.0 The Bootcamp was well structured and had a lot... \n", + "4 5.0 4.0 Pros Lots and lots of help and useful informat... \n", + "... ... ... ... \n", + "1467 5.0 5.0 The UX Design Workshop gave me a great underst... \n", + "1468 5.0 5.0 Just some background information on myself, I ... \n", + "1469 4.0 3.0 I enjoyed the program very much, gained a lot ... \n", + "1470 5.0 5.0 This was my first online experience and it did... \n", + "1471 5.0 4.0 I really enjoyed my time with the Springboard ... \n", + "\n", + " school \n", + "0 ironhack \n", + "1 ironhack \n", + "2 ironhack \n", + "3 ironhack \n", + "4 ironhack \n", + "... ... \n", + "1467 springboard \n", + "1468 springboard \n", + "1469 springboard \n", + "1470 springboard \n", + "1471 springboard \n", + "\n", + "[3918 rows x 21 columns]" + ], + "text/html": [ + "\n", + "

\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnameanonymoushostProgramNamegraduatingYearisAlumnijobTitletaglinebodyrawBody...queryDateprogramuseroverallScorecommentsoverallcurriculumjobSupportreview_bodyschool
0300701Omezzine MeysourFalseNone2023.0FalseCredit risk analystAmazing experience!<span class=\"truncatable\"><p></p><p>Before joi...<p>Before joining the bootcamp, I was skeptica......2023-04-27Data Analytics Bootcamp{'image': None}5.0[]5.05.05.0Before joining the bootcamp, I was skeptical a...ironhack
1300599AnonymousTrueNone2023.0FalseProduct designerGreat bootcamp if you want to change career!<span class=\"truncatable\"><p></p><p>My goal wa...<p>My goal was to change career from Sales to ......2023-04-25UX/UI Design Bootcamp{'image': None}5.0[]5.05.05.0My goal was to change career from Sales to Pro...ironhack
2300597Pim BlomFalseNone2023.0FalseGreat way to become a web dev<span class=\"truncatable\"><p></p><p>It is a in...<p>It is a intense 9 week program, but you lea......2023-04-25Web Development Bootcamp{'image': None}4.0[]4.04.04.0It is a intense 9 week program, but you learn ...ironhack
3300526Nancy OmozokpeaFalseNone2023.0FalseIt was well structured and very encouraging Team<span class=\"truncatable\"><p></p><p>The Bootca...<p>The Bootcamp was well structured and had a ......2023-04-21Data Analytics Bootcamp{'image': None}4.3[]5.05.03.0The Bootcamp was well structured and had a lot...ironhack
4300130Michiel van der merweFalseNone2023.0FalseData engineerAwesome<span class=\"truncatable\"><p></p><p>Pros Lots ...<p>Pros Lots and lots of help and useful infor......2023-04-11Cybersecurity Part-Time{'image': None}4.3[]4.05.04.0Pros Lots and lots of help and useful informat...ironhack
..................................................................
1467234894Stephanie S.FalseNone2015.0TrueWebsite Manager-UX LeadExcellent and comprehensive UX course<span class=\"truncatable\"><p>The UX Design Wor...The UX Design Workshop gave me a great underst......2016-12-15UX Design{'image': None}5.0[]5.05.05.0The UX Design Workshop gave me a great underst...springboard
1468234877Joe FangFalseNone2015.0TrueUX DesignerSpringboard helped me start my career in UX<span class=\"truncatable\"><p>Just some backgro...Just some background information on myself, I ......2016-12-15UX Design{'image': None}5.0[]5.05.05.0Just some background information on myself, I ...springboard
1469234838ZeinaFalseNone2016.0TrueSenior Graphic DesignerHighly recommended<span class=\"truncatable\"><p>I enjoyed the pro...I enjoyed the program very much, gained a lot ......2016-12-15UX Design{'image': None}3.7[]4.04.03.0I enjoyed the program very much, gained a lot ...springboard
1470242681JeanFalseNone2016.0TrueLead Designer/Creative DirectorA way to stay current for the highly motivated!<span class=\"truncatable\"><p>This was my first...This was my first online experience and it did......2016-12-12UX Design{'image': None}5.0[]5.05.05.0This was my first online experience and it did...springboard
1471234178BenFalseNone2016.0TrueNoneSpringboard is an excellent course for self dr...<span class=\"truncatable\"><p>I really enjoyed ...I really enjoyed my time with the Springboard ......2016-12-10UX Design{'image': None}4.7[]5.05.04.0I really enjoyed my time with the Springboard ...springboard
\n", + "

3918 rows × 21 columns

\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 3 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "V_SXOtPxiNNY", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "70c3dcfb-11a9-43b0-a877-cc86d386c79e" + }, + "source": [ + "from pandas.io.json import json_normalize\n", + "\n", + "def get_school_info(school, school_id):\n", + " url = 'https://www.switchup.org/chimera/v1/bootcamp-data?mainTemplate=bootcamp-data%2Fdescription&path=%2Fbootcamps%2F'+ str(school) + '&isDataTarget=false&bootcampId='+ str(school_id) + '&logoTag=logo&truncationLength=250&readMoreOmission=...&readMoreText=Read%20More&readLessText=Read%20Less'\n", + "\n", + " data = requests.get(url).json()\n", + "\n", + " data.keys()\n", + "\n", + " courses = data['content']['courses']\n", + " courses_df = pd.DataFrame(courses, columns= ['courses'])\n", + "\n", + " locations = data['content']['locations']\n", + " locations_df = json_normalize(locations)\n", + "\n", + " badges_df = pd.DataFrame(data['content']['meritBadges'])\n", + " \n", + " website = data['content']['webaddr']\n", + " description = data['content']['description']\n", + " logoUrl = data['content']['logoUrl']\n", + " school_df = pd.DataFrame([website,description,logoUrl]).T\n", + " school_df.columns = ['website','description','LogoUrl']\n", + "\n", + " locations_df['school'] = school\n", + " courses_df['school'] = school\n", + " badges_df['school'] = school\n", + " school_df['school'] = school\n", + " \n", + "\n", + " locations_df['school_id'] = school_id\n", + " courses_df['school_id'] = school_id\n", + " badges_df['school_id'] = school_id\n", + " school_df['school_id'] = school_id\n", + "\n", + " return locations_df, courses_df, badges_df, school_df\n", + "\n", + "locations_list = []\n", + "courses_list = []\n", + "badges_list = []\n", + "schools_list = []\n", + "\n", + "for school, id in schools.items():\n", + " print(school)\n", + " a,b,c,d = get_school_info(school,id)\n", + " \n", + " locations_list.append(a)\n", + " courses_list.append(b)\n", + " badges_list.append(c)\n", + " schools_list.append(d)\n", + "\n" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "ironhack\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":14: FutureWarning: pandas.io.json.json_normalize is deprecated, use pandas.json_normalize instead.\n", + " locations_df = json_normalize(locations)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "app-academy\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":14: FutureWarning: pandas.io.json.json_normalize is deprecated, use pandas.json_normalize instead.\n", + " locations_df = json_normalize(locations)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "springboard\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":14: FutureWarning: pandas.io.json.json_normalize is deprecated, use pandas.json_normalize instead.\n", + " locations_df = json_normalize(locations)\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "9qAfH6JnP3Gd", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "d9a4a626-f581-49c5-d22a-ab606fa73741" + }, + "source": [ + "locations_list" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[ id description country.id country.name country.abbrev \\\n", + " 0 15901 Berlin, Germany 57.0 Germany DE \n", + " 1 16022 Mexico City, Mexico 29.0 Mexico MX \n", + " 2 16086 Amsterdam, Netherlands 59.0 Netherlands NL \n", + " 3 16088 Sao Paulo, Brazil 42.0 Brazil BR \n", + " 4 16109 Paris, France 38.0 France FR \n", + " 5 16375 Miami, FL, United States 1.0 United States US \n", + " 6 16376 Madrid, Spain 12.0 Spain ES \n", + " 7 16377 Barcelona, Spain 12.0 Spain ES \n", + " 8 16709 Lisbon, Portugal 28.0 Portugal PT \n", + " 9 17233 Online NaN NaN NaN \n", + " \n", + " city.id city.name city.keyword state.id state.name state.abbrev \\\n", + " 0 31156.0 Berlin berlin NaN NaN NaN \n", + " 1 31175.0 Mexico City mexico-city NaN NaN NaN \n", + " 2 31168.0 Amsterdam amsterdam NaN NaN NaN \n", + " 3 31121.0 Sao Paulo sao-paulo NaN NaN NaN \n", + " 4 31136.0 Paris paris NaN NaN NaN \n", + " 5 31.0 Miami miami 11.0 Florida FL \n", + " 6 31052.0 Madrid madrid NaN NaN NaN \n", + " 7 31170.0 Barcelona barcelona NaN NaN NaN \n", + " 8 31075.0 Lisbon lisbon NaN NaN NaN \n", + " 9 NaN NaN NaN 1.0 Online Online \n", + " \n", + " state.keyword school school_id \n", + " 0 NaN ironhack 10828 \n", + " 1 NaN ironhack 10828 \n", + " 2 NaN ironhack 10828 \n", + " 3 NaN ironhack 10828 \n", + " 4 NaN ironhack 10828 \n", + " 5 florida ironhack 10828 \n", + " 6 NaN ironhack 10828 \n", + " 7 NaN ironhack 10828 \n", + " 8 NaN ironhack 10828 \n", + " 9 online ironhack 10828 ,\n", + " id description country.id country.name \\\n", + " 0 15704 San Francisco, CA, United States 1.0 United States \n", + " 1 15705 New York City, NY, United States 1.0 United States \n", + " 2 15862 Online NaN NaN \n", + " \n", + " country.abbrev state.id state.name state.abbrev state.keyword city.id \\\n", + " 0 US 6 California CA california 13.0 \n", + " 1 US 34 New York NY new-york 1507.0 \n", + " 2 NaN 1 Online Online online NaN \n", + " \n", + " city.name city.keyword school school_id \n", + " 0 San Francisco san-francisco app-academy 10525 \n", + " 1 NYC new-york-city app-academy 10525 \n", + " 2 NaN NaN app-academy 10525 ,\n", + " id description state.id state.name state.abbrev state.keyword \\\n", + " 0 16013 Online 1 Online Online online \n", + " \n", + " school school_id \n", + " 0 springboard 11035 ]" + ] + }, + "metadata": {}, + "execution_count": 5 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "sH4qeK_8iSzr", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 488 + }, + "outputId": "e255b7cb-2a63-4a86-bc8b-6c3f6b51af2c" + }, + "source": [ + "locations = pd.concat(locations_list)\n", + "locations" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " id description country.id country.name \\\n", + "0 15901 Berlin, Germany 57.0 Germany \n", + "1 16022 Mexico City, Mexico 29.0 Mexico \n", + "2 16086 Amsterdam, Netherlands 59.0 Netherlands \n", + "3 16088 Sao Paulo, Brazil 42.0 Brazil \n", + "4 16109 Paris, France 38.0 France \n", + "5 16375 Miami, FL, United States 1.0 United States \n", + "6 16376 Madrid, Spain 12.0 Spain \n", + "7 16377 Barcelona, Spain 12.0 Spain \n", + "8 16709 Lisbon, Portugal 28.0 Portugal \n", + "9 17233 Online NaN NaN \n", + "0 15704 San Francisco, CA, United States 1.0 United States \n", + "1 15705 New York City, NY, United States 1.0 United States \n", + "2 15862 Online NaN NaN \n", + "0 16013 Online NaN NaN \n", + "\n", + " country.abbrev city.id city.name city.keyword state.id state.name \\\n", + "0 DE 31156.0 Berlin berlin NaN NaN \n", + "1 MX 31175.0 Mexico City mexico-city NaN NaN \n", + "2 NL 31168.0 Amsterdam amsterdam NaN NaN \n", + "3 BR 31121.0 Sao Paulo sao-paulo NaN NaN \n", + "4 FR 31136.0 Paris paris NaN NaN \n", + "5 US 31.0 Miami miami 11.0 Florida \n", + "6 ES 31052.0 Madrid madrid NaN NaN \n", + "7 ES 31170.0 Barcelona barcelona NaN NaN \n", + "8 PT 31075.0 Lisbon lisbon NaN NaN \n", + "9 NaN NaN NaN NaN 1.0 Online \n", + "0 US 13.0 San Francisco san-francisco 6.0 California \n", + "1 US 1507.0 NYC new-york-city 34.0 New York \n", + "2 NaN NaN NaN NaN 1.0 Online \n", + "0 NaN NaN NaN NaN 1.0 Online \n", + "\n", + " state.abbrev state.keyword school school_id \n", + "0 NaN NaN ironhack 10828 \n", + "1 NaN NaN ironhack 10828 \n", + "2 NaN NaN ironhack 10828 \n", + "3 NaN NaN ironhack 10828 \n", + "4 NaN NaN ironhack 10828 \n", + "5 FL florida ironhack 10828 \n", + "6 NaN NaN ironhack 10828 \n", + "7 NaN NaN ironhack 10828 \n", + "8 NaN NaN ironhack 10828 \n", + "9 Online online ironhack 10828 \n", + "0 CA california app-academy 10525 \n", + "1 NY new-york app-academy 10525 \n", + "2 Online online app-academy 10525 \n", + "0 Online online springboard 11035 " + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
iddescriptioncountry.idcountry.namecountry.abbrevcity.idcity.namecity.keywordstate.idstate.namestate.abbrevstate.keywordschoolschool_id
015901Berlin, Germany57.0GermanyDE31156.0BerlinberlinNaNNaNNaNNaNironhack10828
116022Mexico City, Mexico29.0MexicoMX31175.0Mexico Citymexico-cityNaNNaNNaNNaNironhack10828
216086Amsterdam, Netherlands59.0NetherlandsNL31168.0AmsterdamamsterdamNaNNaNNaNNaNironhack10828
316088Sao Paulo, Brazil42.0BrazilBR31121.0Sao Paulosao-pauloNaNNaNNaNNaNironhack10828
416109Paris, France38.0FranceFR31136.0ParisparisNaNNaNNaNNaNironhack10828
516375Miami, FL, United States1.0United StatesUS31.0Miamimiami11.0FloridaFLfloridaironhack10828
616376Madrid, Spain12.0SpainES31052.0MadridmadridNaNNaNNaNNaNironhack10828
716377Barcelona, Spain12.0SpainES31170.0BarcelonabarcelonaNaNNaNNaNNaNironhack10828
816709Lisbon, Portugal28.0PortugalPT31075.0LisbonlisbonNaNNaNNaNNaNironhack10828
917233OnlineNaNNaNNaNNaNNaNNaN1.0OnlineOnlineonlineironhack10828
015704San Francisco, CA, United States1.0United StatesUS13.0San Franciscosan-francisco6.0CaliforniaCAcaliforniaapp-academy10525
115705New York City, NY, United States1.0United StatesUS1507.0NYCnew-york-city34.0New YorkNYnew-yorkapp-academy10525
215862OnlineNaNNaNNaNNaNNaNNaN1.0OnlineOnlineonlineapp-academy10525
016013OnlineNaNNaNNaNNaNNaNNaN1.0OnlineOnlineonlinespringboard11035
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 5 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "eGw9AuxjiTaG", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 363 + }, + "outputId": "c8616f5a-c53e-4618-df1c-9d767199d190" + }, + "source": [ + "courses = pd.concat(courses_list)\n", + "courses.head(10)" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " courses school school_id\n", + "0 Cyber Security Bootcamp ironhack 10828\n", + "1 Cybersecurity Part-Time ironhack 10828\n", + "2 Data Analytics Bootcamp ironhack 10828\n", + "3 Data Analytics Part-Time ironhack 10828\n", + "4 UX/UI Design Bootcamp ironhack 10828\n", + "5 UX/UI Design Part-Time ironhack 10828\n", + "6 Web Development Bootcamp ironhack 10828\n", + "7 Web Development Part-Time ironhack 10828\n", + "0 16-week Software Engineering Program app-academy 10525\n", + "1 Bootcamp Prep app-academy 10525" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
coursesschoolschool_id
0Cyber Security Bootcampironhack10828
1Cybersecurity Part-Timeironhack10828
2Data Analytics Bootcampironhack10828
3Data Analytics Part-Timeironhack10828
4UX/UI Design Bootcampironhack10828
5UX/UI Design Part-Timeironhack10828
6Web Development Bootcampironhack10828
7Web Development Part-Timeironhack10828
016-week Software Engineering Programapp-academy10525
1Bootcamp Prepapp-academy10525
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 6 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "j---orWLiWs1", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 206 + }, + "outputId": "b2a667ec-e30e-475d-eafe-d82f2f1b7bc1" + }, + "source": [ + "badges = pd.concat(badges_list)\n", + "badges.head()" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " name keyword \\\n", + "0 Available Online available_online \n", + "1 Verified Outcomes verified_outcomes \n", + "2 Flexible Classes flexible_classes \n", + "0 Available Online available_online \n", + "1 Flexible Classes flexible_classes \n", + "\n", + " description school school_id \n", + "0

School offers fully online courses

ironhack 10828 \n", + "1

School publishes a third-party verified out... ironhack 10828 \n", + "2

School offers part-time and evening classes... ironhack 10828 \n", + "0

School offers fully online courses

app-academy 10525 \n", + "1

School offers part-time and evening classes... app-academy 10525 " + ], + "text/html": [ + "\n", + "

\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namekeyworddescriptionschoolschool_id
0Available Onlineavailable_online<p>School offers fully online courses</p>ironhack10828
1Verified Outcomesverified_outcomes<p>School publishes a third-party verified out...ironhack10828
2Flexible Classesflexible_classes<p>School offers part-time and evening classes...ironhack10828
0Available Onlineavailable_online<p>School offers fully online courses</p>app-academy10525
1Flexible Classesflexible_classes<p>School offers part-time and evening classes...app-academy10525
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 7 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "kWLmzVpmiZD2", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 143 + }, + "outputId": "db0685d2-5be6-40c3-fe69-9e36b3ac055f" + }, + "source": [ + "# any data cleaning still missing here? take a look at the description\n", + "schools = pd.concat(schools_list)\n", + "schools.head()" + ], + "execution_count": 8, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " website \\\n", + "0 www.ironhack.com/en \n", + "0 appacademy.io \n", + "0 www.springboard.com/?utm_source=switchup&utm_m... \n", + "\n", + " description \\\n", + "0

Ironhack is a glo... \n", + "0

Founded in 2012, ... \n", + "0

Springboard is an... \n", + "\n", + " LogoUrl school school_id \n", + "0 https://d92mrp7hetgfk.cloudfront.net/images/si... ironhack 10828 \n", + "0 https://d92mrp7hetgfk.cloudfront.net/images/si... app-academy 10525 \n", + "0 https://d92mrp7hetgfk.cloudfront.net/images/si... springboard 11035 " + ], + "text/html": [ + "\n", + "

\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
websitedescriptionLogoUrlschoolschool_id
0www.ironhack.com/en<span class=\"truncatable\"><p>Ironhack is a glo...https://d92mrp7hetgfk.cloudfront.net/images/si...ironhack10828
0appacademy.io<span class=\"truncatable\"><p>Founded in 2012, ...https://d92mrp7hetgfk.cloudfront.net/images/si...app-academy10525
0www.springboard.com/?utm_source=switchup&utm_m...<span class=\"truncatable\"><p>Springboard is an...https://d92mrp7hetgfk.cloudfront.net/images/si...springboard11035
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 8 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "_AFkSNlsb9z0" + }, + "source": [], + "execution_count": 8, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/notebooks/SQLProjectPresentationv2.pptx b/notebooks/SQLProjectPresentationv2.pptx new file mode 100644 index 0000000..24b0478 Binary files /dev/null and b/notebooks/SQLProjectPresentationv2.pptx differ diff --git a/notebooks/SQLProjectScript.sql b/notebooks/SQLProjectScript.sql new file mode 100644 index 0000000..fe53265 --- /dev/null +++ b/notebooks/SQLProjectScript.sql @@ -0,0 +1,187 @@ +USE Ironhack_SQL; + +SELECT * +FROM courses + +SELECT * +FROM locations + +SELECT * +FROM badges + +SELECT * +FROM reviews + +SELECT * +FROM websites + +SELECT * +FROM program_cost +ORDER BY Program ASC + +SELECT school, COUNT(*) AS review_count +FROM reviews +GROUP BY school +ORDER BY review_count DESC; + +SELECT school, AVG(overall) AS overall_mean +FROM reviews +GROUP BY school +ORDER BY overall_mean DESC; + +SELECT school, AVG(curriculum) AS curriculum_mean +FROM reviews +GROUP BY school +ORDER BY curriculum_mean DESC; + +SELECT school, AVG(jobSupport) AS job_mean +FROM reviews +GROUP BY school +ORDER BY job_mean DESC; + +SELECT school, AVG(jobSupport)*2 AS job_mean +FROM reviews +WHERE school IN ( + SELECT school + FROM reviews + GROUP BY school + HAVING COUNT(*) > 250 +) +GROUP BY school +ORDER BY job_mean DESC; +-- Explain this number: 303 + +SELECT school, AVG(overall)*2 AS overall_mean +FROM reviews +WHERE school IN ( + SELECT school + FROM reviews + GROUP BY school + HAVING COUNT(*) > 250 +) +GROUP BY school +ORDER BY overall_mean DESC; + +SELECT school, AVG(jobSupport)*2 AS job_mean +FROM reviews +WHERE school IN ( + SELECT school + FROM reviews + GROUP BY school + HAVING COUNT(*) > 250 +) +GROUP BY school +ORDER BY job_mean DESC; +-- Explain this number: 303 + +SELECT school, AVG(curriculum)*2 AS cur_mean +FROM reviews +WHERE school IN ( + SELECT school + FROM reviews + GROUP BY school + HAVING COUNT(*) > 200 +) +GROUP BY school +ORDER BY cur_mean DESC; + +-- Calculate averages for Ironhack +SELECT + 'Ironhack' AS school, + AVG(overall)*2 AS overall_avg, + AVG(curriculum)*2 AS curriculum_avg, + AVG(jobSupport)*2 AS jobSupport_avg +FROM + reviews +WHERE + school = 'ironhack' + +UNION ALL + +-- Calculate averages for all other schools with more than 300 reviews +SELECT + 'Other Schools' AS school, + AVG(overall)*2 AS overall_avg, + AVG(curriculum)*2 AS curriculum_avg, + AVG(jobSupport)*2 AS jobSupport_avg +FROM + reviews +WHERE + school != 'ironhack' + AND school IN ( + SELECT school + FROM reviews + GROUP BY school + HAVING COUNT(*) > 300 + ); + + +SELECT + School, AVG(cost) AS avg_cost +FROM program_cost +GROUP BY school; + +SELECT * +FROM program_costs + +SELECT id, COUNT(*) +FROM program_costs +GROUP BY id +HAVING COUNT(*) > 1; +ALTER TABLE program_costs +ADD PRIMARY KEY (id); + + +-- Change 1 to 0 to allow DB changes +SET SQL_SAFE_UPDATES = 1; +DELETE FROM program_costs +WHERE cost = 0; + +SELECT + program_costs.school, + ROUND(AVG(program_costs.cost)) AS avg_cost, + ROUND(AVG(reviews.overall)) AS avg_overall, + ROUND(AVG(reviews.curriculum)) AS curriculum_avg, + ROUND(AVG(reviews.jobSupport)) AS jobSupport_avg +FROM + program_costs +INNER JOIN + reviews ON program_costs.program = reviews.program +GROUP BY + program_costs.school +ORDER BY + avg_overall DESC; + +-- Change column names-- + +ALTER TABLE locations +CHANGE `country.abbrev` country_abbrev VARCHAR(255); + +SELECT + 'Ironhack' AS school, + locations.country_name, + ROUND(AVG(reviews.overall)) AS overall_avg, + ROUND(AVG(reviews.curriculum)) AS curriculum_avg, + ROUND(AVG(reviews.jobSupport)) AS jobSupport_avg +FROM + reviews +INNER JOIN locations ON reviews.school = locations.school +WHERE + reviews.school = 'ironhack' +GROUP BY + locations.country_name +UNION ALL +-- Calculate averages for all other schools by location +SELECT + 'Other Schools' AS school, + locations.country_name, + ROUND(AVG(reviews.overall)) AS overall_avg, + ROUND(AVG(reviews.curriculum)) AS curriculum_avg, + ROUND(AVG(reviews.jobSupport)) AS jobSupport_avg +FROM + reviews +INNER JOIN locations ON reviews.school = locations.school +WHERE + reviews.school != 'ironhack' +GROUP BY + locations.country_name; \ No newline at end of file diff --git a/notebooks/switchup_scraper.ipynb b/notebooks/switchup_scraper.ipynb index 32348f0..40dea3e 100644 --- a/notebooks/switchup_scraper.ipynb +++ b/notebooks/switchup_scraper.ipynb @@ -1,1884 +1,1604 @@ { - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "TuwSdWZlgveP" + }, + "source": [ + "# SQL Project\n", + "You were hired by Ironhack to perform an Analytics Consulting Project entitled: competitive landscape.\n", + "\n", + "Your mission is to create and populate an appropriate database with many coding schools that are our competition, as well as design an suitable queries that answer business questions of interest (to be defined by you)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hXDGm8_RgG-K" + }, + "source": [ + "**Suggested Steps in the Project:**\n", + "\n", + "\n", + "* Read this notebook and understand each function. Comment the code appropriately\n", + "\n", + "* Populate the list of schools with a wider variety of schools (how are you going to get the school ID?)\n", + "\n", + "* Take a look at the obtained dataframes. What dimensions do you have? what keys do you have? how could the different dataframes be connected?\n", + "\n", + "* Go back to the drawing board and try to create an entity relationship diagram for tables available\n", + "\n", + "* Once you have the schemas you want, you will need to:\n", + " - create the suitable SQL queries to create the tables and populate them\n", + " - run these queries using the appropriate Python connectors\n", + " \n", + "* Bonus: How will this datamodel be updated in the future? Please write auxiliary functions that test the database for data quality issues. For example: how could you make sure you only include the most recent comments when you re-run the script?\n", + "\n", + "\n", + "# Suggested Deliverables\n", + "\n", + "* 5-6 minute presentation of data model created, decision process and business analysis proposed\n", + "\n", + "* exported .sql file with the final schema\n", + "\n", + "* Supporting python files used to generate all logic\n", + "\n", + "* High level documentation explaining tables designed and focusing on update methods\n", + "\n", + "Crucial hint: check out the following tutorial:\n", + "https://www.dataquest.io/blog/sql-insert-tutorial/\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "id": "CHQ8IJLpgBsH" + }, + "outputs": [], + "source": [ + "# you must populate this dict with the schools required -> try talking to the teaching team about this\n", + "\n", + "\n", + "schools = { \n", + "'ironhack' : 10828,\n", + "'app-academy' : 10525,\n", + "'springboard' : 11035,\n", + "'udacity' : 11118,\n", + "'maven-analytics' : 11740,\n", + "'colaberry' : 11718,\n", + "'tripleten' : 11225\n", + "}\n", + "\n", + "import re\n", + "import pandas as pd\n", + "from pandas import json_normalize\n", + "import requests\n", + "\n", + "\n", + "\n", + "def get_comments_school(school):\n", + " TAG_RE = re.compile(r'<[^>]+>')\n", + " # defines url to make api call to data -> dynamic with school if you want to scrape competition\n", + " url = \"https://www.switchup.org/chimera/v1/school-review-list?mainTemplate=school-review-list&path=%2Fbootcamps%2F\" + school + \"&isDataTarget=false&page=3&perPage=10000&simpleHtml=true&truncationLength=250\"\n", + " #makes get request and converts answer to json\n", + " # url defines the page of all the information, request is made, and information is returned to data variable\n", + " data = requests.get(url).json()\n", + " #converts json to dataframe\n", + " reviews = pd.DataFrame(data['content']['reviews'])\n", + " \n", + " #aux function to apply regex and remove tags\n", + " def remove_tags(x):\n", + " return TAG_RE.sub('',x)\n", + " reviews['review_body'] = reviews['body'].apply(remove_tags)\n", + " reviews['school'] = school\n", + " return reviews" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { "colab": { - "provenance": [] + "base_uri": "https://localhost:8080/" }, - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" + "id": "cxSFN100h6Ej", + "outputId": "53481633-d00b-4176-cd08-4f8ae2e57dd6" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ironhack\n", + "app-academy\n", + "springboard\n", + "udacity\n", + "maven-analytics\n", + "colaberry\n", + "tripleten\n" + ] } + ], + "source": [ + "# could you write this as a list comprehension? ;)\n", + "comments = []\n", + "\n", + "for school in schools.keys():\n", + " print(school)\n", + " comments.append(get_comments_school(school))\n", + "\n", + "comments = pd.concat(comments)" + ] }, - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "TuwSdWZlgveP" - }, - "source": [ - "# SQL Project\n", - "You were hired by Ironhack to perform an Analytics Consulting Project entitled: competitive landscape.\n", - "\n", - "Your mission is to create and populate an appropriate database with many coding schools that are our competition, as well as design an suitable queries that answer business questions of interest (to be defined by you)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "hXDGm8_RgG-K" - }, - "source": [ - "**Suggested Steps in the Project:**\n", - "\n", - "\n", - "* Read this notebook and understand each function. Comment the code appropriately\n", - "\n", - "* Populate the list of schools with a wider variety of schools (how are you going to get the school ID?)\n", - "\n", - "* Take a look at the obtained dataframes. What dimensions do you have? what keys do you have? how could the different dataframes be connected?\n", - "\n", - "* Go back to the drawing board and try to create an entity relationship diagram for tables available\n", - "\n", - "* Once you have the schemas you want, you will need to:\n", - " - create the suitable SQL queries to create the tables and populate them\n", - " - run these queries using the appropriate Python connectors\n", - " \n", - "* Bonus: How will this datamodel be updated in the future? Please write auxiliary functions that test the database for data quality issues. For example: how could you make sure you only include the most recent comments when you re-run the script?\n", - "\n", - "\n", - "# Suggested Deliverables\n", - "\n", - "* 5-6 minute presentation of data model created, decision process and business analysis proposed\n", - "\n", - "* exported .sql file with the final schema\n", - "\n", - "* Supporting python files used to generate all logic\n", - "\n", - "* High level documentation explaining tables designed and focusing on update methods\n", - "\n", - "Crucial hint: check out the following tutorial:\n", - "https://www.dataquest.io/blog/sql-insert-tutorial/\n" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "CHQ8IJLpgBsH" - }, - "source": [ - "# you must populate this dict with the schools required -> try talking to the teaching team about this\n", - "\n", - "\n", - "schools = { \n", - "'ironhack' : 10828,\n", - "'app-academy' : 10525,\n", - "'springboard' : 11035 \n", - "}\n", - "\n", - "import re\n", - "import pandas as pd\n", - "from pandas.io.json import json_normalize\n", - "import requests\n", - "\n", - "\n", - "\n", - "def get_comments_school(school):\n", - " TAG_RE = re.compile(r'<[^>]+>')\n", - " # defines url to make api call to data -> dynamic with school if you want to scrape competition\n", - " url = \"https://www.switchup.org/chimera/v1/school-review-list?mainTemplate=school-review-list&path=%2Fbootcamps%2F\" + school + \"&isDataTarget=false&page=3&perPage=10000&simpleHtml=true&truncationLength=250\"\n", - " #makes get request and converts answer to json\n", - " # url defines the page of all the information, request is made, and information is returned to data variable\n", - " data = requests.get(url).json()\n", - " #converts json to dataframe\n", - " reviews = pd.DataFrame(data['content']['reviews'])\n", - " \n", - " #aux function to apply regex and remove tags\n", - " def remove_tags(x):\n", - " return TAG_RE.sub('',x)\n", - " reviews['review_body'] = reviews['body'].apply(remove_tags)\n", - " reviews['school'] = school\n", - " return reviews" - ], - "execution_count": 1, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "XxRrTBYVDXUk" - }, - "source": [], - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "cxSFN100h6Ej", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "53481633-d00b-4176-cd08-4f8ae2e57dd6" - }, - "source": [ - "# could you write this as a list comprehension? ;)\n", - "comments = []\n", - "\n", - "for school in schools.keys():\n", - " print(school)\n", - " comments.append(get_comments_school(school))\n", - "\n", - "comments = pd.concat(comments)" - ], - "execution_count": 2, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "ironhack\n", - "app-academy\n", - "springboard\n" - ] - } - ] + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 }, + "id": "IL9osdr_iLZg", + "outputId": "2a6446f4-cc4d-485a-d7f2-02e900137888" + }, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "IL9osdr_iLZg", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - }, - "outputId": "2a6446f4-cc4d-485a-d7f2-02e900137888" - }, - "source": [ - "comments" + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnameanonymoushostProgramNamegraduatingYearisAlumnijobTitletaglinebodyrawBody...queryDateprogramuseroverallScorecommentsoverallcurriculumjobSupportreview_bodyschool
0300701Omezzine MeysourFalseNone2023.0FalseCredit risk analystAmazing experience!<span class=\"truncatable\"><p></p><p>Before joi...<p>Before joining the bootcamp, I was skeptica......2023-04-27Data Analytics Bootcamp{'image': None}5.0[]5.05.05.0Before joining the bootcamp, I was skeptical a...ironhack
1300599AnonymousTrueNone2023.0FalseProduct designerGreat bootcamp if you want to change career!<span class=\"truncatable\"><p></p><p>My goal wa...<p>My goal was to change career from Sales to ......2023-04-25UX/UI Design Bootcamp{'image': None}5.0[]5.05.05.0My goal was to change career from Sales to Pro...ironhack
2300597Pim BlomFalseNone2023.0FalseGreat way to become a web dev<span class=\"truncatable\"><p></p><p>It is a in...<p>It is a intense 9 week program, but you lea......2023-04-25Web Development Bootcamp{'image': None}4.0[]4.04.04.0It is a intense 9 week program, but you learn ...ironhack
3300526Nancy OmozokpeaFalseNone2023.0FalseIt was well structured and very encouraging Team<span class=\"truncatable\"><p></p><p>The Bootca...<p>The Bootcamp was well structured and had a ......2023-04-21Data Analytics Bootcamp{'image': None}4.3[]5.05.03.0The Bootcamp was well structured and had a lot...ironhack
4300130Michiel van der merweFalseNone2023.0FalseData engineerAwesome<span class=\"truncatable\"><p></p><p>Pros Lots ...<p>Pros Lots and lots of help and useful infor......2023-04-11Cybersecurity Part-Time{'image': None}4.3[]4.05.04.0Pros Lots and lots of help and useful informat...ironhack
..................................................................
1467234894Stephanie S.FalseNone2015.0TrueWebsite Manager-UX LeadExcellent and comprehensive UX course<span class=\"truncatable\"><p>The UX Design Wor...The UX Design Workshop gave me a great underst......2016-12-15UX Design{'image': None}5.0[]5.05.05.0The UX Design Workshop gave me a great underst...springboard
1468234877Joe FangFalseNone2015.0TrueUX DesignerSpringboard helped me start my career in UX<span class=\"truncatable\"><p>Just some backgro...Just some background information on myself, I ......2016-12-15UX Design{'image': None}5.0[]5.05.05.0Just some background information on myself, I ...springboard
1469234838ZeinaFalseNone2016.0TrueSenior Graphic DesignerHighly recommended<span class=\"truncatable\"><p>I enjoyed the pro...I enjoyed the program very much, gained a lot ......2016-12-15UX Design{'image': None}3.7[]4.04.03.0I enjoyed the program very much, gained a lot ...springboard
1470242681JeanFalseNone2016.0TrueLead Designer/Creative DirectorA way to stay current for the highly motivated!<span class=\"truncatable\"><p>This was my first...This was my first online experience and it did......2016-12-12UX Design{'image': None}5.0[]5.05.05.0This was my first online experience and it did...springboard
1471234178BenFalseNone2016.0TrueNoneSpringboard is an excellent course for self dr...<span class=\"truncatable\"><p>I really enjoyed ...I really enjoyed my time with the Springboard ......2016-12-10UX Design{'image': None}4.7[]5.05.04.0I really enjoyed my time with the Springboard ...springboard
\n", + "

3918 rows × 21 columns

\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " ], - "execution_count": 3, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " id name anonymous hostProgramName \\\n", - "0 300701 Omezzine Meysour False None \n", - "1 300599 Anonymous True None \n", - "2 300597 Pim Blom False None \n", - "3 300526 Nancy Omozokpea False None \n", - "4 300130 Michiel van der merwe False None \n", - "... ... ... ... ... \n", - "1467 234894 Stephanie S. False None \n", - "1468 234877 Joe Fang False None \n", - "1469 234838 Zeina False None \n", - "1470 242681 Jean False None \n", - "1471 234178 Ben False None \n", - "\n", - " graduatingYear isAlumni jobTitle \\\n", - "0 2023.0 False Credit risk analyst \n", - "1 2023.0 False Product designer \n", - "2 2023.0 False \n", - "3 2023.0 False \n", - "4 2023.0 False Data engineer \n", - "... ... ... ... \n", - "1467 2015.0 True Website Manager-UX Lead \n", - "1468 2015.0 True UX Designer \n", - "1469 2016.0 True Senior Graphic Designer \n", - "1470 2016.0 True Lead Designer/Creative Director \n", - "1471 2016.0 True None \n", - "\n", - " tagline \\\n", - "0 Amazing experience! \n", - "1 Great bootcamp if you want to change career! \n", - "2 Great way to become a web dev \n", - "3 It was well structured and very encouraging Team \n", - "4 Awesome \n", - "... ... \n", - "1467 Excellent and comprehensive UX course \n", - "1468 Springboard helped me start my career in UX \n", - "1469 Highly recommended \n", - "1470 A way to stay current for the highly motivated! \n", - "1471 Springboard is an excellent course for self dr... \n", - "\n", - " body \\\n", - "0

Before joi... \n", - "1

My goal wa... \n", - "2

It is a in... \n", - "3

The Bootca... \n", - "4

Pros Lots ... \n", - "... ... \n", - "1467

The UX Design Wor... \n", - "1468

Just some backgro... \n", - "1469

I enjoyed the pro... \n", - "1470

This was my first... \n", - "1471

I really enjoyed ... \n", - "\n", - " rawBody ... queryDate \\\n", - "0

Before joining the bootcamp, I was skeptica... ... 2023-04-27 \n", - "1

My goal was to change career from Sales to ... ... 2023-04-25 \n", - "2

It is a intense 9 week program, but you lea... ... 2023-04-25 \n", - "3

The Bootcamp was well structured and had a ... ... 2023-04-21 \n", - "4

Pros Lots and lots of help and useful infor... ... 2023-04-11 \n", - "... ... ... ... \n", - "1467 The UX Design Workshop gave me a great underst... ... 2016-12-15 \n", - "1468 Just some background information on myself, I ... ... 2016-12-15 \n", - "1469 I enjoyed the program very much, gained a lot ... ... 2016-12-15 \n", - "1470 This was my first online experience and it did... ... 2016-12-12 \n", - "1471 I really enjoyed my time with the Springboard ... ... 2016-12-10 \n", - "\n", - " program user overallScore comments overall \\\n", - "0 Data Analytics Bootcamp {'image': None} 5.0 [] 5.0 \n", - "1 UX/UI Design Bootcamp {'image': None} 5.0 [] 5.0 \n", - "2 Web Development Bootcamp {'image': None} 4.0 [] 4.0 \n", - "3 Data Analytics Bootcamp {'image': None} 4.3 [] 5.0 \n", - "4 Cybersecurity Part-Time {'image': None} 4.3 [] 4.0 \n", - "... ... ... ... ... ... \n", - "1467 UX Design {'image': None} 5.0 [] 5.0 \n", - "1468 UX Design {'image': None} 5.0 [] 5.0 \n", - "1469 UX Design {'image': None} 3.7 [] 4.0 \n", - "1470 UX Design {'image': None} 5.0 [] 5.0 \n", - "1471 UX Design {'image': None} 4.7 [] 5.0 \n", - "\n", - " curriculum jobSupport review_body \\\n", - "0 5.0 5.0 Before joining the bootcamp, I was skeptical a... \n", - "1 5.0 5.0 My goal was to change career from Sales to Pro... \n", - "2 4.0 4.0 It is a intense 9 week program, but you learn ... \n", - "3 5.0 3.0 The Bootcamp was well structured and had a lot... \n", - "4 5.0 4.0 Pros Lots and lots of help and useful informat... \n", - "... ... ... ... \n", - "1467 5.0 5.0 The UX Design Workshop gave me a great underst... \n", - "1468 5.0 5.0 Just some background information on myself, I ... \n", - "1469 4.0 3.0 I enjoyed the program very much, gained a lot ... \n", - "1470 5.0 5.0 This was my first online experience and it did... \n", - "1471 5.0 4.0 I really enjoyed my time with the Springboard ... \n", - "\n", - " school \n", - "0 ironhack \n", - "1 ironhack \n", - "2 ironhack \n", - "3 ironhack \n", - "4 ironhack \n", - "... ... \n", - "1467 springboard \n", - "1468 springboard \n", - "1469 springboard \n", - "1470 springboard \n", - "1471 springboard \n", - "\n", - "[3918 rows x 21 columns]" - ], - "text/html": [ - "\n", - "

\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idnameanonymoushostProgramNamegraduatingYearisAlumnijobTitletaglinebodyrawBody...queryDateprogramuseroverallScorecommentsoverallcurriculumjobSupportreview_bodyschool
0300701Omezzine MeysourFalseNone2023.0FalseCredit risk analystAmazing experience!<span class=\"truncatable\"><p></p><p>Before joi...<p>Before joining the bootcamp, I was skeptica......2023-04-27Data Analytics Bootcamp{'image': None}5.0[]5.05.05.0Before joining the bootcamp, I was skeptical a...ironhack
1300599AnonymousTrueNone2023.0FalseProduct designerGreat bootcamp if you want to change career!<span class=\"truncatable\"><p></p><p>My goal wa...<p>My goal was to change career from Sales to ......2023-04-25UX/UI Design Bootcamp{'image': None}5.0[]5.05.05.0My goal was to change career from Sales to Pro...ironhack
2300597Pim BlomFalseNone2023.0FalseGreat way to become a web dev<span class=\"truncatable\"><p></p><p>It is a in...<p>It is a intense 9 week program, but you lea......2023-04-25Web Development Bootcamp{'image': None}4.0[]4.04.04.0It is a intense 9 week program, but you learn ...ironhack
3300526Nancy OmozokpeaFalseNone2023.0FalseIt was well structured and very encouraging Team<span class=\"truncatable\"><p></p><p>The Bootca...<p>The Bootcamp was well structured and had a ......2023-04-21Data Analytics Bootcamp{'image': None}4.3[]5.05.03.0The Bootcamp was well structured and had a lot...ironhack
4300130Michiel van der merweFalseNone2023.0FalseData engineerAwesome<span class=\"truncatable\"><p></p><p>Pros Lots ...<p>Pros Lots and lots of help and useful infor......2023-04-11Cybersecurity Part-Time{'image': None}4.3[]4.05.04.0Pros Lots and lots of help and useful informat...ironhack
..................................................................
1467234894Stephanie S.FalseNone2015.0TrueWebsite Manager-UX LeadExcellent and comprehensive UX course<span class=\"truncatable\"><p>The UX Design Wor...The UX Design Workshop gave me a great underst......2016-12-15UX Design{'image': None}5.0[]5.05.05.0The UX Design Workshop gave me a great underst...springboard
1468234877Joe FangFalseNone2015.0TrueUX DesignerSpringboard helped me start my career in UX<span class=\"truncatable\"><p>Just some backgro...Just some background information on myself, I ......2016-12-15UX Design{'image': None}5.0[]5.05.05.0Just some background information on myself, I ...springboard
1469234838ZeinaFalseNone2016.0TrueSenior Graphic DesignerHighly recommended<span class=\"truncatable\"><p>I enjoyed the pro...I enjoyed the program very much, gained a lot ......2016-12-15UX Design{'image': None}3.7[]4.04.03.0I enjoyed the program very much, gained a lot ...springboard
1470242681JeanFalseNone2016.0TrueLead Designer/Creative DirectorA way to stay current for the highly motivated!<span class=\"truncatable\"><p>This was my first...This was my first online experience and it did......2016-12-12UX Design{'image': None}5.0[]5.05.05.0This was my first online experience and it did...springboard
1471234178BenFalseNone2016.0TrueNoneSpringboard is an excellent course for self dr...<span class=\"truncatable\"><p>I really enjoyed ...I really enjoyed my time with the Springboard ......2016-12-10UX Design{'image': None}4.7[]5.05.04.0I really enjoyed my time with the Springboard ...springboard
\n", - "

3918 rows × 21 columns

\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 3 - } + "text/plain": [ + " id name anonymous hostProgramName \\\n", + "0 300701 Omezzine Meysour False None \n", + "1 300599 Anonymous True None \n", + "2 300597 Pim Blom False None \n", + "3 300526 Nancy Omozokpea False None \n", + "4 300130 Michiel van der merwe False None \n", + "... ... ... ... ... \n", + "1467 234894 Stephanie S. False None \n", + "1468 234877 Joe Fang False None \n", + "1469 234838 Zeina False None \n", + "1470 242681 Jean False None \n", + "1471 234178 Ben False None \n", + "\n", + " graduatingYear isAlumni jobTitle \\\n", + "0 2023.0 False Credit risk analyst \n", + "1 2023.0 False Product designer \n", + "2 2023.0 False \n", + "3 2023.0 False \n", + "4 2023.0 False Data engineer \n", + "... ... ... ... \n", + "1467 2015.0 True Website Manager-UX Lead \n", + "1468 2015.0 True UX Designer \n", + "1469 2016.0 True Senior Graphic Designer \n", + "1470 2016.0 True Lead Designer/Creative Director \n", + "1471 2016.0 True None \n", + "\n", + " tagline \\\n", + "0 Amazing experience! \n", + "1 Great bootcamp if you want to change career! \n", + "2 Great way to become a web dev \n", + "3 It was well structured and very encouraging Team \n", + "4 Awesome \n", + "... ... \n", + "1467 Excellent and comprehensive UX course \n", + "1468 Springboard helped me start my career in UX \n", + "1469 Highly recommended \n", + "1470 A way to stay current for the highly motivated! \n", + "1471 Springboard is an excellent course for self dr... \n", + "\n", + " body \\\n", + "0

Before joi... \n", + "1

My goal wa... \n", + "2

It is a in... \n", + "3

The Bootca... \n", + "4

Pros Lots ... \n", + "... ... \n", + "1467

The UX Design Wor... \n", + "1468

Just some backgro... \n", + "1469

I enjoyed the pro... \n", + "1470

This was my first... \n", + "1471

I really enjoyed ... \n", + "\n", + " rawBody ... queryDate \\\n", + "0

Before joining the bootcamp, I was skeptica... ... 2023-04-27 \n", + "1

My goal was to change career from Sales to ... ... 2023-04-25 \n", + "2

It is a intense 9 week program, but you lea... ... 2023-04-25 \n", + "3

The Bootcamp was well structured and had a ... ... 2023-04-21 \n", + "4

Pros Lots and lots of help and useful infor... ... 2023-04-11 \n", + "... ... ... ... \n", + "1467 The UX Design Workshop gave me a great underst... ... 2016-12-15 \n", + "1468 Just some background information on myself, I ... ... 2016-12-15 \n", + "1469 I enjoyed the program very much, gained a lot ... ... 2016-12-15 \n", + "1470 This was my first online experience and it did... ... 2016-12-12 \n", + "1471 I really enjoyed my time with the Springboard ... ... 2016-12-10 \n", + "\n", + " program user overallScore comments overall \\\n", + "0 Data Analytics Bootcamp {'image': None} 5.0 [] 5.0 \n", + "1 UX/UI Design Bootcamp {'image': None} 5.0 [] 5.0 \n", + "2 Web Development Bootcamp {'image': None} 4.0 [] 4.0 \n", + "3 Data Analytics Bootcamp {'image': None} 4.3 [] 5.0 \n", + "4 Cybersecurity Part-Time {'image': None} 4.3 [] 4.0 \n", + "... ... ... ... ... ... \n", + "1467 UX Design {'image': None} 5.0 [] 5.0 \n", + "1468 UX Design {'image': None} 5.0 [] 5.0 \n", + "1469 UX Design {'image': None} 3.7 [] 4.0 \n", + "1470 UX Design {'image': None} 5.0 [] 5.0 \n", + "1471 UX Design {'image': None} 4.7 [] 5.0 \n", + "\n", + " curriculum jobSupport review_body \\\n", + "0 5.0 5.0 Before joining the bootcamp, I was skeptical a... \n", + "1 5.0 5.0 My goal was to change career from Sales to Pro... \n", + "2 4.0 4.0 It is a intense 9 week program, but you learn ... \n", + "3 5.0 3.0 The Bootcamp was well structured and had a lot... \n", + "4 5.0 4.0 Pros Lots and lots of help and useful informat... \n", + "... ... ... ... \n", + "1467 5.0 5.0 The UX Design Workshop gave me a great underst... \n", + "1468 5.0 5.0 Just some background information on myself, I ... \n", + "1469 4.0 3.0 I enjoyed the program very much, gained a lot ... \n", + "1470 5.0 5.0 This was my first online experience and it did... \n", + "1471 5.0 4.0 I really enjoyed my time with the Springboard ... \n", + "\n", + " school \n", + "0 ironhack \n", + "1 ironhack \n", + "2 ironhack \n", + "3 ironhack \n", + "4 ironhack \n", + "... ... \n", + "1467 springboard \n", + "1468 springboard \n", + "1469 springboard \n", + "1470 springboard \n", + "1471 springboard \n", + "\n", + "[3918 rows x 21 columns]" ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "comments" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "V_SXOtPxiNNY", + "outputId": "70c3dcfb-11a9-43b0-a877-cc86d386c79e" + }, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "V_SXOtPxiNNY", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "70c3dcfb-11a9-43b0-a877-cc86d386c79e" - }, - "source": [ - "from pandas.io.json import json_normalize\n", - "\n", - "def get_school_info(school, school_id):\n", - " url = 'https://www.switchup.org/chimera/v1/bootcamp-data?mainTemplate=bootcamp-data%2Fdescription&path=%2Fbootcamps%2F'+ str(school) + '&isDataTarget=false&bootcampId='+ str(school_id) + '&logoTag=logo&truncationLength=250&readMoreOmission=...&readMoreText=Read%20More&readLessText=Read%20Less'\n", - "\n", - " data = requests.get(url).json()\n", - "\n", - " data.keys()\n", - "\n", - " courses = data['content']['courses']\n", - " courses_df = pd.DataFrame(courses, columns= ['courses'])\n", - "\n", - " locations = data['content']['locations']\n", - " locations_df = json_normalize(locations)\n", - "\n", - " badges_df = pd.DataFrame(data['content']['meritBadges'])\n", - " \n", - " website = data['content']['webaddr']\n", - " description = data['content']['description']\n", - " logoUrl = data['content']['logoUrl']\n", - " school_df = pd.DataFrame([website,description,logoUrl]).T\n", - " school_df.columns = ['website','description','LogoUrl']\n", - "\n", - " locations_df['school'] = school\n", - " courses_df['school'] = school\n", - " badges_df['school'] = school\n", - " school_df['school'] = school\n", - " \n", - "\n", - " locations_df['school_id'] = school_id\n", - " courses_df['school_id'] = school_id\n", - " badges_df['school_id'] = school_id\n", - " school_df['school_id'] = school_id\n", - "\n", - " return locations_df, courses_df, badges_df, school_df\n", - "\n", - "locations_list = []\n", - "courses_list = []\n", - "badges_list = []\n", - "schools_list = []\n", - "\n", - "for school, id in schools.items():\n", - " print(school)\n", - " a,b,c,d = get_school_info(school,id)\n", - " \n", - " locations_list.append(a)\n", - " courses_list.append(b)\n", - " badges_list.append(c)\n", - " schools_list.append(d)\n", - "\n" - ], - "execution_count": 4, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "ironhack\n" - ] - }, - { - "output_type": "stream", - "name": "stderr", - "text": [ - ":14: FutureWarning: pandas.io.json.json_normalize is deprecated, use pandas.json_normalize instead.\n", - " locations_df = json_normalize(locations)\n" - ] - }, - { - "output_type": "stream", - "name": "stdout", - "text": [ - "app-academy\n" - ] - }, - { - "output_type": "stream", - "name": "stderr", - "text": [ - ":14: FutureWarning: pandas.io.json.json_normalize is deprecated, use pandas.json_normalize instead.\n", - " locations_df = json_normalize(locations)\n" - ] - }, - { - "output_type": "stream", - "name": "stdout", - "text": [ - "springboard\n" - ] - }, - { - "output_type": "stream", - "name": "stderr", - "text": [ - ":14: FutureWarning: pandas.io.json.json_normalize is deprecated, use pandas.json_normalize instead.\n", - " locations_df = json_normalize(locations)\n" - ] - } - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "ironhack\n", + "app-academy\n", + "springboard\n", + "udacity\n", + "maven-analytics\n", + "colaberry\n", + "tripleten\n" + ] + } + ], + "source": [ + "from pandas import json_normalize\n", + "\n", + "def get_school_info(school, school_id):\n", + " url = 'https://www.switchup.org/chimera/v1/bootcamp-data?mainTemplate=bootcamp-data%2Fdescription&path=%2Fbootcamps%2F'+ str(school) + '&isDataTarget=false&bootcampId='+ str(school_id) + '&logoTag=logo&truncationLength=250&readMoreOmission=...&readMoreText=Read%20More&readLessText=Read%20Less'\n", + "\n", + " data = requests.get(url).json()\n", + "\n", + " data.keys()\n", + "\n", + " courses = data['content']['courses']\n", + " courses_df = pd.DataFrame(courses, columns= ['courses'])\n", + "\n", + " locations = data['content']['locations']\n", + " locations_df = json_normalize(locations)\n", + "\n", + " badges_df = pd.DataFrame(data['content']['meritBadges'])\n", + " \n", + " website = data['content']['webaddr']\n", + " description = data['content']['description']\n", + " logoUrl = data['content']['logoUrl']\n", + " school_df = pd.DataFrame([website,description,logoUrl]).T\n", + " school_df.columns = ['website','description','LogoUrl']\n", + "\n", + " locations_df['school'] = school\n", + " courses_df['school'] = school\n", + " badges_df['school'] = school\n", + " school_df['school'] = school\n", + " \n", + "\n", + " locations_df['school_id'] = school_id\n", + " courses_df['school_id'] = school_id\n", + " badges_df['school_id'] = school_id\n", + " school_df['school_id'] = school_id\n", + "\n", + " return locations_df, courses_df, badges_df, school_df\n", + "\n", + "locations_list = []\n", + "courses_list = []\n", + "badges_list = []\n", + "schools_list = []\n", + "\n", + "for school, id in schools.items():\n", + " print(school)\n", + " a,b,c,d = get_school_info(school,id)\n", + " \n", + " locations_list.append(a)\n", + " courses_list.append(b)\n", + " badges_list.append(c)\n", + " schools_list.append(d)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "9qAfH6JnP3Gd", + "outputId": "d9a4a626-f581-49c5-d22a-ab606fa73741" + }, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "9qAfH6JnP3Gd", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "d9a4a626-f581-49c5-d22a-ab606fa73741" - }, - "source": [ - "locations_list" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "[ id description country.id country.name country.abbrev \\\n", - " 0 15901 Berlin, Germany 57.0 Germany DE \n", - " 1 16022 Mexico City, Mexico 29.0 Mexico MX \n", - " 2 16086 Amsterdam, Netherlands 59.0 Netherlands NL \n", - " 3 16088 Sao Paulo, Brazil 42.0 Brazil BR \n", - " 4 16109 Paris, France 38.0 France FR \n", - " 5 16375 Miami, FL, United States 1.0 United States US \n", - " 6 16376 Madrid, Spain 12.0 Spain ES \n", - " 7 16377 Barcelona, Spain 12.0 Spain ES \n", - " 8 16709 Lisbon, Portugal 28.0 Portugal PT \n", - " 9 17233 Online NaN NaN NaN \n", - " \n", - " city.id city.name city.keyword state.id state.name state.abbrev \\\n", - " 0 31156.0 Berlin berlin NaN NaN NaN \n", - " 1 31175.0 Mexico City mexico-city NaN NaN NaN \n", - " 2 31168.0 Amsterdam amsterdam NaN NaN NaN \n", - " 3 31121.0 Sao Paulo sao-paulo NaN NaN NaN \n", - " 4 31136.0 Paris paris NaN NaN NaN \n", - " 5 31.0 Miami miami 11.0 Florida FL \n", - " 6 31052.0 Madrid madrid NaN NaN NaN \n", - " 7 31170.0 Barcelona barcelona NaN NaN NaN \n", - " 8 31075.0 Lisbon lisbon NaN NaN NaN \n", - " 9 NaN NaN NaN 1.0 Online Online \n", - " \n", - " state.keyword school school_id \n", - " 0 NaN ironhack 10828 \n", - " 1 NaN ironhack 10828 \n", - " 2 NaN ironhack 10828 \n", - " 3 NaN ironhack 10828 \n", - " 4 NaN ironhack 10828 \n", - " 5 florida ironhack 10828 \n", - " 6 NaN ironhack 10828 \n", - " 7 NaN ironhack 10828 \n", - " 8 NaN ironhack 10828 \n", - " 9 online ironhack 10828 ,\n", - " id description country.id country.name \\\n", - " 0 15704 San Francisco, CA, United States 1.0 United States \n", - " 1 15705 New York City, NY, United States 1.0 United States \n", - " 2 15862 Online NaN NaN \n", - " \n", - " country.abbrev state.id state.name state.abbrev state.keyword city.id \\\n", - " 0 US 6 California CA california 13.0 \n", - " 1 US 34 New York NY new-york 1507.0 \n", - " 2 NaN 1 Online Online online NaN \n", - " \n", - " city.name city.keyword school school_id \n", - " 0 San Francisco san-francisco app-academy 10525 \n", - " 1 NYC new-york-city app-academy 10525 \n", - " 2 NaN NaN app-academy 10525 ,\n", - " id description state.id state.name state.abbrev state.keyword \\\n", - " 0 16013 Online 1 Online Online online \n", - " \n", - " school school_id \n", - " 0 springboard 11035 ]" - ] - }, - "metadata": {}, - "execution_count": 5 - } + "data": { + "text/plain": [ + "[ id description country.id country.name country.abbrev \\\n", + " 0 15901 Berlin, Germany 57.0 Germany DE \n", + " 1 16022 Mexico City, Mexico 29.0 Mexico MX \n", + " 2 16086 Amsterdam, Netherlands 59.0 Netherlands NL \n", + " 3 16088 Sao Paulo, Brazil 42.0 Brazil BR \n", + " 4 16109 Paris, France 38.0 France FR \n", + " 5 16375 Miami, FL, United States 1.0 United States US \n", + " 6 16376 Madrid, Spain 12.0 Spain ES \n", + " 7 16377 Barcelona, Spain 12.0 Spain ES \n", + " 8 16709 Lisbon, Portugal 28.0 Portugal PT \n", + " 9 17233 Online NaN NaN NaN \n", + " \n", + " city.id city.name city.keyword state.id state.name state.abbrev \\\n", + " 0 31156.0 Berlin berlin NaN NaN NaN \n", + " 1 31175.0 Mexico City mexico-city NaN NaN NaN \n", + " 2 31168.0 Amsterdam amsterdam NaN NaN NaN \n", + " 3 31121.0 Sao Paulo sao-paulo NaN NaN NaN \n", + " 4 31136.0 Paris paris NaN NaN NaN \n", + " 5 31.0 Miami miami 11.0 Florida FL \n", + " 6 31052.0 Madrid madrid NaN NaN NaN \n", + " 7 31170.0 Barcelona barcelona NaN NaN NaN \n", + " 8 31075.0 Lisbon lisbon NaN NaN NaN \n", + " 9 NaN NaN NaN 1.0 Online Online \n", + " \n", + " state.keyword school school_id \n", + " 0 NaN ironhack 10828 \n", + " 1 NaN ironhack 10828 \n", + " 2 NaN ironhack 10828 \n", + " 3 NaN ironhack 10828 \n", + " 4 NaN ironhack 10828 \n", + " 5 florida ironhack 10828 \n", + " 6 NaN ironhack 10828 \n", + " 7 NaN ironhack 10828 \n", + " 8 NaN ironhack 10828 \n", + " 9 online ironhack 10828 ,\n", + " id description country.id country.name \\\n", + " 0 15704 San Francisco, CA, United States 1.0 United States \n", + " 1 15705 New York City, NY, United States 1.0 United States \n", + " 2 15862 Online NaN NaN \n", + " \n", + " country.abbrev state.id state.name state.abbrev state.keyword city.id \\\n", + " 0 US 6 California CA california 13.0 \n", + " 1 US 34 New York NY new-york 1507.0 \n", + " 2 NaN 1 Online Online online NaN \n", + " \n", + " city.name city.keyword school school_id \n", + " 0 San Francisco san-francisco app-academy 10525 \n", + " 1 NYC new-york-city app-academy 10525 \n", + " 2 NaN NaN app-academy 10525 ,\n", + " id description state.id state.name state.abbrev state.keyword \\\n", + " 0 16013 Online 1 Online Online online \n", + " \n", + " school school_id \n", + " 0 springboard 11035 ]" ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "locations_list" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 488 }, + "id": "sH4qeK_8iSzr", + "outputId": "e255b7cb-2a63-4a86-bc8b-6c3f6b51af2c" + }, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "sH4qeK_8iSzr", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 488 - }, - "outputId": "e255b7cb-2a63-4a86-bc8b-6c3f6b51af2c" - }, - "source": [ - "locations = pd.concat(locations_list)\n", - "locations" + "data": { + "text/html": [ + "

\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
iddescriptioncountry.idcountry.namecountry.abbrevcity.idcity.namecity.keywordstate.idstate.namestate.abbrevstate.keywordschoolschool_id
015901Berlin, Germany57.0GermanyDE31156.0BerlinberlinNaNNaNNaNNaNironhack10828
116022Mexico City, Mexico29.0MexicoMX31175.0Mexico Citymexico-cityNaNNaNNaNNaNironhack10828
216086Amsterdam, Netherlands59.0NetherlandsNL31168.0AmsterdamamsterdamNaNNaNNaNNaNironhack10828
316088Sao Paulo, Brazil42.0BrazilBR31121.0Sao Paulosao-pauloNaNNaNNaNNaNironhack10828
416109Paris, France38.0FranceFR31136.0ParisparisNaNNaNNaNNaNironhack10828
516375Miami, FL, United States1.0United StatesUS31.0Miamimiami11.0FloridaFLfloridaironhack10828
616376Madrid, Spain12.0SpainES31052.0MadridmadridNaNNaNNaNNaNironhack10828
716377Barcelona, Spain12.0SpainES31170.0BarcelonabarcelonaNaNNaNNaNNaNironhack10828
816709Lisbon, Portugal28.0PortugalPT31075.0LisbonlisbonNaNNaNNaNNaNironhack10828
917233OnlineNaNNaNNaNNaNNaNNaN1.0OnlineOnlineonlineironhack10828
015862OnlineNaNNaNNaNNaNNaNNaN1.0OnlineOnlineonlineapp-academy10525
016013OnlineNaNNaNNaNNaNNaNNaN1.0OnlineOnlineonlinespringboard11035
015807OnlineNaNNaNNaNNaNNaNNaN1.0OnlineOnlineonlineudacity11118
018116OnlineNaNNaNNaNNaNNaNNaN1.0OnlineOnlineonlinemaven-analytics11740
018073OnlineNaNNaNNaNNaNNaNNaN1.0OnlineOnlineonlinecolaberry11718
017154OnlineNaNNaNNaNNaNNaNNaN1.0OnlineOnlineonlinetripleten11225
\n", + "
" ], - "execution_count": 5, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " id description country.id country.name \\\n", - "0 15901 Berlin, Germany 57.0 Germany \n", - "1 16022 Mexico City, Mexico 29.0 Mexico \n", - "2 16086 Amsterdam, Netherlands 59.0 Netherlands \n", - "3 16088 Sao Paulo, Brazil 42.0 Brazil \n", - "4 16109 Paris, France 38.0 France \n", - "5 16375 Miami, FL, United States 1.0 United States \n", - "6 16376 Madrid, Spain 12.0 Spain \n", - "7 16377 Barcelona, Spain 12.0 Spain \n", - "8 16709 Lisbon, Portugal 28.0 Portugal \n", - "9 17233 Online NaN NaN \n", - "0 15704 San Francisco, CA, United States 1.0 United States \n", - "1 15705 New York City, NY, United States 1.0 United States \n", - "2 15862 Online NaN NaN \n", - "0 16013 Online NaN NaN \n", - "\n", - " country.abbrev city.id city.name city.keyword state.id state.name \\\n", - "0 DE 31156.0 Berlin berlin NaN NaN \n", - "1 MX 31175.0 Mexico City mexico-city NaN NaN \n", - "2 NL 31168.0 Amsterdam amsterdam NaN NaN \n", - "3 BR 31121.0 Sao Paulo sao-paulo NaN NaN \n", - "4 FR 31136.0 Paris paris NaN NaN \n", - "5 US 31.0 Miami miami 11.0 Florida \n", - "6 ES 31052.0 Madrid madrid NaN NaN \n", - "7 ES 31170.0 Barcelona barcelona NaN NaN \n", - "8 PT 31075.0 Lisbon lisbon NaN NaN \n", - "9 NaN NaN NaN NaN 1.0 Online \n", - "0 US 13.0 San Francisco san-francisco 6.0 California \n", - "1 US 1507.0 NYC new-york-city 34.0 New York \n", - "2 NaN NaN NaN NaN 1.0 Online \n", - "0 NaN NaN NaN NaN 1.0 Online \n", - "\n", - " state.abbrev state.keyword school school_id \n", - "0 NaN NaN ironhack 10828 \n", - "1 NaN NaN ironhack 10828 \n", - "2 NaN NaN ironhack 10828 \n", - "3 NaN NaN ironhack 10828 \n", - "4 NaN NaN ironhack 10828 \n", - "5 FL florida ironhack 10828 \n", - "6 NaN NaN ironhack 10828 \n", - "7 NaN NaN ironhack 10828 \n", - "8 NaN NaN ironhack 10828 \n", - "9 Online online ironhack 10828 \n", - "0 CA california app-academy 10525 \n", - "1 NY new-york app-academy 10525 \n", - "2 Online online app-academy 10525 \n", - "0 Online online springboard 11035 " - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
iddescriptioncountry.idcountry.namecountry.abbrevcity.idcity.namecity.keywordstate.idstate.namestate.abbrevstate.keywordschoolschool_id
015901Berlin, Germany57.0GermanyDE31156.0BerlinberlinNaNNaNNaNNaNironhack10828
116022Mexico City, Mexico29.0MexicoMX31175.0Mexico Citymexico-cityNaNNaNNaNNaNironhack10828
216086Amsterdam, Netherlands59.0NetherlandsNL31168.0AmsterdamamsterdamNaNNaNNaNNaNironhack10828
316088Sao Paulo, Brazil42.0BrazilBR31121.0Sao Paulosao-pauloNaNNaNNaNNaNironhack10828
416109Paris, France38.0FranceFR31136.0ParisparisNaNNaNNaNNaNironhack10828
516375Miami, FL, United States1.0United StatesUS31.0Miamimiami11.0FloridaFLfloridaironhack10828
616376Madrid, Spain12.0SpainES31052.0MadridmadridNaNNaNNaNNaNironhack10828
716377Barcelona, Spain12.0SpainES31170.0BarcelonabarcelonaNaNNaNNaNNaNironhack10828
816709Lisbon, Portugal28.0PortugalPT31075.0LisbonlisbonNaNNaNNaNNaNironhack10828
917233OnlineNaNNaNNaNNaNNaNNaN1.0OnlineOnlineonlineironhack10828
015704San Francisco, CA, United States1.0United StatesUS13.0San Franciscosan-francisco6.0CaliforniaCAcaliforniaapp-academy10525
115705New York City, NY, United States1.0United StatesUS1507.0NYCnew-york-city34.0New YorkNYnew-yorkapp-academy10525
215862OnlineNaNNaNNaNNaNNaNNaN1.0OnlineOnlineonlineapp-academy10525
016013OnlineNaNNaNNaNNaNNaNNaN1.0OnlineOnlineonlinespringboard11035
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 5 - } + "text/plain": [ + " id description country.id country.name country.abbrev \\\n", + "0 15901 Berlin, Germany 57.0 Germany DE \n", + "1 16022 Mexico City, Mexico 29.0 Mexico MX \n", + "2 16086 Amsterdam, Netherlands 59.0 Netherlands NL \n", + "3 16088 Sao Paulo, Brazil 42.0 Brazil BR \n", + "4 16109 Paris, France 38.0 France FR \n", + "5 16375 Miami, FL, United States 1.0 United States US \n", + "6 16376 Madrid, Spain 12.0 Spain ES \n", + "7 16377 Barcelona, Spain 12.0 Spain ES \n", + "8 16709 Lisbon, Portugal 28.0 Portugal PT \n", + "9 17233 Online NaN NaN NaN \n", + "0 15862 Online NaN NaN NaN \n", + "0 16013 Online NaN NaN NaN \n", + "0 15807 Online NaN NaN NaN \n", + "0 18116 Online NaN NaN NaN \n", + "0 18073 Online NaN NaN NaN \n", + "0 17154 Online NaN NaN NaN \n", + "\n", + " city.id city.name city.keyword state.id state.name state.abbrev \\\n", + "0 31156.0 Berlin berlin NaN NaN NaN \n", + "1 31175.0 Mexico City mexico-city NaN NaN NaN \n", + "2 31168.0 Amsterdam amsterdam NaN NaN NaN \n", + "3 31121.0 Sao Paulo sao-paulo NaN NaN NaN \n", + "4 31136.0 Paris paris NaN NaN NaN \n", + "5 31.0 Miami miami 11.0 Florida FL \n", + "6 31052.0 Madrid madrid NaN NaN NaN \n", + "7 31170.0 Barcelona barcelona NaN NaN NaN \n", + "8 31075.0 Lisbon lisbon NaN NaN NaN \n", + "9 NaN NaN NaN 1.0 Online Online \n", + "0 NaN NaN NaN 1.0 Online Online \n", + "0 NaN NaN NaN 1.0 Online Online \n", + "0 NaN NaN NaN 1.0 Online Online \n", + "0 NaN NaN NaN 1.0 Online Online \n", + "0 NaN NaN NaN 1.0 Online Online \n", + "0 NaN NaN NaN 1.0 Online Online \n", + "\n", + " state.keyword school school_id \n", + "0 NaN ironhack 10828 \n", + "1 NaN ironhack 10828 \n", + "2 NaN ironhack 10828 \n", + "3 NaN ironhack 10828 \n", + "4 NaN ironhack 10828 \n", + "5 florida ironhack 10828 \n", + "6 NaN ironhack 10828 \n", + "7 NaN ironhack 10828 \n", + "8 NaN ironhack 10828 \n", + "9 online ironhack 10828 \n", + "0 online app-academy 10525 \n", + "0 online springboard 11035 \n", + "0 online udacity 11118 \n", + "0 online maven-analytics 11740 \n", + "0 online colaberry 11718 \n", + "0 online tripleten 11225 " ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "locations = pd.concat(locations_list)\n", + "locations" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 363 }, + "id": "eGw9AuxjiTaG", + "outputId": "c8616f5a-c53e-4618-df1c-9d767199d190" + }, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "eGw9AuxjiTaG", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 363 - }, - "outputId": "c8616f5a-c53e-4618-df1c-9d767199d190" - }, - "source": [ - "courses = pd.concat(courses_list)\n", - "courses.head(10)" + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
coursesschoolschool_id
0Cyber Security Bootcampironhack10828
1Cybersecurity Part-Timeironhack10828
2Data Analytics Bootcampironhack10828
3Data Analytics Part-Timeironhack10828
4UX/UI Design Bootcampironhack10828
5UX/UI Design Part-Timeironhack10828
6Web Development Bootcampironhack10828
7Web Development Part-Timeironhack10828
024-week Software Engineering Full-Time Program...app-academy10525
148-week Software Engineering Part-Time Program...app-academy10525
\n", + "
" ], - "execution_count": 6, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " courses school school_id\n", - "0 Cyber Security Bootcamp ironhack 10828\n", - "1 Cybersecurity Part-Time ironhack 10828\n", - "2 Data Analytics Bootcamp ironhack 10828\n", - "3 Data Analytics Part-Time ironhack 10828\n", - "4 UX/UI Design Bootcamp ironhack 10828\n", - "5 UX/UI Design Part-Time ironhack 10828\n", - "6 Web Development Bootcamp ironhack 10828\n", - "7 Web Development Part-Time ironhack 10828\n", - "0 16-week Software Engineering Program app-academy 10525\n", - "1 Bootcamp Prep app-academy 10525" - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
coursesschoolschool_id
0Cyber Security Bootcampironhack10828
1Cybersecurity Part-Timeironhack10828
2Data Analytics Bootcampironhack10828
3Data Analytics Part-Timeironhack10828
4UX/UI Design Bootcampironhack10828
5UX/UI Design Part-Timeironhack10828
6Web Development Bootcampironhack10828
7Web Development Part-Timeironhack10828
016-week Software Engineering Programapp-academy10525
1Bootcamp Prepapp-academy10525
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 6 - } + "text/plain": [ + " courses school school_id\n", + "0 Cyber Security Bootcamp ironhack 10828\n", + "1 Cybersecurity Part-Time ironhack 10828\n", + "2 Data Analytics Bootcamp ironhack 10828\n", + "3 Data Analytics Part-Time ironhack 10828\n", + "4 UX/UI Design Bootcamp ironhack 10828\n", + "5 UX/UI Design Part-Time ironhack 10828\n", + "6 Web Development Bootcamp ironhack 10828\n", + "7 Web Development Part-Time ironhack 10828\n", + "0 24-week Software Engineering Full-Time Program... app-academy 10525\n", + "1 48-week Software Engineering Part-Time Program... app-academy 10525" ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "courses = pd.concat(courses_list)\n", + "courses.head(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 206 }, + "id": "j---orWLiWs1", + "outputId": "b2a667ec-e30e-475d-eafe-d82f2f1b7bc1" + }, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "j---orWLiWs1", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 206 - }, - "outputId": "b2a667ec-e30e-475d-eafe-d82f2f1b7bc1" - }, - "source": [ - "badges = pd.concat(badges_list)\n", - "badges.head()" + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namekeyworddescriptionschoolschool_id
0Available Onlineavailable_online<p>School offers fully online courses</p>ironhack10828
1Verified Outcomesverified_outcomes<p>School publishes a third-party verified out...ironhack10828
2Flexible Classesflexible_classes<p>School offers part-time and evening classes...ironhack10828
0Available Onlineavailable_online<p>School offers fully online courses</p>app-academy10525
1Flexible Classesflexible_classes<p>School offers part-time and evening classes...app-academy10525
\n", + "
" ], - "execution_count": 7, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " name keyword \\\n", - "0 Available Online available_online \n", - "1 Verified Outcomes verified_outcomes \n", - "2 Flexible Classes flexible_classes \n", - "0 Available Online available_online \n", - "1 Flexible Classes flexible_classes \n", - "\n", - " description school school_id \n", - "0

School offers fully online courses

ironhack 10828 \n", - "1

School publishes a third-party verified out... ironhack 10828 \n", - "2

School offers part-time and evening classes... ironhack 10828 \n", - "0

School offers fully online courses

app-academy 10525 \n", - "1

School offers part-time and evening classes... app-academy 10525 " - ], - "text/html": [ - "\n", - "

\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
namekeyworddescriptionschoolschool_id
0Available Onlineavailable_online<p>School offers fully online courses</p>ironhack10828
1Verified Outcomesverified_outcomes<p>School publishes a third-party verified out...ironhack10828
2Flexible Classesflexible_classes<p>School offers part-time and evening classes...ironhack10828
0Available Onlineavailable_online<p>School offers fully online courses</p>app-academy10525
1Flexible Classesflexible_classes<p>School offers part-time and evening classes...app-academy10525
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 7 - } + "text/plain": [ + " name keyword \\\n", + "0 Available Online available_online \n", + "1 Verified Outcomes verified_outcomes \n", + "2 Flexible Classes flexible_classes \n", + "0 Available Online available_online \n", + "1 Flexible Classes flexible_classes \n", + "\n", + " description school school_id \n", + "0

School offers fully online courses

ironhack 10828 \n", + "1

School publishes a third-party verified out... ironhack 10828 \n", + "2

School offers part-time and evening classes... ironhack 10828 \n", + "0

School offers fully online courses

app-academy 10525 \n", + "1

School offers part-time and evening classes... app-academy 10525 " ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "badges = pd.concat(badges_list)\n", + "badges.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 143 }, + "id": "kWLmzVpmiZD2", + "outputId": "db0685d2-5be6-40c3-fe69-9e36b3ac055f" + }, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "kWLmzVpmiZD2", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 143 - }, - "outputId": "db0685d2-5be6-40c3-fe69-9e36b3ac055f" - }, - "source": [ - "# any data cleaning still missing here? take a look at the description\n", - "schools = pd.concat(schools_list)\n", - "schools.head()" + "data": { + "text/html": [ + "

\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
websitedescriptionLogoUrlschoolschool_id
0www.ironhack.com/en<span class=\"truncatable\"><p>Ironhack is a glo...https://d92mrp7hetgfk.cloudfront.net/images/si...ironhack10828
0appacademy.io<span class=\"truncatable\"><p>Founded in 2012, ...https://d92mrp7hetgfk.cloudfront.net/images/si...app-academy10525
0www.springboard.com/?utm_source=switchup&utm_m...<span class=\"truncatable\"><p>Springboard is an...https://d92mrp7hetgfk.cloudfront.net/images/si...springboard11035
0www.udacity.com/?utm_source=switchup&utm_mediu...<span class=\"truncatable\"><p>Udacity is the tr...https://d92mrp7hetgfk.cloudfront.net/images/si...udacity11118
0www.mavenanalytics.io/<span class=\"truncatable\"><p>Maven Analytics o...https://d92mrp7hetgfk.cloudfront.net/images/si...maven-analytics11740
\n", + "
" ], - "execution_count": 8, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " website \\\n", - "0 www.ironhack.com/en \n", - "0 appacademy.io \n", - "0 www.springboard.com/?utm_source=switchup&utm_m... \n", - "\n", - " description \\\n", - "0

Ironhack is a glo... \n", - "0

Founded in 2012, ... \n", - "0

Springboard is an... \n", - "\n", - " LogoUrl school school_id \n", - "0 https://d92mrp7hetgfk.cloudfront.net/images/si... ironhack 10828 \n", - "0 https://d92mrp7hetgfk.cloudfront.net/images/si... app-academy 10525 \n", - "0 https://d92mrp7hetgfk.cloudfront.net/images/si... springboard 11035 " - ], - "text/html": [ - "\n", - "

\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
websitedescriptionLogoUrlschoolschool_id
0www.ironhack.com/en<span class=\"truncatable\"><p>Ironhack is a glo...https://d92mrp7hetgfk.cloudfront.net/images/si...ironhack10828
0appacademy.io<span class=\"truncatable\"><p>Founded in 2012, ...https://d92mrp7hetgfk.cloudfront.net/images/si...app-academy10525
0www.springboard.com/?utm_source=switchup&utm_m...<span class=\"truncatable\"><p>Springboard is an...https://d92mrp7hetgfk.cloudfront.net/images/si...springboard11035
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 8 - } + "text/plain": [ + " website \\\n", + "0 www.ironhack.com/en \n", + "0 appacademy.io \n", + "0 www.springboard.com/?utm_source=switchup&utm_m... \n", + "0 www.udacity.com/?utm_source=switchup&utm_mediu... \n", + "0 www.mavenanalytics.io/ \n", + "\n", + " description \\\n", + "0

Ironhack is a glo... \n", + "0

Founded in 2012, ... \n", + "0

Springboard is an... \n", + "0

Udacity is the tr... \n", + "0

Maven Analytics o... \n", + "\n", + " LogoUrl school \\\n", + "0 https://d92mrp7hetgfk.cloudfront.net/images/si... ironhack \n", + "0 https://d92mrp7hetgfk.cloudfront.net/images/si... app-academy \n", + "0 https://d92mrp7hetgfk.cloudfront.net/images/si... springboard \n", + "0 https://d92mrp7hetgfk.cloudfront.net/images/si... udacity \n", + "0 https://d92mrp7hetgfk.cloudfront.net/images/si... maven-analytics \n", + "\n", + " school_id \n", + "0 10828 \n", + "0 10525 \n", + "0 11035 \n", + "0 11118 \n", + "0 11740 " ] - }, - { - "cell_type": "code", - "metadata": { - "id": "_AFkSNlsb9z0" - }, - "source": [], - "execution_count": 8, - "outputs": [] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" } - ] -} \ No newline at end of file + ], + "source": [ + "# any data cleaning still missing here? take a look at the description\n", + "schools = pd.concat(schools_list)\n", + "schools.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "id": "_AFkSNlsb9z0" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/switchup_scraperv4 (2).ipynb b/notebooks/switchup_scraperv4 (2).ipynb new file mode 100644 index 0000000..4481575 --- /dev/null +++ b/notebooks/switchup_scraperv4 (2).ipynb @@ -0,0 +1,3511 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "TuwSdWZlgveP" + }, + "source": [ + "# SQL Project\n", + "You were hired by Ironhack to perform an Analytics Consulting Project entitled: competitive landscape.\n", + "\n", + "Your mission is to create and populate an appropriate database with many coding schools that are our competition, as well as design an suitable queries that answer business questions of interest (to be defined by you)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hXDGm8_RgG-K" + }, + "source": [ + "**Suggested Steps in the Project:**\n", + "\n", + "\n", + "* Read this notebook and understand each function. Comment the code appropriately\n", + "\n", + "* Populate the list of schools with a wider variety of schools (how are you going to get the school ID?)\n", + "\n", + "* Take a look at the obtained dataframes. What dimensions do you have? what keys do you have? how could the different dataframes be connected?\n", + "\n", + "* Go back to the drawing board and try to create an entity relationship diagram for tables available\n", + "\n", + "* Once you have the schemas you want, you will need to:\n", + " - create the suitable SQL queries to create the tables and populate them\n", + " - run these queries using the appropriate Python connectors\n", + " \n", + "* Bonus: How will this datamodel be updated in the future? Please write auxiliary functions that test the database for data quality issues. For example: how could you make sure you only include the most recent comments when you re-run the script?\n", + "\n", + "\n", + "# Suggested Deliverables\n", + "\n", + "* 5-6 minute presentation of data model created, decision process and business analysis proposed\n", + "\n", + "* exported .sql file with the final schema\n", + "\n", + "* Supporting python files used to generate all logic\n", + "\n", + "* High level documentation explaining tables designed and focusing on update methods\n", + "\n", + "Crucial hint: check out the following tutorial:\n", + "https://www.dataquest.io/blog/sql-insert-tutorial/\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "id": "CHQ8IJLpgBsH" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "text/html": [ + "

\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnameanonymoushostProgramNamegraduatingYearisAlumnijobTitletaglinebodyrawBody...queryDateprogramuseroverallScorecommentsoverallcurriculumjobSupportreview_bodyschool
0309849AnonymousTrueNone2024FalseData Analytics<span class=\"truncatable\"><p></p><p>I just Fin...<p>I just Finished the my study , I did the Da......2024-04-03Data Analytics Part-Time{'image': None}3.3[]4.04.02.0I just Finished the my study , I did the Data ...ironhack
1309479Patrick MarquesFalseNone2024FalseProject ManagerAn intense experience full of emotions but at ...<span class=\"truncatable\"><p></p><p>Hello, my ...<p>Hello, my name is Patrick Marques and I can......2024-03-19Data Analytics Bootcamp{'image': None}4.0[]4.04.04.0Hello, my name is Patrick Marques and I can sa...ironhack
2308683Harikrishnan RamakrishnapillaiFalseNone2023FalseCybersecurityIt was amazing<span class=\"truncatable\"><p></p><p>I could fi...<p>I could finish cybersecurity course within ......2024-02-15None{'image': None}4.3[]4.05.04.0I could finish cybersecurity course within 3 m...ironhack
3307433Sorin TuineaFalseNone2023FalseData analystI would definitely recommend it<span class=\"truncatable\"><p></p><p>I chose Ir...<p>I chose Ironhack after reading a lot of rev......2023-12-22None{'image': None}5.0[]5.05.05.0I chose Ironhack after reading a lot of review...ironhack
4307350Kasia LukszaFalseNone2023FalseUX/UI DesignerBest learning experience of my life<span class=\"truncatable\"><p></p><p>Attending ...<p>Attending this bootcamp was hands down the ......2023-12-19UX/UI Design Bootcamp{'image': None}5.0[]5.05.05.0Attending this bootcamp was hands down the bes...ironhack
..................................................................
1288231772AnonymousFalseNone2014TrueNoneLearn in two months what would otherwise take ...<span class=\"truncatable\"><p>I can fully recom...I can fully recommend IronHack for any of you ......2014-09-30Part-time Web Development{'image': None}5.0[]5.05.05.0I can fully recommend IronHack for any of you ...ironhack
1289231636Marcos SorribasFalseNone2014TrueiOS DeveloperEl mejor bootcamp al que he asistido. Una expe...<span class=\"truncatable\"><p>Asistí al primer ...Asistí al primer bootcamp de desarrollo de iOS......2014-09-24Full-time Web Development Bootcamp{'image': None}5.0[]5.05.05.0Asistí al primer bootcamp de desarrollo de iOS...ironhack
1290231611Xabier VicuñaFalseNone2014TrueEntrepreneurGreat experience, I highly recommend it<span class=\"truncatable\"><p>Excellent product...Excellent product. Great experience. Worth eve......2014-09-24Part-time Web Development{'image': None}5.0[]5.05.05.0Excellent product. Great experience. Worth eve...ironhack
1291231609JHDFalseNone2014TrueNoneIt was an amazing experience!<span class=\"truncatable\"><p>I was part of the...I was part of the first English run of Ironhac......2014-09-24Part-time Web Development{'image': None}5.0[]5.05.05.0I was part of the first English run of Ironhac...ironhack
1292231815Enrique Isasi VelascoFalseUX/UI Design2014TrueFounder, RoR Developer @ Decorissimo.esSimply gorgeous.<span class=\"truncatable\"><p>I attended the Ir...I attended the Ironhack Madrid Bootcamp on Jan......2014-09-23Part-time Web Development{'image': None}5.0[]5.05.05.0I attended the Ironhack Madrid Bootcamp on Jan...ironhack
\n", + "

1293 rows × 21 columns

\n", + "
" + ], + "text/plain": [ + " id name anonymous hostProgramName \\\n", + "0 309849 Anonymous True None \n", + "1 309479 Patrick Marques False None \n", + "2 308683 Harikrishnan Ramakrishnapillai False None \n", + "3 307433 Sorin Tuinea False None \n", + "4 307350 Kasia Luksza False None \n", + "... ... ... ... ... \n", + "1288 231772 Anonymous False None \n", + "1289 231636 Marcos Sorribas False None \n", + "1290 231611 Xabier Vicuña False None \n", + "1291 231609 JHD False None \n", + "1292 231815 Enrique Isasi Velasco False UX/UI Design \n", + "\n", + " graduatingYear isAlumni jobTitle \\\n", + "0 2024 False \n", + "1 2024 False Project Manager \n", + "2 2023 False Cybersecurity \n", + "3 2023 False Data analyst \n", + "4 2023 False UX/UI Designer \n", + "... ... ... ... \n", + "1288 2014 True None \n", + "1289 2014 True iOS Developer \n", + "1290 2014 True Entrepreneur \n", + "1291 2014 True None \n", + "1292 2014 True Founder, RoR Developer @ Decorissimo.es \n", + "\n", + " tagline \\\n", + "0 Data Analytics \n", + "1 An intense experience full of emotions but at ... \n", + "2 It was amazing \n", + "3 I would definitely recommend it \n", + "4 Best learning experience of my life \n", + "... ... \n", + "1288 Learn in two months what would otherwise take ... \n", + "1289 El mejor bootcamp al que he asistido. Una expe... \n", + "1290 Great experience, I highly recommend it \n", + "1291 It was an amazing experience! \n", + "1292 Simply gorgeous. \n", + "\n", + " body \\\n", + "0

I just Fin... \n", + "1

Hello, my ... \n", + "2

I could fi... \n", + "3

I chose Ir... \n", + "4

Attending ... \n", + "... ... \n", + "1288

I can fully recom... \n", + "1289

Asistí al primer ... \n", + "1290

Excellent product... \n", + "1291

I was part of the... \n", + "1292

I attended the Ir... \n", + "\n", + " rawBody ... queryDate \\\n", + "0

I just Finished the my study , I did the Da... ... 2024-04-03 \n", + "1

Hello, my name is Patrick Marques and I can... ... 2024-03-19 \n", + "2

I could finish cybersecurity course within ... ... 2024-02-15 \n", + "3

I chose Ironhack after reading a lot of rev... ... 2023-12-22 \n", + "4

Attending this bootcamp was hands down the ... ... 2023-12-19 \n", + "... ... ... ... \n", + "1288 I can fully recommend IronHack for any of you ... ... 2014-09-30 \n", + "1289 Asistí al primer bootcamp de desarrollo de iOS... ... 2014-09-24 \n", + "1290 Excellent product. Great experience. Worth eve... ... 2014-09-24 \n", + "1291 I was part of the first English run of Ironhac... ... 2014-09-24 \n", + "1292 I attended the Ironhack Madrid Bootcamp on Jan... ... 2014-09-23 \n", + "\n", + " program user overallScore \\\n", + "0 Data Analytics Part-Time {'image': None} 3.3 \n", + "1 Data Analytics Bootcamp {'image': None} 4.0 \n", + "2 None {'image': None} 4.3 \n", + "3 None {'image': None} 5.0 \n", + "4 UX/UI Design Bootcamp {'image': None} 5.0 \n", + "... ... ... ... \n", + "1288 Part-time Web Development {'image': None} 5.0 \n", + "1289 Full-time Web Development Bootcamp {'image': None} 5.0 \n", + "1290 Part-time Web Development {'image': None} 5.0 \n", + "1291 Part-time Web Development {'image': None} 5.0 \n", + "1292 Part-time Web Development {'image': None} 5.0 \n", + "\n", + " comments overall curriculum jobSupport \\\n", + "0 [] 4.0 4.0 2.0 \n", + "1 [] 4.0 4.0 4.0 \n", + "2 [] 4.0 5.0 4.0 \n", + "3 [] 5.0 5.0 5.0 \n", + "4 [] 5.0 5.0 5.0 \n", + "... ... ... ... ... \n", + "1288 [] 5.0 5.0 5.0 \n", + "1289 [] 5.0 5.0 5.0 \n", + "1290 [] 5.0 5.0 5.0 \n", + "1291 [] 5.0 5.0 5.0 \n", + "1292 [] 5.0 5.0 5.0 \n", + "\n", + " review_body school \n", + "0 I just Finished the my study , I did the Data ... ironhack \n", + "1 Hello, my name is Patrick Marques and I can sa... ironhack \n", + "2 I could finish cybersecurity course within 3 m... ironhack \n", + "3 I chose Ironhack after reading a lot of review... ironhack \n", + "4 Attending this bootcamp was hands down the bes... ironhack \n", + "... ... ... \n", + "1288 I can fully recommend IronHack for any of you ... ironhack \n", + "1289 Asistí al primer bootcamp de desarrollo de iOS... ironhack \n", + "1290 Excellent product. Great experience. Worth eve... ironhack \n", + "1291 I was part of the first English run of Ironhac... ironhack \n", + "1292 I attended the Ironhack Madrid Bootcamp on Jan... ironhack \n", + "\n", + "[1293 rows x 21 columns]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# you must populate this dict with the schools required -> try talking to the teaching team about this\n", + "\n", + "# Ironhack is ranked 4th, so lets take the top 12 (works with 3 team members, each pulling 4)\n", + "\n", + "\n", + "schools = { \n", + "'ironhack' : 10828,\n", + "'app-academy' : 10525,\n", + "'springboard' : 11035,\n", + "'syntax-technologies' : 11797,\n", + "'dataquest' : 10683,\n", + "'tripleten' : 11225,\n", + "'ccs-learning-academy' : 11736,\n", + "'thinkful': 11098,\n", + "'brainstation': 10571,\n", + "'colaberry' : 11718,\n", + "'simplilearn' : 11016,\n", + "'maven-analytics' : 11740,\n", + "'udacity' : 11118,\n", + "'general-assembly' : 10761,\n", + "'data-science-dojo' : 10685,\n", + "}\n", + "\n", + "import re\n", + "import pandas as pd\n", + "from pandas import json_normalize\n", + "import json\n", + "import requests\n", + "import mysql.connector\n", + "import getpass\n", + "from mysql.connector import Error\n", + "from sqlalchemy import create_engine\n", + "\n", + "\n", + "def get_comments_school(school):\n", + " TAG_RE = re.compile(r'<[^>]+>')\n", + " # defines url to make api call to data -> dynamic with school if you want to scrape competition\n", + " url = \"https://www.switchup.org/chimera/v1/school-review-list?mainTemplate=school-review-list&path=%2Fbootcamps%2F\" + school + \"&isDataTarget=false&page=3&perPage=10000&simpleHtml=true&truncationLength=250\"\n", + " #makes get request and converts answer to json\n", + " # url defines the page of all the information, request is made, and information is returned to data variable\n", + " data = requests.get(url).json()\n", + " # Print the JSON data to view it\n", + " print(data.keys)\n", + " #converts json to dataframe\n", + " reviews = pd.DataFrame(data['content']['reviews'])\n", + " \n", + " #aux function to apply regex and remove tags\n", + " def remove_tags(x):\n", + " return TAG_RE.sub('',x)\n", + " reviews['review_body'] = reviews['body'].apply(remove_tags)\n", + " reviews['school'] = school\n", + " return reviews\n", + "\n", + "get_comments_school('ironhack')\n", + "\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ironhack\n", + "app-academy\n", + "springboard\n", + "syntax-technologies\n", + "dataquest\n", + "tripleten\n", + "ccs-learning-academy\n", + "thinkful\n", + "brainstation\n", + "colaberry\n", + "simplilearn\n", + "maven-analytics\n", + "udacity\n", + "general-assembly\n", + "data-science-dojo\n" + ] + } + ], + "source": [ + "\n", + "\n", + "def get_school_info(school, school_id):\n", + " url = 'https://www.switchup.org/chimera/v1/bootcamp-data?mainTemplate=bootcamp-data%2Fdescription&path=%2Fbootcamps%2F'+ str(school) + '&isDataTarget=false&bootcampId='+ str(school_id) + '&logoTag=logo&truncationLength=250&readMoreOmission=...&readMoreText=Read%20More&readLessText=Read%20Less'\n", + "\n", + " data = requests.get(url).json()\n", + "\n", + " data.keys()\n", + "\n", + " courses = data['content']['courses']\n", + " courses_df = pd.DataFrame(courses, columns= ['courses'])\n", + "\n", + " locations = data['content']['locations']\n", + " locations_df = json_normalize(locations)\n", + "\n", + " badges_df = pd.DataFrame(data['content']['meritBadges'])\n", + " \n", + " website = data['content']['webaddr']\n", + " description = data['content']['description']\n", + " logoUrl = data['content']['logoUrl']\n", + " school_df = pd.DataFrame([website,description,logoUrl]).T\n", + " school_df.columns = ['website','description','LogoUrl']\n", + "\n", + " locations_df['school'] = school\n", + " courses_df['school'] = school\n", + " badges_df['school'] = school\n", + " school_df['school'] = school\n", + " \n", + "\n", + " locations_df['school_id'] = school_id\n", + " courses_df['school_id'] = school_id\n", + " badges_df['school_id'] = school_id\n", + " school_df['school_id'] = school_id\n", + "\n", + " return locations_df, courses_df, badges_df, school_df\n", + "\n", + "\n", + "locations_list = []\n", + "courses_list = []\n", + "badges_list = []\n", + "schools_list = []\n", + "\n", + "for school, id in schools.items():\n", + " print(school)\n", + " a,b,c,d = get_school_info(school,id)\n", + " \n", + " locations_list.append(a)\n", + " courses_list.append(b)\n", + " badges_list.append(c)\n", + " schools_list.append(d)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cxSFN100h6Ej", + "outputId": "53481633-d00b-4176-cd08-4f8ae2e57dd6" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ironhack\n", + "\n", + "app-academy\n", + "\n", + "springboard\n", + "\n", + "syntax-technologies\n", + "\n", + "dataquest\n", + "\n", + "tripleten\n", + "\n", + "ccs-learning-academy\n", + "\n", + "thinkful\n", + "\n", + "brainstation\n", + "\n", + "colaberry\n", + "\n", + "simplilearn\n", + "\n", + "maven-analytics\n", + "\n", + "udacity\n", + "\n", + "general-assembly\n", + "\n", + "data-science-dojo\n", + "\n", + "['ironhack', 'app-academy', 'springboard', 'syntax-technologies', 'dataquest', 'tripleten', 'ccs-learning-academy', 'thinkful', 'brainstation', 'colaberry', 'simplilearn', 'maven-analytics', 'udacity', 'general-assembly', 'data-science-dojo']\n" + ] + } + ], + "source": [ + "# could you write this as a list comprehension? ;)\n", + "comments = []\n", + "list_of_schools = []\n", + "\n", + "for school in schools.keys():\n", + " list_of_schools.append(school)\n", + " print(school)\n", + " comments.append(get_comments_school(school))\n", + "\n", + "comments = pd.concat(comments)\n", + "print(list_of_schools)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating The SQL database. Then define table and export to SQL" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdin", + "output_type": "stream", + "text": [ + " ········\n" + ] + } + ], + "source": [ + "#Password\n", + "password = getpass.getpass() " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Create a connection to SQL workbench without specifying DB\n", + "\n", + "cnx = mysql.connector.connect(user = 'root', password = password, port=3306)\n", + "cnx.is_connected()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Connection open\n" + ] + } + ], + "source": [ + "# Create DB\n", + "\n", + "\n", + "if cnx.is_connected():\n", + " cursor = cnx.cursor()\n", + " print(\"Connection open\")\n", + " # do stuff you need to the database\n", + " cursor.execute(\"CREATE DATABASE IF NOT EXISTS Ironhack_SQL\")\n", + "else:\n", + " print(\"Connection is not open\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "IL9osdr_iLZg", + "outputId": "2a6446f4-cc4d-485a-d7f2-02e900137888" + }, + "outputs": [ + { + "data": { + "text/html": [ + "

\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnameanonymoushostProgramNamegraduatingYearisAlumnijobTitletaglinebodyrawBody...queryDateprogramuseroverallScorecommentsoverallcurriculumjobSupportreview_bodyschool
0309849AnonymousTrueNone2024.0FalseData Analytics<span class=\"truncatable\"><p></p><p>I just Fin...<p>I just Finished the my study , I did the Da......2024-04-03Data Analytics Part-Time{'image': None}3.3[]4.04.02.0I just Finished the my study , I did the Data ...ironhack
1309479Patrick MarquesFalseNone2024.0FalseProject ManagerAn intense experience full of emotions but at ...<span class=\"truncatable\"><p></p><p>Hello, my ...<p>Hello, my name is Patrick Marques and I can......2024-03-19Data Analytics Bootcamp{'image': None}4.0[]4.04.04.0Hello, my name is Patrick Marques and I can sa...ironhack
2308683Harikrishnan RamakrishnapillaiFalseNone2023.0FalseCybersecurityIt was amazing<span class=\"truncatable\"><p></p><p>I could fi...<p>I could finish cybersecurity course within ......2024-02-15None{'image': None}4.3[]4.05.04.0I could finish cybersecurity course within 3 m...ironhack
3307433Sorin TuineaFalseNone2023.0FalseData analystI would definitely recommend it<span class=\"truncatable\"><p></p><p>I chose Ir...<p>I chose Ironhack after reading a lot of rev......2023-12-22None{'image': None}5.0[]5.05.05.0I chose Ironhack after reading a lot of review...ironhack
4307350Kasia LukszaFalseNone2023.0FalseUX/UI DesignerBest learning experience of my life<span class=\"truncatable\"><p></p><p>Attending ...<p>Attending this bootcamp was hands down the ......2023-12-19UX/UI Design Bootcamp{'image': None}5.0[]5.05.05.0Attending this bootcamp was hands down the bes...ironhack
..................................................................
128234263DavidFalseNone2016.0TrueLaboratory Informatics ConsultantAn immersive review of applied data science.<span class=\"truncatable\"><p>An immersive revi...An immersive review of applied data science. \\......2016-07-225-Day Data Science Bootcamp{'image': None}5.0[]5.05.05.0An immersive review of applied data science. T...data-science-dojo
129233958JCFalseNone2016.0TrueSenior Data EngineerData Exploration, Data Validation, Data Modeli...<span class=\"truncatable\"><p>The training prov...The training provides a very well balanced app......2016-06-105-Day Data Science Bootcamp{'image': None}5.0[]5.0NaNNaNThe training provides a very well balanced app...data-science-dojo
130233957Saurabh AgrawalFalseNone2016.0TrueSoftware Engineer IVGreat learning experience<p>I was able to apply the concepts I learned ...I was able to apply the concepts I learned imm......2016-06-105-Day Data Science Bootcamp{'image': None}5.0[]5.0NaNNaNI was able to apply the concepts I learned imm...data-science-dojo
131233956GuilhermeFalseNone2016.0TrueNoneAwesome Bootcamp<span class=\"truncatable\"><p>This one week boo...This one week bootcamp will get you up to spee......2016-06-105-Day Data Science Bootcamp{'image': None}5.0[]5.0NaNNaNThis one week bootcamp will get you up to spee...data-science-dojo
132233672Ryan M.FalseNone2016.0TrueTraderExceeded my expectations - handily<span class=\"truncatable\"><p>I just completed ...I just completed the Chicago bootcamp and I ca......2016-05-105-Day Data Science Bootcamp{'image': None}5.0[]5.0NaNNaNI just completed the Chicago bootcamp and I ca...data-science-dojo
\n", + "

8915 rows × 21 columns

\n", + "
" + ], + "text/plain": [ + " id name anonymous hostProgramName \\\n", + "0 309849 Anonymous True None \n", + "1 309479 Patrick Marques False None \n", + "2 308683 Harikrishnan Ramakrishnapillai False None \n", + "3 307433 Sorin Tuinea False None \n", + "4 307350 Kasia Luksza False None \n", + ".. ... ... ... ... \n", + "128 234263 David False None \n", + "129 233958 JC False None \n", + "130 233957 Saurabh Agrawal False None \n", + "131 233956 Guilherme False None \n", + "132 233672 Ryan M. False None \n", + "\n", + " graduatingYear isAlumni jobTitle \\\n", + "0 2024.0 False \n", + "1 2024.0 False Project Manager \n", + "2 2023.0 False Cybersecurity \n", + "3 2023.0 False Data analyst \n", + "4 2023.0 False UX/UI Designer \n", + ".. ... ... ... \n", + "128 2016.0 True Laboratory Informatics Consultant \n", + "129 2016.0 True Senior Data Engineer \n", + "130 2016.0 True Software Engineer IV \n", + "131 2016.0 True None \n", + "132 2016.0 True Trader \n", + "\n", + " tagline \\\n", + "0 Data Analytics \n", + "1 An intense experience full of emotions but at ... \n", + "2 It was amazing \n", + "3 I would definitely recommend it \n", + "4 Best learning experience of my life \n", + ".. ... \n", + "128 An immersive review of applied data science. \n", + "129 Data Exploration, Data Validation, Data Modeli... \n", + "130 Great learning experience \n", + "131 Awesome Bootcamp \n", + "132 Exceeded my expectations - handily \n", + "\n", + " body \\\n", + "0

I just Fin... \n", + "1

Hello, my ... \n", + "2

I could fi... \n", + "3

I chose Ir... \n", + "4

Attending ... \n", + ".. ... \n", + "128

An immersive revi... \n", + "129

The training prov... \n", + "130

I was able to apply the concepts I learned ... \n", + "131

This one week boo... \n", + "132

I just completed ... \n", + "\n", + " rawBody ... queryDate \\\n", + "0

I just Finished the my study , I did the Da... ... 2024-04-03 \n", + "1

Hello, my name is Patrick Marques and I can... ... 2024-03-19 \n", + "2

I could finish cybersecurity course within ... ... 2024-02-15 \n", + "3

I chose Ironhack after reading a lot of rev... ... 2023-12-22 \n", + "4

Attending this bootcamp was hands down the ... ... 2023-12-19 \n", + ".. ... ... ... \n", + "128 An immersive review of applied data science. \\... ... 2016-07-22 \n", + "129 The training provides a very well balanced app... ... 2016-06-10 \n", + "130 I was able to apply the concepts I learned imm... ... 2016-06-10 \n", + "131 This one week bootcamp will get you up to spee... ... 2016-06-10 \n", + "132 I just completed the Chicago bootcamp and I ca... ... 2016-05-10 \n", + "\n", + " program user overallScore comments \\\n", + "0 Data Analytics Part-Time {'image': None} 3.3 [] \n", + "1 Data Analytics Bootcamp {'image': None} 4.0 [] \n", + "2 None {'image': None} 4.3 [] \n", + "3 None {'image': None} 5.0 [] \n", + "4 UX/UI Design Bootcamp {'image': None} 5.0 [] \n", + ".. ... ... ... ... \n", + "128 5-Day Data Science Bootcamp {'image': None} 5.0 [] \n", + "129 5-Day Data Science Bootcamp {'image': None} 5.0 [] \n", + "130 5-Day Data Science Bootcamp {'image': None} 5.0 [] \n", + "131 5-Day Data Science Bootcamp {'image': None} 5.0 [] \n", + "132 5-Day Data Science Bootcamp {'image': None} 5.0 [] \n", + "\n", + " overall curriculum jobSupport \\\n", + "0 4.0 4.0 2.0 \n", + "1 4.0 4.0 4.0 \n", + "2 4.0 5.0 4.0 \n", + "3 5.0 5.0 5.0 \n", + "4 5.0 5.0 5.0 \n", + ".. ... ... ... \n", + "128 5.0 5.0 5.0 \n", + "129 5.0 NaN NaN \n", + "130 5.0 NaN NaN \n", + "131 5.0 NaN NaN \n", + "132 5.0 NaN NaN \n", + "\n", + " review_body school \n", + "0 I just Finished the my study , I did the Data ... ironhack \n", + "1 Hello, my name is Patrick Marques and I can sa... ironhack \n", + "2 I could finish cybersecurity course within 3 m... ironhack \n", + "3 I chose Ironhack after reading a lot of review... ironhack \n", + "4 Attending this bootcamp was hands down the bes... ironhack \n", + ".. ... ... \n", + "128 An immersive review of applied data science. T... data-science-dojo \n", + "129 The training provides a very well balanced app... data-science-dojo \n", + "130 I was able to apply the concepts I learned imm... data-science-dojo \n", + "131 This one week bootcamp will get you up to spee... data-science-dojo \n", + "132 I just completed the Chicago bootcamp and I ca... data-science-dojo \n", + "\n", + "[8915 rows x 21 columns]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "

\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnameanonymousgraduatingYearisAlumnijobTitleprogramoverallScoreoverallcurriculumjobSupportschool
0309849AnonymousTrue2024.0FalseData Analytics Part-Time3.34.04.02.0ironhack
1309479Patrick MarquesFalse2024.0FalseProject ManagerData Analytics Bootcamp4.04.04.04.0ironhack
2308683Harikrishnan RamakrishnapillaiFalse2023.0FalseCybersecurityNone4.34.05.04.0ironhack
3307433Sorin TuineaFalse2023.0FalseData analystNone5.05.05.05.0ironhack
4307350Kasia LukszaFalse2023.0FalseUX/UI DesignerUX/UI Design Bootcamp5.05.05.05.0ironhack
.......................................
128234263DavidFalse2016.0TrueLaboratory Informatics Consultant5-Day Data Science Bootcamp5.05.05.05.0data-science-dojo
129233958JCFalse2016.0TrueSenior Data Engineer5-Day Data Science Bootcamp5.05.0NaNNaNdata-science-dojo
130233957Saurabh AgrawalFalse2016.0TrueSoftware Engineer IV5-Day Data Science Bootcamp5.05.0NaNNaNdata-science-dojo
131233956GuilhermeFalse2016.0TrueNone5-Day Data Science Bootcamp5.05.0NaNNaNdata-science-dojo
132233672Ryan M.False2016.0TrueTrader5-Day Data Science Bootcamp5.05.0NaNNaNdata-science-dojo
\n", + "

8915 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " id name anonymous graduatingYear \\\n", + "0 309849 Anonymous True 2024.0 \n", + "1 309479 Patrick Marques False 2024.0 \n", + "2 308683 Harikrishnan Ramakrishnapillai False 2023.0 \n", + "3 307433 Sorin Tuinea False 2023.0 \n", + "4 307350 Kasia Luksza False 2023.0 \n", + ".. ... ... ... ... \n", + "128 234263 David False 2016.0 \n", + "129 233958 JC False 2016.0 \n", + "130 233957 Saurabh Agrawal False 2016.0 \n", + "131 233956 Guilherme False 2016.0 \n", + "132 233672 Ryan M. False 2016.0 \n", + "\n", + " isAlumni jobTitle program \\\n", + "0 False Data Analytics Part-Time \n", + "1 False Project Manager Data Analytics Bootcamp \n", + "2 False Cybersecurity None \n", + "3 False Data analyst None \n", + "4 False UX/UI Designer UX/UI Design Bootcamp \n", + ".. ... ... ... \n", + "128 True Laboratory Informatics Consultant 5-Day Data Science Bootcamp \n", + "129 True Senior Data Engineer 5-Day Data Science Bootcamp \n", + "130 True Software Engineer IV 5-Day Data Science Bootcamp \n", + "131 True None 5-Day Data Science Bootcamp \n", + "132 True Trader 5-Day Data Science Bootcamp \n", + "\n", + " overallScore overall curriculum jobSupport school \n", + "0 3.3 4.0 4.0 2.0 ironhack \n", + "1 4.0 4.0 4.0 4.0 ironhack \n", + "2 4.3 4.0 5.0 4.0 ironhack \n", + "3 5.0 5.0 5.0 5.0 ironhack \n", + "4 5.0 5.0 5.0 5.0 ironhack \n", + ".. ... ... ... ... ... \n", + "128 5.0 5.0 5.0 5.0 data-science-dojo \n", + "129 5.0 5.0 NaN NaN data-science-dojo \n", + "130 5.0 5.0 NaN NaN data-science-dojo \n", + "131 5.0 5.0 NaN NaN data-science-dojo \n", + "132 5.0 5.0 NaN NaN data-science-dojo \n", + "\n", + "[8915 rows x 12 columns]" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(comments) # ok this is the ratings DataFrame\n", + "\n", + "comments_columns = comments.columns\n", + "\n", + "cleaned_comments = comments.drop(['body', 'rawBody', 'review_body', 'user', 'comments', 'hostProgramName', 'tagline', 'createdAt', 'queryDate'], axis = 1)\n", + "\n", + "display(cleaned_comments)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnameanonymousgraduatingYearisAlumnijobTitleprogramoverallScoreoverallcurriculumjobSupportschool
0309849AnonymousTrue2024.0FalseData Analytics Part-Time3.34.04.02.0ironhack
1309479Patrick MarquesFalse2024.0FalseProject ManagerData Analytics Bootcamp4.04.04.04.0ironhack
2308683Harikrishnan RamakrishnapillaiFalse2023.0FalseCybersecurityNone4.34.05.04.0ironhack
3307433Sorin TuineaFalse2023.0FalseData analystNone5.05.05.05.0ironhack
4307350Kasia LukszaFalse2023.0FalseUX/UI DesignerUX/UI Design Bootcamp5.05.05.05.0ironhack
.......................................
128234263DavidFalse2016.0TrueLaboratory Informatics Consultant5-Day Data Science Bootcamp5.05.05.05.0data-science-dojo
129233958JCFalse2016.0TrueSenior Data Engineer5-Day Data Science Bootcamp5.05.0NaNNaNdata-science-dojo
130233957Saurabh AgrawalFalse2016.0TrueSoftware Engineer IV5-Day Data Science Bootcamp5.05.0NaNNaNdata-science-dojo
131233956GuilhermeFalse2016.0TrueNone5-Day Data Science Bootcamp5.05.0NaNNaNdata-science-dojo
132233672Ryan M.False2016.0TrueTrader5-Day Data Science Bootcamp5.05.0NaNNaNdata-science-dojo
\n", + "

8915 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " id name anonymous graduatingYear \\\n", + "0 309849 Anonymous True 2024.0 \n", + "1 309479 Patrick Marques False 2024.0 \n", + "2 308683 Harikrishnan Ramakrishnapillai False 2023.0 \n", + "3 307433 Sorin Tuinea False 2023.0 \n", + "4 307350 Kasia Luksza False 2023.0 \n", + ".. ... ... ... ... \n", + "128 234263 David False 2016.0 \n", + "129 233958 JC False 2016.0 \n", + "130 233957 Saurabh Agrawal False 2016.0 \n", + "131 233956 Guilherme False 2016.0 \n", + "132 233672 Ryan M. False 2016.0 \n", + "\n", + " isAlumni jobTitle program \\\n", + "0 False Data Analytics Part-Time \n", + "1 False Project Manager Data Analytics Bootcamp \n", + "2 False Cybersecurity None \n", + "3 False Data analyst None \n", + "4 False UX/UI Designer UX/UI Design Bootcamp \n", + ".. ... ... ... \n", + "128 True Laboratory Informatics Consultant 5-Day Data Science Bootcamp \n", + "129 True Senior Data Engineer 5-Day Data Science Bootcamp \n", + "130 True Software Engineer IV 5-Day Data Science Bootcamp \n", + "131 True None 5-Day Data Science Bootcamp \n", + "132 True Trader 5-Day Data Science Bootcamp \n", + "\n", + " overallScore overall curriculum jobSupport school \n", + "0 3.3 4.0 4.0 2.0 ironhack \n", + "1 4.0 4.0 4.0 4.0 ironhack \n", + "2 4.3 4.0 5.0 4.0 ironhack \n", + "3 5.0 5.0 5.0 5.0 ironhack \n", + "4 5.0 5.0 5.0 5.0 ironhack \n", + ".. ... ... ... ... ... \n", + "128 5.0 5.0 5.0 5.0 data-science-dojo \n", + "129 5.0 5.0 NaN NaN data-science-dojo \n", + "130 5.0 5.0 NaN NaN data-science-dojo \n", + "131 5.0 5.0 NaN NaN data-science-dojo \n", + "132 5.0 5.0 NaN NaN data-science-dojo \n", + "\n", + "[8915 rows x 12 columns]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "ename": "OperationalError", + "evalue": "(pymysql.err.OperationalError) (1054, \"Unknown column 'name' in 'field list'\")\n[SQL: INSERT INTO reviews (id, name, anonymous, `graduatingYear`, `isAlumni`, `jobTitle`, program, `overallScore`, overall, curriculum, `jobSupport`, school) VALUES (%(id)s, %(name)s, %(anonymous)s, %(graduatingYear)s, %(isAlumni)s, %(jobTitle)s, %(program)s, %(overallScore)s, %(overall)s, %(curriculum)s, %(jobSupport)s, %(school)s)]\n[parameters: [{'id': 309849, 'name': 'Anonymous', 'anonymous': 1, 'graduatingYear': 2024.0, 'isAlumni': 0, 'jobTitle': '', 'program': 'Data Analytics Part-Time', 'overallScore': '3.3', 'overall': '4.0', 'curriculum': '4.0', 'jobSupport': '2.0', 'school': 'ironhack'}, {'id': 309479, 'name': 'Patrick Marques', 'anonymous': 0, 'graduatingYear': 2024.0, 'isAlumni': 0, 'jobTitle': 'Project Manager', 'program': 'Data Analytics Bootcamp', 'overallScore': '4.0', 'overall': '4.0', 'curriculum': '4.0', 'jobSupport': '4.0', 'school': 'ironhack'}, {'id': 308683, 'name': 'Harikrishnan Ramakrishnapillai', 'anonymous': 0, 'graduatingYear': 2023.0, 'isAlumni': 0, 'jobTitle': 'Cybersecurity', 'program': None, 'overallScore': '4.3', 'overall': '4.0', 'curriculum': '5.0', 'jobSupport': '4.0', 'school': 'ironhack'}, {'id': 307433, 'name': 'Sorin Tuinea', 'anonymous': 0, 'graduatingYear': 2023.0, 'isAlumni': 0, 'jobTitle': 'Data analyst', 'program': None, 'overallScore': '5.0', 'overall': '5.0', 'curriculum': '5.0', 'jobSupport': '5.0', 'school': 'ironhack'}, {'id': 307350, 'name': 'Kasia Luksza', 'anonymous': 0, 'graduatingYear': 2023.0, 'isAlumni': 0, 'jobTitle': 'UX/UI Designer', 'program': 'UX/UI Design Bootcamp', 'overallScore': '5.0', 'overall': '5.0', 'curriculum': '5.0', 'jobSupport': '5.0', 'school': 'ironhack'}, {'id': 307312, 'name': 'Eminmert Toprak', 'anonymous': 0, 'graduatingYear': 2023.0, 'isAlumni': 1, 'jobTitle': 'Web Developer', 'program': 'Web Development Bootcamp', 'overallScore': '4.3', 'overall': '4.0', 'curriculum': '5.0', 'jobSupport': '4.0', 'school': 'ironhack'}, {'id': 307150, 'name': 'Miguel Reche Domingo', 'anonymous': 0, 'graduatingYear': 2023.0, 'isAlumni': 1, 'jobTitle': 'Diseño Gráfico', 'program': None, 'overallScore': '3.3', 'overall': '4.0', 'curriculum': '3.0', 'jobSupport': '3.0', 'school': 'ironhack'}, {'id': 307149, 'name': 'Adrian Siquier Valles', 'anonymous': 0, 'graduatingYear': 2023.0, 'isAlumni': 0, 'jobTitle': 'Full Stack Developer', 'program': 'Web Development Bootcamp', 'overallScore': '5.0', 'overall': '5.0', 'curriculum': '5.0', 'jobSupport': '5.0', 'school': 'ironhack'} ... displaying 10 of 8915 total bound parameter sets ... {'id': 233956, 'name': 'Guilherme', 'anonymous': 0, 'graduatingYear': 2016.0, 'isAlumni': 1, 'jobTitle': None, 'program': '5-Day Data Science Bootcamp', 'overallScore': '5.0', 'overall': '5.0', 'curriculum': None, 'jobSupport': None, 'school': 'data-science-dojo'}, {'id': 233672, 'name': 'Ryan M.', 'anonymous': 0, 'graduatingYear': 2016.0, 'isAlumni': 1, 'jobTitle': 'Trader', 'program': '5-Day Data Science Bootcamp', 'overallScore': '5.0', 'overall': '5.0', 'curriculum': None, 'jobSupport': None, 'school': 'data-science-dojo'}]]\n(Background on this error at: https://sqlalche.me/e/20/e3q8)", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mOperationalError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1938\u001b[0m, in \u001b[0;36mConnection._exec_single_context\u001b[0;34m(self, dialect, context, statement, parameters)\u001b[0m\n\u001b[1;32m 1937\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m evt_handled:\n\u001b[0;32m-> 1938\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdialect\u001b[38;5;241m.\u001b[39mdo_executemany(\n\u001b[1;32m 1939\u001b[0m cursor,\n\u001b[1;32m 1940\u001b[0m str_statement,\n\u001b[1;32m 1941\u001b[0m effective_parameters,\n\u001b[1;32m 1942\u001b[0m context,\n\u001b[1;32m 1943\u001b[0m )\n\u001b[1;32m 1944\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m effective_parameters \u001b[38;5;129;01mand\u001b[39;00m context\u001b[38;5;241m.\u001b[39mno_parameters:\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqldb.py:175\u001b[0m, in \u001b[0;36mMySQLDialect_mysqldb.do_executemany\u001b[0;34m(self, cursor, statement, parameters, context)\u001b[0m\n\u001b[1;32m 174\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdo_executemany\u001b[39m(\u001b[38;5;28mself\u001b[39m, cursor, statement, parameters, context\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[0;32m--> 175\u001b[0m rowcount \u001b[38;5;241m=\u001b[39m cursor\u001b[38;5;241m.\u001b[39mexecutemany(statement, parameters)\n\u001b[1;32m 176\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m context \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pymysql/cursors.py:182\u001b[0m, in \u001b[0;36mCursor.executemany\u001b[0;34m(self, query, args)\u001b[0m\n\u001b[1;32m 181\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m q_values[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m(\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m q_values[\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m] \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m)\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m--> 182\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_do_execute_many(\n\u001b[1;32m 183\u001b[0m q_prefix,\n\u001b[1;32m 184\u001b[0m q_values,\n\u001b[1;32m 185\u001b[0m q_postfix,\n\u001b[1;32m 186\u001b[0m args,\n\u001b[1;32m 187\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmax_stmt_length,\n\u001b[1;32m 188\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_db()\u001b[38;5;241m.\u001b[39mencoding,\n\u001b[1;32m 189\u001b[0m )\n\u001b[1;32m 191\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mrowcount \u001b[38;5;241m=\u001b[39m \u001b[38;5;28msum\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexecute(query, arg) \u001b[38;5;28;01mfor\u001b[39;00m arg \u001b[38;5;129;01min\u001b[39;00m args)\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pymysql/cursors.py:215\u001b[0m, in \u001b[0;36mCursor._do_execute_many\u001b[0;34m(self, prefix, values, postfix, args, max_stmt_length, encoding)\u001b[0m\n\u001b[1;32m 214\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(sql) \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mlen\u001b[39m(v) \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mlen\u001b[39m(postfix) \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;241m>\u001b[39m max_stmt_length:\n\u001b[0;32m--> 215\u001b[0m rows \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexecute(sql \u001b[38;5;241m+\u001b[39m postfix)\n\u001b[1;32m 216\u001b[0m sql \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mbytearray\u001b[39m(prefix)\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pymysql/cursors.py:153\u001b[0m, in \u001b[0;36mCursor.execute\u001b[0;34m(self, query, args)\u001b[0m\n\u001b[1;32m 151\u001b[0m query \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmogrify(query, args)\n\u001b[0;32m--> 153\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_query(query)\n\u001b[1;32m 154\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_executed \u001b[38;5;241m=\u001b[39m query\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pymysql/cursors.py:322\u001b[0m, in \u001b[0;36mCursor._query\u001b[0;34m(self, q)\u001b[0m\n\u001b[1;32m 321\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_clear_result()\n\u001b[0;32m--> 322\u001b[0m conn\u001b[38;5;241m.\u001b[39mquery(q)\n\u001b[1;32m 323\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_do_get_result()\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pymysql/connections.py:563\u001b[0m, in \u001b[0;36mConnection.query\u001b[0;34m(self, sql, unbuffered)\u001b[0m\n\u001b[1;32m 562\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_execute_command(COMMAND\u001b[38;5;241m.\u001b[39mCOM_QUERY, sql)\n\u001b[0;32m--> 563\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_affected_rows \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_read_query_result(unbuffered\u001b[38;5;241m=\u001b[39munbuffered)\n\u001b[1;32m 564\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_affected_rows\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pymysql/connections.py:825\u001b[0m, in \u001b[0;36mConnection._read_query_result\u001b[0;34m(self, unbuffered)\u001b[0m\n\u001b[1;32m 824\u001b[0m result \u001b[38;5;241m=\u001b[39m MySQLResult(\u001b[38;5;28mself\u001b[39m)\n\u001b[0;32m--> 825\u001b[0m result\u001b[38;5;241m.\u001b[39mread()\n\u001b[1;32m 826\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_result \u001b[38;5;241m=\u001b[39m result\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pymysql/connections.py:1199\u001b[0m, in \u001b[0;36mMySQLResult.read\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1198\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1199\u001b[0m first_packet \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconnection\u001b[38;5;241m.\u001b[39m_read_packet()\n\u001b[1;32m 1201\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m first_packet\u001b[38;5;241m.\u001b[39mis_ok_packet():\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pymysql/connections.py:775\u001b[0m, in \u001b[0;36mConnection._read_packet\u001b[0;34m(self, packet_type)\u001b[0m\n\u001b[1;32m 774\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_result\u001b[38;5;241m.\u001b[39munbuffered_active \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m--> 775\u001b[0m packet\u001b[38;5;241m.\u001b[39mraise_for_error()\n\u001b[1;32m 776\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m packet\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pymysql/protocol.py:219\u001b[0m, in \u001b[0;36mMysqlPacket.raise_for_error\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124merrno =\u001b[39m\u001b[38;5;124m\"\u001b[39m, errno)\n\u001b[0;32m--> 219\u001b[0m err\u001b[38;5;241m.\u001b[39mraise_mysql_exception(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_data)\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pymysql/err.py:150\u001b[0m, in \u001b[0;36mraise_mysql_exception\u001b[0;34m(data)\u001b[0m\n\u001b[1;32m 149\u001b[0m errorclass \u001b[38;5;241m=\u001b[39m InternalError \u001b[38;5;28;01mif\u001b[39;00m errno \u001b[38;5;241m<\u001b[39m \u001b[38;5;241m1000\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m OperationalError\n\u001b[0;32m--> 150\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m errorclass(errno, errval)\n", + "\u001b[0;31mOperationalError\u001b[0m: (1054, \"Unknown column 'name' in 'field list'\")", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[0;31mOperationalError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[15], line 38\u001b[0m\n\u001b[1;32m 20\u001b[0m reviews \u001b[38;5;241m=\u001b[39m Table(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mreviews\u001b[39m\u001b[38;5;124m'\u001b[39m, metadata,\n\u001b[1;32m 21\u001b[0m Column(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mid\u001b[39m\u001b[38;5;124m'\u001b[39m, Integer, primary_key\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m),\n\u001b[1;32m 22\u001b[0m Column(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m'\u001b[39m, String(\u001b[38;5;241m255\u001b[39m)),\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 32\u001b[0m Column(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mschool\u001b[39m\u001b[38;5;124m'\u001b[39m, String(\u001b[38;5;241m255\u001b[39m))\n\u001b[1;32m 33\u001b[0m )\n\u001b[1;32m 35\u001b[0m metadata\u001b[38;5;241m.\u001b[39mcreate_all(engine)\n\u001b[0;32m---> 38\u001b[0m cleaned_comments\u001b[38;5;241m.\u001b[39mto_sql(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mreviews\u001b[39m\u001b[38;5;124m'\u001b[39m, con\u001b[38;5;241m=\u001b[39mengine, if_exists\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mappend\u001b[39m\u001b[38;5;124m'\u001b[39m, index\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/util/_decorators.py:333\u001b[0m, in \u001b[0;36mdeprecate_nonkeyword_arguments..decorate..wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 327\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(args) \u001b[38;5;241m>\u001b[39m num_allow_args:\n\u001b[1;32m 328\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\n\u001b[1;32m 329\u001b[0m msg\u001b[38;5;241m.\u001b[39mformat(arguments\u001b[38;5;241m=\u001b[39m_format_argument_list(allow_args)),\n\u001b[1;32m 330\u001b[0m \u001b[38;5;167;01mFutureWarning\u001b[39;00m,\n\u001b[1;32m 331\u001b[0m stacklevel\u001b[38;5;241m=\u001b[39mfind_stack_level(),\n\u001b[1;32m 332\u001b[0m )\n\u001b[0;32m--> 333\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m func(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/core/generic.py:3008\u001b[0m, in \u001b[0;36mNDFrame.to_sql\u001b[0;34m(self, name, con, schema, if_exists, index, index_label, chunksize, dtype, method)\u001b[0m\n\u001b[1;32m 2813\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 2814\u001b[0m \u001b[38;5;124;03mWrite records stored in a DataFrame to a SQL database.\u001b[39;00m\n\u001b[1;32m 2815\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 3004\u001b[0m \u001b[38;5;124;03m[(1,), (None,), (2,)]\u001b[39;00m\n\u001b[1;32m 3005\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m \u001b[38;5;66;03m# noqa: E501\u001b[39;00m\n\u001b[1;32m 3006\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mio\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m sql\n\u001b[0;32m-> 3008\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m sql\u001b[38;5;241m.\u001b[39mto_sql(\n\u001b[1;32m 3009\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 3010\u001b[0m name,\n\u001b[1;32m 3011\u001b[0m con,\n\u001b[1;32m 3012\u001b[0m schema\u001b[38;5;241m=\u001b[39mschema,\n\u001b[1;32m 3013\u001b[0m if_exists\u001b[38;5;241m=\u001b[39mif_exists,\n\u001b[1;32m 3014\u001b[0m index\u001b[38;5;241m=\u001b[39mindex,\n\u001b[1;32m 3015\u001b[0m index_label\u001b[38;5;241m=\u001b[39mindex_label,\n\u001b[1;32m 3016\u001b[0m chunksize\u001b[38;5;241m=\u001b[39mchunksize,\n\u001b[1;32m 3017\u001b[0m dtype\u001b[38;5;241m=\u001b[39mdtype,\n\u001b[1;32m 3018\u001b[0m method\u001b[38;5;241m=\u001b[39mmethod,\n\u001b[1;32m 3019\u001b[0m )\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/io/sql.py:788\u001b[0m, in \u001b[0;36mto_sql\u001b[0;34m(frame, name, con, schema, if_exists, index, index_label, chunksize, dtype, method, engine, **engine_kwargs)\u001b[0m\n\u001b[1;32m 783\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mNotImplementedError\u001b[39;00m(\n\u001b[1;32m 784\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mframe\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m argument should be either a Series or a DataFrame\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 785\u001b[0m )\n\u001b[1;32m 787\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m pandasSQL_builder(con, schema\u001b[38;5;241m=\u001b[39mschema, need_transaction\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m pandas_sql:\n\u001b[0;32m--> 788\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m pandas_sql\u001b[38;5;241m.\u001b[39mto_sql(\n\u001b[1;32m 789\u001b[0m frame,\n\u001b[1;32m 790\u001b[0m name,\n\u001b[1;32m 791\u001b[0m if_exists\u001b[38;5;241m=\u001b[39mif_exists,\n\u001b[1;32m 792\u001b[0m index\u001b[38;5;241m=\u001b[39mindex,\n\u001b[1;32m 793\u001b[0m index_label\u001b[38;5;241m=\u001b[39mindex_label,\n\u001b[1;32m 794\u001b[0m schema\u001b[38;5;241m=\u001b[39mschema,\n\u001b[1;32m 795\u001b[0m chunksize\u001b[38;5;241m=\u001b[39mchunksize,\n\u001b[1;32m 796\u001b[0m dtype\u001b[38;5;241m=\u001b[39mdtype,\n\u001b[1;32m 797\u001b[0m method\u001b[38;5;241m=\u001b[39mmethod,\n\u001b[1;32m 798\u001b[0m engine\u001b[38;5;241m=\u001b[39mengine,\n\u001b[1;32m 799\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mengine_kwargs,\n\u001b[1;32m 800\u001b[0m )\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/io/sql.py:1958\u001b[0m, in \u001b[0;36mSQLDatabase.to_sql\u001b[0;34m(self, frame, name, if_exists, index, index_label, schema, chunksize, dtype, method, engine, **engine_kwargs)\u001b[0m\n\u001b[1;32m 1946\u001b[0m sql_engine \u001b[38;5;241m=\u001b[39m get_engine(engine)\n\u001b[1;32m 1948\u001b[0m table \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprep_table(\n\u001b[1;32m 1949\u001b[0m frame\u001b[38;5;241m=\u001b[39mframe,\n\u001b[1;32m 1950\u001b[0m name\u001b[38;5;241m=\u001b[39mname,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1955\u001b[0m dtype\u001b[38;5;241m=\u001b[39mdtype,\n\u001b[1;32m 1956\u001b[0m )\n\u001b[0;32m-> 1958\u001b[0m total_inserted \u001b[38;5;241m=\u001b[39m sql_engine\u001b[38;5;241m.\u001b[39minsert_records(\n\u001b[1;32m 1959\u001b[0m table\u001b[38;5;241m=\u001b[39mtable,\n\u001b[1;32m 1960\u001b[0m con\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcon,\n\u001b[1;32m 1961\u001b[0m frame\u001b[38;5;241m=\u001b[39mframe,\n\u001b[1;32m 1962\u001b[0m name\u001b[38;5;241m=\u001b[39mname,\n\u001b[1;32m 1963\u001b[0m index\u001b[38;5;241m=\u001b[39mindex,\n\u001b[1;32m 1964\u001b[0m schema\u001b[38;5;241m=\u001b[39mschema,\n\u001b[1;32m 1965\u001b[0m chunksize\u001b[38;5;241m=\u001b[39mchunksize,\n\u001b[1;32m 1966\u001b[0m method\u001b[38;5;241m=\u001b[39mmethod,\n\u001b[1;32m 1967\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mengine_kwargs,\n\u001b[1;32m 1968\u001b[0m )\n\u001b[1;32m 1970\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcheck_case_sensitive(name\u001b[38;5;241m=\u001b[39mname, schema\u001b[38;5;241m=\u001b[39mschema)\n\u001b[1;32m 1971\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m total_inserted\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/io/sql.py:1507\u001b[0m, in \u001b[0;36mSQLAlchemyEngine.insert_records\u001b[0;34m(self, table, con, frame, name, index, schema, chunksize, method, **engine_kwargs)\u001b[0m\n\u001b[1;32m 1505\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m re\u001b[38;5;241m.\u001b[39msearch(msg, err_text):\n\u001b[1;32m 1506\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124minf cannot be used with MySQL\u001b[39m\u001b[38;5;124m\"\u001b[39m) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n\u001b[0;32m-> 1507\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m err\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/io/sql.py:1498\u001b[0m, in \u001b[0;36mSQLAlchemyEngine.insert_records\u001b[0;34m(self, table, con, frame, name, index, schema, chunksize, method, **engine_kwargs)\u001b[0m\n\u001b[1;32m 1495\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01msqlalchemy\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m exc\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1498\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m table\u001b[38;5;241m.\u001b[39minsert(chunksize\u001b[38;5;241m=\u001b[39mchunksize, method\u001b[38;5;241m=\u001b[39mmethod)\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m exc\u001b[38;5;241m.\u001b[39mStatementError \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;66;03m# GH34431\u001b[39;00m\n\u001b[1;32m 1501\u001b[0m \u001b[38;5;66;03m# https://stackoverflow.com/a/67358288/6067848\u001b[39;00m\n\u001b[1;32m 1502\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mr\u001b[39m\u001b[38;5;124m\"\"\"\u001b[39m\u001b[38;5;124m(\u001b[39m\u001b[38;5;124m\\\u001b[39m\u001b[38;5;124m(1054, \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mUnknown column \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124minf(e0)?\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m in \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfield list\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\\\u001b[39m\u001b[38;5;124m))(?#\u001b[39m\n\u001b[1;32m 1503\u001b[0m \u001b[38;5;124m )|inf can not be used with MySQL\u001b[39m\u001b[38;5;124m\"\"\"\u001b[39m\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/io/sql.py:1059\u001b[0m, in \u001b[0;36mSQLTable.insert\u001b[0;34m(self, chunksize, method)\u001b[0m\n\u001b[1;32m 1056\u001b[0m \u001b[38;5;28;01mbreak\u001b[39;00m\n\u001b[1;32m 1058\u001b[0m chunk_iter \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mzip\u001b[39m(\u001b[38;5;241m*\u001b[39m(arr[start_i:end_i] \u001b[38;5;28;01mfor\u001b[39;00m arr \u001b[38;5;129;01min\u001b[39;00m data_list))\n\u001b[0;32m-> 1059\u001b[0m num_inserted \u001b[38;5;241m=\u001b[39m exec_insert(conn, keys, chunk_iter)\n\u001b[1;32m 1060\u001b[0m \u001b[38;5;66;03m# GH 46891\u001b[39;00m\n\u001b[1;32m 1061\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m num_inserted \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/io/sql.py:951\u001b[0m, in \u001b[0;36mSQLTable._execute_insert\u001b[0;34m(self, conn, keys, data_iter)\u001b[0m\n\u001b[1;32m 939\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 940\u001b[0m \u001b[38;5;124;03mExecute SQL statement inserting data\u001b[39;00m\n\u001b[1;32m 941\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 948\u001b[0m \u001b[38;5;124;03m Each item contains a list of values to be inserted\u001b[39;00m\n\u001b[1;32m 949\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 950\u001b[0m data \u001b[38;5;241m=\u001b[39m [\u001b[38;5;28mdict\u001b[39m(\u001b[38;5;28mzip\u001b[39m(keys, row)) \u001b[38;5;28;01mfor\u001b[39;00m row \u001b[38;5;129;01min\u001b[39;00m data_iter]\n\u001b[0;32m--> 951\u001b[0m result \u001b[38;5;241m=\u001b[39m conn\u001b[38;5;241m.\u001b[39mexecute(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtable\u001b[38;5;241m.\u001b[39minsert(), data)\n\u001b[1;32m 952\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m result\u001b[38;5;241m.\u001b[39mrowcount\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1416\u001b[0m, in \u001b[0;36mConnection.execute\u001b[0;34m(self, statement, parameters, execution_options)\u001b[0m\n\u001b[1;32m 1414\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc\u001b[38;5;241m.\u001b[39mObjectNotExecutableError(statement) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n\u001b[1;32m 1415\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1416\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m meth(\n\u001b[1;32m 1417\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 1418\u001b[0m distilled_parameters,\n\u001b[1;32m 1419\u001b[0m execution_options \u001b[38;5;129;01mor\u001b[39;00m NO_OPTIONS,\n\u001b[1;32m 1420\u001b[0m )\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/sqlalchemy/sql/elements.py:517\u001b[0m, in \u001b[0;36mClauseElement._execute_on_connection\u001b[0;34m(self, connection, distilled_params, execution_options)\u001b[0m\n\u001b[1;32m 515\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m TYPE_CHECKING:\n\u001b[1;32m 516\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\u001b[38;5;28mself\u001b[39m, Executable)\n\u001b[0;32m--> 517\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m connection\u001b[38;5;241m.\u001b[39m_execute_clauseelement(\n\u001b[1;32m 518\u001b[0m \u001b[38;5;28mself\u001b[39m, distilled_params, execution_options\n\u001b[1;32m 519\u001b[0m )\n\u001b[1;32m 520\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 521\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc\u001b[38;5;241m.\u001b[39mObjectNotExecutableError(\u001b[38;5;28mself\u001b[39m)\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1639\u001b[0m, in \u001b[0;36mConnection._execute_clauseelement\u001b[0;34m(self, elem, distilled_parameters, execution_options)\u001b[0m\n\u001b[1;32m 1627\u001b[0m compiled_cache: Optional[CompiledCacheType] \u001b[38;5;241m=\u001b[39m execution_options\u001b[38;5;241m.\u001b[39mget(\n\u001b[1;32m 1628\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcompiled_cache\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mengine\u001b[38;5;241m.\u001b[39m_compiled_cache\n\u001b[1;32m 1629\u001b[0m )\n\u001b[1;32m 1631\u001b[0m compiled_sql, extracted_params, cache_hit \u001b[38;5;241m=\u001b[39m elem\u001b[38;5;241m.\u001b[39m_compile_w_cache(\n\u001b[1;32m 1632\u001b[0m dialect\u001b[38;5;241m=\u001b[39mdialect,\n\u001b[1;32m 1633\u001b[0m compiled_cache\u001b[38;5;241m=\u001b[39mcompiled_cache,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1637\u001b[0m linting\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdialect\u001b[38;5;241m.\u001b[39mcompiler_linting \u001b[38;5;241m|\u001b[39m compiler\u001b[38;5;241m.\u001b[39mWARN_LINTING,\n\u001b[1;32m 1638\u001b[0m )\n\u001b[0;32m-> 1639\u001b[0m ret \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_execute_context(\n\u001b[1;32m 1640\u001b[0m dialect,\n\u001b[1;32m 1641\u001b[0m dialect\u001b[38;5;241m.\u001b[39mexecution_ctx_cls\u001b[38;5;241m.\u001b[39m_init_compiled,\n\u001b[1;32m 1642\u001b[0m compiled_sql,\n\u001b[1;32m 1643\u001b[0m distilled_parameters,\n\u001b[1;32m 1644\u001b[0m execution_options,\n\u001b[1;32m 1645\u001b[0m compiled_sql,\n\u001b[1;32m 1646\u001b[0m distilled_parameters,\n\u001b[1;32m 1647\u001b[0m elem,\n\u001b[1;32m 1648\u001b[0m extracted_params,\n\u001b[1;32m 1649\u001b[0m cache_hit\u001b[38;5;241m=\u001b[39mcache_hit,\n\u001b[1;32m 1650\u001b[0m )\n\u001b[1;32m 1651\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m has_events:\n\u001b[1;32m 1652\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdispatch\u001b[38;5;241m.\u001b[39mafter_execute(\n\u001b[1;32m 1653\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 1654\u001b[0m elem,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1658\u001b[0m ret,\n\u001b[1;32m 1659\u001b[0m )\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1848\u001b[0m, in \u001b[0;36mConnection._execute_context\u001b[0;34m(self, dialect, constructor, statement, parameters, execution_options, *args, **kw)\u001b[0m\n\u001b[1;32m 1843\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exec_insertmany_context(\n\u001b[1;32m 1844\u001b[0m dialect,\n\u001b[1;32m 1845\u001b[0m context,\n\u001b[1;32m 1846\u001b[0m )\n\u001b[1;32m 1847\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1848\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exec_single_context(\n\u001b[1;32m 1849\u001b[0m dialect, context, statement, parameters\n\u001b[1;32m 1850\u001b[0m )\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1988\u001b[0m, in \u001b[0;36mConnection._exec_single_context\u001b[0;34m(self, dialect, context, statement, parameters)\u001b[0m\n\u001b[1;32m 1985\u001b[0m result \u001b[38;5;241m=\u001b[39m context\u001b[38;5;241m.\u001b[39m_setup_result_proxy()\n\u001b[1;32m 1987\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m-> 1988\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_handle_dbapi_exception(\n\u001b[1;32m 1989\u001b[0m e, str_statement, effective_parameters, cursor, context\n\u001b[1;32m 1990\u001b[0m )\n\u001b[1;32m 1992\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m result\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2344\u001b[0m, in \u001b[0;36mConnection._handle_dbapi_exception\u001b[0;34m(self, e, statement, parameters, cursor, context, is_sub_exec)\u001b[0m\n\u001b[1;32m 2342\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m should_wrap:\n\u001b[1;32m 2343\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m sqlalchemy_exception \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m-> 2344\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m sqlalchemy_exception\u001b[38;5;241m.\u001b[39mwith_traceback(exc_info[\u001b[38;5;241m2\u001b[39m]) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01me\u001b[39;00m\n\u001b[1;32m 2345\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 2346\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m exc_info[\u001b[38;5;241m1\u001b[39m] \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1938\u001b[0m, in \u001b[0;36mConnection._exec_single_context\u001b[0;34m(self, dialect, context, statement, parameters)\u001b[0m\n\u001b[1;32m 1936\u001b[0m \u001b[38;5;28;01mbreak\u001b[39;00m\n\u001b[1;32m 1937\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m evt_handled:\n\u001b[0;32m-> 1938\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdialect\u001b[38;5;241m.\u001b[39mdo_executemany(\n\u001b[1;32m 1939\u001b[0m cursor,\n\u001b[1;32m 1940\u001b[0m str_statement,\n\u001b[1;32m 1941\u001b[0m effective_parameters,\n\u001b[1;32m 1942\u001b[0m context,\n\u001b[1;32m 1943\u001b[0m )\n\u001b[1;32m 1944\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m effective_parameters \u001b[38;5;129;01mand\u001b[39;00m context\u001b[38;5;241m.\u001b[39mno_parameters:\n\u001b[1;32m 1945\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdialect\u001b[38;5;241m.\u001b[39m_has_events:\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqldb.py:175\u001b[0m, in \u001b[0;36mMySQLDialect_mysqldb.do_executemany\u001b[0;34m(self, cursor, statement, parameters, context)\u001b[0m\n\u001b[1;32m 174\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdo_executemany\u001b[39m(\u001b[38;5;28mself\u001b[39m, cursor, statement, parameters, context\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[0;32m--> 175\u001b[0m rowcount \u001b[38;5;241m=\u001b[39m cursor\u001b[38;5;241m.\u001b[39mexecutemany(statement, parameters)\n\u001b[1;32m 176\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m context \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 177\u001b[0m context\u001b[38;5;241m.\u001b[39m_rowcount \u001b[38;5;241m=\u001b[39m rowcount\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pymysql/cursors.py:182\u001b[0m, in \u001b[0;36mCursor.executemany\u001b[0;34m(self, query, args)\u001b[0m\n\u001b[1;32m 180\u001b[0m q_postfix \u001b[38;5;241m=\u001b[39m m\u001b[38;5;241m.\u001b[39mgroup(\u001b[38;5;241m3\u001b[39m) \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 181\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m q_values[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m(\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m q_values[\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m] \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m)\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m--> 182\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_do_execute_many(\n\u001b[1;32m 183\u001b[0m q_prefix,\n\u001b[1;32m 184\u001b[0m q_values,\n\u001b[1;32m 185\u001b[0m q_postfix,\n\u001b[1;32m 186\u001b[0m args,\n\u001b[1;32m 187\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmax_stmt_length,\n\u001b[1;32m 188\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_db()\u001b[38;5;241m.\u001b[39mencoding,\n\u001b[1;32m 189\u001b[0m )\n\u001b[1;32m 191\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mrowcount \u001b[38;5;241m=\u001b[39m \u001b[38;5;28msum\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexecute(query, arg) \u001b[38;5;28;01mfor\u001b[39;00m arg \u001b[38;5;129;01min\u001b[39;00m args)\n\u001b[1;32m 192\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mrowcount\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pymysql/cursors.py:215\u001b[0m, in \u001b[0;36mCursor._do_execute_many\u001b[0;34m(self, prefix, values, postfix, args, max_stmt_length, encoding)\u001b[0m\n\u001b[1;32m 213\u001b[0m v \u001b[38;5;241m=\u001b[39m v\u001b[38;5;241m.\u001b[39mencode(encoding, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msurrogateescape\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 214\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(sql) \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mlen\u001b[39m(v) \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mlen\u001b[39m(postfix) \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;241m>\u001b[39m max_stmt_length:\n\u001b[0;32m--> 215\u001b[0m rows \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexecute(sql \u001b[38;5;241m+\u001b[39m postfix)\n\u001b[1;32m 216\u001b[0m sql \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mbytearray\u001b[39m(prefix)\n\u001b[1;32m 217\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pymysql/cursors.py:153\u001b[0m, in \u001b[0;36mCursor.execute\u001b[0;34m(self, query, args)\u001b[0m\n\u001b[1;32m 149\u001b[0m \u001b[38;5;28;01mpass\u001b[39;00m\n\u001b[1;32m 151\u001b[0m query \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmogrify(query, args)\n\u001b[0;32m--> 153\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_query(query)\n\u001b[1;32m 154\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_executed \u001b[38;5;241m=\u001b[39m query\n\u001b[1;32m 155\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m result\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pymysql/cursors.py:322\u001b[0m, in \u001b[0;36mCursor._query\u001b[0;34m(self, q)\u001b[0m\n\u001b[1;32m 320\u001b[0m conn \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_db()\n\u001b[1;32m 321\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_clear_result()\n\u001b[0;32m--> 322\u001b[0m conn\u001b[38;5;241m.\u001b[39mquery(q)\n\u001b[1;32m 323\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_do_get_result()\n\u001b[1;32m 324\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mrowcount\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pymysql/connections.py:563\u001b[0m, in \u001b[0;36mConnection.query\u001b[0;34m(self, sql, unbuffered)\u001b[0m\n\u001b[1;32m 561\u001b[0m sql \u001b[38;5;241m=\u001b[39m sql\u001b[38;5;241m.\u001b[39mencode(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mencoding, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msurrogateescape\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 562\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_execute_command(COMMAND\u001b[38;5;241m.\u001b[39mCOM_QUERY, sql)\n\u001b[0;32m--> 563\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_affected_rows \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_read_query_result(unbuffered\u001b[38;5;241m=\u001b[39munbuffered)\n\u001b[1;32m 564\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_affected_rows\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pymysql/connections.py:825\u001b[0m, in \u001b[0;36mConnection._read_query_result\u001b[0;34m(self, unbuffered)\u001b[0m\n\u001b[1;32m 823\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 824\u001b[0m result \u001b[38;5;241m=\u001b[39m MySQLResult(\u001b[38;5;28mself\u001b[39m)\n\u001b[0;32m--> 825\u001b[0m result\u001b[38;5;241m.\u001b[39mread()\n\u001b[1;32m 826\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_result \u001b[38;5;241m=\u001b[39m result\n\u001b[1;32m 827\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m result\u001b[38;5;241m.\u001b[39mserver_status \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pymysql/connections.py:1199\u001b[0m, in \u001b[0;36mMySQLResult.read\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1197\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mread\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 1198\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1199\u001b[0m first_packet \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconnection\u001b[38;5;241m.\u001b[39m_read_packet()\n\u001b[1;32m 1201\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m first_packet\u001b[38;5;241m.\u001b[39mis_ok_packet():\n\u001b[1;32m 1202\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_read_ok_packet(first_packet)\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pymysql/connections.py:775\u001b[0m, in \u001b[0;36mConnection._read_packet\u001b[0;34m(self, packet_type)\u001b[0m\n\u001b[1;32m 773\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_result \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_result\u001b[38;5;241m.\u001b[39munbuffered_active \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[1;32m 774\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_result\u001b[38;5;241m.\u001b[39munbuffered_active \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m--> 775\u001b[0m packet\u001b[38;5;241m.\u001b[39mraise_for_error()\n\u001b[1;32m 776\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m packet\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pymysql/protocol.py:219\u001b[0m, in \u001b[0;36mMysqlPacket.raise_for_error\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 217\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m DEBUG:\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124merrno =\u001b[39m\u001b[38;5;124m\"\u001b[39m, errno)\n\u001b[0;32m--> 219\u001b[0m err\u001b[38;5;241m.\u001b[39mraise_mysql_exception(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_data)\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pymysql/err.py:150\u001b[0m, in \u001b[0;36mraise_mysql_exception\u001b[0;34m(data)\u001b[0m\n\u001b[1;32m 148\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m errorclass \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 149\u001b[0m errorclass \u001b[38;5;241m=\u001b[39m InternalError \u001b[38;5;28;01mif\u001b[39;00m errno \u001b[38;5;241m<\u001b[39m \u001b[38;5;241m1000\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m OperationalError\n\u001b[0;32m--> 150\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m errorclass(errno, errval)\n", + "\u001b[0;31mOperationalError\u001b[0m: (pymysql.err.OperationalError) (1054, \"Unknown column 'name' in 'field list'\")\n[SQL: INSERT INTO reviews (id, name, anonymous, `graduatingYear`, `isAlumni`, `jobTitle`, program, `overallScore`, overall, curriculum, `jobSupport`, school) VALUES (%(id)s, %(name)s, %(anonymous)s, %(graduatingYear)s, %(isAlumni)s, %(jobTitle)s, %(program)s, %(overallScore)s, %(overall)s, %(curriculum)s, %(jobSupport)s, %(school)s)]\n[parameters: [{'id': 309849, 'name': 'Anonymous', 'anonymous': 1, 'graduatingYear': 2024.0, 'isAlumni': 0, 'jobTitle': '', 'program': 'Data Analytics Part-Time', 'overallScore': '3.3', 'overall': '4.0', 'curriculum': '4.0', 'jobSupport': '2.0', 'school': 'ironhack'}, {'id': 309479, 'name': 'Patrick Marques', 'anonymous': 0, 'graduatingYear': 2024.0, 'isAlumni': 0, 'jobTitle': 'Project Manager', 'program': 'Data Analytics Bootcamp', 'overallScore': '4.0', 'overall': '4.0', 'curriculum': '4.0', 'jobSupport': '4.0', 'school': 'ironhack'}, {'id': 308683, 'name': 'Harikrishnan Ramakrishnapillai', 'anonymous': 0, 'graduatingYear': 2023.0, 'isAlumni': 0, 'jobTitle': 'Cybersecurity', 'program': None, 'overallScore': '4.3', 'overall': '4.0', 'curriculum': '5.0', 'jobSupport': '4.0', 'school': 'ironhack'}, {'id': 307433, 'name': 'Sorin Tuinea', 'anonymous': 0, 'graduatingYear': 2023.0, 'isAlumni': 0, 'jobTitle': 'Data analyst', 'program': None, 'overallScore': '5.0', 'overall': '5.0', 'curriculum': '5.0', 'jobSupport': '5.0', 'school': 'ironhack'}, {'id': 307350, 'name': 'Kasia Luksza', 'anonymous': 0, 'graduatingYear': 2023.0, 'isAlumni': 0, 'jobTitle': 'UX/UI Designer', 'program': 'UX/UI Design Bootcamp', 'overallScore': '5.0', 'overall': '5.0', 'curriculum': '5.0', 'jobSupport': '5.0', 'school': 'ironhack'}, {'id': 307312, 'name': 'Eminmert Toprak', 'anonymous': 0, 'graduatingYear': 2023.0, 'isAlumni': 1, 'jobTitle': 'Web Developer', 'program': 'Web Development Bootcamp', 'overallScore': '4.3', 'overall': '4.0', 'curriculum': '5.0', 'jobSupport': '4.0', 'school': 'ironhack'}, {'id': 307150, 'name': 'Miguel Reche Domingo', 'anonymous': 0, 'graduatingYear': 2023.0, 'isAlumni': 1, 'jobTitle': 'Diseño Gráfico', 'program': None, 'overallScore': '3.3', 'overall': '4.0', 'curriculum': '3.0', 'jobSupport': '3.0', 'school': 'ironhack'}, {'id': 307149, 'name': 'Adrian Siquier Valles', 'anonymous': 0, 'graduatingYear': 2023.0, 'isAlumni': 0, 'jobTitle': 'Full Stack Developer', 'program': 'Web Development Bootcamp', 'overallScore': '5.0', 'overall': '5.0', 'curriculum': '5.0', 'jobSupport': '5.0', 'school': 'ironhack'} ... displaying 10 of 8915 total bound parameter sets ... {'id': 233956, 'name': 'Guilherme', 'anonymous': 0, 'graduatingYear': 2016.0, 'isAlumni': 1, 'jobTitle': None, 'program': '5-Day Data Science Bootcamp', 'overallScore': '5.0', 'overall': '5.0', 'curriculum': None, 'jobSupport': None, 'school': 'data-science-dojo'}, {'id': 233672, 'name': 'Ryan M.', 'anonymous': 0, 'graduatingYear': 2016.0, 'isAlumni': 1, 'jobTitle': 'Trader', 'program': '5-Day Data Science Bootcamp', 'overallScore': '5.0', 'overall': '5.0', 'curriculum': None, 'jobSupport': None, 'school': 'data-science-dojo'}]]\n(Background on this error at: https://sqlalche.me/e/20/e3q8)" + ] + } + ], + "source": [ + "from sqlalchemy import Table, Column, Integer, String, Boolean, Float, Text, Date, MetaData\n", + "\n", + "\n", + "display(cleaned_comments)\n", + "\n", + "cleaned_comments['anonymous'] = cleaned_comments['name'].apply(lambda x: 1 if x == 'Anonymous' else 0)\n", + "\n", + "\n", + "metadata = MetaData()\n", + "\n", + "username = 'root'\n", + "host = 'localhost'\n", + "database = 'Ironhack_SQL'\n", + "\n", + "engine = create_engine(\"mysql+pymysql://{user}:{pw}@localhost/{db}\"\n", + " .format(user=\"root\",\n", + " pw=password,\n", + " db=database))\n", + "\n", + "reviews = Table('reviews', metadata,\n", + " Column('id', Integer, primary_key=True),\n", + " Column('name', String(255)),\n", + " Column('anonymous', Boolean),\n", + " Column('graduatingYear', Integer),\n", + " Column('isAlumni', Boolean),\n", + " Column('jobTitle', String(255)),\n", + " Column('program', String(255)),\n", + " Column('overallScore', Float),\n", + " Column('overall', Float),\n", + " Column('curriculum', Float),\n", + " Column('jobSupport', Float),\n", + " Column('school', String(255))\n", + " )\n", + "\n", + "metadata.create_all(engine)\n", + "\n", + "\n", + "cleaned_comments.to_sql('reviews', con=engine, if_exists='append', index=False)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Original Code for SQL import from Python manually" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "if cnx.is_connected():\n", + " \n", + " cursor = cnx.cursor()\n", + " print(\"Connection open\")\n", + " \n", + " # do stuff you need to the database\n", + "\n", + " insert_review_data = \"\"\"\n", + " INSERT INTO Ironhack_SQL.reviews \n", + " (id, \n", + " name, \n", + " anonymous, \n", + " hostProgramName, \n", + " graduatingYear, \n", + " isAlumni, \n", + " jobTitle, \n", + " tagline, \n", + " body, \n", + " rawBody, \n", + " createdAt, \n", + " queryDate, \n", + " program, \n", + " user, \n", + " overallScore, \n", + " comments, \n", + " overall, \n", + " curriculum, \n", + " jobSupport, \n", + " review_body, \n", + " school)\n", + " VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)\n", + " \"\"\"\n", + "\n", + "#VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)\n", + " \n", + " # iterate over each row in the DF\n", + " for index, row in comments.iterrows():\n", + " data_tuple = (\n", + " row['id'], \n", + " row['name'], \n", + " row['anonymous'], \n", + " row['hostProgramName'], \n", + " row['graduatingYear'],\n", + " row['isAlumni'], \n", + " row['jobTitle'], \n", + " row['tagline'], \n", + " row['body'], \n", + " row['rawBody'],\n", + " row['createdAt'], \n", + " row['queryDate'], \n", + " row['program'], \n", + " row['user'], \n", + " row['overallScore'],\n", + " row['comments'], \n", + " row['overall'], \n", + " row['curriculum'], \n", + " row['jobSupport'], \n", + " row['review_body'], \n", + " row['school']\n", + " )\n", + " for index, row in comments.iterrows():\n", + " # Extract data from each row as a tuple\n", + " try:\n", + " data_tuple = tuple(str(row[col]) if isinstance(row[col], dict) else row[col] for col in columns)\n", + " # Debugging: Print the row being processed\n", + " print(f\"Inserting row {index + 1}: {data_tuple}\")\n", + " # Execute the SQL command\n", + " cursor.execute(insert_review_data, data_tuple)\n", + " except Error as e:\n", + " print(f\"Error occurred at row {index + 1}: {e}\")\n", + " break\n", + "\n", + "else:\n", + " print(\"Connection is not open\")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "9qAfH6JnP3Gd", + "outputId": "d9a4a626-f581-49c5-d22a-ab606fa73741" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[ id description country.id country.name country.abbrev \\\n", + " 0 15901 Berlin, Germany 57.0 Germany DE \n", + " 1 16022 Mexico City, Mexico 29.0 Mexico MX \n", + " 2 16086 Amsterdam, Netherlands 59.0 Netherlands NL \n", + " 3 16088 Sao Paulo, Brazil 42.0 Brazil BR \n", + " 4 16109 Paris, France 38.0 France FR \n", + " 5 16375 Miami, FL, United States 1.0 United States US \n", + " 6 16376 Madrid, Spain 12.0 Spain ES \n", + " 7 16377 Barcelona, Spain 12.0 Spain ES \n", + " 8 16709 Lisbon, Portugal 28.0 Portugal PT \n", + " 9 17233 Online NaN NaN NaN \n", + " \n", + " city.id city.name city.keyword state.id state.name state.abbrev \\\n", + " 0 31156.0 Berlin berlin NaN NaN NaN \n", + " 1 31175.0 Mexico City mexico-city NaN NaN NaN \n", + " 2 31168.0 Amsterdam amsterdam NaN NaN NaN \n", + " 3 31121.0 Sao Paulo sao-paulo NaN NaN NaN \n", + " 4 31136.0 Paris paris NaN NaN NaN \n", + " 5 31.0 Miami miami 11.0 Florida FL \n", + " 6 31052.0 Madrid madrid NaN NaN NaN \n", + " 7 31170.0 Barcelona barcelona NaN NaN NaN \n", + " 8 31075.0 Lisbon lisbon NaN NaN NaN \n", + " 9 NaN NaN NaN 1.0 Online Online \n", + " \n", + " state.keyword school school_id \n", + " 0 NaN ironhack 10828 \n", + " 1 NaN ironhack 10828 \n", + " 2 NaN ironhack 10828 \n", + " 3 NaN ironhack 10828 \n", + " 4 NaN ironhack 10828 \n", + " 5 florida ironhack 10828 \n", + " 6 NaN ironhack 10828 \n", + " 7 NaN ironhack 10828 \n", + " 8 NaN ironhack 10828 \n", + " 9 online ironhack 10828 ,\n", + " id description state.id state.name state.abbrev state.keyword \\\n", + " 0 15862 Online 1 Online Online online \n", + " \n", + " school school_id \n", + " 0 app-academy 10525 ,\n", + " id description state.id state.name state.abbrev state.keyword \\\n", + " 0 16013 Online 1 Online Online online \n", + " \n", + " school school_id \n", + " 0 springboard 11035 ,\n", + " id description state.id state.name state.abbrev state.keyword \\\n", + " 0 18261 Online 1 Online Online online \n", + " \n", + " school school_id \n", + " 0 syntax-technologies 11797 ,\n", + " id description state.id state.name state.abbrev state.keyword \\\n", + " 0 16378 Online 1 Online Online online \n", + " \n", + " school school_id \n", + " 0 dataquest 10683 ,\n", + " id description state.id state.name state.abbrev state.keyword \\\n", + " 0 17154 Online 1 Online Online online \n", + " \n", + " school school_id \n", + " 0 tripleten 11225 ,\n", + " id description state.id state.name state.abbrev state.keyword \\\n", + " 0 18109 Online 1 Online Online online \n", + " \n", + " school school_id \n", + " 0 ccs-learning-academy 11736 ,\n", + " id description state.id state.name state.abbrev state.keyword \\\n", + " 0 16383 Online 1 Online Online online \n", + " \n", + " school school_id \n", + " 0 thinkful 11098 ,\n", + " id description country.id country.name country.abbrev \\\n", + " 0 15935 New York City, NY 1.0 United States US \n", + " 1 15985 Toronto, Canada 2.0 Canada CA \n", + " 2 16010 Vancouver, Canada 2.0 Canada CA \n", + " 3 16909 Boston, MA 1.0 United States US \n", + " 4 16910 Chicago, IL 1.0 United States US \n", + " 5 16940 Online NaN NaN NaN \n", + " 6 17706 Miami, FL 1.0 United States US \n", + " 7 17731 London, UK 11.0 United Kingdom GB \n", + " \n", + " state.id state.name state.abbrev state.keyword city.id city.name \\\n", + " 0 34.0 New York NY new-york 1507.0 NYC \n", + " 1 66.0 Ontario ON 31152.0 Toronto \n", + " 2 71.0 British Columbia BC 31138.0 Vancouver \n", + " 3 23.0 Massachusetts MA massachusetts 47.0 Boston \n", + " 4 15.0 Illinois IL illinois 39.0 Chicago \n", + " 5 1.0 Online Online online NaN NaN \n", + " 6 11.0 Florida FL florida 31.0 Miami \n", + " 7 NaN NaN NaN NaN 31176.0 London \n", + " \n", + " city.keyword school school_id \n", + " 0 new-york-city brainstation 10571 \n", + " 1 toronto brainstation 10571 \n", + " 2 vancouver brainstation 10571 \n", + " 3 boston brainstation 10571 \n", + " 4 chicago brainstation 10571 \n", + " 5 NaN brainstation 10571 \n", + " 6 miami brainstation 10571 \n", + " 7 london brainstation 10571 ,\n", + " id description state.id state.name state.abbrev state.keyword \\\n", + " 0 18073 Online 1 Online Online online \n", + " \n", + " school school_id \n", + " 0 colaberry 11718 ,\n", + " id description state.id state.name state.abbrev state.keyword \\\n", + " 0 17099 Online 1 Online Online online \n", + " \n", + " school school_id \n", + " 0 simplilearn 11016 ,\n", + " id description state.id state.name state.abbrev state.keyword \\\n", + " 0 18116 Online 1 Online Online online \n", + " \n", + " school school_id \n", + " 0 maven-analytics 11740 ,\n", + " id description state.id state.name state.abbrev state.keyword school \\\n", + " 0 15807 Online 1 Online Online online udacity \n", + " \n", + " school_id \n", + " 0 11118 ,\n", + " id description country.id country.name country.abbrev \\\n", + " 0 16360 New York City, NY 1.0 United States US \n", + " 1 16372 Online NaN NaN NaN \n", + " 2 16961 London, UK 11.0 United Kingdom GB \n", + " 3 17033 Toronto, Canada 2.0 Canada CA \n", + " \n", + " state.id state.name state.abbrev state.keyword city.id city.name \\\n", + " 0 34.0 New York NY new-york 1507.0 NYC \n", + " 1 1.0 Online Online online NaN NaN \n", + " 2 NaN NaN NaN NaN 31176.0 London \n", + " 3 66.0 Ontario ON 31152.0 Toronto \n", + " \n", + " city.keyword school school_id \n", + " 0 new-york-city general-assembly 10761 \n", + " 1 NaN general-assembly 10761 \n", + " 2 london general-assembly 10761 \n", + " 3 toronto general-assembly 10761 ,\n", + " id description country.id country.name \\\n", + " 0 15968 Seattle, WA, United States 1.0 United States \n", + " 1 15995 Washington, DC, United States 1.0 United States \n", + " 2 16101 Austin, TX, United States 1.0 United States \n", + " 3 16103 New York City, NY, United States 1.0 United States \n", + " 4 16737 Barcelona, Spain 12.0 Spain \n", + " 5 16740 Singapore, Singapore 56.0 Singapore \n", + " 6 17042 Albuquerque, NM, United States 1.0 United States \n", + " 7 17235 Online NaN NaN \n", + " \n", + " country.abbrev state.id state.name state.abbrev \\\n", + " 0 US 49.0 Washington WA \n", + " 1 US 10.0 District of Columbia DC \n", + " 2 US 45.0 Texas TX \n", + " 3 US 34.0 New York NY \n", + " 4 ES NaN NaN NaN \n", + " 5 SG NaN NaN NaN \n", + " 6 US 33.0 New Mexico NM \n", + " 7 NaN 1.0 Online Online \n", + " \n", + " state.keyword city.id city.name city.keyword \\\n", + " 0 washington 97.0 Seattle seattle \n", + " 1 district-of-columbia 775.0 Washington D.C. washington-dc \n", + " 2 texas 84.0 Austin austin \n", + " 3 new-york 1507.0 NYC new-york-city \n", + " 4 NaN 31170.0 Barcelona barcelona \n", + " 5 NaN 31154.0 Singapore singapore \n", + " 6 new-mexico 63.0 Albuquerque albuquerque \n", + " 7 online NaN NaN NaN \n", + " \n", + " school school_id \n", + " 0 data-science-dojo 10685 \n", + " 1 data-science-dojo 10685 \n", + " 2 data-science-dojo 10685 \n", + " 3 data-science-dojo 10685 \n", + " 4 data-science-dojo 10685 \n", + " 5 data-science-dojo 10685 \n", + " 6 data-science-dojo 10685 \n", + " 7 data-science-dojo 10685 ]" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(locations_list)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Index(['id', 'description', 'country_id', 'country_name', 'country_abbrev',\n", + " 'city_id', 'city_name', 'city_keyword', 'state_id', 'state_name',\n", + " 'state_abbrev', 'state_keyword', 'school', 'school_id'],\n", + " dtype='object')\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
iddescriptioncountry.idcountry.namecountry.abbrevcity.idcity.namecity.keywordschoolschool_id
015901Berlin, Germany57.0GermanyDE31156.0Berlinberlinironhack10828
116022Mexico City, Mexico29.0MexicoMX31175.0Mexico Citymexico-cityironhack10828
216086Amsterdam, Netherlands59.0NetherlandsNL31168.0Amsterdamamsterdamironhack10828
316088Sao Paulo, Brazil42.0BrazilBR31121.0Sao Paulosao-pauloironhack10828
416109Paris, France38.0FranceFR31136.0Parisparisironhack10828
516375Miami, FL, United States1.0United StatesUS31.0Miamimiamiironhack10828
616376Madrid, Spain12.0SpainES31052.0Madridmadridironhack10828
716377Barcelona, Spain12.0SpainES31170.0Barcelonabarcelonaironhack10828
816709Lisbon, Portugal28.0PortugalPT31075.0Lisbonlisbonironhack10828
917233Onlineonlineonlineonlineonlineonlineonlineironhack10828
015862Onlineonlineonlineonlineonlineonlineonlineapp-academy10525
016013Onlineonlineonlineonlineonlineonlineonlinespringboard11035
018261Onlineonlineonlineonlineonlineonlineonlinesyntax-technologies11797
016378Onlineonlineonlineonlineonlineonlineonlinedataquest10683
017154Onlineonlineonlineonlineonlineonlineonlinetripleten11225
018109Onlineonlineonlineonlineonlineonlineonlineccs-learning-academy11736
016383Onlineonlineonlineonlineonlineonlineonlinethinkful11098
015935New York City, NY1.0United StatesUS1507.0NYCnew-york-citybrainstation10571
115985Toronto, Canada2.0CanadaCA31152.0Torontotorontobrainstation10571
216010Vancouver, Canada2.0CanadaCA31138.0Vancouvervancouverbrainstation10571
316909Boston, MA1.0United StatesUS47.0Bostonbostonbrainstation10571
416910Chicago, IL1.0United StatesUS39.0Chicagochicagobrainstation10571
516940Onlineonlineonlineonlineonlineonlineonlinebrainstation10571
617706Miami, FL1.0United StatesUS31.0Miamimiamibrainstation10571
717731London, UK11.0United KingdomGB31176.0Londonlondonbrainstation10571
018073Onlineonlineonlineonlineonlineonlineonlinecolaberry11718
017099Onlineonlineonlineonlineonlineonlineonlinesimplilearn11016
018116Onlineonlineonlineonlineonlineonlineonlinemaven-analytics11740
015807Onlineonlineonlineonlineonlineonlineonlineudacity11118
016360New York City, NY1.0United StatesUS1507.0NYCnew-york-citygeneral-assembly10761
116372Onlineonlineonlineonlineonlineonlineonlinegeneral-assembly10761
216961London, UK11.0United KingdomGB31176.0Londonlondongeneral-assembly10761
317033Toronto, Canada2.0CanadaCA31152.0Torontotorontogeneral-assembly10761
015968Seattle, WA, United States1.0United StatesUS97.0Seattleseattledata-science-dojo10685
115995Washington, DC, United States1.0United StatesUS775.0Washington D.C.washington-dcdata-science-dojo10685
216101Austin, TX, United States1.0United StatesUS84.0Austinaustindata-science-dojo10685
316103New York City, NY, United States1.0United StatesUS1507.0NYCnew-york-citydata-science-dojo10685
416737Barcelona, Spain12.0SpainES31170.0Barcelonabarcelonadata-science-dojo10685
516740Singapore, Singapore56.0SingaporeSG31154.0Singaporesingaporedata-science-dojo10685
617042Albuquerque, NM, United States1.0United StatesUS63.0Albuquerquealbuquerquedata-science-dojo10685
717235Onlineonlineonlineonlineonlineonlineonlinedata-science-dojo10685
\n", + "
" + ], + "text/plain": [ + " id description country.id country.name \\\n", + "0 15901 Berlin, Germany 57.0 Germany \n", + "1 16022 Mexico City, Mexico 29.0 Mexico \n", + "2 16086 Amsterdam, Netherlands 59.0 Netherlands \n", + "3 16088 Sao Paulo, Brazil 42.0 Brazil \n", + "4 16109 Paris, France 38.0 France \n", + "5 16375 Miami, FL, United States 1.0 United States \n", + "6 16376 Madrid, Spain 12.0 Spain \n", + "7 16377 Barcelona, Spain 12.0 Spain \n", + "8 16709 Lisbon, Portugal 28.0 Portugal \n", + "9 17233 Online online online \n", + "0 15862 Online online online \n", + "0 16013 Online online online \n", + "0 18261 Online online online \n", + "0 16378 Online online online \n", + "0 17154 Online online online \n", + "0 18109 Online online online \n", + "0 16383 Online online online \n", + "0 15935 New York City, NY 1.0 United States \n", + "1 15985 Toronto, Canada 2.0 Canada \n", + "2 16010 Vancouver, Canada 2.0 Canada \n", + "3 16909 Boston, MA 1.0 United States \n", + "4 16910 Chicago, IL 1.0 United States \n", + "5 16940 Online online online \n", + "6 17706 Miami, FL 1.0 United States \n", + "7 17731 London, UK 11.0 United Kingdom \n", + "0 18073 Online online online \n", + "0 17099 Online online online \n", + "0 18116 Online online online \n", + "0 15807 Online online online \n", + "0 16360 New York City, NY 1.0 United States \n", + "1 16372 Online online online \n", + "2 16961 London, UK 11.0 United Kingdom \n", + "3 17033 Toronto, Canada 2.0 Canada \n", + "0 15968 Seattle, WA, United States 1.0 United States \n", + "1 15995 Washington, DC, United States 1.0 United States \n", + "2 16101 Austin, TX, United States 1.0 United States \n", + "3 16103 New York City, NY, United States 1.0 United States \n", + "4 16737 Barcelona, Spain 12.0 Spain \n", + "5 16740 Singapore, Singapore 56.0 Singapore \n", + "6 17042 Albuquerque, NM, United States 1.0 United States \n", + "7 17235 Online online online \n", + "\n", + " country.abbrev city.id city.name city.keyword \\\n", + "0 DE 31156.0 Berlin berlin \n", + "1 MX 31175.0 Mexico City mexico-city \n", + "2 NL 31168.0 Amsterdam amsterdam \n", + "3 BR 31121.0 Sao Paulo sao-paulo \n", + "4 FR 31136.0 Paris paris \n", + "5 US 31.0 Miami miami \n", + "6 ES 31052.0 Madrid madrid \n", + "7 ES 31170.0 Barcelona barcelona \n", + "8 PT 31075.0 Lisbon lisbon \n", + "9 online online online online \n", + "0 online online online online \n", + "0 online online online online \n", + "0 online online online online \n", + "0 online online online online \n", + "0 online online online online \n", + "0 online online online online \n", + "0 online online online online \n", + "0 US 1507.0 NYC new-york-city \n", + "1 CA 31152.0 Toronto toronto \n", + "2 CA 31138.0 Vancouver vancouver \n", + "3 US 47.0 Boston boston \n", + "4 US 39.0 Chicago chicago \n", + "5 online online online online \n", + "6 US 31.0 Miami miami \n", + "7 GB 31176.0 London london \n", + "0 online online online online \n", + "0 online online online online \n", + "0 online online online online \n", + "0 online online online online \n", + "0 US 1507.0 NYC new-york-city \n", + "1 online online online online \n", + "2 GB 31176.0 London london \n", + "3 CA 31152.0 Toronto toronto \n", + "0 US 97.0 Seattle seattle \n", + "1 US 775.0 Washington D.C. washington-dc \n", + "2 US 84.0 Austin austin \n", + "3 US 1507.0 NYC new-york-city \n", + "4 ES 31170.0 Barcelona barcelona \n", + "5 SG 31154.0 Singapore singapore \n", + "6 US 63.0 Albuquerque albuquerque \n", + "7 online online online online \n", + "\n", + " school school_id \n", + "0 ironhack 10828 \n", + "1 ironhack 10828 \n", + "2 ironhack 10828 \n", + "3 ironhack 10828 \n", + "4 ironhack 10828 \n", + "5 ironhack 10828 \n", + "6 ironhack 10828 \n", + "7 ironhack 10828 \n", + "8 ironhack 10828 \n", + "9 ironhack 10828 \n", + "0 app-academy 10525 \n", + "0 springboard 11035 \n", + "0 syntax-technologies 11797 \n", + "0 dataquest 10683 \n", + "0 tripleten 11225 \n", + "0 ccs-learning-academy 11736 \n", + "0 thinkful 11098 \n", + "0 brainstation 10571 \n", + "1 brainstation 10571 \n", + "2 brainstation 10571 \n", + "3 brainstation 10571 \n", + "4 brainstation 10571 \n", + "5 brainstation 10571 \n", + "6 brainstation 10571 \n", + "7 brainstation 10571 \n", + "0 colaberry 11718 \n", + "0 simplilearn 11016 \n", + "0 maven-analytics 11740 \n", + "0 udacity 11118 \n", + "0 general-assembly 10761 \n", + "1 general-assembly 10761 \n", + "2 general-assembly 10761 \n", + "3 general-assembly 10761 \n", + "0 data-science-dojo 10685 \n", + "1 data-science-dojo 10685 \n", + "2 data-science-dojo 10685 \n", + "3 data-science-dojo 10685 \n", + "4 data-science-dojo 10685 \n", + "5 data-science-dojo 10685 \n", + "6 data-science-dojo 10685 \n", + "7 data-science-dojo 10685 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "41" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "locations_df = pd.concat(locations_list)\n", + "\n", + "cl_locations_df = locations_df.drop(['state.id', 'state.name', 'state.abbrev', 'state.keyword'], axis = 1)\n", + "\n", + "cl_locations_df = cl_locations_df.fillna('online')\n", + "\n", + "locations_df.columns = locations_df.columns.str.replace('.', '_')\n", + "\n", + "print(locations_df.columns)\n", + "display(cl_locations_df)\n", + "\n", + "metadata = MetaData()\n", + "\n", + "# Replace dots with underscores in column names\n", + "\n", + "\n", + "engine = create_engine(\"mysql+pymysql://{user}:{pw}@{host}/{db}\"\n", + " .format(user=username,\n", + " pw=password,\n", + " host=host,\n", + " db=database))\n", + "\n", + "# Define the table schema\n", + "locations = Table('locations', metadata,\n", + " Column('id', Integer, primary_key=True),\n", + " Column('description', String(255)),\n", + " Column('country_id', Float), \n", + " Column('country_name', String(255)),\n", + " Column('country_abbrev', String(10)),\n", + " Column('city_id', Float),\n", + " Column('city_name', String(255)),\n", + " Column('city_keyword', String(255)),\n", + " Column('school', String(255)),\n", + " Column('school_id', Integer),\n", + " extend_existing=True\n", + " )\n", + "\n", + "cl_locations_df.to_sql('locations', con=engine, if_exists='append', index=False)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 363 + }, + "id": "eGw9AuxjiTaG", + "outputId": "c8616f5a-c53e-4618-df1c-9d767199d190" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
coursesschoolschool_id
0Cyber Security Bootcampironhack10828
1Cybersecurity Part-Timeironhack10828
2Data Analytics Bootcampironhack10828
3Data Analytics Part-Timeironhack10828
4UX/UI Design Bootcampironhack10828
5UX/UI Design Part-Timeironhack10828
6Web Development Bootcampironhack10828
7Web Development Part-Timeironhack10828
024-week Software Engineering Full-Time Program...app-academy10525
148-week Software Engineering Part-Time Program...app-academy10525
\n", + "
" + ], + "text/plain": [ + " courses school school_id\n", + "0 Cyber Security Bootcamp ironhack 10828\n", + "1 Cybersecurity Part-Time ironhack 10828\n", + "2 Data Analytics Bootcamp ironhack 10828\n", + "3 Data Analytics Part-Time ironhack 10828\n", + "4 UX/UI Design Bootcamp ironhack 10828\n", + "5 UX/UI Design Part-Time ironhack 10828\n", + "6 Web Development Bootcamp ironhack 10828\n", + "7 Web Development Part-Time ironhack 10828\n", + "0 24-week Software Engineering Full-Time Program... app-academy 10525\n", + "1 48-week Software Engineering Part-Time Program... app-academy 10525" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "155" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "courses_df = pd.concat(courses_list)\n", + "display(courses_df.head(10))\n", + "\n", + "metadata = MetaData()\n", + "\n", + "username = 'root'\n", + "host = 'localhost'\n", + "database = 'Ironhack_SQL'\n", + "\n", + "engine = create_engine(\"mysql+pymysql://{user}:{pw}@localhost/{db}\"\n", + " .format(user=username,\n", + " pw=password,\n", + " db=database))\n", + "\n", + "courses = Table('courses', metadata,\n", + " Column('id', Integer, primary_key=True, autoincrement=True),\n", + " Column('courses', String(255)),\n", + " Column('school', String(255)),\n", + " Column('school_id', Integer)\n", + " )\n", + "\n", + "metadata.create_all(engine)\n", + "\n", + "courses_df.to_sql('courses', con=engine, if_exists='append', index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 206 + }, + "id": "j---orWLiWs1", + "outputId": "b2a667ec-e30e-475d-eafe-d82f2f1b7bc1" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namekeywordschoolschool_id
0Available Onlineavailable_onlineironhack10828
1Verified Outcomesverified_outcomesironhack10828
2Flexible Classesflexible_classesironhack10828
0Available Onlineavailable_onlineapp-academy10525
1Flexible Classesflexible_classesapp-academy10525
2Job Guaranteejob_guaranteeapp-academy10525
0Available Onlineavailable_onlinespringboard11035
1Flexible Classesflexible_classesspringboard11035
2Job Guaranteejob_guaranteespringboard11035
0Available Onlineavailable_onlinesyntax-technologies11797
\n", + "
" + ], + "text/plain": [ + " name keyword school school_id\n", + "0 Available Online available_online ironhack 10828\n", + "1 Verified Outcomes verified_outcomes ironhack 10828\n", + "2 Flexible Classes flexible_classes ironhack 10828\n", + "0 Available Online available_online app-academy 10525\n", + "1 Flexible Classes flexible_classes app-academy 10525\n", + "2 Job Guarantee job_guarantee app-academy 10525\n", + "0 Available Online available_online springboard 11035\n", + "1 Flexible Classes flexible_classes springboard 11035\n", + "2 Job Guarantee job_guarantee springboard 11035\n", + "0 Available Online available_online syntax-technologies 11797" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "40" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "badges = pd.concat(badges_list)\n", + "cl_badges = badges.drop(['description'], axis = 1)\n", + "\n", + "display(cl_badges.head(10))\n", + "\n", + "username = 'root'\n", + "host = 'localhost'\n", + "database = 'Ironhack_SQL'\n", + "\n", + "metadata = MetaData()\n", + "\n", + "engine = create_engine(\"mysql+pymysql://{user}:{pw}@{host}/{db}\"\n", + " .format(user=username,\n", + " pw=password,\n", + " host=host,\n", + " db=database))\n", + "\n", + "features = Table('badges', metadata,\n", + " Column('id', Integer, primary_key=True, autoincrement=True),\n", + " Column('name', String(255)),\n", + " Column('keyword', String(255)),\n", + " Column('school', String(255)),\n", + " Column('school_id', Integer)\n", + " )\n", + "\n", + "metadata.create_all(engine)\n", + "\n", + "cl_badges.to_sql('badges', con=engine, if_exists='append', index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 143 + }, + "id": "kWLmzVpmiZD2", + "outputId": "db0685d2-5be6-40c3-fe69-9e36b3ac055f" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
websiteschoolschool_id
0www.ironhack.com/enironhack10828
0appacademy.ioapp-academy10525
0www.springboard.com/?utm_source=switchup&utm_m...springboard11035
0www.syntaxtechs.com/syntax-technologies11797
0www.dataquest.iodataquest10683
0tripleten.com/?utm_source=referral&utm_medium=...tripleten11225
0ccslearningacademy.com/ccs-learning-academy11736
0thinkful.com/thinkful11098
0brainstation.iobrainstation10571
0www.colaberry.com/colaberry11718
0simplilearn.com/simplilearn11016
0www.mavenanalytics.io/maven-analytics11740
0www.udacity.com/?utm_source=switchup&utm_mediu...udacity11118
0generalassemb.ly?utm_source=switchup&utm_mediu...general-assembly10761
0datasciencedojo.com/data-science-bootcampdata-science-dojo10685
\n", + "
" + ], + "text/plain": [ + " website school \\\n", + "0 www.ironhack.com/en ironhack \n", + "0 appacademy.io app-academy \n", + "0 www.springboard.com/?utm_source=switchup&utm_m... springboard \n", + "0 www.syntaxtechs.com/ syntax-technologies \n", + "0 www.dataquest.io dataquest \n", + "0 tripleten.com/?utm_source=referral&utm_medium=... tripleten \n", + "0 ccslearningacademy.com/ ccs-learning-academy \n", + "0 thinkful.com/ thinkful \n", + "0 brainstation.io brainstation \n", + "0 www.colaberry.com/ colaberry \n", + "0 simplilearn.com/ simplilearn \n", + "0 www.mavenanalytics.io/ maven-analytics \n", + "0 www.udacity.com/?utm_source=switchup&utm_mediu... udacity \n", + "0 generalassemb.ly?utm_source=switchup&utm_mediu... general-assembly \n", + "0 datasciencedojo.com/data-science-bootcamp data-science-dojo \n", + "\n", + " school_id \n", + "0 10828 \n", + "0 10525 \n", + "0 11035 \n", + "0 11797 \n", + "0 10683 \n", + "0 11225 \n", + "0 11736 \n", + "0 11098 \n", + "0 10571 \n", + "0 11718 \n", + "0 11016 \n", + "0 11740 \n", + "0 11118 \n", + "0 10761 \n", + "0 10685 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "15" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# any data cleaning still missing here? take a look at the description\n", + "schools = pd.concat(schools_list)\n", + "schools.head()\n", + "cl_schools_df = schools.drop(['description', 'LogoUrl'], axis = 1)\n", + "\n", + "display(cl_schools_df)\n", + "\n", + "engine = create_engine(\"mysql+pymysql://{user}:{pw}@{host}/{db}\"\n", + " .format(user=username,\n", + " pw=password,\n", + " host=host,\n", + " db=database))\n", + "\n", + "websites = Table('websites', metadata,\n", + " Column('id', Integer, primary_key=True, autoincrement=True),\n", + " Column('website', String(255)),\n", + " Column('school', String(255)),\n", + " Column('school_id', Integer),\n", + " extend_existing=True\n", + " )\n", + "\n", + "metadata.create_all(engine)\n", + "\n", + "cl_schools_df.to_sql('websites', con=engine, if_exists='append', index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "id": "_AFkSNlsb9z0" + }, + "outputs": [ + { + "data": { + "image/png": "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BX9UjERERERERERERESpRoKTtgULFsTHjx/RsmVLnDlzRk3SDh069IcFR0RERERERERERJTaJLg8wt27d1GxYkVUqVIFBQoU+JExEREREREREREREaVaCU7aBgUFIV++fPD09IStrS0GDhyIwMBAKIryI+MjIiIiIiIiIiIiSlUSnLS1sbHB8OHDcffuXaxevRohISFwdnZGVFQUfH19cfv27R8ZJxEREREREREREVGqkOCkbVxVq1bFmjVr8PTpU3h7e+PgwYPInz8/ihYtmtTxEREREREREREREaUq35S01bCwsED37t1x/vx5BAQEoHLlykkUFhEREREREREREVHq9F1J27iKFSuGuXPnJtXqiIiIiIiIiIiIiFKlJEvaEhEREREREREREdH3Y9KWiIiIiIiIiIiIKBlh0paIiIiIiIiIiIgoGWHSloiIiIiIiIiIiCgZMUhIo8QMMNa7d+9vDoaIiIiIiIiIiIgotUtQ0nbWrFkJWpmiKEzaEhEREREREREREX2HBCVtg4KCfnQcRERERERERERERATWtCUiIiIiIiIiIiJKVhLU07Z///4JXuHMmTO/ORgiIiIiIiIiIiKi1C5BSdvAwMAErUxRlO8KhoiIiIiIiIiIiCi1S1DS9tChQz86DiIiIiIiIiIiIiICa9oSERERERERERERJSsJ6mn7T+fOncPmzZvx8OFDfP78WWve1q1bkyQwIiIiIiIiIiIiotQo0T1tN2zYAGdnZ1y/fh3btm1DZGQkrl+/joMHD8LCwuJHxEhERERERERERESUaiQ6aTtp0iTMmjULO3fuhJGREebMmYMbN26gadOmsLe3/xExEhEREREREREREaUaiU7a3rt3D3Xq1AEAGBsb48OHD1AUBf369cPixYuTPEAiIiIiIiIiIiKi1CTRSduMGTMiLCwMAGBjY4OrV68CAEJDQ/Hx48ekjY6IiIiIiIiIiIgolUn0QGQuLi7Yv38/ihQpgqZNm6JPnz44ePAg9u/fj2rVqv2IGImIiIiIiIiIiIhSjUQnbb29vREeHg4A8PLygqGhIY4fP45GjRph5MiRSR4gERERERERERERUWqSqKRtVFQUduzYATc3NwCAnp4eBg8ejMGDB/+Q4IiIiIiIiIiIiIhSm0TVtDUwMICnpyciIiJ+VDxEREREREREREREqVqiByIrW7YsAgMDf0QsRERERERERERERKleomvadu/eHQMGDMCjR49QsmRJpE2bVmt+0aJFkyw4IiIiIiIiIiIiotQm0UnbZs2aAQB69+6tTlMUBSICRVEQHR2d4HVNnjwZW7duxc2bN5EmTRo4OTlh6tSpyJcvX2LDIiIiIiIiIiIiIvolJDppGxQUlGRvfuTIEfTo0QOlS5dGVFQUhg8fjho1auD69evxevASERERERERERERpQaJTtpmz549yd58z549Wq9XrFgBKysrXLhwARUrVozXPiIiQmsQtHfv3iVZLERERERERERERETJQaIHIgOA1atXw9nZGdbW1njw4AEAYPbs2fD39/+uYN6+fQsAyJgx4xfnT548GRYWFuo/Ozu773o/IiIiIiIiIiIiouQm0UnbBQsWoH///qhduzZCQ0PVGrbp06fH7NmzvzkQEUH//v1RoUIFFC5c+IttvLy88PbtW/VfcHDwN78fERERERERERERUXKU6KTtvHnzsGTJEgwfPhz6+vrq9FKlSuHKlSvfHEjPnj1x+fJlrF+//qttjI2NYW5urvWPiIiIiIiIiIiI6FfyTQORFS9ePN50Y2NjfPjw4ZuC6NWrF/744w8cPXoUtra237QOIiIiIiIiIiIiol9Bonva5syZExcvXow3fffu3ShYsGCi1iUi6NmzJ7Zu3YqDBw8iZ86ciQ2HiIiIiIiIiIiI6JeS6J62gwYNQo8ePRAeHg4RwdmzZ7F+/XpMnjwZS5cuTdS6evTogXXr1sHf3x9mZmYICQkBAFhYWCBNmjSJDY2IiIiIiIiIiIgoxUt00rZ9+/aIiorC4MGD8fHjR7Rs2RI2NjaYM2cOmjdvnqh1LViwAABQuXJlrekrVqyAh4dHYkMjIiIiIiIiIiIiSvESnbQFgM6dO6Nz5854+fIlYmJiYGVl9U1vLiLftBwRERERERERERHRryrRNW3Hjh2Le/fuAQAyZcr0zQlbIiIiIiIiIiIiIoov0UlbPz8/5M2bF+XKlYO3tzdevHjxI+IiIiIiIiIiIiIiSpUSnbS9fPkyLl++jKpVq2LmzJmwsbFB7dq1sW7dOnz8+PFHxEhERERERERERESUaiQ6aQsAhQoVwqRJk/D333/j0KFDyJkzJ/r27YusWbMmdXxEREREREREREREqco3JW3jSps2LdKkSQMjIyNERkYmRUxEREREREREREREqdY3JW2DgoIwceJEFCxYEKVKlUJAQADGjBmDkJCQpI6PiIiIiIiIiIiIKFUxSOwC5cuXx9mzZ1GkSBG0b98eLVu2hI2NzY+IjYiIiIiIiIiIiCjVSXTStkqVKli6dCkKFSr0I+IhIiIiIiIiIiIiStUSnbSdNGkSAODly5dQFAWWlpZJHhQRERERERERERFRapWomrahoaHo0aMHMmXKhCxZssDKygqZMmVCz549ERoa+oNCJCIiIiIiIiIiIko9EtzT9vXr1yhfvjweP36MVq1aoUCBAhAR3LhxA76+vjhw4ABOnjyJDBky/Mh4iYiIiIiIiIiIiH5pCU7ajhs3DkZGRrh37x6yZMkSb16NGjUwbtw4zJo1K8mDJCIiIiIiIiIiIkotElweYfv27ZgxY0a8hC0AZM2aFdOmTcO2bduSNDgiIiIiIiIiIiKi1CbBSdunT5+iUKFCX51fuHBhhISEJElQRERERERERERERKlVgpO2mTJlwv379786PygoCJaWlkkRExEREREREREREVGqleCkbc2aNTF8+HB8/vw53ryIiAiMHDkSNWvWTNLgiIiIiIiIiIiIiFKbBA9ENnbsWJQqVQoODg7o0aMH8ufPDwC4fv06fHx8EBERgdWrV/+wQImIiIiIiIiIiIhSgwQnbW1tbXHq1Cl0794dXl5eEBEAgKIocHV1hbe3N+zs7H5YoERERERERERERESpQYKTtgCQM2dO7N69G2/evMGdO3cAAHny5EHGjBl/SHBEREREREREREREqU2ikrYaGTJkQJkyZZI6FiIiIiIiIiIiIqJUL8EDkRERERERERERERHRj8ekLREREREREREREVEywqQtERERERERERERUTLCpC0RERERERERERFRMsKkLREREREREREREVEywqQtERERERERERERUTLCpC0RERERERERERFRMsKkLREREREREREREVEywqQtERERERERERERUTLCpC0RERERERERERFRMsKkLREREREREREREVEywqQtERERERERERERUTLCpC0RERERERERERFRMsKkLREREREREREREVEywqQtERERERERERERUTLCpC0RERERERERERFRMsKkLREREREREREREVEywqQtERERERERERERUTKi86Stj48PcubMCRMTE5QsWRLHjh3TdUhEREREREREREREOqPTpO3GjRvRt29fDB8+HIGBgXBxcUGtWrXw8OFDXYZFREREREREREREpDMGunzzmTNnomPHjujUqRMAYPbs2di7dy8WLFiAyZMnx2sfERGBiIgI9fXbt28BAO/evfs5AScXEaLrCH4NSfx3ExPxMUnXl1r9kP2Z+0zS4LZJvng8S5Z+xPGM2yZpJPW24XZJGtxnki9um+QrybcNz82SBs+bky/uM8lTKsvraY7dIv/+96PIf7X4QT5//gxTU1Ns3rwZDRs2VKf36dMHFy9exJEjR+ItM2bMGIwdO/ZnhklERERERERERESUpIKDg2Fra/vV+Trrafvy5UtER0cjS5YsWtOzZMmCkJCQLy7j5eWF/v37q69jYmLw+vVrWFpaQlGUHxovJdy7d+9gZ2eH4OBgmJub6zoc+n/cLskXt03yxW2TPHG7JF/cNskTt0vyxW2TfHHbJE/cLskXt03yxO2SPIkIwsLCYG1t/a/tdFoeAUC8ZKuIfDUBa2xsDGNjY61p6dOn/1Gh0XcyNzfnQSEZ4nZJvrhtki9um+SJ2yX54rZJnrhdki9um+SL2yZ54nZJvrhtkidul+THwsLiP9vobCCyTJkyQV9fP16v2ufPn8frfUtERERERERERESUWugsaWtkZISSJUti//79WtP3798PJycnHUVFREREREREREREpFs6LY/Qv39/tGnTBqVKlUL58uWxePFiPHz4EN26ddNlWPSdjI2NMXr06HilLEi3uF2SL26b5IvbJnnidkm+uG2SJ26X5IvbJvnitkmeuF2SL26b5InbJWVTRER0GYCPjw+mTZuGp0+fonDhwpg1axYqVqyoy5CIiIiIiIiIiIiIdEbnSVsiIiIiIiIiIiIi+h+d1bQlIiIiIiIiIiIioviYtCUiIiIiIiIiIiJKRpi0JSIiIiIiIiIiIkpGmLQlIiIiIiIiIiIiSkaYtCUiIiIiIiIiIiJKRpi0JaL/9PTpU12HQPTLExEAQHh4uI4jIfoxFi1ahGXLluk6DCKinyYmJkbXIRARUQrGpC39dJrExD//n5KngQMHYsCAAbh9+7auQ0mVeLKfOogIFEXB7t270b59ezx48EDXIRElGRHBs2fPcOzYMUyePBnr1q3TdUj0A/DGE1F8enqxl9sHDhxAREQEr32SEW6LXw+vm34sfr+6waQt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REQGhElbIiIiIiIiIiIiIgPCpC0RERERERERERGRAWHSloiIiIiIiIiIiMiAMGlLREREREREREREZECYtCUiIiIiIiIiIiIyIEzaEhERERERERERERkQJm2JiIiIiIiIiIiIDAiTtkREREREREREREQGhElbIiIiIiIiIiIiIgPCpC0RERERERERERGRAWHSloiIiIiIiIiIiMiAMGlLREREREREREREZECYtCUiIiKDd+XKFXh7e+Onn36ChYUF0qVLhxIlSmDKlCl49erVd4ujcuXKqFy58jd7/5UrV0JRFNy/f/+bfcZ/0bhxYyiKgp49e+othsqVK6Nw4cLf/HM+fPiA3377DS4uLrC2toaVlRVy5cqF5s2b49ixY0l6r6NHj0JRFGzZsuUbRftlhvg3lZTtKCIiAnPnzoW7uztsbW1hZmYGBweHr1oP38qTJ08wZswYXLp0Sd+hEBER0Q/ERN8BEBEREf2TJUuWoHv37siXLx9++eUXFCxYEFFRUbh48SIWLlyIM2fOYPv27d8llvnz53+XzzFEYWFh2L17NwBg3bp1mDZtGiwsLPQc1bcRExODGjVq4OrVq/jll19QunRpAMCdO3ewa9cunDhxApUqVdJzlD++Fy9eoGbNmrhy5Qo6dOiAX375BRkyZMDjx4/h5+eHatWqISAgAC4uLnqN88mTJxg7dixy5MiBYsWK6TUWIiIi+nEwaUtEREQG68yZM/Dx8YGHhwd27NgBc3NzdZqHhwcGDBiA/fv3J8tnffr0CRYWFlAUJd60jx8/wtLSEgULFkyWz0qJVq9ejaioKNSpUwd79uzBtm3b8PPPP+s7rG/i+PHjOH36NJYvXw5vb2+13dPTEz179oRGo9FjdKlHu3btcPnyZRw4cABVq1bVmdayZUv0798ftra2eoru62n3J0RERET/hOURiIiIyGBNnDgRiqJg8eLFOglbLTMzM9SvX199rSgKxowZE2++HDlyoH379upr7SPjBw8eRIcOHZA5c2ZYWloiIiJCffz++PHjcHNzg6WlJTp06AAg4ce6IyIiMG7cOBQoUAAWFhbImDEjqlSpgtOnTwMA7t+/D0VRsHLlynhxfSnef4pd6++xaB/BX79+PQYPHoxs2bIhXbp0qFevHp49e4bw8HB06dIFmTJlQqZMmeDt7Y3379//42fHtXz5cmTJkgWr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RERERET0P0zaEhERERERERERERmQFF3TVqPR4MmTJ7CysoKiKPoOh4iIiIiIiIiIiOiLRATh4eGwt7eHkdGX+9Om6KTtkydP4OjoqO8wiIiIiIiIiIiIiBItJCQE2bNn/+L0FJ20tbKyAhD7Ja2trfUcDREREREREREREdGXvXv3Do6Ojmpe80tSdNJWWxLB2tqaSVsiIiIiIiIiIiJKEf6t1CsHIiMiIiIiIiIiIiIyIEzaEhERERERERERERkQJm2JiIiIiIiIiIiIDEiKrmmbao2x0XcEP4Yxb5P17XIM2ZOs75da3Z9cJ/nflNtM8kjmbSb2PblukgX3ZwbpW+zPuG6SR3KvG66X5MFtxnBx3Riub3LuTESJx+uZ5PEtrjV/AOxpS0RERERERERERGRAmLQlIiIiIiIiIiIiMiBM2hIREREREREREREZECZtiYiIiIiIiIiIiAwIk7ZEREREREREREREBoRJWyIiIiIiIiIiIiIDwqQtERERERERERERkQExSeoCtra2UBQlXruiKLCwsEDu3LnRvn17eHt7J0uARERERERERERERKlJkpO2o0aNwq+//opatWqhdOnSEBFcuHAB+/fvR48ePRAcHAwfHx9ER0ejc+fO3yJmIiIiIiIiIiIioh9WkpO2J0+exIQJE9CtWzed9kWLFuHgwYPYunUrihYtitmzZzNpS0RERERERERERJRESa5pe+DAAVSvXj1ee7Vq1XDgwAEAQO3atXHv3r3/Hh0RERERERERERFRKpPkpG2GDBmwa9eueO27du1ChgwZAAAfPnyAlZXVf4+OiIiIiIiIiIiIKJVJcnmEkSNHwsfHB/7+/ihdujQURcH58+exd+9eLFy4EABw6NAhVKpUKdmDJSIiIiIiIiIiIvrRJTlp27lzZxQsWBBz587Ftm3bICLInz8/jh07Bjc3NwDAgAEDkj1QIiIiIiIiIiIiotQgyUlbAChfvjzKly+f3LEQERERERERERERpXpJrmlbpUoVLFu2DG/fvv0W8RARERERERERERGlaklO2hYpUgQjRoxA1qxZ0aRJE+zYsQORkZHfIjYiIiIiIiIiIiKiVCfJSdvZs2fj8ePH8PPzg5WVFby8vJA1a1Z06dIFx44d+xYxEhEREREREREREaUaSU7aAoCRkRFq1KiBlStX4tmzZ1i0aBHOnz+PqlWrJnd8RERERERERERERKnKVw1EphUaGooNGzZg7dq1uHLlClxdXZMrLiIiIiIiIiIiIqJUKck9bd+9e4cVK1bAw8MDjo6OWLBgAerVq4fbt2/j3LlzXx3IpEmToCgK+vbt+9XvQURERERERERERJTSJbmnbZYsWWBra4vmzZtj4sSJydK79sKFC1i8eDGKFi36n9+LiIiIiIiIiIiIKCVLck9bPz8/PHr0CDNnzlQTthqNBrt27ULDhg2THMD79+/RunVrLFmyBLa2tv84b0REBN69e6fzj4iIiIiIiIiIiOhHkuSetjVq1FD/f+fOHSxfvhyrVq3C69ev4enpmeQAevTogTp16qB69eqYMGHCP847adIkjB07NsmfQURERERERET/YoyNviP4MYx5+w3ek+smWXyLdUP0jSQ5afvp0yds2rQJy5Ytw9mzZxETE4MZM2agQ4cOSJcuXZLea8OGDQgMDMSFCxcSNf/QoUPRv39/9fW7d+/g6OiYpM8kIiIiIiIiIiIiMmSJLo9w/vx5dOnSBVmzZsXcuXPRpEkThISEwMjICNWrV09ywjYkJAR9+vTB2rVrYWFhkahlzM3NYW1trfOPiIiIiIiIiIiI6EeS6J62bm5u6NWrF86fP498+fL95w8OCAhAWFgYSpYsqbbFxMTg+PHjmDt3LiIiImBsbPyfP4eIiIiIiIiIiIgoJUl00rZq1apYtmwZwsLC0LZtW3h6ekJRlK/+4GrVquHq1as6bd7e3sifPz8GDx7MhC0RERERERERERGlSolO2h48eBAhISFYsWIFfHx88OnTJ7Ro0QIAvip5a2VlhcKFC+u0pU2bFhkzZozXTkRERERERERERJRaJLqmLQA4Ojpi1KhRCA4Oxpo1axAWFgYTExM0aNAAw4YNQ2Bg4LeKk4iIiIiIiIiIiChVSHRP27/z8PCAh4cHXr9+jbVr12L58uX47bffEBMT89XBHD169KuXJSIiIiIiIiIiIvoRJKmnbUJsbW3Rq1cvBAUF4cKFC8kRExEREREREREREVGq9Z+TtnGVKFEiOd+OiIiIiIiIiIiIKNVJ1qQtEREREREREREREf03TNoSERERERERERERGRAmbYmIiIiIiIiIiIgMCJO2RERERERERERERAbEJKkLvHz5EqNGjYK/vz/CwsKg0Wh0pr969SrZgiMiIiIiIiIiIiJKbZKctG3Tpg3++usvdOzYEVmyZIGiKN8iLiIiIiIiIiIiIqJUKclJ25MnT+LkyZNwcXH5FvEQERERERERERERpWpJrmmbP39+fPr06VvEQkRERERERERERJTqJTlpO3/+fAwfPhzHjh3Dy5cv8e7dO51/RERERERERERERPT1klweIX369Hj79i2qVq2q0y4iUBQFMTExyRYcERERERERERERUWqT5KRt69atYWZmhvXr13MgMiIiIiIiIiIiIqJkluSk7bVr1xAUFIR8+fJ9i3iIiIiIiIiIiIiIUrUk17QtVaoUQkJCvkUsRERERERERERERKleknva9urVC3369MEvv/yCIkWKwNTUVGd60aJFky04IiIiIiIiIiIiotQmyUnbFi1aAAA6dOigtimKwoHIiIiIiIiIiIiIiJJBkpO2wcHB3yIOIiIiIiIiIiIiIsJXJG2dnZ2/RRxEREREREREREREhK9I2q5evfofp7dr1+6rgyEiIiIiIiIiIiJK7ZKctO3Tp4/O66ioKHz8+BFmZmawtLRk0paIiIiIiIiIiIjoPzBK6gKvX7/W+ff+/XvcunUL7u7u8PX1/RYxEhEREREREREREaUaSU7aJiRPnjyYPHlyvF64RERERERERERERJQ0yZK0BQBjY2M8efIkud6OiIiIiIiIiIiIKFVKck3bnTt36rwWETx9+hRz585F+fLlky0wIiIiIiIiIiIiotQoyUnbhg0b6rxWFAWZM2dG1apV8fvvvydXXERERERERERERESpUpKTthqN5lvEQURERERERERERERIxpq2RERERERERERERPTfJaqnbf/+/RP9htOnT//qYIiIiIiIiIiIiIhSu0QlbYOCghL1Zoqi/KdgiIiIiIiIiIiIiFK7RCVt/f39v3UcRERERERERERERATWtCUiIiIiIiIiIiIyKInqaRtXlSpV/rEMwpEjR/5TQERERERERERERESpWZKTtsWKFdN5HRUVhUuXLuHatWvw8vJKrriIiIiIiIiIiIiIUqUkJ21nzJiRYPuYMWPw/v37/xwQERERERERERERUWqWbDVt27Rpg+XLlyfX2xERERERERERERGlSsmWtD1z5gwsLCyS6+2IiIiIiIiIiIiIUqUkl0do3LixzmsRwdOnT3Hx4kWMHDky2QIjIiIiIiIiIiIiSo2S3NPWxsZG51+GDBlQuXJl7N27F6NHj07Se02aNAmurq6wsrKCnZ0dGjZsiFu3biU1JCIiIiIiIiIiIqIfRpJ72q5YsSLZPvzYsWPo0aMHXF1dER0djeHDh6NGjRq4fv060qZNm2yfQ0RERERERERERJRSJDlpe+HCBWg0GpQpU0an/dy5czA2NkapUqUS/V779+/Xeb1ixQrY2dkhICAAFStWjDd/REQEIiIi1Nfv3r1LYvREREREREREREREhi3J5RF69OiBkJCQeO2PHz9Gjx49/lMwb9++BQBkyJAhwemTJk3SKc3g6Oj4nz6PiIiIiIiIiIiIyNAkOWl7/fp1lChRIl578eLFcf369a8ORETQv39/uLu7o3DhwgnOM3ToULx9+1b9l1DymIiIiIiIiIiIiCglS3J5BHNzczx79gw5c+bUaX/69ClMTJL8dqqePXviypUrOHny5D9+trm5+Vd/BhEREREREREREZGhS3JPWw8PD7XHq9abN28wbNgweHh4fFUQvXr1ws6dO+Hv74/s2bN/1XsQERERERERERER/QiS3DX2999/R8WKFeHs7IzixYsDAC5duoQsWbJgzZo1SXovEUGvXr2wfft2HD16FD/99FNSwyEiIiIiIiIiIiL6oSQ5aevg4IArV65g3bp1uHz5MtKkSQNvb2+0atUKpqamSXqvHj16YP369fDz84OVlRVCQ0MBADY2NkiTJk1SQyMiIiIiIiIiIiJK8b6qCG3atGnRpUuX//zhCxYsAABUrlxZp33FihVo3779f35/IiIiIiIiIiIiopQmUUnbnTt3olatWjA1NcXOnTv/cd769esn+sNFJNHzEhEREREREREREaUGiUraNmzYEKGhobCzs0PDhg2/OJ+iKIiJiUmu2IiIiIiIiIiIiIhSnUQlbTUaTYL/JyIiIiIiIiIiIqLkZZSUmaOiolClShXcvn37W8VDRERERERERERElKolKWlramqKa9euQVGUbxUPERERERERERERUaqWpKQtALRr1w7Lli37FrEQERERERERERERpXqJqmkbV2RkJJYuXYpDhw6hVKlSSJs2rc706dOnJ1twRERERERERERERKlNkpO2165dQ4kSJQAgXm1blk0gIiIiIiIiIiIi+m+SlLSNiYnBmDFjUKRIEWTIkOFbxURERERERERERESUaiWppq2xsTE8PT3x9u3bbxUPERERERERERERUaqW5IHIihQpgnv37n2LWIiIiIiIiIiIiIhSvSQnbX/99VcMHDgQu3fvxtOnT/Hu3Tudf0RERERERERERET09ZI8EFnNmjUBAPXr19cZeExEoCgKYmJiki86IiIiIiIiIiIiolQmyUlbf3//bxEHEREREREREREREeErkraVKlX6FnEQEREREREREREREb4iaXv8+PF/nF6xYsWvDoaIiIiIiIiIiIgotUty0rZy5crx2uLWtmVNWyIiIiIiIiIiIqKvZ5TUBV6/fq3zLywsDPv374erqysOHjz4LWIkIiIiIiIiIiIiSjWS3NPWxsYmXpuHhwfMzc3Rr18/BAQEJEtgRERERERERERERKlRknvafknmzJlx69at5Ho7IiIiIiIiIiIiolQpyT1tr1y5ovNaRPD06VNMnjwZLi4uyRYYERERERERERERUWqU5KRtsWLFoCgKRESnvWzZsli+fHmyBUZERERERERERESUGiU5aRscHKzz2sjICJkzZ4aFhUWyBUVERERERERERESUWiU5aevs7Pwt4iAiIiIiIiIiIiIiJGEgsiNHjqBgwYJ49+5dvGlv375FoUKFcOLEiWQNjoiIiIiIiIiIiCi1SXTSdubMmejcuTOsra3jTbOxsUHXrl0xffr0ZA2OiIiIiIiIiIiIKLVJdNL28uXLqFmz5hen16hRAwEBAckSFBEREREREREREVFqleik7bNnz2BqavrF6SYmJnj+/HmyBEVERERERERERESUWiU6aevg4ICrV69+cfqVK1eQLVu2ZAmKiIiIiIiIiIiIKLVKdNK2du3aGDVqFD5//hxv2qdPnzB69GjUrVs3WYMjIiIiIiIiIiIiSm1MEjvjiBEjsG3bNuTNmxc9e/ZEvnz5oCgKbty4gXnz5iEmJgbDhw//lrESERERERERERER/fASnbTNkiULTp8+DR8fHwwdOhQiAgBQFAWenp6YP38+smTJ8s0CJSIiIiIiIiIiIkoNEp20BQBnZ2fs3bsXr1+/xt27dyEiyJMnD2xtbb9VfERERERERERERESpSpKStlq2trZwdXVN7liIiIiIiIiIiIiIUr1ED0RGRERERERERERERN8ek7ZEREREREREREREBoRJWyIiIiIiIiIiIiIDwqQtERERERERERERkQHRe9J2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LiOi5Id7KRERJVvR1xWNjY2ZsCUiIiKiVM3X1xc5cuTAtm3boCgK8ubNi759+8LS0hKLFy/G169fAUTVua1duzaGDx+OV69eYezYsQD+d27NhC1RysCetkREREREREREydyLFy8wduxYrFq1Cp6enmjUqBGCg4Ph6ekJd3d32NnZYc2aNTAyMgIQ1aP2woULcHR0hI6OjpajJ6KEYtKWiIiIiIiIiCgFePnyJSZNmoQFCxZg69ataNiwIb5+/YoNGzZg2bJlsLW1xdq1a2FoaKgxX0REBBO3RCkMk7ZERERERERERMlYzKRrUFAQJk2aBHd3d43EraenJ5YvXw5jY2Ps27cP+vr6Wo6aiP4LXW0HQEREREREREREmo4dO4aAgAC0adMGOjo6auLW3Nwco0aNgqIoaN26NbZt2wZnZ2e0atUKX758ga+vL3R1me4hSunY05aIiIiIiIiIKJkQEXz9+hX169fHp0+f0LdvXzRv3hyAZo/bx48fY+TIkXj27Bm8vLyQKVMmhIWFQVdXF4qiIDIykoOOEaVg3HuJiIiIiIiIiJIJRVFgbGyMJUuWIGvWrFi2bBk2btwIAGqPWwCwtrZG9erVcfPmTXz9+hUAoKenB0VRICJM2BKlcNyDiYiIiIiIiIiSGTs7O8yZMwfGxsZYsWIFPD09AUQlbkNDQwEANjY2sLe3jzXImKIovzxeIkpcTNoSERERERERESVDOXPmxIIFC2BsbIzly5dj1apVAAB9fX0EBwdjxowZyJo1K7JmzarlSIkosbGmLRERERERERFRMubv748hQ4bgwYMHyJMnD4oVK4bDhw/j9evXOHv2LPT09CAi7GFL9Bth0paIiIiIiIiIKJl79uwZvL29sWXLFmTJkgU2NjaYNWsWdHV1ER4eDl1dXW2HSESJiElbIiIiIiIiIqIUKiIiIlZNWyJK+Zi0JSIiIiIiIiJKAVgCgSj14EBkREREREREREQpABO2RKkHk7ZEREREREREREREyQiTtkRERERERERERETJCJO2RERERERERERERMkIk7ZEREREREREREREyQiTtkRERERERERERETJCJO2RERERERERERERMkIk7ZEREREREREREREyQiTtkRERERERERERETJCJO2RERERERERERERMkIk7ZEREREREREREREyQiTtkRERERERERERETJ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YmJiIi1atJAXL16o7c6ePSsNGzYUGxsbMTAwkMyZM0ulSpVk165dGst7/vy5NG7cWDJlyiSmpqbSunVruXTpUqwR6du1aydp06aVa9euSeXKlcXIyEgyZcokbm5u8unTJ41lApCePXvKokWLxM7OTvT09CRfvnyyYcOGWO/D9evXxcXFRUxNTUVfX1+KFCmisV4RkaNHjwoA8fLyivO9nDt3ruTMmVN0dHRixR1TgwYNRF9fX4KCguJ8XkSkefPmoqurK4GBgSIiEhERIVZWVgJARo4cGec8N27ckOrVq4uhoaFkypRJOnXqJGvWrBEAcvXq1W+uSyT+2zOmY8eOCQCZNm3ad5cdLSQkRGbOnCm1a9cWa2trMTAwEENDQ8mfP78MGTJEXr9+rdH+69evMmbMGMmdO7fo6+tL5syZpWrVqnLmzBm1TfQ2/jcbGxtp166dxrSTJ09K1apVJW3atGJkZCRlypSR3bt3x5o3Pp8Ff3//727jmKZNmya2trZiYGAg+fPnl+XLl6vvd0wJeS27du2SwoULi76+vlhbW8u0adPiXOb37Ny5U+rWrStmZmaiq6srGTNmlCpVqsiSJUskJCREbff69Wvp3r27ZM+eXXR1dcXGxkaGDx8uwcHBGst7//69dO7cWbJmzSpp06YVFxcXefjwoQCQsWPHqu2i43z58qXG/KtWrRIA4u/vr07z9fWVcuXKibGxsQCQSpUqabS9ePHid1+jra2t5M+fP97vCREREaUeikg8ikURERERaUnfvn3h7u6Od+/eaYxan1y1b98e3t7e+PTp0w/bKoqCnj17wt3d/RdEljx17doVnp6eeP36NfT19RN12QMHDsTixYsREBAQZ49iIm26du0aihQpgoULF6JHjx7aDoeIiIiSGZZHICIiomTp8uXLuHjxIjw8PODq6poiErb0fRMmTICFhQVy5cqFT58+Yc+ePVixYgVGjRqVqAnbc+fO4c6dO1i0aBG6devGhC0lK/fv38ejR48wYsQIZM+eHe3bt9d2SERERJQMMWlLREREyVLjxo3x/v17uLq6Yv78+doOhxKBnp4eZsyYgSdPniA8PBy5c+fG7Nmz0bdv30RdT/SAdPXq1cOkSZMSddlE/9XEiROxbt065M+fH15eXrEGTyQiIiICAJZHICIiIiIiIiIiIkpG4jdMLxERERERERERERH9EkzaEhERERERERERESUjTNoSERERERERERERJSMpeiCyyMhIPHv2DCYmJlAURdvhEBEREREREREREX2TiODjx4+wsLBAmjTf7k+bopO2z549g5WVlbbDICIiIiIiIiIiIoq3gIAA5MiR45vPp+ikrYmJCYCoF5k+fXotR0NERERERERERET0bR8+fICVlZWa1/yWFJ20jS6JkD59eiZtiYiIiIiIiIiIKEX4UalXDkRGRERERERERERElIwwaUtERERERERERESUjDBpS0RERERERERERJSMpOiatqmV7bC92g7ht/BwWt1EXR63S+JI7O0CABhnmvjLTI3GvU/0RXK/SRw8niVPSXE847ZJHNxnkifuM8kXt03ylSTnzkQEEUF4eDgiIiK+39C95K8J6HfX65K2I0hUOjo60NXV/WHN2h9h0paIiIiIiIiIiAhAaGgonj9/ji9fvvy4cblZSR9QauDvr+0IEp2xsTGyZ88OfX39n14Gk7ZERERERERERJTqRUZGwt/fHzo6OrCwsIC+vv73e0sGff11wf3OzHNqO4JEIyIIDQ3Fy5cv4e/vj9y5cyNNmp+rTsukLRERERERERERpXqhoaGIjIyElZUVjI2NfzyD7n+7/Z3+n6GhtiNIVEZGRtDT08OjR48QGhoKw598fRyIjIiIiIiIiIiI6P/9bM9IomiJ8Rnip5CIiIiIiIiIiIgoGWHSloiIiIiIiIiIiCgZYU1bIiIiIiIiIiKi77AdtveXru9hH4tfur74UiyLY/vKWWhQq0rSrUNRsH37djRo0CDJ1pESJChpO2DAgDinK4oCQ0ND2Nvbo379+siUKVOiBEdERERERERERETf177fWLz78BE7PGZrOxRKJAlK2l65cgU+Pj6IiIhA3rx5ISK4e/cudHR0kC9fPixatAgDBw7EqVOn4ODgkFQxExERERERERERUTyEhoZBX19P22FQAiWopm39+vVRvXp1PHv2DJcvX4aPjw+ePn2KGjVqoEWLFnj69CkqVqyI/v37J1W8RERERERERERE9A2VG3dBr5HTMGDcLGQpWBU1WrgBAI6fvYxSddvAIGdpZC9WE8OmzEd4eLjGfH1GT8eQSXORqUBlZCtaA+NmLYm1/Fdv3qFhp4EwtnNC7nL1sevv4+pzERER6DRwPHKWqQcju7LIW6Eh5q3YGGsZ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g7Bnzx48f/4cHz580PgjIiIiIiIiIiJKifT09AAAX7580XIklNJFf4aiP1M/I141baPVqlULAODq6gpFUdTpIgJFURAREfHTgRAREREREREREWmLjo4OMmTIgKCgIACAsbGxRv4rlnD2yE0Uv1EpVhHBly9fEBQUhAwZMkBHR+enl5WgpO3Ro0d/ekVERERERERERETJWbZs2QBATdx+17uXSRxNKvHZX9sRJLoMGTKon6WflaCkbaVKlf7TyoiIiIiIiIiIiJIrRVGQPXt2mJubIyws7PuN3Zv8mqB+d70uaTuCRKWnp/efethGS1DSFgDevXuHlStX4tatW1AUBQ4ODujYsSNMTU3/czBERERERERERETapqOj8+PE26eAXxPM787QUNsRJEsJGojs0qVLsLOzw5w5c/DmzRu8evUKs2fPhp2dHXx8fJIqRiIiIiIiIiIiIqJUI0E9bfv37w9XV1csX74curpRs4aHh6Nz587o168fTpw4kSRBEhEREREREREREaUWCUraXrp0SSNhCwC6uroYMmQISpYsmejBEREREREREREREaU2CSqPkD59ejx+/DjW9ICAAJiYmCRaUERERERERERERESpVYKSts2aNUOnTp2wefNmBAQE4MmTJ9i0aRM6d+6MFi1aJFWMRERERERERERERKlGgsojzJw5E4qioG3btggPDwcA6Onpwc3NDdOmTUuSAImIiIiIiIiIiIhSkwQlbfX19TFv3jxMnToV9+/fh4jA3t4exsbGSRUfERERERERERERUaqSoKRtNGNjY2TIkAGKojBhS0RERERERERERJSIElTTNjw8HKNHj4apqSlsbW1hY2MDU1NTjBo1CmFhYUkVIxEREREREREREVGqkaCetr169cL27dsxffp0lC1bFgBw9uxZjBs3Dq9evcKSJUuSJEgiIiIiIiIiIiKi1CJBSVtPT09s2rQJtWvXVqcVLlwY1tbWaN68OZO2RERERERERERERP9RgsojGBoawtbWNtZ0W1tb6OvrJ1ZMRERERERERERERKlWgpK2PXv2xMSJExESEqJOCwkJweTJk9GrV69ED46IiIiIiIiIiIgotUlQeYQrV67g8OHDyJEjB4oUKQIAuHr1KkJDQ1GtWjU0atRIbbtt27bEjZSIiIiIiIiIiIgoFUhQ0jZDhgz4448/NKZZWVklakBEREREREREREREqVmCkrarVq1KqjiIiIiIiIiIiIiICAlM2kYLCgqCn58fFEVBnjx5YG5unthxEREREREREREREaVKCRqI7MOHD2jTpg0sLS1RqVIlVKxYEZaWlmjdujXev3+fVDESERERERERERERpRoJStp27twZ58+fx549e/Du3Tu8f/8ee/bswaVLl9ClS5ekipGIiIiIiIiIiIgo1UhQ0nbv3r3w8PCAs7Mz0qdPDxMTEzg7O2P58uXYu3dvglc+depUODo6wsTEBObm5mjQoAH8/PwSvBwiIiIiIiIiIiKi30WCkraZM2eGqalprOmmpqbImDFjgld+/Phx9OzZE+fOncPBgwcRHh6OmjVr4vPnzwleFhEREREREREREdHvIEEDkY0aNQoDBgzA2rVrkT17dgBAYGAgBg8ejNGjRyd45fv379d4vGrVKpibm+Py5cuoWLFigpdHRERERERERERElNIlKGm7ePFi3Lt3DzY2NrC2tgYAPH78GAYGBnj58iWWLl2qtvXx8UlwMNGDmWXKlCnO50NCQhASEqI+/vDhQ4LXQURERERERERERJScJShp26BBgyQKAxARDBgwAOXLl0fBggXjbDN16lSMHz8+yWIgIiIiIiIiIiIi0rYEJW3Hjh2bVHGgV69euHbtGk6dOvXNNsOHD8eAAQPUxx8+fICVlVWSxURERERERERERET0qyUoaZtUevfujV27duHEiRPIkSPHN9sZGBjAwMDgF0ZGRERERERERERE9GslKGmbJk0aKIryzecjIiIStHIRQe/evbF9+3YcO3YMOXPmTND8RERERERERERERL+bBCVtt2/frvE4LCwMV65cwZo1a36q1mzPnj2xceNG7Ny5EyYmJggMDAQAmJqawsjIKMHLIyIiIiIiIiIiIkrpEpS0rV+/fqxpjRs3RoECBbB582Z06tQpQStfvHgxAKBy5coa01etWoX27dsnaFlEREREREREREREv4NEqWlbunRpdOnSJcHziUhirJ6IiIiIiIiIiIjot5Hmvy7g69evWLBgwXcHECMiIiIiIiIiIiKi+ElQT9uMGTNqDEQmIvj48SOMjY2xfv36RA+OiIiIiIiIiIiIKLVJUNJ2zpw5GknbNGnSwMzMDKVLl0bGjBkTPTgiIiIiIiIiIiKi1CZBSVsODkZERERERERERESUtBJU03b//v04deqU+njhwoUoWrQoWrZsibdv3yZ6cERERERERERERESpTYKStoMHD8aHDx8AANevX8eAAQNQp04dPHjwAAMGDEiSAImIiIiIiIiIiIhSkwSVR/D394eDgwMAYOvWrXBxccGUKVPg4+ODOnXqJEmARERERERERERERKlJgnra6uvr48uXLwCAQ4cOoWbNmgCATJkyqT1wiYiIiIiIiIiIiOjnJainbfny5TFgwACUK1cOFy5cwObNmwEAd+7cQY4cOZIkQCIiIiIiIiIiIqLUJEE9bd3d3aGrqwtvb28sXrwYlpaWAIB9+/ahVq1aSRIgERERERERERERUWqSoJ621tbW2LNnT6zpc+bMSbSAiIiIiIiIiIiIiFKzBCVtASAiIgLbt2/HrVu3oCgK8uXLhwYNGkBXN8GLIiIiIiIiIiIiIqJ/SVCm9caNG3B1dcWLFy+QN29eAFH1bM3MzLBr1y4UKlQoSYIkIiIiIiIiIiIiSi0SVNO2c+fOKFiwIJ48eQIfHx/4+PggICAAhQsXRteuXZMqRiIiIiIiIiIiIqJUI0E9ba9evYpLly4hY8aM6rSMGTNi8uTJcHR0TPTgiIiIiIiIiIiIiFKbBPW0zZs3L168eBFrelBQEOzt7RMtKCIiIiIiIiIiIqLU6odJ2w8fPqh/U6ZMQZ8+feDt7Y0nT57gyZMn8Pb2Rr9+/fDnn3/+iniJiIiIiIiIiIiIfms/LI+QIUMGKIqiPhYRNG3aVJ0mIgAAFxcXREREJFGYRERERERERERERKnDD5O2R48e/RVxEBERERERERERERHikbStVKnSr4iDiIiIiIiIiIiIiBCPpO2/vXv3DitXrsStW7egKAocHBzQsWNHmJqaJkV8RERERERERERERKnKDwcii+nSpUuws7PDnDlz8ObNG7x69QqzZ8+GnZ0dfHx8kipGIiIiIiIiIiIiolQjQT1t+/fvD1dXVyxfvhy6ulGzhoeHo3PnzujXrx9OnDiRJEESERERERERERERpRYJStpeunRJI2ELALq6uhgyZAhKliyZ6MERERERERERERERpTYJKo+QPn16PH78ONb0gIAAmJiYJFpQRERERERERERERKlVgpK2zZo1Q6dOnbB582YEBATgyZMn2LRpEzp37owWLVokVYxEREREREREREREqUaCyiPMnDkTiqKgbdu2CA8Ph4hAX18fbm5umDZtWlLFSERERERERERERJRqJChpq6+vj3nz5mHq1Km4f/8+RAT29vYwNjZOqviIiIiIiIiIiIiIUpV4JW0bNWr04wXp6iJbtmyoUaMGXFxc/nNgRERERERERERERKlRvGrampqa/vDPyMgId+/eRbNmzTBmzJikjpuIiIiIiIiIiIjotxSvnrarVq2K9wL37t0LNzc3TJgw4aeDIiIiIiIiIiIiIkqt4tXTNiHKlSuHkiVLJvZiiYiIiIiIiIiIiFKFRE/aZsiQAdu2bUvsxRIRERERERERERGlCometCUiIiIiIiIiIiKin8ekLREREREREREREVEywqQtERERERERERERUTLCpC0RERERERERERFRMsKkLREREREREREREVEyovWk7aJFi5AzZ04YGhqiRIkSOHnypLZDIiIiIiIiIiIiItIarSZtN2/ejH79+mHkyJG4cuUKKlSogNq1a+Px48faDIuIiIiIiIiIiIhIa3S1ufLZs2ejU6dO6Ny5MwBg7ty5OHDgABYvXoypU6fGah8SEoKQkBD18fv37wEAHz58+DUBJxchou0Ifg+J/LmJDPmSqMtLrZJkf+Y+kzi4bZIvHs+SpaQ4nnHbJI7E3jbcLomD+0zyxW2TfCX6tuG5WeLgeXPyxX0meUpleb3oY7fI9z8/ivyoRRIJDQ2FsbExvLy80LBhQ3V637594evri+PHj8eaZ9y4cRg/fvyvDJOIiIiIiIiIiIgoUQUEBCBHjhzffF5rPW1fvXqFiIgIZM2aVWN61qxZERgYGOc8w4cPx4ABA9THkZGRePPmDTJnzgxFUZI0Xoq/Dx8+wMrKCgEBAUifPr22w6H/x+2SfHHbJF/cNskTt0vyxW2TPHG7JF/cNskXt03yxO2SfHHbJE/cLsmTiODjx4+wsLD4bjutlkcAECvZKiLfTMAaGBjAwMBAY1qGDBmSKjT6j9KnT8+DQjLE7ZJ8cdskX9w2yRO3S/LFbZM8cbskX9w2yRe3TfLE7ZJ8cdskT9wuyY+pqekP22htILIsWbJAR0cnVq/aoKCgWL1viYiIiIiIiIiIiFILrSVt9fX1UaJECRw8eFBj+sGDB+Hk5KSlqIiIiIiIiIiIiIi0S6vlEQYMGIA2bdqgZMmSKFu2LJYtW4bHjx+je/fu2gyL/iMDAwOMHTs2VikL0i5ul+SL2yb54rZJnrhdki9um+SJ2yX54rZJvrhtkidul+SL2yZ54nZJ2RQREW0GsGjRIkyfPh3Pnz9HwYIFMWfOHFSsWFGbIRERERERERERERFpjdaTtkRERERERERERET0P1qraUtEREREREREREREsTFpS0RERERERERERJSMMGlLRERERERERERElIwwaUtERERERERERESUjDBpS0RERERERERERJSMMGlLRD/0/PlzbYdARERERJSiREZGajsEIiJKwZi0JaLvGjRoEAYOHIg7d+5oOxSi35qIAACCg4O1HAlR0li6dClWrlyp7TCIiH6ZNGmifm4fPnwYISEh6nc9ESU+XiSh3xGTtvTLxTxZ4YlL8pctWzbcuXMH8+bNY+JWC3jykTqICBRFwb59+9ChQwc8evRI2yERJRoRwYsXL3Dy5ElMnToVGzdu1HZIlAR44enX43l08iciuH37NmrUqIFTp05BURRth0T/j/vP70VE1IskW7duxZw5c3Dy5EmEhIRoObLfB3+XageTtvRLRScmDh8+jGHDhsHFxQUbN26En5+ftkOjf4k+kRk0aBC6dOmCs2fPYu7cuUzc/kKRkZHqyceBAwewfft2XLlyRctRUVJQFAXbtm1DixYtYGVlhTdv3mg7pN9C9HFMRBAWFhbnc5T0FEVB1qxZMXToUDg7O2PixInYsGGDtsOiRBR9fnfkyBHMmTMHt2/f1nZIv53oY9b9+/dx5coV3Lx5M9ZxjZIfRVGQL18+tG7dGmvWrMHnz5+1HVKqE73vPH36FA8ePFAvjCuKwnOB30j0BZHRo0ejffv2WLt2LSpVqoSxY8fi3r17Wo4u5Yv5u3Tt2rWYPHky3NzccOXKFXz48EHL0f3emLSlX0pRFGzfvh2NGjXC69evkTdvXgwePBjDhw9HQECAtsOjGBRFUa+mdevWDV26dMG5c+eYuP1FYl4tHjhwINq3b4/OnTujS5cuGDFiBE8yfzM3b95Ejx498Oeff2L69OkoVqwYACAwMBDh4eFaji5lik4i7d+/H+3atUO5cuUwcuRInDx5EgDY2+kXmTRpEho1agQAKFSoELp3745KlSph0qRJTNz+JqL3ta1bt8LV1RURERGIiIjQdli/lZjvceXKldG8eXMUKlQIbdq0wZ49e7QdHsXw755o0Y/Lly+Ps2fP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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Sample data\n", + "data = {\n", + " 'school': ['Ironhack', 'Ironhack', 'Ironhack', 'Ironhack', 'Ironhack', 'Ironhack', 'Ironhack', 'Ironhack', 'Ironhack', \n", + " 'Other Schools', 'Other Schools', 'Other Schools', 'Other Schools', 'Other Schools', 'Other Schools'],\n", + " 'country_name': ['online', 'Portugal', 'Spain', 'United States', 'France', 'Brazil', 'Netherlands', 'Mexico', 'Germany', \n", + " 'online', 'Canada', 'United Kingdom', 'United States', 'Singapore', 'Spain'],\n", + " 'overall_avg': [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 5, 5, 5],\n", + " 'curriculum_avg': [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 5, 5, 5],\n", + " 'jobSupport_avg': [5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 5, 5]\n", + "}\n", + "\n", + "# Create DataFrame\n", + "df = pd.DataFrame(data)\n", + "\n", + "# Set the figure size\n", + "plt.figure(figsize=(14, 8))\n", + "\n", + "# Plot the bar chart\n", + "for i, col in enumerate(['overall_avg', 'curriculum_avg', 'jobSupport_avg']):\n", + " plt.subplot(3, 1, i + 1)\n", + " for school in df['school'].unique():\n", + " plt.bar(df[df['school'] == school]['country_name'], df[df['school'] == school][col], label=school)\n", + " plt.title(f'{col.replace(\"_\", \" \").title()} by School and Country')\n", + " plt.ylabel(col.replace(\"_\", \" \").title())\n", + " plt.xticks(rotation=45)\n", + "\n", + "# Show the legend\n", + "plt.legend()\n", + "\n", + "# Adjust layout\n", + "plt.tight_layout()\n", + "\n", + "# Show the plot\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}