├── Loading data from cloudant to Pandas.ipynb ├── Lendo e gravando o COS.ipynb ├── cvs2db2.ipynb ├── COVID-BR.ipynb ├── Predicting Telco Customer Churn using SparkML.ipynb └── Linear regression.ipynb /Loading data from cloudant to Pandas.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "!pip install cloudant" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": null, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "from cloudant import Cloudant\n", 19 | "# PEGAR AS INFROMAÇÕES ABAIXO NA ABA CREDENTIALS DO SERVIÇO DE CLOUDANT NA IBM CLOUD\n", 20 | "u = ''\n", 21 | "p = ''\n", 22 | "a = '' # SIM, O ENDPOINT CIRADO PARA O SEU CLOUD É O MESMO QUE O USUÁRIO :-)\n", 23 | "client = Cloudant(u, p, account=a, connect=True, auto_renew=True)" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": null, 29 | "metadata": {}, 30 | "outputs": [], 31 | "source": [ 32 | "\n", 33 | "db = client[''] # NOME DO DB CRIADO NO CLOUDANT" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": null, 39 | "metadata": {}, 40 | "outputs": [], 41 | "source": [ 42 | "response = db.all_docs(limit=500, include_docs= True)\n", 43 | "\n", 44 | "# put document bodies into an array\n", 45 | "docs = []\n", 46 | "for r in response['rows']:\n", 47 | " docs.append(r['doc']) # CASO TENHA USADO O NODE-RED E GRAVADO TODO O MSG USE: docs.append(r['doc']['payload'])\n", 48 | "type(docs)" 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": null, 54 | "metadata": { 55 | "pixiedust": { 56 | "displayParams": { 57 | "brunelMapType": "Heat Map", 58 | "chartsize": "97", 59 | "coloropacity": "65", 60 | "handlerId": "mapView", 61 | "keyFields": "LAT,LONG", 62 | "mapboxtoken": "pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4M29iazA2Z2gycXA4N2pmbDZmangifQ.-g_vE53SD2WrJ6tFX7QHmA", 63 | "numbins": "16", 64 | "rendererId": "mapbox" 65 | } 66 | } 67 | }, 68 | "outputs": [], 69 | "source": [ 70 | "# create a Pandas dataframe containing the data\n", 71 | "import pandas as pd\n", 72 | "df = pd.DataFrame(data=docs)\n", 73 | "\n", 74 | "#df[\"LAT\"] = df[\"LAT\"].astype(float)\n", 75 | "#df[\"LONG\"] = df[\"LONG\"].astype(float)\n", 76 | "\n", 77 | "df.head()" 78 | ] 79 | }, 80 | { 81 | "cell_type": "code", 82 | "execution_count": null, 83 | "metadata": { 84 | "pixiedust": { 85 | "displayParams": { 86 | "colorrampname": "Light to Dark Red", 87 | "handlerId": "mapView", 88 | "keyFields": "LONG,LAT", 89 | "kind": "simple-cluster", 90 | "mapboxtoken": "pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4M29iazA2Z2gycXA4N2pmbDZmangifQ.-g_vE53SD2WrJ6tFX7QHmA", 91 | "valueFields": "Estação" 92 | } 93 | } 94 | }, 95 | "outputs": [], 96 | "source": [ 97 | "#import pixiedust\n", 98 | "#display(df)" 99 | ] 100 | }, 101 | { 102 | "cell_type": "code", 103 | "execution_count": null, 104 | "metadata": {}, 105 | "outputs": [], 106 | "source": [] 107 | } 108 | ], 109 | "metadata": { 110 | "kernelspec": { 111 | "display_name": "Python 3.6", 112 | "language": "python", 113 | "name": "python3" 114 | }, 115 | "language_info": { 116 | "codemirror_mode": { 117 | "name": "ipython", 118 | "version": 3 119 | }, 120 | "file_extension": ".py", 121 | "mimetype": "text/x-python", 122 | "name": "python", 123 | "nbconvert_exporter": "python", 124 | "pygments_lexer": "ipython3", 125 | "version": "3.6.9" 126 | } 127 | }, 128 | "nbformat": 4, 129 | "nbformat_minor": 1 130 | } 131 | -------------------------------------------------------------------------------- /Lendo e gravando o COS.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 6, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": "\nimport types\nimport pandas as pd\nfrom botocore.client import Config\nimport ibm_boto3\n\ndef __iter__(self): return 0\n\n# The following code accesses a file in your IBM Cloud Object Storage. It includes your credentials.\n# You might want to remove those credentials before you share the notebook.\ncos = ibm_boto3.client(service_name='s3',\n ibm_api_key_id=\"\",\n ibm_auth_endpoint=\"https://iam.ng.bluemix.net/oidc/token\",\n config=Config(signature_version='oauth'),\n endpoint_url='https://s3-api.us-geo.objectstorage.service.networklayer.com')" 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 7, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": "# The code was removed by Watson Studio for sharing." 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 8, 20 | "metadata": {}, 21 | "outputs": [ 22 | { 23 | "data": { 24 | "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
AVGHEARTBEATSPERMINPALPITATIONSPERDAYCHOLESTEROLBMIHEARTFAILUREAGESEXFAMILYHISTORYSMOKERLAST5YRSEXERCISEMINPERWEEK
0932216325N49FNN110
11082218124N32FNN192
286023920N60FNN121
3803616431Y45FYN141
4663618523N39FNN63
\n
", 25 | "text/plain": " AVGHEARTBEATSPERMIN PALPITATIONSPERDAY CHOLESTEROL BMI HEARTFAILURE \\\n0 93 22 163 25 N \n1 108 22 181 24 N \n2 86 0 239 20 N \n3 80 36 164 31 Y \n4 66 36 185 23 N \n\n AGE SEX FAMILYHISTORY SMOKERLAST5YRS EXERCISEMINPERWEEK \n0 49 F N N 110 \n1 32 F N N 192 \n2 60 F N N 121 \n3 45 F Y N 141 \n4 39 F N N 63 " 26 | }, 27 | "execution_count": 8, 28 | "metadata": {}, 29 | "output_type": "execute_result" 30 | } 31 | ], 32 | "source": "body = cos.get_object(Bucket='covid19-donotdelete-pr-im28vw91gfqqeg',Key='data-health.csv')['Body']\n# add missing __iter__ method, so pandas accepts body as file-like object\nif not hasattr(body, \"__iter__\"): body.__iter__ = types.MethodType( __iter__, body )\n\ndf_data_1 = pd.read_csv(body)\ndf_data_1.head()\n" 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 9, 37 | "metadata": {}, 38 | "outputs": [ 39 | { 40 | "name": "stdout", 41 | "output_type": "stream", 42 | "text": "filename-local.csv uploaded to IBM COS.\n" 43 | } 44 | ], 45 | "source": "\n df_data_1.to_csv('novo_arquivo.csv', sep=',', encoding='utf-8')\n try:\n res=cos.upload_file(Filename='novo_arquivo.csv', Bucket='covid19-donotdelete-pr-im28vw91gfqqeg', Key='filename-at-cos.csv')\n except Exception as e:\n print(Exception, e)\n else:\n print(\"filename-local.csv uploaded to IBM COS.\")" 46 | }, 47 | { 48 | "cell_type": "code", 49 | "execution_count": 10, 50 | "metadata": {}, 51 | "outputs": [ 52 | { 53 | "data": { 54 | "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
Unnamed: 0AVGHEARTBEATSPERMINPALPITATIONSPERDAYCHOLESTEROLBMIHEARTFAILUREAGESEXFAMILYHISTORYSMOKERLAST5YRSEXERCISEMINPERWEEK
00932216325N49FNN110
111082218124N32FNN192
2286023920N60FNN121
33803616431Y45FYN141
44663618523N39FNN63
\n
", 55 | "text/plain": " Unnamed: 0 AVGHEARTBEATSPERMIN PALPITATIONSPERDAY CHOLESTEROL BMI \\\n0 0 93 22 163 25 \n1 1 108 22 181 24 \n2 2 86 0 239 20 \n3 3 80 36 164 31 \n4 4 66 36 185 23 \n\n HEARTFAILURE AGE SEX FAMILYHISTORY SMOKERLAST5YRS EXERCISEMINPERWEEK \n0 N 49 F N N 110 \n1 N 32 F N N 192 \n2 N 60 F N N 121 \n3 Y 45 F Y N 141 \n4 N 39 F N N 63 " 56 | }, 57 | "execution_count": 10, 58 | "metadata": {}, 59 | "output_type": "execute_result" 60 | } 61 | ], 62 | "source": "body = cos.get_object(Bucket='covid19-donotdelete-pr-im28vw91gfqqeg',Key='filename-at-cos.csv')['Body']\n# add missing __iter__ method, so pandas accepts body as file-like object\nif not hasattr(body, \"__iter__\"): body.__iter__ = types.MethodType( __iter__, body )\n\ndf = pd.read_csv(body)\ndf.head()" 63 | }, 64 | { 65 | "cell_type": "code", 66 | "execution_count": null, 67 | "metadata": {}, 68 | "outputs": [], 69 | "source": "" 70 | } 71 | ], 72 | "metadata": { 73 | "kernelspec": { 74 | "display_name": "Python 3.6", 75 | "language": "python", 76 | "name": "python3" 77 | }, 78 | "language_info": { 79 | "codemirror_mode": { 80 | "name": "ipython", 81 | "version": 3 82 | }, 83 | "file_extension": ".py", 84 | "mimetype": "text/x-python", 85 | "name": "python", 86 | "nbconvert_exporter": "python", 87 | "pygments_lexer": "ipython3", 88 | "version": "3.6.9" 89 | } 90 | }, 91 | "nbformat": 4, 92 | "nbformat_minor": 1 93 | } -------------------------------------------------------------------------------- /cvs2db2.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 20, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": "import pandas as pd\nfrom sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, Date, Numeric, DateTime\nfrom sqlalchemy.orm import scoped_session, sessionmaker\nfrom sqlalchemy.ext.automap import automap_base" 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 21, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": "# The code was removed by Watson Studio for sharing." 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 22, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": "#Connect to DB2\nconnection_string = \"db2+ibm_db://\" + user + \":\" + pwd + \"@dashdb-txn-flex-yp-dal13-43.services.dal.bluemix.net:50000/BLUDB\"\n" 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 23, 27 | "metadata": {}, 28 | "outputs": [], 29 | "source": "\nengine = create_engine(connection_string, echo=False)\nmeta = MetaData()\n\nnome_tabela = 'COVID'\n\ncovid = Table('covid', meta, \n Column(\"DATE\", Date),\n Column(\"TYPE\", String(30)),\n Column(\"CASES\", Integer),\n Column(\"DIFFERENCE\", Integer),\n Column(\"COUNTRY\", String(50)),\n Column(\"PROVINCE_STATE\", String(50)), \n Column(\"LAT\", Numeric(18,8)),\n Column(\"LONG\", Numeric(18,8)),\n Column(\"LATEST_DATE\", DateTime))\n\ndropTable = True\n\nif not engine.dialect.has_table(engine, nome_tabela, schema = 'BLUADMIN'):\n meta.create_all(engine)\nelse:\n if dropTable:\n covid.drop(engine) # Apaga tabela\n meta.create_all(engine) # Cria tabela\n conn = engine.connect()\n #stmt = covid.delete().where(students.c.lastname == 'Khanna')\n stmt = covid.delete()\n conn.execute(stmt)\n conn.close()" 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": 24, 34 | "metadata": {}, 35 | "outputs": [], 36 | "source": "Base = automap_base()\n\n#engine = create_engine(connection_string, echo=True)\nsession = scoped_session(sessionmaker(autocommit=True,\n autoflush=False,\n bind=engine))\n\nBase.prepare(engine, reflect=True)\nbase_sa = Base.classes" 37 | }, 38 | { 39 | "cell_type": "code", 40 | "execution_count": 25, 41 | "metadata": {}, 42 | "outputs": [ 43 | { 44 | "data": { 45 | "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
DATETYPECASESDIFFERENCECOUNTRYPROVINCE_STATELATLONGLATEST_DATE
02020-06-04Confirmed3262152Cote d'IvoireNaN7.540000-5.5471002020-06-04T23:15:39
12020-06-04Deaths00EritreaNaN15.17940039.7823002020-06-04T23:15:39
22020-06-04Deaths10FranceFrench Guiana4.000000-53.0000002020-06-04T23:15:39
32020-06-04Confirmed2980CanadaManitoba53.760900-98.8139002020-06-04T23:15:39
42020-06-04Confirmed200FranceNew Caledonia-20.904305165.6180422020-06-04T23:15:39
\n
", 46 | "text/plain": " DATE TYPE CASES DIFFERENCE COUNTRY PROVINCE_STATE \\\n0 2020-06-04 Confirmed 3262 152 Cote d'Ivoire NaN \n1 2020-06-04 Deaths 0 0 Eritrea NaN \n2 2020-06-04 Deaths 1 0 France French Guiana \n3 2020-06-04 Confirmed 298 0 Canada Manitoba \n4 2020-06-04 Confirmed 20 0 France New Caledonia \n\n LAT LONG LATEST_DATE \n0 7.540000 -5.547100 2020-06-04T23:15:39 \n1 15.179400 39.782300 2020-06-04T23:15:39 \n2 4.000000 -53.000000 2020-06-04T23:15:39 \n3 53.760900 -98.813900 2020-06-04T23:15:39 \n4 -20.904305 165.618042 2020-06-04T23:15:39 " 47 | }, 48 | "execution_count": 25, 49 | "metadata": {}, 50 | "output_type": "execute_result" 51 | } 52 | ], 53 | "source": "df = pd.read_csv('https://download.data.world/s/3xpcwdh7es3o6uqyztkkhdnh4ht7i7')\ndf.head()" 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 26, 58 | "metadata": {}, 59 | "outputs": [], 60 | "source": "nome_tabela = 'covid'" 61 | }, 62 | { 63 | "cell_type": "code", 64 | "execution_count": 27, 65 | "metadata": { 66 | "scrolled": true 67 | }, 68 | "outputs": [], 69 | "source": "df.to_sql(name=nome_tabela, con=engine, if_exists='append', index=False)\n#df.to_sql(name=nome_tabela, con=engine, if_exists='append', index=False, chunksize=1000) # With number of records to be processed each time" 70 | }, 71 | { 72 | "cell_type": "code", 73 | "execution_count": 28, 74 | "metadata": {}, 75 | "outputs": [ 76 | { 77 | "data": { 78 | "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
DATETYPEcasesdifferencecountryprovince_statelatLONGlatest_date
02020-06-04Confirmed3262152Cote d'IvoireNone7.540000-5.5471002020-06-04 23:15:39
12020-06-04Deaths00EritreaNone15.17940039.7823002020-06-04 23:15:39
22020-06-04Deaths10FranceFrench Guiana4.000000-53.0000002020-06-04 23:15:39
32020-06-04Confirmed2980CanadaManitoba53.760900-98.8139002020-06-04 23:15:39
42020-06-04Confirmed200FranceNew Caledonia-20.904305165.6180422020-06-04 23:15:39
\n
", 79 | "text/plain": " DATE TYPE cases difference country province_state \\\n0 2020-06-04 Confirmed 3262 152 Cote d'Ivoire None \n1 2020-06-04 Deaths 0 0 Eritrea None \n2 2020-06-04 Deaths 1 0 France French Guiana \n3 2020-06-04 Confirmed 298 0 Canada Manitoba \n4 2020-06-04 Confirmed 20 0 France New Caledonia \n\n lat LONG latest_date \n0 7.540000 -5.547100 2020-06-04 23:15:39 \n1 15.179400 39.782300 2020-06-04 23:15:39 \n2 4.000000 -53.000000 2020-06-04 23:15:39 \n3 53.760900 -98.813900 2020-06-04 23:15:39 \n4 -20.904305 165.618042 2020-06-04 23:15:39 " 80 | }, 81 | "execution_count": 28, 82 | "metadata": {}, 83 | "output_type": "execute_result" 84 | } 85 | ], 86 | "source": "df2 = pd.read_sql_table(nome_tabela, engine)\ndf2.head()" 87 | }, 88 | { 89 | "cell_type": "code", 90 | "execution_count": 29, 91 | "metadata": {}, 92 | "outputs": [], 93 | "source": "session.close()" 94 | }, 95 | { 96 | "cell_type": "code", 97 | "execution_count": null, 98 | "metadata": {}, 99 | "outputs": [], 100 | "source": "" 101 | } 102 | ], 103 | "metadata": { 104 | "kernelspec": { 105 | "display_name": "Python 3.6", 106 | "language": "python", 107 | "name": "python3" 108 | }, 109 | "language_info": { 110 | "codemirror_mode": { 111 | "name": "ipython", 112 | "version": 3 113 | }, 114 | "file_extension": ".py", 115 | "mimetype": "text/x-python", 116 | "name": "python", 117 | "nbconvert_exporter": "python", 118 | "pygments_lexer": "ipython3", 119 | "version": "3.6.9" 120 | } 121 | }, 122 | "nbformat": 4, 123 | "nbformat_minor": 1 124 | } -------------------------------------------------------------------------------- /COVID-BR.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 7, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": "import pandas as pd\nfrom sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, Date, Numeric, DateTime\nfrom sqlalchemy.orm import scoped_session, sessionmaker\nfrom sqlalchemy.ext.automap import automap_base" 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 8, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": "# The code was removed by Watson Studio for sharing." 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 9, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": "#DB connection string\nconnection_string = \"db2+ibm_db://\" + user + \":\" + pwd + \"@dashdb-txn-flex-yp-dal13-43.services.dal.bluemix.net:50000/BLUDB\"" 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 10, 27 | "metadata": {}, 28 | "outputs": [], 29 | "source": "\nengine = create_engine(connection_string, echo=False)\nmeta = MetaData()\n\nnome_tabela = 'COVID-BR'\n\ncovid = Table('COVID-BR', meta, \n Column(\"COUNTRY\", String(30)),\n Column(\"PROVINCE_STATE\", String(50)),\n Column(\"CITY\", String(50)),\n Column(\"IBGEID\", Integer),\n Column(\"COD_REGIAODESAUDE\",Numeric(18,8)),\n Column(\"NOME_REGIAODESAUDE\",String(50)),\n Column(\"DEATHS\", Integer),\n Column(\"CASES\", Integer),\n Column(\"DEATHS_PER_100K_INHABITANTS\", Numeric(18,8)),\n Column(\"TOTALCASES_PER_100K_INHABITANTS\", Numeric(18,8)),\n Column(\"DEATHS_BY_TOTALCASES\", Numeric(18,8)),\n Column(\"SOURCE\", String(10)),\n Column(\"DATE\", Date),\n Column(\"NEWCASES\", Integer),\n Column(\"NEWDEATHS\",Integer),\n Column(\"LAST_INFO_DATE\", Date))\n\n\n# date\tnewCases\tnewDeaths\n#'DEATHS_PER_100K_INHABITANTS','TOTALCASES_PER_100K_INHABITANTS','DEATHS_BY_TOTALCASES'\n\ndropTable = True\n\nif not engine.dialect.has_table(engine, nome_tabela, schema = 'BLUADMIN'):\n meta.create_all(engine)\nelse:\n if dropTable:\n covid.drop(engine) # Apaga tabela\n meta.create_all(engine) # Cria tabela\n conn = engine.connect()\n #stmt = covid.delete().where(students.c.lastname == 'Khanna')\n stmt = covid.delete()\n conn.execute(stmt)\n conn.close()" 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": 11, 34 | "metadata": {}, 35 | "outputs": [], 36 | "source": "Base = automap_base()\n\n#engine = create_engine(connection_string, echo=True)\nsession = scoped_session(sessionmaker(autocommit=True,\n autoflush=False,\n bind=engine))\n\nBase.prepare(engine, reflect=True)\nbase_sa = Base.classes" 37 | }, 38 | { 39 | "cell_type": "code", 40 | "execution_count": 12, 41 | "metadata": {}, 42 | "outputs": [ 43 | { 44 | "data": { 45 | "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
countrystatecityibgeIDcod_RegiaoDeSaudename_RegiaoDeSaudedeathstotalCasesdeaths_per_100k_inhabitantstotalCases_per_100k_inhabitantsdeaths_by_totalCases_sourcedatenewCasesnewDeathslast_info_date
0BrazilGOAbadia de Goi\u00e1s/GO520005052001.0Central113511.398611538.812260.00741SES2020-07-25002020-07-25
1BrazilMGAbadia dos Dourados/MG310010431074.0Patroc\u00ednio / Monte Carmelo0150.00000214.622980.00000SES2020-07-25002020-07-24
2BrazilGOAbadi\u00e2nia/GO520010052011.0Pirineus77734.92665384.193190.09091SES2020-07-25002020-07-25
3BrazilPAAbaetetuba/PA150010715011.0Tocantins109259869.119461647.452730.04196SES2020-07-25002020-07-25
4BrazilMGAbaet\u00e9/MG310020331024.0Sete Lagoas0260.00000111.890520.00000SES2020-07-25002020-07-24
\n
", 46 | "text/plain": " country state city ibgeID cod_RegiaoDeSaude \\\n0 Brazil GO Abadia de Goi\u00e1s/GO 5200050 52001.0 \n1 Brazil MG Abadia dos Dourados/MG 3100104 31074.0 \n2 Brazil GO Abadi\u00e2nia/GO 5200100 52011.0 \n3 Brazil PA Abaetetuba/PA 1500107 15011.0 \n4 Brazil MG Abaet\u00e9/MG 3100203 31024.0 \n\n name_RegiaoDeSaude deaths totalCases \\\n0 Central 1 135 \n1 Patroc\u00ednio / Monte Carmelo 0 15 \n2 Pirineus 7 77 \n3 Tocantins 109 2598 \n4 Sete Lagoas 0 26 \n\n deaths_per_100k_inhabitants totalCases_per_100k_inhabitants \\\n0 11.39861 1538.81226 \n1 0.00000 214.62298 \n2 34.92665 384.19319 \n3 69.11946 1647.45273 \n4 0.00000 111.89052 \n\n deaths_by_totalCases _source date newCases newDeaths \\\n0 0.00741 SES 2020-07-25 0 0 \n1 0.00000 SES 2020-07-25 0 0 \n2 0.09091 SES 2020-07-25 0 0 \n3 0.04196 SES 2020-07-25 0 0 \n4 0.00000 SES 2020-07-25 0 0 \n\n last_info_date \n0 2020-07-25 \n1 2020-07-24 \n2 2020-07-25 \n3 2020-07-25 \n4 2020-07-24 " 47 | }, 48 | "execution_count": 12, 49 | "metadata": {}, 50 | "output_type": "execute_result" 51 | } 52 | ], 53 | "source": "df = pd.read_csv('https://raw.githubusercontent.com/wcota/covid19br/master/cases-brazil-cities.csv')\ndf.head()" 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 13, 58 | "metadata": {}, 59 | "outputs": [ 60 | { 61 | "data": { 62 | "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
COUNTRYPROVINCE_STATECITYIBGEIDCOD_REGIAODESAUDENOME_REGIAODESAUDEDEATHSCASESDEATHS_PER_100K_INHABITANTSTOTALCASES_PER_100K_INHABITANTSDEATHS_BY_TOTALCASESSOURCEDATENEWCASESNEWDEATHSLAST_INFO_DATE
0BrazilGOAbadia de Goi\u00e1s/GO520005052001.0Central113511.398611538.812260.00741SES2020-07-25002020-07-25
1BrazilMGAbadia dos Dourados/MG310010431074.0Patroc\u00ednio / Monte Carmelo0150.00000214.622980.00000SES2020-07-25002020-07-24
2BrazilGOAbadi\u00e2nia/GO520010052011.0Pirineus77734.92665384.193190.09091SES2020-07-25002020-07-25
3BrazilPAAbaetetuba/PA150010715011.0Tocantins109259869.119461647.452730.04196SES2020-07-25002020-07-25
4BrazilMGAbaet\u00e9/MG310020331024.0Sete Lagoas0260.00000111.890520.00000SES2020-07-25002020-07-24
\n
", 63 | "text/plain": " COUNTRY PROVINCE_STATE CITY IBGEID COD_REGIAODESAUDE \\\n0 Brazil GO Abadia de Goi\u00e1s/GO 5200050 52001.0 \n1 Brazil MG Abadia dos Dourados/MG 3100104 31074.0 \n2 Brazil GO Abadi\u00e2nia/GO 5200100 52011.0 \n3 Brazil PA Abaetetuba/PA 1500107 15011.0 \n4 Brazil MG Abaet\u00e9/MG 3100203 31024.0 \n\n NOME_REGIAODESAUDE DEATHS CASES DEATHS_PER_100K_INHABITANTS \\\n0 Central 1 135 11.39861 \n1 Patroc\u00ednio / Monte Carmelo 0 15 0.00000 \n2 Pirineus 7 77 34.92665 \n3 Tocantins 109 2598 69.11946 \n4 Sete Lagoas 0 26 0.00000 \n\n TOTALCASES_PER_100K_INHABITANTS DEATHS_BY_TOTALCASES SOURCE DATE \\\n0 1538.81226 0.00741 SES 2020-07-25 \n1 214.62298 0.00000 SES 2020-07-25 \n2 384.19319 0.09091 SES 2020-07-25 \n3 1647.45273 0.04196 SES 2020-07-25 \n4 111.89052 0.00000 SES 2020-07-25 \n\n NEWCASES NEWDEATHS LAST_INFO_DATE \n0 0 0 2020-07-25 \n1 0 0 2020-07-24 \n2 0 0 2020-07-25 \n3 0 0 2020-07-25 \n4 0 0 2020-07-24 " 64 | }, 65 | "execution_count": 13, 66 | "metadata": {}, 67 | "output_type": "execute_result" 68 | } 69 | ], 70 | "source": "df.columns = ['COUNTRY','PROVINCE_STATE','CITY',\n 'IBGEID','COD_REGIAODESAUDE','NOME_REGIAODESAUDE','DEATHS','CASES','DEATHS_PER_100K_INHABITANTS',\n 'TOTALCASES_PER_100K_INHABITANTS','DEATHS_BY_TOTALCASES','SOURCE','DATE',\n 'NEWCASES','NEWDEATHS','LAST_INFO_DATE']\ndf.head()" 71 | }, 72 | { 73 | "cell_type": "code", 74 | "execution_count": 14, 75 | "metadata": {}, 76 | "outputs": [], 77 | "source": "nome_tabela = 'COVID-BR'" 78 | }, 79 | { 80 | "cell_type": "code", 81 | "execution_count": 15, 82 | "metadata": { 83 | "scrolled": true 84 | }, 85 | "outputs": [], 86 | "source": "df.to_sql(name=nome_tabela, con=engine, if_exists='append', index=False)\n#df.to_sql(name=nome_tabela, con=engine, if_exists='append', index=False, chunksize=1000) # With number of records to be processed each time" 87 | }, 88 | { 89 | "cell_type": "code", 90 | "execution_count": 16, 91 | "metadata": {}, 92 | "outputs": [ 93 | { 94 | "data": { 95 | "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
countryprovince_statecityibgeidcod_regiaodesaudenome_regiaodesaudedeathscasesdeaths_per_100k_inhabitantstotalcases_per_100k_inhabitantsdeaths_by_totalcasesSOURCEDATEnewcasesnewdeathslast_info_date
0BrazilGOAbadia de Goi\u00e1s/GO520005052001.0Central113511.398611538.812260.00741SES2020-07-25002020-07-25
1BrazilMGAbadia dos Dourados/MG310010431074.0Patroc\u00ednio / Monte Carmelo0150.00000214.622980.00000SES2020-07-25002020-07-24
2BrazilGOAbadi\u00e2nia/GO520010052011.0Pirineus77734.92665384.193190.09091SES2020-07-25002020-07-25
3BrazilPAAbaetetuba/PA150010715011.0Tocantins109259869.119461647.452730.04196SES2020-07-25002020-07-25
4BrazilMGAbaet\u00e9/MG310020331024.0Sete Lagoas0260.00000111.890520.00000SES2020-07-25002020-07-24
\n
", 96 | "text/plain": " country province_state city ibgeid cod_regiaodesaude \\\n0 Brazil GO Abadia de Goi\u00e1s/GO 5200050 52001.0 \n1 Brazil MG Abadia dos Dourados/MG 3100104 31074.0 \n2 Brazil GO Abadi\u00e2nia/GO 5200100 52011.0 \n3 Brazil PA Abaetetuba/PA 1500107 15011.0 \n4 Brazil MG Abaet\u00e9/MG 3100203 31024.0 \n\n nome_regiaodesaude deaths cases deaths_per_100k_inhabitants \\\n0 Central 1 135 11.39861 \n1 Patroc\u00ednio / Monte Carmelo 0 15 0.00000 \n2 Pirineus 7 77 34.92665 \n3 Tocantins 109 2598 69.11946 \n4 Sete Lagoas 0 26 0.00000 \n\n totalcases_per_100k_inhabitants deaths_by_totalcases SOURCE DATE \\\n0 1538.81226 0.00741 SES 2020-07-25 \n1 214.62298 0.00000 SES 2020-07-25 \n2 384.19319 0.09091 SES 2020-07-25 \n3 1647.45273 0.04196 SES 2020-07-25 \n4 111.89052 0.00000 SES 2020-07-25 \n\n newcases newdeaths last_info_date \n0 0 0 2020-07-25 \n1 0 0 2020-07-24 \n2 0 0 2020-07-25 \n3 0 0 2020-07-25 \n4 0 0 2020-07-24 " 97 | }, 98 | "execution_count": 16, 99 | "metadata": {}, 100 | "output_type": "execute_result" 101 | } 102 | ], 103 | "source": "df2 = pd.read_sql_table(nome_tabela, engine)\ndf2.head()" 104 | }, 105 | { 106 | "cell_type": "code", 107 | "execution_count": 17, 108 | "metadata": {}, 109 | "outputs": [], 110 | "source": "session.close()" 111 | }, 112 | { 113 | "cell_type": "code", 114 | "execution_count": null, 115 | "metadata": {}, 116 | "outputs": [], 117 | "source": "" 118 | } 119 | ], 120 | "metadata": { 121 | "kernelspec": { 122 | "display_name": "Python 3.6", 123 | "language": "python", 124 | "name": "python3" 125 | }, 126 | "language_info": { 127 | "codemirror_mode": { 128 | "name": "ipython", 129 | "version": 3 130 | }, 131 | "file_extension": ".py", 132 | "mimetype": "text/x-python", 133 | "name": "python", 134 | "nbconvert_exporter": "python", 135 | "pygments_lexer": "ipython3", 136 | "version": "3.6.9" 137 | } 138 | }, 139 | "nbformat": 4, 140 | "nbformat_minor": 1 141 | } -------------------------------------------------------------------------------- /Predicting Telco Customer Churn using SparkML.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": "# Predicting Telco Customer Churn using SparkML on IBM Cloud Pak for Data (ICP4D)" 7 | }, 8 | { 9 | "cell_type": "markdown", 10 | "metadata": {}, 11 | "source": "We'll use this notebook to create a machine learning model to predict customer churn. In this notebook we will build the prediction model using the SparkML library.\n\nThis notebook walks you through these steps:\n\n- Load and Visualize data set. (https://raw.githubusercontent.com/IBM/telco-customer-churn-on-icp4d/master/data/Telco-Customer-Churn.csv)\n- Build a predictive model with SparkML API\n- Save the model in the ML repository\n\n* This notebook has been updated, in order to compatibilize to the services new versions, and it is part of code pattern at: https://developer.ibm.com/patterns/data-analysis-model-building-and-deploying-with-wml/" 12 | }, 13 | { 14 | "cell_type": "code", 15 | "execution_count": null, 16 | "metadata": {}, 17 | "outputs": [], 18 | "source": "\n# The project token is an authorization token that is used to access project resources like data sources, connections, and used by platform APIs.\n# Generate the TOKEN on settings session, and insert here the code using menu above (3 points) \"Insert Project Token\"\n" 19 | }, 20 | { 21 | "cell_type": "code", 22 | "execution_count": null, 23 | "metadata": {}, 24 | "outputs": [], 25 | "source": "# The code was removed by Watson Studio for sharing." 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "metadata": {}, 30 | "source": "## 1.0 Install required packages\n\nThere are a couple of Python packages we will use in this notebook. First we make sure the Watson Machine Learning client v3 is removed (its not installed by default) and then install/upgrade the v4 version of the client (this package is installed by default on CP4D).\n\nWML Client: https://wml-api-pyclient-dev-v4.mybluemix.net/#repository" 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": null, 35 | "metadata": {}, 36 | "outputs": [], 37 | "source": "!pip uninstall --yes watson-machine-learning-client-V4\n!pip install --user watson-machine-learning-client-V4\n!pip install --user pyspark==2.4 --upgrade|tail -n 1\n!pip install --user scikit-learn==0.20.3 --upgrade|tail -n 1" 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": null, 42 | "metadata": {}, 43 | "outputs": [], 44 | "source": "import pandas as pd\nimport numpy as np\nimport json\nimport os\nimport warnings\n\nwarnings.filterwarnings(\"ignore\")" 45 | }, 46 | { 47 | "cell_type": "markdown", 48 | "metadata": {}, 49 | "source": "## 2.0 Load and Clean data\n\nWe'll load our data as a pandas data frame.\n\n**<< FOLLOW THE INSTRUCTIONS BELOW TO LOAD THE DATASET >>**\n\n* Highlight the cell below by clicking it.\n* Click the `10/01` \"Find data\" icon in the upper right of the notebook.\n* If you are using Virtualized data, begin by choosing the `Files` tab. Then choose your virtualized data (i.e. MYSCHEMA.BILLINGPRODUCTCUSTOMERS), click `Insert to code` and choose `Insert Pandas DataFrame`.\n* If you are using this notebook without virtualized data, add the locally uploaded file `Telco-Customer-Churn.csv` by choosing the `Files` tab. Then choose the `Telco-Customer-Churn.csv`. Click `Insert to code` and choose `Insert Pandas DataFrame`.\n* The code to bring the data into the notebook environment and create a Pandas DataFrame will be added to the cell below.\n* Run the cell\n" 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": null, 54 | "metadata": {}, 55 | "outputs": [], 56 | "source": "# Place cursor below and insert the Pandas DataFrame for the Telco churn data\nimport os, types\nimport pandas as pd\nfrom botocore.client import Config\nimport ibm_boto3\n\ndef __iter__(self): return 0\n\n# Insert pandas code below\n" 57 | }, 58 | { 59 | "cell_type": "code", 60 | "execution_count": null, 61 | "metadata": {}, 62 | "outputs": [], 63 | "source": "# The code was removed by Watson Studio for sharing." 64 | }, 65 | { 66 | "cell_type": "markdown", 67 | "metadata": {}, 68 | "source": "We'll use the Pandas naming convention df for our DataFrame. Make sure that the cell below uses the name for the dataframe used above. For the locally uploaded file it should look like df_data_1 or df_data_2 or df_data_x. For the virtualized data case it should look like data_df_1 or data_df_2 or data_df_x.\n\n**<< UPDATE THE VARIABLE ASSIGNMENT TO THE VARIABLE GENERATED ABOVE. >>**" 69 | }, 70 | { 71 | "cell_type": "code", 72 | "execution_count": null, 73 | "metadata": {}, 74 | "outputs": [], 75 | "source": "# for virtualized data\n# df = data_df_1\n\n# for local upload\ndf = df_data_2" 76 | }, 77 | { 78 | "cell_type": "markdown", 79 | "metadata": {}, 80 | "source": "### 2.1 Drop CustomerID feature (column)" 81 | }, 82 | { 83 | "cell_type": "code", 84 | "execution_count": null, 85 | "metadata": {}, 86 | "outputs": [], 87 | "source": "df = df.drop('customerID', axis=1)" 88 | }, 89 | { 90 | "cell_type": "code", 91 | "execution_count": null, 92 | "metadata": {}, 93 | "outputs": [], 94 | "source": "df.head()" 95 | }, 96 | { 97 | "cell_type": "markdown", 98 | "metadata": {}, 99 | "source": "### 2.2 Examine the data types of the features" 100 | }, 101 | { 102 | "cell_type": "code", 103 | "execution_count": null, 104 | "metadata": {}, 105 | "outputs": [], 106 | "source": "df.info()" 107 | }, 108 | { 109 | "cell_type": "code", 110 | "execution_count": null, 111 | "metadata": {}, 112 | "outputs": [], 113 | "source": "# Statistics for the columns (features). Set it to all, since default is to describe just the numeric features.\ndf.describe(include = 'all')" 114 | }, 115 | { 116 | "cell_type": "markdown", 117 | "metadata": {}, 118 | "source": "We see that Tenure ranges from 0 (new customer) to 6 years, Monthly charges range from $18 to $118, etc" 119 | }, 120 | { 121 | "cell_type": "markdown", 122 | "metadata": {}, 123 | "source": "### 2.3 Check for need to Convert TotalCharges column to numeric if it is detected as object\n\nIf the above `df.info` shows the \"TotalCharges\" columnn as an object, we'll need to convert it to numeric. If you have already done this during a previous exercise for \"Data Visualization with Data Refinery\", you can skip to step `2.4`." 124 | }, 125 | { 126 | "cell_type": "code", 127 | "execution_count": null, 128 | "metadata": {}, 129 | "outputs": [], 130 | "source": "totalCharges = df.columns.get_loc(\"TotalCharges\")\nnew_col = pd.to_numeric(df.iloc[:, totalCharges], errors='coerce')\ndf.iloc[:, totalCharges] = pd.Series(new_col)" 131 | }, 132 | { 133 | "cell_type": "code", 134 | "execution_count": null, 135 | "metadata": {}, 136 | "outputs": [], 137 | "source": "# Statistics for the columns (features). Set it to all, since default is to describe just the numeric features.\ndf.describe(include = 'all')" 138 | }, 139 | { 140 | "cell_type": "markdown", 141 | "metadata": {}, 142 | "source": "We now see statistics for the `TotalCharges` feature." 143 | }, 144 | { 145 | "cell_type": "markdown", 146 | "metadata": {}, 147 | "source": "\n\n### 2.4 Any NaN values should be removed to create a more accurate model." 148 | }, 149 | { 150 | "cell_type": "code", 151 | "execution_count": null, 152 | "metadata": {}, 153 | "outputs": [], 154 | "source": "# Check if we have any NaN values and see which features have missing values that should be addressed\nprint(df.isnull().values.any())\ndf.isnull().sum()" 155 | }, 156 | { 157 | "cell_type": "markdown", 158 | "metadata": {}, 159 | "source": "We should see that the `TotalCharges` column has missing values. There are various ways we can address this issue:\n\n- Drop records with missing values \n- Fill in the missing value with one of the following strategies: Zero, Mean of the values for the column, Random value, etc)." 160 | }, 161 | { 162 | "cell_type": "code", 163 | "execution_count": null, 164 | "metadata": {}, 165 | "outputs": [], 166 | "source": "# Handle missing values for nan_column (TotalCharges)\nfrom sklearn.impute import SimpleImputer\n\n# Find the column number for TotalCharges (starting at 0).\ntotal_charges_idx = df.columns.get_loc(\"TotalCharges\")\nimputer = SimpleImputer(missing_values=np.nan, strategy='mean')\n\ndf.iloc[:, total_charges_idx] = imputer.fit_transform(df.iloc[:, total_charges_idx].values.reshape(-1, 1))\ndf.iloc[:, total_charges_idx] = pd.Series(df.iloc[:, total_charges_idx])" 167 | }, 168 | { 169 | "cell_type": "code", 170 | "execution_count": null, 171 | "metadata": {}, 172 | "outputs": [], 173 | "source": "# Validate that we have addressed any NaN values\nprint(df.isnull().values.any())\ndf.isnull().sum()" 174 | }, 175 | { 176 | "cell_type": "markdown", 177 | "metadata": {}, 178 | "source": "\n### 2.5 Categorize Features\n\nWe will categorize some of the columns / features based on wether they are categorical values or continuous (i.e numerical) values. We will use this in later sections to build visualizations." 179 | }, 180 | { 181 | "cell_type": "code", 182 | "execution_count": null, 183 | "metadata": {}, 184 | "outputs": [], 185 | "source": "columns_idx = np.s_[0:] # Slice of first row(header) with all columns.\nfirst_record_idx = np.s_[0] # Index of first record\n\nstring_fields = [type(fld) is str for fld in df.iloc[first_record_idx, columns_idx]] # All string fields\nall_features = [x for x in df.columns if x != 'Churn']\ncategorical_columns = list(np.array(df.columns)[columns_idx][string_fields])\ncategorical_features = [x for x in categorical_columns if x != 'Churn']\ncontinuous_features = [x for x in all_features if x not in categorical_features]\n\n#print('All Features: ', all_features)\n#print('\\nCategorical Features: ', categorical_features)\n#print('\\nContinuous Features: ', continuous_features)\n#print('\\nAll Categorical Columns: ', categorical_columns)" 186 | }, 187 | { 188 | "cell_type": "markdown", 189 | "metadata": {}, 190 | "source": "### 2.6 Visualize data\n\nData visualization can be used to find patterns, detect outliers, understand distribution and more. We can use graphs such as:\n\n- Histograms, boxplots, etc: To find distribution / spread of our continuous variables.\n- Bar charts: To show frequency in categorical values.\n" 191 | }, 192 | { 193 | "cell_type": "code", 194 | "execution_count": null, 195 | "metadata": {}, 196 | "outputs": [], 197 | "source": "import seaborn as sns\nimport matplotlib.pyplot as plt\n\nfrom sklearn.preprocessing import LabelEncoder\n\n%matplotlib inline\nsns.set(style=\"darkgrid\")\nsns.set_palette(\"hls\", 3)" 198 | }, 199 | { 200 | "cell_type": "markdown", 201 | "metadata": {}, 202 | "source": "First, we get a high level view of the distribution of `Churn`. What percentage of customer in our dataset are churning vs not churning. " 203 | }, 204 | { 205 | "cell_type": "code", 206 | "execution_count": null, 207 | "metadata": {}, 208 | "outputs": [], 209 | "source": "print(df.groupby(['Churn']).size())\nchurn_plot = sns.countplot(data=df, x='Churn', order=df.Churn.value_counts().index)\nplt.ylabel('Count')\nfor p in churn_plot.patches:\n height = p.get_height()\n churn_plot.text(p.get_x()+p.get_width()/2., height + 1,'{0:.0%}'.format(height/float(len(df))),ha=\"center\") \nplt.show()" 210 | }, 211 | { 212 | "cell_type": "markdown", 213 | "metadata": {}, 214 | "source": "We can get use frequency counts charts to get an understanding of the categorical features relative to `Churn` \n\n- We can see that for the `gender` feature. We have relatively equal rates of churn by `gender`\n- We can see that for the `InternetService` feature. We have higher churn for those that have \"Fiber optic\" service versus those with \"DSL\"\n" 215 | }, 216 | { 217 | "cell_type": "code", 218 | "execution_count": null, 219 | "metadata": {}, 220 | "outputs": [], 221 | "source": "# Categorical feature count plots\nf, ((ax1, ax2, ax3), (ax4, ax5, ax6), (ax7, ax8, ax9), (ax10, ax11, ax12), (ax13, ax14, ax15)) = plt.subplots(5, 3, figsize=(20, 20))\nax = [ax1, ax2, ax3, ax4, ax5, ax6, ax7, ax8, ax9, ax10, ax11, ax12, ax13, ax14, ax15 ]\n\nfor i in range(len(categorical_features)):\n sns.countplot(x = categorical_features[i], hue=\"Churn\", data=df, ax=ax[i])" 222 | }, 223 | { 224 | "cell_type": "markdown", 225 | "metadata": {}, 226 | "source": "We can get use histrogram charts to get an understanding of the distribution of our continuous / numerical features relative to Churn.\n\n- We can see that for the `MonthlyCharges` feature, customers that churn tend to pay higher monthly fees than those that stay.\n- We can see that for the `tenure` feature, customers that churn tend to be relatively new customers." 227 | }, 228 | { 229 | "cell_type": "code", 230 | "execution_count": null, 231 | "metadata": {}, 232 | "outputs": [], 233 | "source": "# Continuous feature histograms.\nfig, ax = plt.subplots(2, 2, figsize=(28, 8))\ndf[df.Churn == 'No'][continuous_features].hist(bins=20, color=\"blue\", alpha=0.5, ax=ax)\ndf[df.Churn == 'Yes'][continuous_features].hist(bins=20, color=\"orange\", alpha=0.5, ax=ax)\n\n# Or use displots\n#sns.set_palette(\"hls\", 3)\n#f, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(25, 25))\n#ax = [ax1, ax2, ax3, ax4]\n#for i in range(len(continuous_features)):\n# sns.distplot(df[continuous_features[i]], bins=20, hist=True, ax=ax[i])" 234 | }, 235 | { 236 | "cell_type": "code", 237 | "execution_count": null, 238 | "metadata": { 239 | "scrolled": true 240 | }, 241 | "outputs": [], 242 | "source": "# Create Grid for pairwise relationships\ngr = sns.PairGrid(df, height=5, hue=\"Churn\")\ngr = gr.map_diag(plt.hist)\ngr = gr.map_offdiag(plt.scatter)\ngr = gr.add_legend()" 243 | }, 244 | { 245 | "cell_type": "code", 246 | "execution_count": null, 247 | "metadata": {}, 248 | "outputs": [], 249 | "source": "# Plot boxplots of numerical columns. More variation in the boxplot implies higher significance. \nf, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(25, 25))\nax = [ax1, ax2, ax3, ax4]\n\nfor i in range(len(continuous_features)):\n sns.boxplot(x = 'Churn', y = continuous_features[i], data=df, ax=ax[i])" 250 | }, 251 | { 252 | "cell_type": "markdown", 253 | "metadata": {}, 254 | "source": "## 3.0 Create a model\n\nNow we can create our machine learning model. You could use the insights / intuition gained from the data visualization steps above to what kind of model to create or which features to use. We will create a simple classification model." 255 | }, 256 | { 257 | "cell_type": "code", 258 | "execution_count": null, 259 | "metadata": {}, 260 | "outputs": [], 261 | "source": "from pyspark.sql import SparkSession\nimport pandas as pd\nimport json\n\nspark = SparkSession.builder.getOrCreate()\ndf_data = spark.createDataFrame(df)\ndf_data.head()" 262 | }, 263 | { 264 | "cell_type": "markdown", 265 | "metadata": {}, 266 | "source": "### 3.1 Split the data into training and test sets" 267 | }, 268 | { 269 | "cell_type": "code", 270 | "execution_count": null, 271 | "metadata": {}, 272 | "outputs": [], 273 | "source": "spark_df = df_data\n(train_data, test_data) = spark_df.randomSplit([0.8, 0.2], 24)\n\nprint(\"Number of records for training: \" + str(train_data.count()))\nprint(\"Number of records for evaluation: \" + str(test_data.count()))" 274 | }, 275 | { 276 | "cell_type": "markdown", 277 | "metadata": {}, 278 | "source": "### 3.2 Examine the Spark DataFrame Schema\nLook at the data types to determine requirements for feature engineering" 279 | }, 280 | { 281 | "cell_type": "code", 282 | "execution_count": null, 283 | "metadata": {}, 284 | "outputs": [], 285 | "source": "spark_df.printSchema()" 286 | }, 287 | { 288 | "cell_type": "markdown", 289 | "metadata": {}, 290 | "source": "### 3.3 Use StringIndexer to encode a string column of labels to a column of label indices\n\nWe are using the Pipeline package to build the development steps as pipeline. \nWe are using StringIndexer to handle categorical / string features from the dataset. StringIndexer encodes a string column of labels to a column of label indices\n\nWe then use VectorAssembler to asemble these features into a vector. Pipelines API requires that input variables are passed in a vector" 291 | }, 292 | { 293 | "cell_type": "code", 294 | "execution_count": null, 295 | "metadata": {}, 296 | "outputs": [], 297 | "source": "from pyspark.ml.classification import RandomForestClassifier\nfrom pyspark.ml.feature import StringIndexer, IndexToString, VectorAssembler\nfrom pyspark.ml.evaluation import BinaryClassificationEvaluator\nfrom pyspark.ml import Pipeline, Model\n\n\nsi_gender = StringIndexer(inputCol = 'gender', outputCol = 'gender_IX')\nsi_Partner = StringIndexer(inputCol = 'Partner', outputCol = 'Partner_IX')\nsi_Dependents = StringIndexer(inputCol = 'Dependents', outputCol = 'Dependents_IX')\nsi_PhoneService = StringIndexer(inputCol = 'PhoneService', outputCol = 'PhoneService_IX')\nsi_MultipleLines = StringIndexer(inputCol = 'MultipleLines', outputCol = 'MultipleLines_IX')\nsi_InternetService = StringIndexer(inputCol = 'InternetService', outputCol = 'InternetService_IX')\nsi_OnlineSecurity = StringIndexer(inputCol = 'OnlineSecurity', outputCol = 'OnlineSecurity_IX')\nsi_OnlineBackup = StringIndexer(inputCol = 'OnlineBackup', outputCol = 'OnlineBackup_IX')\nsi_DeviceProtection = StringIndexer(inputCol = 'DeviceProtection', outputCol = 'DeviceProtection_IX')\nsi_TechSupport = StringIndexer(inputCol = 'TechSupport', outputCol = 'TechSupport_IX')\nsi_StreamingTV = StringIndexer(inputCol = 'StreamingTV', outputCol = 'StreamingTV_IX')\nsi_StreamingMovies = StringIndexer(inputCol = 'StreamingMovies', outputCol = 'StreamingMovies_IX')\nsi_Contract = StringIndexer(inputCol = 'Contract', outputCol = 'Contract_IX')\nsi_PaperlessBilling = StringIndexer(inputCol = 'PaperlessBilling', outputCol = 'PaperlessBilling_IX')\nsi_PaymentMethod = StringIndexer(inputCol = 'PaymentMethod', outputCol = 'PaymentMethod_IX')\n" 298 | }, 299 | { 300 | "cell_type": "code", 301 | "execution_count": null, 302 | "metadata": {}, 303 | "outputs": [], 304 | "source": "si_Label = StringIndexer(inputCol=\"Churn\", outputCol=\"label\").fit(spark_df)\nlabel_converter = IndexToString(inputCol=\"prediction\", outputCol=\"predictedLabel\", labels=si_Label.labels)" 305 | }, 306 | { 307 | "cell_type": "markdown", 308 | "metadata": {}, 309 | "source": "### 3.4 Create a single vector" 310 | }, 311 | { 312 | "cell_type": "code", 313 | "execution_count": null, 314 | "metadata": {}, 315 | "outputs": [], 316 | "source": "va_features = VectorAssembler(inputCols=['gender_IX', 'SeniorCitizen', 'Partner_IX', 'Dependents_IX', 'PhoneService_IX', 'MultipleLines_IX', 'InternetService_IX', \\\n 'OnlineSecurity_IX', 'OnlineBackup_IX', 'DeviceProtection_IX', 'TechSupport_IX', 'StreamingTV_IX', 'StreamingMovies_IX', \\\n 'Contract_IX', 'PaperlessBilling_IX', 'PaymentMethod_IX', 'TotalCharges', 'MonthlyCharges'], outputCol=\"features\")" 317 | }, 318 | { 319 | "cell_type": "markdown", 320 | "metadata": {}, 321 | "source": "### 3.5 Create a pipeline, and fit a model using RandomForestClassifier \nAssemble all the stages into a pipeline. We don't expect a clean linear regression, so we'll use RandomForestClassifier to find the best decision tree for the data." 322 | }, 323 | { 324 | "cell_type": "code", 325 | "execution_count": null, 326 | "metadata": {}, 327 | "outputs": [], 328 | "source": "classifier = RandomForestClassifier(featuresCol=\"features\")\n\npipeline = Pipeline(stages=[si_gender, si_Partner, si_Dependents, si_PhoneService, si_MultipleLines, si_InternetService, si_OnlineSecurity, si_OnlineBackup, si_DeviceProtection, \\\n si_TechSupport, si_StreamingTV, si_StreamingMovies, si_Contract, si_PaperlessBilling, si_PaymentMethod, si_Label, va_features, \\\n classifier, label_converter])\n\nmodel = pipeline.fit(train_data)" 329 | }, 330 | { 331 | "cell_type": "code", 332 | "execution_count": null, 333 | "metadata": {}, 334 | "outputs": [], 335 | "source": "predictions = model.transform(test_data)\nevaluatorDT = BinaryClassificationEvaluator(rawPredictionCol=\"prediction\")\narea_under_curve = evaluatorDT.evaluate(predictions)\n\nevaluatorDT = BinaryClassificationEvaluator(rawPredictionCol=\"prediction\", metricName='areaUnderROC')\narea_under_curve = evaluatorDT.evaluate(predictions)\nevaluatorDT = BinaryClassificationEvaluator(rawPredictionCol=\"prediction\", metricName='areaUnderPR')\narea_under_PR = evaluatorDT.evaluate(predictions)\nprint(\"areaUnderROC = %g\" % area_under_curve)" 336 | }, 337 | { 338 | "cell_type": "markdown", 339 | "metadata": {}, 340 | "source": "## 4.0 Save the model and test data\n\nNow the model can be saved for future deployment. The model will be saved using the Watson Machine Learning client, to a deployment space.\n\n**<< UPDATE THE VARIABLE 'MODEL_NAME' TO A UNIQUE NAME>>**\n\n**<< UPDATE THE VARIABLE 'DEPLOYMENT_SPACE_NAME' TO THE NAME OF THE DEPLOYMENT SPACE CREATED PREVIOUSLY>>**" 341 | }, 342 | { 343 | "cell_type": "code", 344 | "execution_count": null, 345 | "metadata": {}, 346 | "outputs": [], 347 | "source": "\nMODEL_NAME = \"GAMA-PREDICT-CHURN\"\nDEPLOYMENT_SPACE_NAME = 'Big-Data'\n" 348 | }, 349 | { 350 | "cell_type": "markdown", 351 | "metadata": {}, 352 | "source": "### 4.1 Save the model to ICP4D local Watson Machine Learning\n\n1. Generate an API Key: https://cloud.ibm.com/iam/apikeys\n2. Generate a TOKEN for your Watson Machine Learning:\n curl --insecure -X POST --header \"Content-Type: application/x-www-form-urlencoded\" --header \"Accept: application/json\" --data-urlencode \"grant_type=urn:ibm:params:oauth:grant-type:apikey\" --data-urlencode \"apikey=$API_key\" \"https://iam.ng.bluemix.net/identity/token\"\n3. Replace the `token` value of `*****` with `token` generate. The value for `url` should match the `url` for your Watson Machine Learning." 353 | }, 354 | { 355 | "cell_type": "code", 356 | "execution_count": null, 357 | "metadata": {}, 358 | "outputs": [], 359 | "source": "from ibm_watson_machine_learning import APIClient\n\nwml_credentials = {\n \"url\": \"https://us-south.ml.cloud.ibm.com\",\n \"token\":\"*******\"\n}\n\nclient = APIClient(wml_credentials)" 360 | }, 361 | { 362 | "cell_type": "code", 363 | "execution_count": null, 364 | "metadata": {}, 365 | "outputs": [], 366 | "source": "# The code was removed by Watson Studio for sharing." 367 | }, 368 | { 369 | "cell_type": "code", 370 | "execution_count": null, 371 | "metadata": {}, 372 | "outputs": [], 373 | "source": "client.spaces.list()" 374 | }, 375 | { 376 | "cell_type": "markdown", 377 | "metadata": {}, 378 | "source": "### Use the desired space as the `default_space`\n\nThe deployment space ID will be looked up based on the name specified above. If you do not receive a space GUID as an output to the next cell, do not proceed until you have created a deployment space." 379 | }, 380 | { 381 | "cell_type": "code", 382 | "execution_count": null, 383 | "metadata": {}, 384 | "outputs": [], 385 | "source": "# Be sure to update the name of the space with the one you want to use.\n#client.spaces.list()\nall_spaces = client.spaces.get_details()['resources']\nspace_id = None\n#print(all_spaces)\nfor space in all_spaces:\n if space['entity']['name'] == DEPLOYMENT_SPACE_NAME:\n space_id = space[\"metadata\"][\"id\"]\n print(\"\\nDeployment Space GUID: \", space_id)\n\nif space_id is None:\n print(\"WARNING: Your space does not exist. Create a deployment space before proceeding to the next cell.\")\n #space_id = client.spaces.store(meta_props={client.spaces.ConfigurationMetaNames.NAME: space_name})[\"metadata\"][\"guid\"]" 386 | }, 387 | { 388 | "cell_type": "markdown", 389 | "metadata": {}, 390 | "source": "**<< REPLACE space_id BELOW with the id for your space. For e.g.
client.set.default_space(\"6b39c537-f707-4078-9dc7-ce70b70ab22f\") >>
**" 391 | }, 392 | { 393 | "cell_type": "code", 394 | "execution_count": null, 395 | "metadata": {}, 396 | "outputs": [], 397 | "source": "# Now set the default space to the GUID for your deployment space. If this is successful, you will see a 'SUCCESS' message.\nclient.set.default_space(space_id)" 398 | }, 399 | { 400 | "cell_type": "markdown", 401 | "metadata": {}, 402 | "source": "#### Save the Model" 403 | }, 404 | { 405 | "cell_type": "code", 406 | "execution_count": null, 407 | "metadata": {}, 408 | "outputs": [], 409 | "source": "# case you need check the services, uncomment th eline below and run it.\n#client.software_specifications.list()" 410 | }, 411 | { 412 | "cell_type": "code", 413 | "execution_count": null, 414 | "metadata": {}, 415 | "outputs": [], 416 | "source": "software_spec_id = client.software_specifications.get_id_by_name('spark-mllib_2.4')\nprint(software_spec_id)" 417 | }, 418 | { 419 | "cell_type": "code", 420 | "execution_count": null, 421 | "metadata": {}, 422 | "outputs": [], 423 | "source": "# Store our model\nmodel_props = {client.repository.ModelMetaNames.NAME: MODEL_NAME,\n client.repository.ModelMetaNames.SOFTWARE_SPEC_UID : software_spec_id,\n client.repository.ModelMetaNames.TYPE : \"mllib_2.4\"}\npublished_model = client.repository.store_model(model=model, pipeline=pipeline, meta_props=model_props, training_data=train_data)\n\nprint(json.dumps(published_model, indent=3))" 424 | }, 425 | { 426 | "cell_type": "code", 427 | "execution_count": null, 428 | "metadata": {}, 429 | "outputs": [], 430 | "source": "# Use this cell to do any cleanup of previously created models and deployments\nclient.repository.list_models()\nclient.deployments.list()\n\n# client.repository.delete('GUID of stored model')\n# client.deployments.delete('GUID of deployed model')\n" 431 | }, 432 | { 433 | "cell_type": "markdown", 434 | "metadata": {}, 435 | "source": "## 5.0 Save Test Data\n\nWe will save the test data we used to evaluate the model to our project." 436 | }, 437 | { 438 | "cell_type": "code", 439 | "execution_count": null, 440 | "metadata": {}, 441 | "outputs": [], 442 | "source": "write_score_CSV=test_data.toPandas().drop(['Churn'], axis=1)\n#write_score_CSV.to_csv('/project_data/data_asset/TelcoCustomerSparkMLBatchScore.csv', sep=',', index=False)\nproject.save_data('TelcoCustomerSparkMLBatchScore.csv', write_score_CSV.to_csv(), overwrite=True)\n\nwrite_eval_CSV=test_data.toPandas()\n#write_eval_CSV.to_csv('/project_data/data_asset/TelcoCustomerSparkMLEval.csv', sep=',', index=False)\nproject.save_data('TelcoCustomerSparkMLEval.csv', write_eval_CSV.to_csv(), overwrite=True)" 443 | }, 444 | { 445 | "cell_type": "markdown", 446 | "metadata": {}, 447 | "source": "## Congratulations, you have created a model based on customer churn data, and deployed it to Watson Machine Learning!" 448 | } 449 | ], 450 | "metadata": { 451 | "kernelspec": { 452 | "display_name": "Python 3.7", 453 | "language": "python", 454 | "name": "python3" 455 | }, 456 | "language_info": { 457 | "codemirror_mode": { 458 | "name": "ipython", 459 | "version": 3 460 | }, 461 | "file_extension": ".py", 462 | "mimetype": "text/x-python", 463 | "name": "python", 464 | "nbconvert_exporter": "python", 465 | "pygments_lexer": "ipython3", 466 | "version": "3.7.10" 467 | } 468 | }, 469 | "nbformat": 4, 470 | "nbformat_minor": 1 471 | } -------------------------------------------------------------------------------- /Linear regression.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 33, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": "#import pandas as pd \nimport numpy as np \nimport matplotlib.pyplot as plt \nimport seaborn as seabornInstance \nfrom sklearn.model_selection import train_test_split \nfrom sklearn.linear_model import LinearRegression\nfrom sklearn import metrics\n%matplotlib inline" 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 34, 13 | "metadata": {}, 14 | "outputs": [ 15 | { 16 | "data": { 17 | "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
PIBCO2
01.7552.6
11.2462.3
22.5475.4
32.8374.3
43.6748.5
\n
", 18 | "text/plain": " PIB CO2\n0 1.7 552.6\n1 1.2 462.3\n2 2.5 475.4\n3 2.8 374.3\n4 3.6 748.5" 19 | }, 20 | "execution_count": 34, 21 | "metadata": {}, 22 | "output_type": "execute_result" 23 | } 24 | ], 25 | "source": "# The code was removed by Watson Studio for sharing." 26 | }, 27 | { 28 | "cell_type": "code", 29 | "execution_count": 35, 30 | "metadata": {}, 31 | "outputs": [ 32 | { 33 | "data": { 34 | "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
PIBCO2
count10.00000010.000000
mean2.460000526.300000
std1.459224267.164415
min0.800000253.000000
25%1.550000380.950000
50%2.300000468.850000
75%2.725000538.650000
max5.9000001180.600000
\n
", 35 | "text/plain": " PIB CO2\ncount 10.000000 10.000000\nmean 2.460000 526.300000\nstd 1.459224 267.164415\nmin 0.800000 253.000000\n25% 1.550000 380.950000\n50% 2.300000 468.850000\n75% 2.725000 538.650000\nmax 5.900000 1180.600000" 36 | }, 37 | "execution_count": 35, 38 | "metadata": {}, 39 | "output_type": "execute_result" 40 | } 41 | ], 42 | "source": "df_data_1.describe()" 43 | }, 44 | { 45 | "cell_type": "code", 46 | "execution_count": 36, 47 | "metadata": {}, 48 | "outputs": [ 49 | { 50 | "data": { 51 | "image/png": "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\n", 52 | "text/plain": "
" 53 | }, 54 | "metadata": { 55 | "needs_background": "light" 56 | }, 57 | "output_type": "display_data" 58 | } 59 | ], 60 | "source": "df_data_1.plot(x='PIB', y='CO2', style='o') \nplt.title('PIB vs CO2') \nplt.xlabel('PIB') \nplt.ylabel('CO2') \nplt.show()" 61 | }, 62 | { 63 | "cell_type": "code", 64 | "execution_count": 37, 65 | "metadata": {}, 66 | "outputs": [ 67 | { 68 | "data": { 69 | "text/plain": "" 70 | }, 71 | "execution_count": 37, 72 | "metadata": {}, 73 | "output_type": "execute_result" 74 | }, 75 | { 76 | "data": { 77 | "image/png": "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\n", 78 | "text/plain": "
" 79 | }, 80 | "metadata": { 81 | "needs_background": "light" 82 | }, 83 | "output_type": "display_data" 84 | } 85 | ], 86 | "source": "plt.figure(figsize=(15,10))\nplt.tight_layout()\nseabornInstance.distplot(df_data_1['CO2'])" 87 | }, 88 | { 89 | "cell_type": "code", 90 | "execution_count": 38, 91 | "metadata": {}, 92 | "outputs": [], 93 | "source": "X = df_data_1['PIB'].values.reshape(-1,1)\ny = df_data_1['CO2'].values.reshape(-1,1)\n" 94 | }, 95 | { 96 | "cell_type": "code", 97 | "execution_count": 45, 98 | "metadata": {}, 99 | "outputs": [], 100 | "source": "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=0)" 101 | }, 102 | { 103 | "cell_type": "code", 104 | "execution_count": 46, 105 | "metadata": {}, 106 | "outputs": [ 107 | { 108 | "data": { 109 | "text/plain": "LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,\n normalize=False)" 110 | }, 111 | "execution_count": 46, 112 | "metadata": {}, 113 | "output_type": "execute_result" 114 | } 115 | ], 116 | "source": "regressor = LinearRegression() \nregressor.fit(X_train, y_train)" 117 | }, 118 | { 119 | "cell_type": "code", 120 | "execution_count": 47, 121 | "metadata": {}, 122 | "outputs": [ 123 | { 124 | "name": "stdout", 125 | "output_type": "stream", 126 | "text": "[121.79434072]\n[[167.03397889]]\n" 127 | } 128 | ], 129 | "source": "#To retrieve the intercept:\nprint(regressor.intercept_)\n#For retrieving the slope:\nprint(regressor.coef_)" 130 | }, 131 | { 132 | "cell_type": "code", 133 | "execution_count": 48, 134 | "metadata": {}, 135 | "outputs": [], 136 | "source": "y_pred = regressor.predict(X_test)" 137 | }, 138 | { 139 | "cell_type": "code", 140 | "execution_count": 49, 141 | "metadata": {}, 142 | "outputs": [ 143 | { 144 | "data": { 145 | "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ActualPredicted
0475.4539.379288
\n
", 146 | "text/plain": " Actual Predicted\n0 475.4 539.379288" 147 | }, 148 | "execution_count": 49, 149 | "metadata": {}, 150 | "output_type": "execute_result" 151 | } 152 | ], 153 | "source": "df = pd.DataFrame({'Actual': y_test.flatten(), 'Predicted': y_pred.flatten()})\ndf" 154 | }, 155 | { 156 | "cell_type": "code", 157 | "execution_count": 50, 158 | "metadata": {}, 159 | "outputs": [ 160 | { 161 | "data": { 162 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6gAAAI+CAYAAACxCSfCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAHoRJREFUeJzt3X+s3nV99/HXRwqWX7euBR3Cbtoo2s4xCjlzVHBDcSp6B/wxMg0bxRC7Rc1mvDdXTRaOCXNuEHTLNjZyQ4r3YplBUcRNq7CG3U7FU6gOqdDicO1AmAVqCVQpfO4/+oUUKO2hPYfrTc/jkTTne32uz3Vd76t/nWe+3+s6rfceAAAAGLXnjXoAAAAASAQqAAAARQhUAAAAShCoAAAAlCBQAQAAKEGgAgAAUIJABQAAoASBCgAAQAkCFQAAgBJmjXqAJDnssMP6vHnzRj0GADwrNj24KXMPmjvqMQDgWbN69eof994P392+EoE6b968TExMjHoMAHhWjK8az/gp46MeAwCeNa21H05mn0t8AQAAKEGgAgAAUIJABQAAoIQSn0EFAAAYpYcffjgbN27M1q1bRz3Kc9rs2bNz1FFHZf/999+jxwtUAABgxtu4cWMOPfTQzJs3L621UY/znNR7z6ZNm7Jx48bMnz9/j57DJb4AAMCMt3Xr1sydO1ec7oXWWubOnbtXZ6EFKgAAQCJOp8De/h8KVAAAAErwGVQAAIAnmbfsS1P6fHd8/C2T2nfVVVfl7W9/e9auXZsFCxY87b7ly5fnDW94Q17ykpfs0TyrVq3KhRdemGuuuWaPHj9dnEEFAAAoYsWKFTn55JNzxRVX7HLf8uXLc+eddz5LUz17BCoAAEABDzzwQL7+9a/n0ksvfUKg/sVf/EWOPfbYHHfccVm2bFmuvPLKTExM5KyzzsqiRYvy0EMPZd68efnxj3+cJJmYmMgpp5ySJLnhhhvy6le/Oscff3xe/epX59Zbbx3FW5s0l/gCAAAU8PnPfz5vetOb8vKXvzxz5szJjTfemLvvvjuf//zn861vfSsHHXRQ7r333syZMyd//dd/nQsvvDBjY2O7fM4FCxbk+uuvz6xZs/K1r30tH/nIR/LZz372WXpHz5xABQAAKGDFihX5wAc+kCR55zvfmRUrVuTRRx/Nu9/97hx00EFJkjlz5jyj59y8eXOWLFmSdevWpbWWhx9+eMrnnkoCFQAAYMQ2bdqU6667LjfffHNaa3nkkUfSWss73vGOSf3pllmzZuXRRx9Nkif8HdI/+ZM/yWtf+9pcddVVueOOOx6/9Lcqn0EFAAAYsSuvvDJnn312fvjDH+aOO+7Ihg0bMn/+/MyZMyeXXXZZHnzwwSTJvffemyQ59NBDs2XLlscfP2/evKxevTpJnnAJ7+bNm3PkkUcm2f7FStU5gwoAAPAkk/2zMFNlxYoVWbZs2RPW3vGOd2Tt2rU5/fTTMzY2lgMOOCBvfvOb87GPfSznnHNOfu/3fi8HHnhgvvGNb+S8887Lueeem4997GP51V/91cef40Mf+lCWLFmSiy66KK973eue1fe0J1rvfdQzZGxsrE9MTIx6DAB4VoyvGs/4KeOjHgOAHaxduzYLFy4c9Rj7hJ39X7bWVvfed/2NTnGJLwAAAEUIVAAAAEoQqAAAAJQgUAEAAChBoAIAAFCCQAUAAKAEfwcVAADgycZfMMXPt3mXd++333459thjs23btixcuDCXX355DjrooD16qVWrVuXCCy/MNddck6uvvjq33HLLU/7G6mPuv//+fPrTn8573/veZ/Qa4+PjOeSQQ/KHf/iHezTj0xGoAPBsW/VnyapPjHoKmJl2EwkwKgceeGDWrFmTJDnrrLPyd3/3d/ngBz/4+P299/Te87znPbOLYE8//fScfvrpT3v//fffn7/92799xoE6XVziCwAAUMhrXvOarF+/PnfccUcWLlyY9773vTnhhBOyYcOGrFy5MosXL84JJ5yQM888Mw888ECS5Mtf/nIWLFiQk08+OZ/73Ocef67ly5fn/e9/f5Lk7rvvztve9rYcd9xxOe644/Jv//ZvWbZsWW6//fYsWrQof/RHf5QkueCCC/Irv/Ir+eVf/uWcd955jz/Xn/7pn+YVr3hFXv/61+fWW2+dlvcuUAEAAIrYtm1b/vmf/znHHntskuTWW2/N2WefnZtuuikHH3xwzj///Hzta1/LjTfemLGxsVx00UXZunVr3vOe9+SLX/xi/vVf/zU/+tGPdvrcv//7v59f//Vfz3e+853ceOONeeUrX5mPf/zjeelLX5o1a9bkggsuyMqVK7Nu3brccMMNWbNmTVavXp3rr78+q1evzhVXXJGbbropn/vc5/Ltb397Wt6/S3wBAABG7KGHHsqiRYuSbD+Deu655+bOO+/M0UcfnRNPPDFJ8s1vfjO33HJLTjrppCTJz372syxevDjf//73M3/+/BxzzDFJkt/+7d/OJZdc8pTXuO666/KpT30qyfbPvL7gBS/Ifffd94Q9K1euzMqVK3P88ccnSR544IGsW7cuW7Zsydve9rbHPxe7q8uG94ZABQAAGLEdP4O6o4MPPvjx4957fuM3fiMrVqx4wp41a9aktTYlc/Te8+EPfzi/+7u/+4T1T37yk1P2GrviEl8AAIDngBNPPDFf//rXs379+iTJgw8+mNtuuy0LFizIf/zHf+T2229PkqcE7GNOPfXUXHzxxUmSRx55JD/5yU9y6KGHZsuWLY/veeMb35jLLrvs8c+2/td//Vfuueee/Nqv/VquuuqqPPTQQ9myZUu++MUvTst7dAYVAADgyQp+4/Phhx+e5cuX513veld++tOfJknOP//8vPzlL88ll1ySt7zlLTnssMNy8skn5+abb37K4//yL/8yS5cuzaWXXpr99tsvF198cRYvXpyTTjopv/RLv5TTTjstF1xwQdauXZvFixcnSQ455JD8wz/8Q0444YT81m/9VhYtWpSjjz46r3nNa6blPbbe+7Q88TMxNjbWJyYmRj0GADwrxsefn/HMHvUYMDMVjA5qWLt2bRYuXDjqMfYJO/u/bK2t7r2P7e6xLvEFAACgBIEKAABACQIVAAAg27/Blr2zt/+HAhUAAJjxZs+enU2bNonUvdB7z6ZNmzJ79p5/z4Jv8QUAAGa8o446Khs3bsx///d/j3qU57TZs2fnqKOO2uPHC1QAAGDG23///TN//vxRjzHjucQXAACAEgQqAAAAJQhUAAAAShCoAAAAlCBQAQAAKEGgAgAAUIJABQAAoASBCgAAQAkCFQAAgBIEKgAAACUIVAAAAEoQqAAAAJQgUAEAAChBoAIAAFCCQAUAAKAEgQoAAEAJAhUAAIASBCoAAAAlCFQAAABKEKgAAACUMKlAba3d0Vr799bamtbaxLA2p7X21dbauuHnzw3rrbX2V6219a2177bWTpjONwAAAMC+4ZmcQX1t731R731suL0sybW992OSXDvcTpLTkhwz/Fua5OKpGhYAAIB9195c4ntGksuH48uTvHWH9U/17b6Z5IWttSP24nUAAACYASYbqD3Jytba6tba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\n", 163 | "text/plain": "
" 164 | }, 165 | "metadata": { 166 | "needs_background": "light" 167 | }, 168 | "output_type": "display_data" 169 | } 170 | ], 171 | "source": "df1 = df.head(25)\ndf1.plot(kind='bar',figsize=(16,10))\nplt.grid(which='major', linestyle='-', linewidth='0.5', color='green')\nplt.grid(which='minor', linestyle=':', linewidth='0.5', color='black')\nplt.show()" 172 | }, 173 | { 174 | "cell_type": "code", 175 | "execution_count": null, 176 | "metadata": {}, 177 | "outputs": [], 178 | "source": "plt.scatter(X_test, y_test, color='gray')\nplt.plot(X_test, y_pred, color='red', linewidth=2)\nplt.show()" 179 | }, 180 | { 181 | "cell_type": "code", 182 | "execution_count": null, 183 | "metadata": {}, 184 | "outputs": [], 185 | "source": "print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred)) \nprint('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred)) \nprint('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))" 186 | }, 187 | { 188 | "cell_type": "code", 189 | "execution_count": null, 190 | "metadata": {}, 191 | "outputs": [], 192 | "source": "" 193 | } 194 | ], 195 | "metadata": { 196 | "kernelspec": { 197 | "display_name": "Python 3.6", 198 | "language": "python", 199 | "name": "python3" 200 | }, 201 | "language_info": { 202 | "codemirror_mode": { 203 | "name": "ipython", 204 | "version": 3 205 | }, 206 | "file_extension": ".py", 207 | "mimetype": "text/x-python", 208 | "name": "python", 209 | "nbconvert_exporter": "python", 210 | "pygments_lexer": "ipython3", 211 | "version": "3.6.9" 212 | } 213 | }, 214 | "nbformat": 4, 215 | "nbformat_minor": 1 216 | } --------------------------------------------------------------------------------