-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathML-students-spark-python.html
More file actions
42 lines (40 loc) · 255 KB
/
ML-students-spark-python.html
File metadata and controls
42 lines (40 loc) · 255 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<!DOCTYPE html>
<html>
<head>
<meta name="databricks-html-version" content="1">
<title>ML Students PySpark - Databricks</title>
<meta charset="utf-8">
<meta name="google" content="notranslate">
<meta name="robots" content="nofollow">
<meta http-equiv="Content-Language" content="en">
<meta http-equiv="Content-Type" content="text/html; charset=UTF8">
<link rel="stylesheet" type="text/css" href="https://databricks-prod-cloudfront.cloud.databricks.com/static/7f9cefa92f0da43a505f7213ef5a6bb5d4a409ec4e0540a0a55701946063455d/css/main.css">
<link rel="stylesheet" href="https://databricks-prod-cloudfront.cloud.databricks.com/static/7f9cefa92f0da43a505f7213ef5a6bb5d4a409ec4e0540a0a55701946063455d/css/print.css" media="print">
<link rel="icon" type="image/png" href="https://databricks-prod-cloudfront.cloud.databricks.com/static/7f9cefa92f0da43a505f7213ef5a6bb5d4a409ec4e0540a0a55701946063455d/img/favicon.ico"/>
<script>window.settings = {"enableUsageDeliveryConfiguration":false,"enableNotebookNotifications":true,"enableSshKeyUI":false,"defaultInteractivePricePerDBU":0.4,"enableClusterMetricsUI":true,"enableOnDemandClusterType":true,"enableAutoCompleteAsYouType":[],"devTierName":"Community Edition","enableJobsPrefetching":true,"workspaceFeaturedLinks":[{"linkURI":"https://docs.databricks.com/index.html","displayName":"Documentation","icon":"question"},{"linkURI":"https://docs.databricks.com/release-notes/product/index.html","displayName":"Release Notes","icon":"code"},{"linkURI":"https://docs.databricks.com/spark/latest/training/index.html","displayName":"Training & Tutorials","icon":"graduation-cap"}],"enableReservoirTableUI":false,"enableClearStateFeature":true,"dbcForumURL":"http://forums.databricks.com/","enableProtoClusterInfoDeltaPublisher":true,"enableAttachExistingCluster":true,"resetJobListOnConnect":true,"serverlessDefaultSparkVersion":"latest-stable-scala2.11","maxCustomTags":45,"serverlessDefaultMaxWorkers":20,"enableInstanceProfilesUIInJobs":true,"nodeInfo":{"node_types":[{"support_ssh":false,"spark_heap_memory":4800,"instance_type_id":"r3.2xlarge","spark_core_oversubscription_factor":8.0,"node_type_id":"dev-tier-node","description":"Community Optimized","support_cluster_tags":false,"container_memory_mb":6000,"node_instance_type":{"instance_type_id":"r3.2xlarge","provider":"AWS","local_disk_size_gb":160,"compute_units":26.0,"number_of_ips":14,"local_disks":1,"reserved_compute_units":3.64,"gpus":0,"memory_mb":62464,"num_cores":8,"local_disk_type":"AHCI","max_attachable_disks":0,"supported_disk_types":[{"ebs_volume_type":"GENERAL_PURPOSE_SSD"},{"ebs_volume_type":"THROUGHPUT_OPTIMIZED_HDD"}],"reserved_memory_mb":4800},"memory_mb":6144,"is_hidden":false,"category":"Community Edition","num_cores":0.88,"support_port_forwarding":false,"support_ebs_volumes":false,"is_deprecated":false}],"default_node_type_id":"dev-tier-node"},"sqlAclsDisabledMap":{"spark.databricks.acl.enabled":"false","spark.databricks.acl.sqlOnly":"false"},"enableDatabaseSupportClusterChoice":true,"enableClusterAcls":true,"notebookRevisionVisibilityHorizon":999999,"serverlessClusterProductName":"Serverless Pool","showS3TableImportOption":true,"maxEbsVolumesPerInstance":10,"enableRStudioUI":false,"isAdmin":true,"deltaProcessingBatchSize":1000,"timerUpdateQueueLength":100,"sqlAclsEnabledMap":{"spark.databricks.acl.enabled":"true","spark.databricks.acl.sqlOnly":"true"},"enableLargeResultDownload":true,"maxElasticDiskCapacityGB":5000,"serverlessDefaultMinWorkers":2,"zoneInfos":[{"id":"us-west-2c","isDefault":true},{"id":"us-west-2b","isDefault":false},{"id":"us-west-2a","isDefault":false}],"enableCustomSpotPricingUIByTier":false,"serverlessClustersEnabled":false,"enableWorkspaceBrowserSorting":true,"enableSentryLogging":false,"enableFindAndReplace":true,"disallowUrlImportExceptFromDocs":false,"defaultStandardClusterModel":{"cluster_name":"","node_type_id":"dev-tier-node","spark_version":"3.5.x-scala2.11","num_workers":0,"aws_attributes":{"first_on_demand":0,"availability":"ON_DEMAND","zone_id":"us-west-2c","spot_bid_price_percent":100},"autotermination_minutes":120,"default_tags":{"Vendor":"Databricks","Creator":"[email protected]","ClusterName":null,"ClusterId":"<Generated after creation>"}},"enableEBSVolumesUIForJobs":true,"enablePublishNotebooks":true,"enableBitbucketCloud":true,"createTableInNotebookS3Link":{"url":"https://docs.databricks.com/_static/notebooks/data-import/s3.html","displayName":"S3","workspaceFileName":"S3 Example"},"sanitizeHtmlResult":true,"enableJobAclsConfig":false,"enableFullTextSearch":false,"enableElasticSparkUI":false,"enableNewClustersCreate":true,"clusters":true,"allowRunOnPendingClusters":true,"useAutoscalingByDefault":false,"enableAzureToolbar":false,"fileStoreBase":"FileStore","enableEmailInAzure":false,"enableRLibraries":true,"enableTableAclsConfig":false,"enableSshKeyUIInJobs":true,"enableDetachAndAttachSubMenu":true,"configurableSparkOptionsSpec":[{"keyPattern":"spark\\.kryo(\\.[^\\.]+)+","valuePattern":".*","keyPatternDisplay":"spark.kryo.*","valuePatternDisplay":"*","description":"Configuration options for Kryo serialization"},{"keyPattern":"spark\\.io\\.compression\\.codec","valuePattern":"(lzf|snappy|org\\.apache\\.spark\\.io\\.LZFCompressionCodec|org\\.apache\\.spark\\.io\\.SnappyCompressionCodec)","keyPatternDisplay":"spark.io.compression.codec","valuePatternDisplay":"snappy|lzf","description":"The codec used to compress internal data such as RDD partitions, broadcast variables and shuffle outputs."},{"keyPattern":"spark\\.serializer","valuePattern":"(org\\.apache\\.spark\\.serializer\\.JavaSerializer|org\\.apache\\.spark\\.serializer\\.KryoSerializer)","keyPatternDisplay":"spark.serializer","valuePatternDisplay":"org.apache.spark.serializer.JavaSerializer|org.apache.spark.serializer.KryoSerializer","description":"Class to use for serializing objects that will be sent over the network or need to be cached in serialized form."},{"keyPattern":"spark\\.rdd\\.compress","valuePattern":"(true|false)","keyPatternDisplay":"spark.rdd.compress","valuePatternDisplay":"true|false","description":"Whether to compress serialized RDD partitions (e.g. for StorageLevel.MEMORY_ONLY_SER). Can save substantial space at the cost of some extra CPU time."},{"keyPattern":"spark\\.speculation","valuePattern":"(true|false)","keyPatternDisplay":"spark.speculation","valuePatternDisplay":"true|false","description":"Whether to use speculation (recommended off for streaming)"},{"keyPattern":"spark\\.es(\\.[^\\.]+)+","valuePattern":".*","keyPatternDisplay":"spark.es.*","valuePatternDisplay":"*","description":"Configuration options for ElasticSearch"},{"keyPattern":"es(\\.([^\\.]+))+","valuePattern":".*","keyPatternDisplay":"es.*","valuePatternDisplay":"*","description":"Configuration options for ElasticSearch"},{"keyPattern":"spark\\.(storage|shuffle)\\.memoryFraction","valuePattern":"0?\\.0*([1-9])([0-9])*","keyPatternDisplay":"spark.(storage|shuffle).memoryFraction","valuePatternDisplay":"(0.0,1.0)","description":"Fraction of Java heap to use for Spark's shuffle or storage"},{"keyPattern":"spark\\.streaming\\.backpressure\\.enabled","valuePattern":"(true|false)","keyPatternDisplay":"spark.streaming.backpressure.enabled","valuePatternDisplay":"true|false","description":"Enables or disables Spark Streaming's internal backpressure mechanism (since 1.5). This enables the Spark Streaming to control the receiving rate based on the current batch scheduling delays and processing times so that the system receives only as fast as the system can process. Internally, this dynamically sets the maximum receiving rate of receivers. This rate is upper bounded by the values `spark.streaming.receiver.maxRate` and `spark.streaming.kafka.maxRatePerPartition` if they are set."},{"keyPattern":"spark\\.streaming\\.receiver\\.maxRate","valuePattern":"^([0-9]{1,})$","keyPatternDisplay":"spark.streaming.receiver.maxRate","valuePatternDisplay":"numeric","description":"Maximum rate (number of records per second) at which each receiver will receive data. Effectively, each stream will consume at most this number of records per second. Setting this configuration to 0 or a negative number will put no limit on the rate. See the deployment guide in the Spark Streaming programing guide for mode details."},{"keyPattern":"spark\\.streaming\\.kafka\\.maxRatePerPartition","valuePattern":"^([0-9]{1,})$","keyPatternDisplay":"spark.streaming.kafka.maxRatePerPartition","valuePatternDisplay":"numeric","description":"Maximum rate (number of records per second) at which data will be read from each Kafka partition when using the Kafka direct stream API introduced in Spark 1.3. See the Kafka Integration guide for more details."},{"keyPattern":"spark\\.streaming\\.kafka\\.maxRetries","valuePattern":"^([0-9]{1,})$","keyPatternDisplay":"spark.streaming.kafka.maxRetries","valuePatternDisplay":"numeric","description":"Maximum number of consecutive retries the driver will make in order to find the latest offsets on the leader of each partition (a default value of 1 means that the driver will make a maximum of 2 attempts). Only applies to the Kafka direct stream API introduced in Spark 1.3."},{"keyPattern":"spark\\.streaming\\.ui\\.retainedBatches","valuePattern":"^([0-9]{1,})$","keyPatternDisplay":"spark.streaming.ui.retainedBatches","valuePatternDisplay":"numeric","description":"How many batches the Spark Streaming UI and status APIs remember before garbage collecting."}],"enableReactNotebookComments":true,"enableAdminPasswordReset":false,"checkBeforeAddingAadUser":false,"enableResetPassword":true,"maxClusterTagValueLength":255,"enableJobsSparkUpgrade":true,"createTableInNotebookDBFSLink":{"url":"https://docs.databricks.com/_static/notebooks/data-import/dbfs.html","displayName":"DBFS","workspaceFileName":"DBFS Example"},"perClusterAutoterminationEnabled":false,"enableNotebookCommandNumbers":true,"allowStyleInSanitizedHtml":true,"sparkVersions":[{"key":"1.6.3-db2-hadoop2-scala2.10","displayName":"Spark 1.6.3-db2 (Hadoop 2, Scala 2.10)","packageLabel":"spark-image-aba860a0ffce4f3471fb14aefdcb1d768ac66a53a5ad884c48745ef98aeb9d67","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":[]},{"key":"3.3.x-gpu-scala2.11","displayName":"3.3 (includes Apache Spark 2.2.0, GPU, Scala 2.11)","packageLabel":"spark-image-86b4917bb6586289ca64e65f64fd23678c297274be6cd6aa6aa01d7b91fed29c","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":[]},{"key":"2.1.1-db5-scala2.11","displayName":"Spark 2.1.1-db5 (Scala 2.11)","packageLabel":"spark-image-08d9fc1551087e0876236f19640c4a83116b1649f15137427d21c9056656e80e","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION"]},{"key":"1.6.x-ubuntu15.10","displayName":"Spark 1.6.x (Hadoop 1)","packageLabel":"spark-image-8cea23fb9094e174bf5815d79009f4a8e383eb86cf2909cf6c6434ed8da2a16a","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":[]},{"key":"3.3.x-scala2.10","displayName":"3.3 (includes Apache Spark 2.2.0, Scala 2.10)","packageLabel":"spark-image-d7df74e188103a4093ff4467dbf0d32886366c984097f6997e0cd87d0f6b2fa5","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":[]},{"key":"1.4.x-ubuntu15.10","displayName":"Spark 1.4.1 (Hadoop 1, deprecated)","packageLabel":"spark-image-f710650fb8aaade8e4e812368ea87c45cd8cd0b5e6894ca6c94f3354e8daa6dc","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":[]},{"key":"2.2.x-scala2.11","displayName":"3.0 (includes Apache Spark 2.2.0, Scala 2.11)","packageLabel":"spark-image-67ab3a06d1e83d5b60df7063245eb419a2e9fe329aeeb7e7d9713332c669bb17","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION"]},{"key":"2.1.1-db6-scala2.10","displayName":"Spark 2.1.1-db6 (Scala 2.10)","packageLabel":"spark-image-177f3f02a6a3432d30068332dc857b9161345bdd2ee8a2d2de05bb05cb4b0f4c","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION"]},{"key":"2.1.0-db2-scala2.11","displayName":"Spark 2.1.0-db2 (Scala 2.11)","packageLabel":"spark-image-267c4490a3ab8a39acdbbd9f1d36f6decdecebf013e30dd677faff50f1d9cf8b","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":[]},{"key":"4.0.x-scala2.11","displayName":"4.0 (includes Apache Spark 2.3.0, Scala 2.11)","packageLabel":"spark-image-04bb47b0bae8165f760972376ce05083bc6102645f3f3851cd1cdf9cba13d6fe","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION","SUPPORTS_TABLE_ACLS"]},{"key":"2.1.x-gpu-scala2.11","displayName":"Spark 2.1 (Auto-updating, GPU, Scala 2.11 experimental)","packageLabel":"spark-image-d613235f93e0f29838beb2079a958c02a192ed67a502192bc67a8a5f2fb37f35","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":[]},{"key":"2.0.0-ubuntu15.10-scala2.10","displayName":"Spark 2.0.0 (Scala 2.10)","packageLabel":"spark-image-073c1b52ace74f251fae2680624a0d8d184a8b57096d1c21c5ce56c29be6a37a","upgradable":true,"deprecated":true,"customerVisible":false,"capabilities":[]},{"key":"4.0.x-rc-scala2.11","displayName":"4.0.1 RC (Scala 2.11)","packageLabel":"spark-image-f2619f10d1b26a93cf69eb4f718dee76a4e7660ee5d6053ea0ec6864208cb796","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION","SUPPORTS_TABLE_ACLS"]},{"key":"latest-stable-gpu-scala2.11","displayName":"Latest stable (GPU, Scala 2.11)","packageLabel":"spark-image-71e2fd18fdbbb732d6adec03e171846687b6ec85a572e5931e8a9ed9b62e7c32","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":[]},{"key":"3.4.x-scala2.11","displayName":"3.4 (includes Apache Spark 2.2.0, Scala 2.11)","packageLabel":"spark-image-a5615cb1adf0d2305f2b93188c6720174ec3e782d100fcbfa96ff870392861df","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION"]},{"key":"2.0.2-db3-scala2.10","displayName":"Spark 2.0.2-db3 (Scala 2.10)","packageLabel":"spark-image-584091dedb690de20e8cf22d9e02fdcce1281edda99eedb441a418d50e28088f","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":[]},{"key":"3.2.x-scala2.10","displayName":"3.2 (includes Apache Spark 2.2.0, Scala 2.10)","packageLabel":"spark-image-557788bea0eea16bbf7a8ba13ace07e64dd7fc86270bd5cea086097fe886431f","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":[]},{"key":"latest-experimental-scala2.10","displayName":"Latest experimental (Scala 2.10)","packageLabel":"spark-image-ec81b6840af02ee2321dd8dfe2587437bbcddf024d4ae287f326a98fac406a6c","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION"]},{"key":"4.0.x-gpu-scala2.11","displayName":"4.0 (includes Apache Spark 2.3.0, GPU, Scala 2.11)","packageLabel":"spark-image-41e21a0db3b77bc857f10358917ccbf5fbd85290e8429c2176a5fc7a29ce4f18","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":[]},{"key":"2.1.0-db1-scala2.11","displayName":"Spark 2.1.0-db1 (Scala 2.11)","packageLabel":"spark-image-e8ad5b72cf0f899dcf2b4720c1f572ab0e87a311d6113b943b4e1d4a7edb77eb","upgradable":true,"deprecated":true,"customerVisible":false,"capabilities":[]},{"key":"2.1.1-db4-scala2.11","displayName":"Spark 2.1.1-db4 (Scala 2.11)","packageLabel":"spark-image-52bca0ca866e3f4243d3820a783abf3b9b3b553edf234abef14b892657ceaca9","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION"]},{"key":"latest-rc-scala2.11","displayName":"Latest RC (4.1 snapshot, Scala 2.11)","packageLabel":"spark-image-e9ad35969427c8292fe357d5150789d8869671121e1b431f950cc56120db2e26","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION","SUPPORTS_TABLE_ACLS"]},{"key":"latest-stable-scala2.11","displayName":"Latest stable (Scala 2.11)","packageLabel":"spark-image-3961e9af697e7e97441ff848e1cc7f314c9fe21660cd2169b469dd1bbe3460f0","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION","SUPPORTS_TABLE_ACLS"]},{"key":"2.1.0-db2-scala2.10","displayName":"Spark 2.1.0-db2 (Scala 2.10)","packageLabel":"spark-image-a2ca4f6b58c95f78dca91b1340305ab3fe32673bd894da2fa8e1dc8a9f8d0478","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":[]},{"key":"1.6.x-ubuntu15.10-hadoop1","displayName":"Spark 1.6.x (Hadoop 1)","packageLabel":"spark-image-8cea23fb9094e174bf5815d79009f4a8e383eb86cf2909cf6c6434ed8da2a16a","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":[]},{"key":"2.0.2-db4-scala2.11","displayName":"Spark 2.0.2-db4 (Scala 2.11)","packageLabel":"spark-image-7dbc7583e8271765b8a1508cb9e832768e35489bbde2c4c790bc6766aee2fd7f","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":[]},{"key":"1.6.1-ubuntu15.10-hadoop1","displayName":"Spark 1.6.1 (Hadoop 1)","packageLabel":"spark-image-21d1cac181b7b8856dd1b4214a3a734f95b5289089349db9d9c926cb87d843db","upgradable":true,"deprecated":true,"customerVisible":false,"capabilities":[]},{"key":"2.0.x-gpu-scala2.11","displayName":"Spark 2.0 (Auto-updating, GPU, Scala 2.11 experimental)","packageLabel":"spark-image-968b89f1d0ec32e1ee4dacd04838cae25ef44370a441224177a37980d539d83a","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":[]},{"key":"1.6.2-ubuntu15.10-hadoop1","displayName":"Spark 1.6.2 (Hadoop 1)","packageLabel":"spark-image-8cea23fb9094e174bf5815d79009f4a8e383eb86cf2909cf6c6434ed8da2a16a","upgradable":true,"deprecated":true,"customerVisible":false,"capabilities":[]},{"key":"next-major-version-scala2.11","displayName":"Next major version (4.0 snapshot, Scala 2.11)","packageLabel":"spark-image-04bb47b0bae8165f760972376ce05083bc6102645f3f3851cd1cdf9cba13d6fe","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION","SUPPORTS_TABLE_ACLS"]},{"key":"1.6.3-db1-hadoop2-scala2.10","displayName":"Spark 1.6.3-db1 (Hadoop 2, Scala 2.10)","packageLabel":"spark-image-eaa8d9b990015a14e032fb2e2e15be0b8d5af9627cd01d855df728b67969d5d9","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":[]},{"key":"1.6.3-db2-hadoop1-scala2.10","displayName":"Spark 1.6.3-db2 (Hadoop 1, Scala 2.10)","packageLabel":"spark-image-14112ea0645bea94333a571a150819ce85573cf5541167d905b7e6588645cf3b","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":[]},{"key":"4.0.x-rc-gpu-scala2.11","displayName":"4.0.1 RC (GPU, Scala 2.11)","packageLabel":"spark-image-faddf14d5692d710f8abb5bdd175bcf18807d23f81485a28b704a938ce5de72b","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":[]},{"key":"3.5.x-scala2.10","displayName":"3.5 LTS (includes Apache Spark 2.2.1, Scala 2.10)","packageLabel":"spark-image-cb1b0de48b4337b75cd84f4827454e6f226f78b43fd3c31720fbfe25269244e5","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION","SUPPORTS_TABLE_ACLS"]},{"key":"1.6.2-ubuntu15.10-hadoop2","displayName":"Spark 1.6.2 (Hadoop 2)","packageLabel":"spark-image-161245e66d887cd775e23286a54bab0b146143e1289f25bd1732beac454a1561","upgradable":true,"deprecated":true,"customerVisible":false,"capabilities":[]},{"key":"1.6.1-ubuntu15.10-hadoop2","displayName":"Spark 1.6.1 (Hadoop 2)","packageLabel":"spark-image-4cafdf8bc6cba8edad12f441e3b3f0a8ea27da35c896bc8290e16b41fd15496a","upgradable":true,"deprecated":true,"customerVisible":false,"capabilities":[]},{"key":"2.0.2-db2-scala2.10","displayName":"Spark 2.0.2-db2 (Scala 2.10)","packageLabel":"spark-image-36d48f22cca7a907538e07df71847dd22aaf84a852c2eeea2dcefe24c681602f","upgradable":true,"deprecated":true,"customerVisible":false,"capabilities":[]},{"key":"2.0.x-ubuntu15.10-scala2.11","displayName":"Spark 2.0 (Ubuntu 15.10, Scala 2.11, deprecated)","packageLabel":"spark-image-8e1c50d626a52eac5a6c8129e09ae206ba9890f4523775f77af4ad6d99a64c44","upgradable":true,"deprecated":true,"customerVisible":false,"capabilities":[]},{"key":"2.0.x-scala2.10","displayName":"Spark 2.0 (Auto-updating, Scala 2.10)","packageLabel":"spark-image-859e88079f97f58d50e25163b39a1943d1eeac0b6939c5a65faba986477e311a","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":[]},{"key":"2.1.1-db4-scala2.10","displayName":"Spark 2.1.1-db4 (Scala 2.10)","packageLabel":"spark-image-c7c0224de396cd1563addc1ae4bca6ba823780b6babe6c3729ddf73008f29ba4","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION"]},{"key":"latest-rc-scala2.10","displayName":"Latest RC (Scala 2.10)","packageLabel":"spark-image-ec81b6840af02ee2321dd8dfe2587437bbcddf024d4ae287f326a98fac406a6c","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION"]},{"key":"latest-stable-scala2.10","displayName":"Latest stable (Scala 2.10)","packageLabel":"spark-image-cb1b0de48b4337b75cd84f4827454e6f226f78b43fd3c31720fbfe25269244e5","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION","SUPPORTS_TABLE_ACLS"]},{"key":"2.0.2-db1-scala2.11","displayName":"Spark 2.0.2-db1 (Scala 2.11)","packageLabel":"spark-image-c2d623f03dd44097493c01aa54a941fc31978ebe6d759b36c75b716b2ff6ab9c","upgradable":true,"deprecated":true,"customerVisible":false,"capabilities":[]},{"key":"2.0.2-db4-scala2.10","displayName":"Spark 2.0.2-db4 (Scala 2.10)","packageLabel":"spark-image-859e88079f97f58d50e25163b39a1943d1eeac0b6939c5a65faba986477e311a","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":[]},{"key":"2.1.1-db5-scala2.10","displayName":"Spark 2.1.1-db5 (Scala 2.10)","packageLabel":"spark-image-74133df2c13950431298d1cab3e865c191d83ac33648a8590495c52fc644c654","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION"]},{"key":"3.4.x-gpu-scala2.11","displayName":"3.4 (includes Apache Spark 2.2.0, GPU, Scala 2.11)","packageLabel":"spark-image-613a129fcaa93423a4de06407c9f93e341ed5c6b02d69179d2703c8bb47e2b99","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":[]},{"key":"1.5.x-ubuntu15.10","displayName":"Spark 1.5.2 (Hadoop 1, deprecated)","packageLabel":"spark-image-c9d2a8abf41f157a4acc6d52bc721090346f6fea2de356f3a66e388f54481698","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":[]},{"key":"latest-experimental-gpu-scala2.11","displayName":"Latest experimental (4.1 snapshot, GPU, Scala 2.11)","packageLabel":"spark-image-d18102578b55f83b03eec528cc3aa7cc75eb90279fee1f3cd7bb0ca1f5c68d07","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":[]},{"key":"2.2.x-scala2.10","displayName":"3.0 (includes Apache Spark 2.2.0, Scala 2.10)","packageLabel":"spark-image-d549f2d4a523994ecdf37e531b51d5ec7d8be51534bb0ca5322eaad28ba8f557","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION"]},{"key":"3.0.x-scala2.11","displayName":"3.0 (includes Apache Spark 2.2.0, Scala 2.11)","packageLabel":"spark-image-67ab3a06d1e83d5b60df7063245eb419a2e9fe329aeeb7e7d9713332c669bb17","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION"]},{"key":"2.0.x-scala2.11","displayName":"Spark 2.0 (Auto-updating, Scala 2.11)","packageLabel":"spark-image-7dbc7583e8271765b8a1508cb9e832768e35489bbde2c4c790bc6766aee2fd7f","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":[]},{"key":"2.1.x-scala2.10","displayName":"Spark 2.1 (Auto-updating, Scala 2.10)","packageLabel":"spark-image-177f3f02a6a3432d30068332dc857b9161345bdd2ee8a2d2de05bb05cb4b0f4c","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION"]},{"key":"3.1.x-scala2.11","displayName":"3.1 (includes Apache Spark 2.2.0, Scala 2.11)","packageLabel":"spark-image-241fa8b78ee6343242b1756b18076270894385ff40a81172a6fb5eadf66155d3","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":[]},{"key":"2.1.0-db3-scala2.10","displayName":"Spark 2.1.0-db3 (Scala 2.10)","packageLabel":"spark-image-25a17d070af155f10c4232dcc6248e36a2eb48c24f8d4fc00f34041b86bd1626","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION"]},{"key":"2.0.2-db2-scala2.11","displayName":"Spark 2.0.2-db2 (Scala 2.11)","packageLabel":"spark-image-4fa852ba378e97815083b96c9cada7b962a513ec23554a5fc849f7f1dd8c065a","upgradable":true,"deprecated":true,"customerVisible":false,"capabilities":[]},{"key":"3.1.x-scala2.10","displayName":"3.1 (includes Apache Spark 2.2.0, Scala 2.10)","packageLabel":"spark-image-7efac6b9a8f2da59cb4f6d0caac46cfcb3f1ebf64c8073498c42d0360f846714","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":[]},{"key":"3.3.x-scala2.11","displayName":"3.3 (includes Apache Spark 2.2.0, Scala 2.11)","packageLabel":"spark-image-0badc3d8dfc8cddd55795d02c0b31c76330cfe687d588414f91278197fbc9416","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":[]},{"key":"next-major-version-gpu-scala2.11","displayName":"Next major version (4.0 snapshot, GPU, Scala 2.11)","packageLabel":"spark-image-41e21a0db3b77bc857f10358917ccbf5fbd85290e8429c2176a5fc7a29ce4f18","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":[]},{"key":"3.5.x-gpu-scala2.11","displayName":"3.5 LTS (includes Apache Spark 2.2.1, GPU, Scala 2.11)","packageLabel":"spark-image-877b9d158b8820a94d954b4f280eb2200b22218dc153731d1e1765abc6dfaafd","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":[]},{"key":"1.3.x-ubuntu15.10","displayName":"Spark 1.3.0 (Hadoop 1, deprecated)","packageLabel":"spark-image-40d2842670bc3dc178b14042501847d76171437ccf70613fa397a7a24c48b912","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":[]},{"key":"2.0.1-db1-scala2.11","displayName":"Spark 2.0.1-db1 (Scala 2.11)","packageLabel":"spark-image-10ab19f634bbfdb860446c326a9f76dc25bfa87de6403b980566279142a289ea","upgradable":true,"deprecated":true,"customerVisible":false,"capabilities":[]},{"key":"2.0.2-db3-scala2.11","displayName":"Spark 2.0.2-db3 (Scala 2.11)","packageLabel":"spark-image-7fd7aaa89d55692e429115ae7eac3b1a1dc4de705d50510995f34306b39c2397","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":[]},{"key":"2.1.1-db6-scala2.11","displayName":"Spark 2.1.1-db6 (Scala 2.11)","packageLabel":"spark-image-fdad9ef557700d7a8b6bde86feccbcc3c71d1acdc838b0fd299bd19956b1076e","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION"]},{"key":"1.6.3-db1-hadoop1-scala2.10","displayName":"Spark 1.6.3-db1 (Hadoop 1, Scala 2.10)","packageLabel":"spark-image-d50af1032799546b8ccbeeb76889a20c819ebc2a0e68ea20920cb30d3895d3ae","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":[]},{"key":"2.0.2-db1-scala2.10","displayName":"Spark 2.0.2-db1 (Scala 2.10)","packageLabel":"spark-image-654bdd6e9bad70079491987d853b4b7abf3b736fff099701501acaabe0e75c41","upgradable":true,"deprecated":true,"customerVisible":false,"capabilities":[]},{"key":"2.0.x-ubuntu15.10","displayName":"Spark 2.0 (Ubuntu 15.10, Scala 2.10, deprecated)","packageLabel":"spark-image-a659f3909d51b38d297b20532fc807ecf708cfb7440ce9b090c406ab0c1e4b7e","upgradable":true,"deprecated":true,"customerVisible":false,"capabilities":[]},{"key":"3.5.x-scala2.11","displayName":"3.5 LTS (includes Apache Spark 2.2.1, Scala 2.11)","packageLabel":"spark-image-3961e9af697e7e97441ff848e1cc7f314c9fe21660cd2169b469dd1bbe3460f0","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION","SUPPORTS_TABLE_ACLS"]},{"key":"latest-experimental-scala2.11","displayName":"Latest experimental (4.1 snapshot, Scala 2.11)","packageLabel":"spark-image-e9ad35969427c8292fe357d5150789d8869671121e1b431f950cc56120db2e26","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION","SUPPORTS_TABLE_ACLS"]},{"key":"3.2.x-scala2.11","displayName":"3.2 (includes Apache Spark 2.2.0, Scala 2.11)","packageLabel":"spark-image-5537926238bc55cb6cd76ee0f0789511349abead3781c4780721a845f34b5d4e","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":[]},{"key":"2.0.1-db1-scala2.10","displayName":"Spark 2.0.1-db1 (Scala 2.10)","packageLabel":"spark-image-5a13c2db3091986a4e7363006cc185c5b1108c7761ef5d0218506cf2e6643840","upgradable":true,"deprecated":true,"customerVisible":false,"capabilities":[]},{"key":"2.1.x-scala2.11","displayName":"Spark 2.1 (Auto-updating, Scala 2.11)","packageLabel":"spark-image-fdad9ef557700d7a8b6bde86feccbcc3c71d1acdc838b0fd299bd19956b1076e","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION"]},{"key":"2.1.0-db1-scala2.10","displayName":"Spark 2.1.0-db1 (Scala 2.10)","packageLabel":"spark-image-f0ab82a5deb7908e0d159e9af066ba05fb56e1edb35bdad41b7ad2fd62a9b546","upgradable":true,"deprecated":true,"customerVisible":false,"capabilities":[]},{"key":"3.0.x-scala2.10","displayName":"3.0 (includes Apache Spark 2.2.0, Scala 2.10)","packageLabel":"spark-image-d549f2d4a523994ecdf37e531b51d5ec7d8be51534bb0ca5322eaad28ba8f557","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION"]},{"key":"1.6.0-ubuntu15.10","displayName":"Spark 1.6.0 (Hadoop 1)","packageLabel":"spark-image-10ef758029b8c7e19cd7f4fb52fff9180d75db92ca071bd94c47f3c1171a7cb5","upgradable":true,"deprecated":true,"customerVisible":false,"capabilities":[]},{"key":"1.6.x-ubuntu15.10-hadoop2","displayName":"Spark 1.6.x (Hadoop 2)","packageLabel":"spark-image-161245e66d887cd775e23286a54bab0b146143e1289f25bd1732beac454a1561","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":[]},{"key":"2.0.0-ubuntu15.10-scala2.11","displayName":"Spark 2.0.0 (Scala 2.11)","packageLabel":"spark-image-b4ec141e751f201399f8358a82efee202560f7ed05e1a04a2ae8778f6324b909","upgradable":true,"deprecated":true,"customerVisible":false,"capabilities":[]},{"key":"2.1.0-db3-scala2.11","displayName":"Spark 2.1.0-db3 (Scala 2.11)","packageLabel":"spark-image-ccbc6b73f158e2001fc1fb8c827bfdde425d8bd6d65cb7b3269784c28bb72c16","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION"]},{"key":"latest-rc-gpu-scala2.11","displayName":"Latest RC (4.1 snapshot, GPU, Scala 2.11)","packageLabel":"spark-image-d18102578b55f83b03eec528cc3aa7cc75eb90279fee1f3cd7bb0ca1f5c68d07","upgradable":true,"deprecated":false,"customerVisible":false,"capabilities":[]},{"key":"3.4.x-scala2.10","displayName":"3.4 (includes Apache Spark 2.2.0, Scala 2.10)","packageLabel":"spark-image-b768d65de82a89fbfabff8ec1d2f279ced527c0ec05e83c3ae0c206d2e97edc0","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION"]}],"enablePresentationMode":false,"enableClearStateAndRunAll":true,"enableTableAclsByTier":false,"enableRestrictedClusterCreation":true,"enableFeedback":true,"enableClusterAutoScaling":false,"enableUserVisibleDefaultTags":true,"defaultNumWorkers":0,"serverContinuationTimeoutMillis":10000,"jobsUnreachableThresholdMillis":60000,"driverStderrFilePrefix":"stderr","enableNotebookRefresh":false,"createTableInNotebookImportedFileLink":{"url":"https://docs.databricks.com/_static/notebooks/data-import/imported-file.html","displayName":"Imported File","workspaceFileName":"Imported File Example"},"accountsOwnerUrl":"https://accounts.cloud.databricks.com/registration.html#login","tableAclsDisabledMap":{"spark.databricks.acl.dfAclsEnabled":"false"},"driverStdoutFilePrefix":"stdout","showDbuPricing":true,"databricksDocsBaseHostname":"docs.databricks.com","defaultNodeTypeToPricingUnitsMap":{"r3.2xlarge":2,"i3.4xlarge":4,"class-node":1,"m4.2xlarge":1.5,"r4.xlarge":1,"m4.4xlarge":3,"Standard_DS5_v2":3,"Standard_D2s_v3":0.5,"Standard_DS4_v2_Promo":1.5,"Standard_DS14":4,"Standard_DS11_v2_Promo":0.5,"r4.16xlarge":16,"Standard_DS11":0.5,"Standard_D2_v3":0.5,"Standard_DS14_v2_Promo":4,"Standard_D64s_v3":12,"p2.8xlarge":16,"m4.10xlarge":8,"Standard_D8s_v3":1.5,"Standard_E32s_v3":8,"Standard_DS3":0.75,"Standard_DS2_v2":0.5,"r3.8xlarge":8,"r4.4xlarge":4,"dev-tier-node":1,"Standard_L8s":2,"Standard_DS13_v2_Promo":2,"Standard_E4s_v3":1,"Standard_D3_v2":0.75,"Standard_DS15_v2":5,"Standard_D16s_v3":3,"Standard_D5_v2":3,"Standard_E8s_v3":2,"Standard_DS2_v2_Promo":0.5,"c3.8xlarge":4,"Standard_D4_v3":0.75,"Standard_E2s_v3":0.5,"Standard_D32_v3":6,"Standard_DS3_v2":0.75,"r3.4xlarge":4,"Standard_DS4":1.5,"i2.4xlarge":6,"Standard_DS3_v2_Promo":0.75,"m4.xlarge":0.75,"r4.8xlarge":8,"Standard_H16":4,"Standard_DS14_v2":4,"r4.large":0.5,"Standard_DS12":1,"development-node":1,"i2.2xlarge":3,"g2.8xlarge":6,"i3.large":0.75,"memory-optimized":1,"m4.large":0.4,"Standard_D16_v3":3,"Standard_F4s":0.5,"p2.16xlarge":24,"i3.8xlarge":8,"Standard_D32s_v3":6,"i3.16xlarge":16,"Standard_DS12_v2":1,"Standard_L32s":8,"Standard_D4s_v3":0.75,"Standard_DS13":2,"Standard_DS11_v2":0.5,"Standard_DS12_v2_Promo":1,"Standard_DS13_v2":2,"c3.2xlarge":1,"Standard_L4s":1,"Standard_F16s":2,"c4.2xlarge":1,"Standard_L16s":4,"i2.xlarge":1.5,"Standard_DS2":0.5,"compute-optimized":1,"c4.4xlarge":2,"Standard_DS5_v2_Promo":3,"Standard_D64_v3":12,"Standard_D2_v2":0.5,"Standard_D8_v3":1.5,"i3.2xlarge":2,"Standard_E16s_v3":4,"Standard_F8s":1,"c3.4xlarge":2,"g2.2xlarge":1.5,"p2.xlarge":2,"m4.16xlarge":12,"Standard_DS4_v2":1.5,"c4.8xlarge":4,"i3.xlarge":1,"r3.xlarge":1,"r4.2xlarge":2,"i2.8xlarge":12},"tableFilesBaseFolder":"/tables","enableSparkDocsSearch":true,"sparkHistoryServerEnabled":true,"enableClusterAppsUIOnServerless":false,"enableEBSVolumesUI":false,"homePageWelcomeMessage":"Welcome to ","metastoreServiceRowLimit":1000000,"enableIPythonImportExport":true,"enableClusterTagsUIForJobs":true,"enableClusterTagsUI":false,"enableNotebookHistoryDiffing":true,"branch":"2.66.997","accountsLimit":3,"enableSparkEnvironmentVariables":true,"enableX509Authentication":false,"useAADLogin":false,"enableStructuredStreamingNbOptimizations":true,"enableNotebookGitBranching":true,"local":false,"enableNotebookLazyRenderWrapper":false,"enableClusterAutoScalingForJobs":true,"enableStrongPassword":false,"showReleaseNote":true,"displayDefaultContainerMemoryGB":6,"broadenedEditPermission":false,"disableS3TableImport":false,"enableArrayParamsEdit":true,"deploymentMode":"production","useSpotForWorkers":true,"removePasswordInAccountSettings":false,"preferStartTerminatedCluster":false,"enableUserInviteWorkflow":true,"createTableConnectorOptionLinks":[{"url":"https://docs.databricks.com/_static/notebooks/redshift.html","displayName":"Amazon Redshift","workspaceFileName":"Amazon Redshift Example"},{"url":"https://docs.databricks.com/_static/notebooks/structured-streaming-kinesis.html","displayName":"Amazon Kinesis","workspaceFileName":"Amazon Kinesis Example"},{"url":"https://docs.databricks.com/_static/notebooks/data-import/jdbc.html","displayName":"JDBC","workspaceFileName":"JDBC Example"},{"url":"https://docs.databricks.com/_static/notebooks/cassandra.html","displayName":"Cassandra","workspaceFileName":"Cassandra Example"},{"url":"https://docs.databricks.com/_static/notebooks/structured-streaming-etl-kafka.html","displayName":"Kafka","workspaceFileName":"Kafka Example"},{"url":"https://docs.databricks.com/_static/notebooks/redis.html","displayName":"Redis","workspaceFileName":"Redis Example"},{"url":"https://docs.databricks.com/_static/notebooks/elasticsearch.html","displayName":"Elasticsearch","workspaceFileName":"Elasticsearch Example"}],"enableStaticNotebooks":true,"enableNewLineChart":true,"sandboxForUrlSandboxFrame":"allow-scripts allow-popups allow-popups-to-escape-sandbox allow-forms","enableCssTransitions":true,"serverlessEnableElasticDisk":true,"minClusterTagKeyLength":1,"showHomepageFeaturedLinks":true,"pricingURL":"https://databricks.com/product/pricing","enableClusterEdit":true,"enableClusterAclsConfig":false,"useTempS3UrlForTableUpload":false,"notifyLastLogin":false,"enableSshKeyUIByTier":false,"enableCreateClusterOnAttach":true,"defaultAutomatedPricePerDBU":0.2,"enableNotebookGitVersioning":true,"defaultMinWorkers":2,"files":"files/","feedbackEmail":"[email protected]","enableDriverLogsUI":true,"enableExperimentalCharts":false,"defaultMaxWorkers":8,"enableWorkspaceAclsConfig":false,"serverlessRunPythonAsLowPrivilegeUser":false,"dropzoneMaxFileSize":2047,"enableNewClustersList":true,"enableNewDashboardViews":true,"enableJobListPermissionFilter":true,"driverLog4jFilePrefix":"log4j","enableSingleSignOn":true,"enableMavenLibraries":true,"displayRowLimit":1000,"deltaProcessingAsyncEnabled":true,"enableSparkEnvironmentVariablesUI":false,"defaultSparkVersion":{"key":"3.5.x-scala2.11","displayName":"3.5 LTS (includes Apache Spark 2.2.1, Scala 2.11)","packageLabel":"spark-image-3961e9af697e7e97441ff848e1cc7f314c9fe21660cd2169b469dd1bbe3460f0","upgradable":true,"deprecated":false,"customerVisible":true,"capabilities":["SUPPORTS_END_TO_END_ENCRYPTION","SUPPORTS_TABLE_ACLS"]},"enableNewLineChartParams":false,"deprecatedEnableStructuredDataAcls":false,"enableCustomSpotPricing":false,"enableMountAclsConfig":false,"defaultAutoterminationMin":120,"useDevTierHomePage":true,"disableExportNotebook":false,"enableClusterClone":true,"enableNotebookLineNumbers":true,"enablePublishHub":false,"notebookHubUrl":"http://hub.dev.databricks.com/","showSqlEndpoints":false,"enableNotebookDatasetInfoView":true,"defaultTagKeys":{"CLUSTER_NAME":"ClusterName","VENDOR":"Vendor","CLUSTER_TYPE":"ResourceClass","CREATOR":"Creator","CLUSTER_ID":"ClusterId"},"enableClusterAclsByTier":false,"databricksDocsBaseUrl":"https://docs.databricks.com/","azurePortalLink":"https://portal.azure.com","cloud":"AWS","customSparkVersionPrefix":"custom:","disallowAddingAdmins":true,"enableSparkConfUI":true,"enableClusterEventsUI":false,"featureTier":"DEVELOPER_BASIC_TIER","mavenCentralSearchEndpoint":"http://search.maven.org/solrsearch/select","defaultServerlessClusterModel":{"cluster_name":"","node_type_id":"i3.2xlarge","spark_version":"latest-stable-scala2.11","num_workers":null,"enable_jdbc_auto_start":true,"custom_tags":{"ResourceClass":"Serverless"},"autoscale":{"min_workers":2,"max_workers":20},"spark_conf":{"spark.databricks.cluster.profile":"serverless","spark.databricks.repl.allowedLanguages":"sql,python,r","spark.databricks.acl.enabled":"false","spark.databricks.acl.sqlOnly":"false"},"aws_attributes":{"ebs_volume_count":null,"availability":"ON_DEMAND","first_on_demand":1,"ebs_volume_type":null,"spot_bid_price_percent":100,"zone_id":"us-west-2c","ebs_volume_size":null},"autotermination_minutes":0,"enable_elastic_disk":false,"default_tags":{"Vendor":"Databricks","Creator":"[email protected]","ClusterName":null,"ClusterId":"<Generated after creation>"}},"enableOrgSwitcherUI":true,"bitbucketCloudBaseApiV2Url":"https://api.bitbucket.org/2.0","clustersLimit":1,"enableJdbcImport":true,"enableClusterAppsUIOnNormalClusters":false,"enableElasticDisk":false,"logfiles":"logfiles/","enableRelativeNotebookLinks":true,"enableMultiSelect":true,"homePageLogo":"login/databricks_logoTM_rgb_TM.svg","enableWebappSharding":true,"enableNotebookParamsEdit":true,"enableClusterDeltaUpdates":true,"enableSingleSignOnLogin":false,"separateTableForJobClusters":true,"ebsVolumeSizeLimitGB":{"GENERAL_PURPOSE_SSD":[100,4096],"THROUGHPUT_OPTIMIZED_HDD":[500,4096]},"enableMountAcls":false,"requireEmailUserName":true,"enableRServerless":true,"dbcFeedbackURL":"mailto:[email protected]","enableMountAclService":true,"showVersion":true,"serverlessClustersByDefault":false,"enableWorkspaceAcls":false,"maxClusterTagKeyLength":127,"gitHash":"","clusterTagReservedPrefixes":[],"tableAclsEnabledMap":{"spark.databricks.acl.dfAclsEnabled":"true"},"showWorkspaceFeaturedLinks":true,"signupUrl":"https://databricks.com/try-databricks","databricksDocsNotebookPathPrefix":"^https://docs\\.databricks\\.com/_static/notebooks/.+$","serverlessAttachEbsVolumesByDefault":false,"enableTokensConfig":true,"allowFeedbackForumAccess":true,"enablePythonVersionUI":true,"enableImportFromUrl":true,"allowDisplayHtmlByUrl":true,"enableTokens":false,"enableMiniClusters":true,"enableNewJobList":true,"enableDebugUI":false,"enableStreamingMetricsDashboard":true,"allowNonAdminUsers":true,"enableSingleSignOnByTier":false,"enableJobsRetryOnTimeout":true,"loginLogo":"/login/databricks_logoTM_rgb_TM.svg","useStandardTierUpgradeTooltips":true,"staticNotebookResourceUrl":"https://databricks-prod-cloudfront.cloud.databricks.com/static/7f9cefa92f0da43a505f7213ef5a6bb5d4a409ec4e0540a0a55701946063455d/","enableSpotClusterType":true,"enableSparkPackages":true,"checkAadUserInWorkspaceTenant":false,"dynamicSparkVersions":true,"useIframeForHtmlResult":false,"enableClusterTagsUIByTier":false,"enableNotebookHistoryUI":true,"addWhitespaceAfterLastNotebookCell":true,"enableClusterLoggingUI":true,"enableDatabaseDropdownInTableUI":true,"showDebugCounters":false,"enableInstanceProfilesUI":false,"enableFolderHtmlExport":true,"homepageFeaturedLinks":[{"linkURI":"https://docs.databricks.com/_static/notebooks/gentle-introduction-to-apache-spark.html","displayName":"Introduction to Apache Spark on Databricks","icon":"img/home/Python_icon.svg"},{"linkURI":"https://docs.databricks.com/_static/notebooks/databricks-for-data-scientists.html","displayName":"Databricks for Data Scientists","icon":"img/home/Scala_icon.svg"},{"linkURI":"https://docs.databricks.com/_static/notebooks/structured-streaming-python.html","displayName":"Introduction to Structured Streaming","icon":"img/home/Python_icon.svg"}],"enableClusterStart":false,"maxImportFileVersion":5,"enableEBSVolumesUIByTier":false,"enableTableAclService":true,"removeSubCommandCodeWhenExport":true,"upgradeURL":"https://accounts.cloud.databricks.com/registration.html#login","maxAutoterminationMinutes":10000,"showResultsFromExternalSearchEngine":true,"autoterminateClustersByDefault":true,"notebookLoadingBackground":"#fff","sshContainerForwardedPort":2200,"enableServerAutoComplete":true,"enableStaticHtmlImport":true,"enableInstanceProfilesByTier":false,"showForgotPasswordLink":true,"defaultMemoryPerContainerMB":6000,"enablePresenceUI":true,"minAutoterminationMinutes":10,"accounts":true,"useOnDemandClustersByDefault":true,"useFramedStaticNotebooks":false,"enableNewProgressReportUI":true,"enableAutoCreateUserUI":true,"defaultCoresPerContainer":4,"showTerminationReason":true,"enableNewClustersGet":true,"showPricePerDBU":false,"showSqlProxyUI":true,"enableNotebookErrorHighlighting":true};</script>
<script>var __DATABRICKS_NOTEBOOK_MODEL = {"version":"NotebookV1","origId":1240587378362186,"name":"ML Students PySpark","language":"python","commands":[{"version":"CommandV1","origId":1240587378362187,"guid":"a6918f86-404f-4bc6-9d05-21f9b2dea073","subtype":"command","commandType":"auto","position":1.0,"command":"%md # ML Students PySpark","commandVersion":1,"state":"finished","results":null,"errorSummary":null,"error":null,"workflows":[],"startTime":0,"submitTime":1520365906822,"finishTime":0,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{},"streamStates":{},"nuid":"5de92cae-ea6c-424e-a4c4-d2e1d647a0eb"},{"version":"CommandV1","origId":1194130955806235,"guid":"d47e8f7d-e3a4-4973-bab2-dad0bd6ce038","subtype":"command","commandType":"auto","position":1.5,"command":"%md \n___\n## Introducción\n\nPara la realización de esta tarea se utilizará el [dataset](https://archive.ics.uci.edu/ml/machine-learning-databases/00320/student.zip) que contiene las notas y otras características de alumnos en las asignaturas de matemáticas. [Aquí](https://archive.ics.uci.edu/ml/datasets/Student+Performance) se puede obtener una descripción detallada de todos los atributos. Como alternativa, a continuación se puede consultar estos atributos:\n\n1. school - student's school (binary: \"GP\" - Gabriel Pereira or \"MS\" - Mousinho da Silveira)\n2. sex - student's sex (binary: \"F\" - female or \"M\" - male)\n3. age - student's age (numeric: from 15 to 22)\n4. address - student's home address type (binary: \"U\" - urban or \"R\" - rural)\n5. famsize - family size (binary: \"LE3\" - less or equal to 3 or \"GT3\" - greater than 3)\n6. Pstatus - parent's cohabitation status (binary: \"T\" - living together or \"A\" - apart)\n7. Medu - mother's education (numeric: 0 - none, 1 - primary education (4th grade), 2 - 5th to 9th grade, 3 - secondary education or 4 - higher education)\n8. Fedu - father's education (numeric: 0 - none, 1 - primary education (4th grade), 2 - 5th to 9th grade, 3 - secondary education or 4 - higher education)\n9. Mjob - mother's job (nominal: \"teacher\", \"health\" care related, civil \"services\" (e.g. administrative or police), \"at_home\" or \"other\")\n10. Fjob - father's job (nominal: \"teacher\", \"health\" care related, civil \"services\" (e.g. administrative or police), \"at_home\" or \"other\")\n11. reason - reason to choose this school (nominal: close to \"home\", school \"reputation\", \"course\" preference or \"other\")\n12. guardian - student's guardian (nominal: \"mother\", \"father\" or \"other\")\n13. traveltime - home to school travel time (numeric: 1 - <15 min., 2 - 15 to 30 min., 3 - 30 min. to 1 hour, or 4 - >1 hour)\n14. studytime - weekly study time (numeric: 1 - <2 hours, 2 - 2 to 5 hours, 3 - 5 to 10 hours, or 4 - >10 hours)\n15. failures - number of past class failures (numeric: n if 1<=n<3, else 4)\n16. schoolsup - extra educational support (binary: yes or no)\n17. famsup - family educational support (binary: yes or no)\n18. paid - extra paid classes within the course subject (Math or Portuguése) (binary: yes or no)\n19. activities - extra-curricular activities (binary: yes or no)\n20. nursery - attended nursery school (binary: yes or no)\n21. higher - wants to take higher education (binary: yes or no)\n22. internet - Internet access at home (binary: yes or no)\n23. romantic - with a romantic relationship (binary: yes or no)\n24. famrel - quality of family relationships (numeric: from 1 - very bad to 5 - excellent)\n25. freetime - free time after school (numeric: from 1 - very low to 5 - very high)\n26. goout - going out with friends (numeric: from 1 - very low to 5 - very high)\n27. Dalc - workday alcohol consumption (numeric: from 1 - very low to 5 - very high)\n28. Walc - weekend alcohol consumption (numeric: from 1 - very low to 5 - very high)\n29. health - current health status (numeric: from 1 - very bad to 5 - very good)\n30. absences - number of school absences (numeric: from 0 to 93)\n31. G1 - first period grade (numeric: from 0 to 20)\n32. G2 - second period grade (numeric: from 0 to 20)\n33. G3 - final grade (numeric: from 0 to 20, output target)\n\nLos pasos que se seguirán tienen que ser:\n1. Cargar los datos en un RDD\n2. Seleccionar sólo las columnas numéricas y añadir una nueva columna con un valor 0 si el alumno ha suspendido (G3 < 10) o 1 si ha aprobado (G3 >= 10)\n3. Transformar el RDD en dataframe\n4. Transformar el dataframe para dejarlo listo para hacer la predicción de la nota G3 y clasificación de si aprueba o no\n5. Crear un modelo para predecir la nota G3 y medir la calidad con el conjunto de entrenamiento y el de test\n6. Crear un modelo para clasificar al alumno en aprobado o suspenso y medir la calidad con el conjunto de entrenamiento y el de test\n\nPara la ejecución de la tarea se ha utilizado el **entorno de Databricks con Spark 2.2.1**","commandVersion":0,"state":"finished","results":null,"errorSummary":null,"error":null,"workflows":[],"startTime":0,"submitTime":1520365906833,"finishTime":0,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":null,"streamStates":{},"nuid":"5e3608c9-dbf5-4229-adcb-736a30a79939"},{"version":"CommandV1","origId":1240587378362188,"guid":"1021efec-9f0f-47b9-ae42-ec7bcde1e5d6","subtype":"command","commandType":"auto","position":2.0,"command":"%md \n___\n## Preparación del entorno: paquetes y variables\n\nLo primero que vamos hacer es **importar todos los paquetes** necesarios y crear el contexto para los data frames (SQLContext)","commandVersion":1,"state":"finished","results":null,"errorSummary":null,"error":null,"workflows":[],"startTime":0,"submitTime":1520365906845,"finishTime":0,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{},"streamStates":{},"nuid":"9787f1f4-e205-4950-ad5e-619b82edf46c"},{"version":"CommandV1","origId":1240587378362189,"guid":"18b5ec2a-c49b-4a24-a4e7-e72d2081d37f","subtype":"command","commandType":"auto","position":3.0,"command":"# -*- coding: utf-8 -*-\n%matplotlib inline\n\nimport re\nfrom pyspark.sql import SQLContext, Row\nfrom pyspark.sql.types import *\nfrom pyspark.sql.functions import corr\nfrom pyspark.ml.feature import VectorAssembler, VectorIndexer, StringIndexer, StandardScaler\nfrom pyspark.ml.regression import LinearRegression, LinearRegressionModel\nfrom pyspark.ml.classification import LogisticRegression, LogisticRegressionModel\nfrom pyspark.ml.classification import DecisionTreeClassifier, DecisionTreeClassificationModel\nfrom pyspark.ml.evaluation import BinaryClassificationEvaluator, RegressionEvaluator\nfrom pyspark.ml.tuning import CrossValidator, ParamGridBuilder\n\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom sklearn.metrics import roc_curve, auc\n\nsqlc = SQLContext(sc)","commandVersion":1,"state":"finished","results":{"type":"html","data":"<div class=\"ansiout\">%matplotlib inline is not supported in Databricks.\nYou can display matplotlib figures using display(). For an example, see https://docs.databricks.com/user-guide/visualizations/matplotlib-and-ggplot.html\n</div>","arguments":{},"addedWidgets":{},"removedWidgets":[],"datasetInfos":[]},"errorSummary":null,"error":null,"workflows":[],"startTime":1520365907122,"submitTime":1520365906855,"finishTime":1520365907514,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{"collapsed":true},"streamStates":{},"nuid":"b4ebd95e-e74d-4db5-a8e6-04bdc403bbad"},{"version":"CommandV1","origId":1240587378362190,"guid":"f286cfc1-2394-4729-8ce2-5d26b0a6ff1b","subtype":"command","commandType":"auto","position":4.0,"command":"%md A continuación se crean las **variables** para:\n* La ruta del fichero y el nombre del fichero con las notas de los alumnos de matemáticas\n* El separador de los campos en el fichero\n* El umbral por defecto que se utilizará para saber si dos variables están correladas\n* El nombre y posición de las columnas tipo numérico en el fichero; además del tipo de dato que será en el dataframe\n* Un array con todos elementos del punto anterior para ser iterable. Además se añade la columna objetivo que valdrá 0 si el alumno ha suspendido (G3 < 10) o 1 en caso contrario (G3 >= 10). Las columnas objetivo (G3 y pass) siempre estarán al final de esta lista. De esta forma, se puede saber que columnas se pueden eliminar si están correladas de forma programática.\n\nTambién se crea una función en la que se devuelve una lista con el nombre de las columnas numéricas.","commandVersion":1,"state":"finished","results":null,"errorSummary":null,"error":null,"workflows":[],"startTime":0,"submitTime":1520365906861,"finishTime":0,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{},"streamStates":{},"nuid":"1592bbe3-41fd-4501-8853-0d117d43a33b"},{"version":"CommandV1","origId":1240587378362191,"guid":"89880111-1629-4ada-a0c8-2f4cfeb66f05","subtype":"command","commandType":"auto","position":5.0,"command":"# Ruta y nombre del fichero student y separador por defecto que utiliza. Ademas del umbral de correlacion por defecto\nRUTA_FICHERO = '/FileStore/tables/student_mat-be366.csv'\nSEPARADOR = ';'\nUMBRAL_CORRELACION = 0.80\n\n# Variables numericas del fichero, la que se crea para saber si un alumno aprueba o no y columna feature: \n# - posicion 0: nombre de la columna en el fichero\n# - posicion 1: posicion de la columna en el fichero\n# - posicion 2: tipo para convertir de RDD a dataframe\n# - posicion 3: True si la columna puede ser nullable. Se utilizara al convertir de RDD a dataframe.\nCOL_AGE = ('age', 2, DoubleType(), True)\nCOL_MEDU = ('Medu', 6, DoubleType(), True)\nCOL_FEDU = ('Fedu', 7, DoubleType(), True)\nCOL_TRAVELTIME = ('traveltime', 12, DoubleType(), True)\nCOL_STUDYTIME = ('studytime', 13, DoubleType(), True)\nCOL_FAILURES = ('failures', 14, DoubleType(), True)\nCOL_FAMREL = ('famrel', 23, DoubleType(), True)\nCOL_FREETIME = ('freetime', 24, DoubleType(), True)\nCOL_GOOUT = ('goout', 25, DoubleType(), True)\nCOL_DALC = ('Dalc', 26, DoubleType(), True)\nCOL_WALC = ('Walc', 27, DoubleType(), True)\nCOL_HEALTH = ('health', 28, DoubleType(), True)\nCOL_ABSENCES = ('absences', 29, DoubleType(), True)\nCOL_G1 = ('G1', 30, DoubleType(), True)\nCOL_G2 = ('G2', 31, DoubleType(), True)\nCOL_G3 = ('G3', 32, DoubleType(), True)\nCOL_PASS = ('pass', None, DoubleType(), True)\nCOL_FEATURES = ('features', None, None, None)\nCOL_PREDICTION = ('prediction', None, None, None)\n\n# Lista que almacena todas las variables numericas listadas arriba (excepto features) para una mejor iterazion.\n# Las ultimas son las variables target\nCOLS_NUMERICAS = (\n COL_AGE, \n COL_MEDU, \n COL_FEDU, \n COL_TRAVELTIME, \n COL_STUDYTIME, \n COL_FAILURES,\n COL_FAMREL, \n COL_FREETIME, \n COL_GOOUT, \n COL_DALC, \n COL_WALC, \n COL_HEALTH, \n COL_ABSENCES, \n COL_G1, \n COL_G2,\n COL_G3, \n COL_PASS)\n# De todos las columnas en la lista anterior, esta variable dice cuantas son target empezando desde atras\nNUMERO_COLUMNAS_TARGET_EN_COLS_NUMERICAS = 2\n\n# Obtiene el nombre de las cabeceras y las devuelve como una lista.\n# parametro cols: lista con elementos que contienen el nombre de la columna. Cada elemento tiene que ser una \n# lista donde la posicion 0 es el nombre de la columna.\ndef obtenerNombreCabeceras(cols=COLS_NUMERICAS):\n \"\"\"\n Obtiene el nombre de las cabeceras y las devuelve como una lista.\n\n :param cols: lista con elementos que contienen el nombre de la columna. Cada elemento tiene que ser una \n lista donde la posicion 0 es el nombre de la columna. Por defecto es la variable COLS_NUMERICAS\n :return: lista con el nombre de las columnas pasadas por parametro.\n \"\"\"\n \n nombres = list()\n for col in cols:\n nombres.append(col[0])\n return nombres","commandVersion":1,"state":"finished","results":{"type":"html","data":"<div class=\"ansiout\"></div>","arguments":{},"addedWidgets":{},"removedWidgets":[],"datasetInfos":[]},"errorSummary":null,"error":null,"workflows":[],"startTime":1520365907519,"submitTime":1520365906873,"finishTime":1520365907601,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{"collapsed":true},"streamStates":{},"nuid":"3dee9bf6-9c2c-44e4-a554-d2e5f980b332"},{"version":"CommandV1","origId":1240587378362192,"guid":"1809e268-c40c-4733-9347-c8f0f46c4577","subtype":"command","commandType":"auto","position":6.0,"command":"%md \n___\n## Creación del RDD y filtrado columnas numéricas\n\nUna vez que se han definido las variables, ya se puede **crear el RDD**. Para ello:\n* Se carga el fichero\n* Se elimina la cabecera del fichero utilizando filter\n* Utilizando una función map se obtienen las columnas numéricas:\n * Se divide la línea por ;\n * Se seleccionan las columnas numéricas\n * Se eliminan \" ya que algunos campos numéricos empiezan y/o terminan por esta símbolo\n * Se trasforma en float\n * Se añade una columna al final que vale 0 si G3 < 10 (suspenso/a) y 1 si G3 >= 10 (aprobado/a)","commandVersion":1,"state":"finished","results":null,"errorSummary":null,"error":null,"workflows":[],"startTime":0,"submitTime":1520365906879,"finishTime":0,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{"collapsed":true},"streamStates":{},"nuid":"bfa23952-3cef-4e2d-890f-bb41609563b6"},{"version":"CommandV1","origId":1240587378362193,"guid":"bb6ea683-bbf6-46e4-a9b5-fe964e474829","subtype":"command","commandType":"auto","position":7.0,"command":"def convertirANumeroFiltrarYAnyadirPass(linea, separador=SEPARADOR, cols=COLS_NUMERICAS, colTarget=COL_G3):\n \"\"\"\n Esta funcion:\n 1. Divide la linea en elementos separados por ;\n 2. Filtra por las columnas que se ha pasado por parametro cols\n 3. Elimina \" para no tener problemas al hacer el cast a float\n 4. Convierte a numero los campos que son numericos\n 5. Se crea un nuevo campo al final con el valor float 0 si G3 es menor que 10 y 1 si es mayor o igual que 10\n\n :param linea: linea del fichero separada por el separador\n :param separador: separador de los campos que hay en la linea. Por defecto es SEPARADOR\n :param cols: lista con elementos que contienen el nombre de la columna. Cada elemento tiene que ser una \n lista donde la posicion 1 es la posicion en la linea. Por defecto es la variable COLS_NUMERICAS\n :param colTarget: lista donde la posicion 0 es el nombre de la columna target para crear la variable de si ha aprobado\n o no. Por defecto es la variable COL_G3\n :return: lista con los valores float de los campos que se han especificado para filtrar (en el orden pasado en cols) mas \n un elemento al final cuyo valor es 0 si colTarget es menor que 10 y 1 si es mayor o igual\n \"\"\"\n \n lineaSeparada = linea.split(separador)\n \n listaFloat = list()\n for col in cols:\n if col[1]:\n listaFloat.append(float(eliminarDobleComas(lineaSeparada[col[1]])))\n \n notaFinal = float(eliminarDobleComas(lineaSeparada[colTarget[1]]))\n if notaFinal < 10:\n listaFloat.append(float(0))\n else:\n listaFloat.append(float(1))\n \n return listaFloat\n\ndef eliminarDobleComas(elemento):\n \"\"\"\n Elimina cualquier \" que haya en el parametro.\n \n :param elemento: string del que se quiere eliminar \"\n :return: elemento sin ningun \"\n \"\"\"\n \n return re.sub('\"+', '', elemento)","commandVersion":1,"state":"finished","results":{"type":"html","data":"<div class=\"ansiout\"></div>","arguments":{},"addedWidgets":{},"removedWidgets":[],"datasetInfos":[]},"errorSummary":null,"error":null,"workflows":[],"startTime":1520365907604,"submitTime":1520365906890,"finishTime":1520365907651,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{"collapsed":true},"streamStates":{},"nuid":"4e0b761a-8b20-45bd-9e10-1e6ddf5344b0"},{"version":"CommandV1","origId":1240587378362194,"guid":"67959094-dc58-43d2-9039-60f78438e45c","subtype":"command","commandType":"auto","position":8.0,"command":"# Se lee el csv y se elimina la cabecera\nfichero = sc.textFile(RUTA_FICHERO)\ncabeceraFichero = fichero.first()\ndatos = fichero.filter(lambda x: x!=cabeceraFichero)\n\n# Se hace el map para dividir las filas, quedarse con los campos numericos y convertirlos a float, y anyadir si ha pasado o no\ndatosSoloNumerosYPass = datos.map(convertirANumeroFiltrarYAnyadirPass)\ndatosSoloNumerosYPass.take(3)","commandVersion":1,"state":"finished","results":{"type":"html","data":"<div class=\"ansiout\"><span class=\"ansired\">Out[</span><span class=\"ansired\">4</span><span class=\"ansired\">]: </span>\n[[18.0,\n 4.0,\n 4.0,\n 2.0,\n 2.0,\n 0.0,\n 4.0,\n 3.0,\n 4.0,\n 1.0,\n 1.0,\n 3.0,\n 6.0,\n 5.0,\n 6.0,\n 6.0,\n 0.0],\n [17.0,\n 1.0,\n 1.0,\n 1.0,\n 2.0,\n 0.0,\n 5.0,\n 3.0,\n 3.0,\n 1.0,\n 1.0,\n 3.0,\n 4.0,\n 5.0,\n 5.0,\n 6.0,\n 0.0],\n [15.0,\n 1.0,\n 1.0,\n 1.0,\n 2.0,\n 3.0,\n 4.0,\n 3.0,\n 2.0,\n 2.0,\n 3.0,\n 3.0,\n 10.0,\n 7.0,\n 8.0,\n 10.0,\n 1.0]]\n</div>","arguments":{},"addedWidgets":{},"removedWidgets":[],"datasetInfos":[]},"errorSummary":null,"error":null,"workflows":[],"startTime":1520365907655,"submitTime":1520365906896,"finishTime":1520365907980,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{},"streamStates":{},"nuid":"a607895c-1816-4a21-80bf-11d199c3530e"},{"version":"CommandV1","origId":1240587378362195,"guid":"8a2ee378-060c-48dc-9676-97efeddd2254","subtype":"command","commandType":"auto","position":9.0,"command":"%md \n___\n## Trasformación RDD a dataframe y estudio de las variables\n\nSe **trasforma el RDD en un dataframe** creando un esquema para tal fin utilizando la variable COLS_NUMERICAS para hacerlo de forma programática:","commandVersion":1,"state":"finished","results":null,"errorSummary":null,"error":null,"workflows":[],"startTime":0,"submitTime":1520365906901,"finishTime":0,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{},"streamStates":{},"nuid":"dfcbf78a-8cfe-4ce2-a738-243a3c022ec1"},{"version":"CommandV1","origId":1240587378362196,"guid":"5792a2ea-7b87-47a1-9538-71bdaaf33741","subtype":"command","commandType":"auto","position":10.0,"command":"# Esquema que se utiliza para convertir de RDD a Dataframe. Para ello utiliza la variable del principio COLS_NUMERICAS:\n# nombre de la columna, tipo en Spark, si es nullable\nesquema = StructType()\nfor col in COLS_NUMERICAS:\n esquema.add(StructField(col[0], col[2], col[3]))\n \n# Se convierte el RDD a dataframe\ndataframe = sqlc.createDataFrame(datosSoloNumerosYPass, esquema)\ndataframe.show(3)","commandVersion":1,"state":"finished","results":{"type":"html","data":"<div class=\"ansiout\">+----+----+----+----------+---------+--------+------+--------+-----+----+----+------+--------+---+---+----+----+\n| age|Medu|Fedu|traveltime|studytime|failures|famrel|freetime|goout|Dalc|Walc|health|absences| G1| G2| G3|pass|\n+----+----+----+----------+---------+--------+------+--------+-----+----+----+------+--------+---+---+----+----+\n|18.0| 4.0| 4.0| 2.0| 2.0| 0.0| 4.0| 3.0| 4.0| 1.0| 1.0| 3.0| 6.0|5.0|6.0| 6.0| 0.0|\n|17.0| 1.0| 1.0| 1.0| 2.0| 0.0| 5.0| 3.0| 3.0| 1.0| 1.0| 3.0| 4.0|5.0|5.0| 6.0| 0.0|\n|15.0| 1.0| 1.0| 1.0| 2.0| 3.0| 4.0| 3.0| 2.0| 2.0| 3.0| 3.0| 10.0|7.0|8.0|10.0| 1.0|\n+----+----+----+----------+---------+--------+------+--------+-----+----+----+------+--------+---+---+----+----+\nonly showing top 3 rows\n\n</div>","arguments":{},"addedWidgets":{},"removedWidgets":[],"datasetInfos":[{"name":"dataframe","typeStr":"pyspark.sql.dataframe.DataFrame","schema":{"fields":[{"metadata":{},"name":"age","nullable":true,"type":"double"},{"metadata":{},"name":"Medu","nullable":true,"type":"double"},{"metadata":{},"name":"Fedu","nullable":true,"type":"double"},{"metadata":{},"name":"traveltime","nullable":true,"type":"double"},{"metadata":{},"name":"studytime","nullable":true,"type":"double"},{"metadata":{},"name":"failures","nullable":true,"type":"double"},{"metadata":{},"name":"famrel","nullable":true,"type":"double"},{"metadata":{},"name":"freetime","nullable":true,"type":"double"},{"metadata":{},"name":"goout","nullable":true,"type":"double"},{"metadata":{},"name":"Dalc","nullable":true,"type":"double"},{"metadata":{},"name":"Walc","nullable":true,"type":"double"},{"metadata":{},"name":"health","nullable":true,"type":"double"},{"metadata":{},"name":"absences","nullable":true,"type":"double"},{"metadata":{},"name":"G1","nullable":true,"type":"double"},{"metadata":{},"name":"G2","nullable":true,"type":"double"},{"metadata":{},"name":"G3","nullable":true,"type":"double"},{"metadata":{},"name":"pass","nullable":true,"type":"double"}],"type":"struct"},"tableIdentifier":null}]},"errorSummary":null,"error":null,"workflows":[],"startTime":1520365907985,"submitTime":1520365906913,"finishTime":1520365908519,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{},"streamStates":{},"nuid":"565d1c1d-dbd7-4509-bbbc-9d06673639b6"},{"version":"CommandV1","origId":1240587378362197,"guid":"0b5a435a-2fdb-4f17-b4e5-97a5e12ae5e1","subtype":"command","commandType":"auto","position":11.0,"command":"%md Se muestran las características de cada columna ya que si se hace diretamente sobre todo el dataframe la salida no es muy legible:","commandVersion":1,"state":"finished","results":null,"errorSummary":null,"error":null,"workflows":[],"startTime":0,"submitTime":1520365906919,"finishTime":0,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{},"streamStates":{},"nuid":"4fa42c85-3b24-4c06-8158-4df3e2612692"},{"version":"CommandV1","origId":1240587378362198,"guid":"99721fb9-6a4c-4e71-a3c1-995c0e87fb34","subtype":"command","commandType":"auto","position":12.0,"command":"# Para que se vea claro en pantalla se imprime columna por columna el describe\nfor nombrecolumna in obtenerNombreCabeceras():\n print dataframe.select(nombrecolumna).describe().show()","commandVersion":1,"state":"finished","results":{"type":"html","data":"<div class=\"ansiout\">+-------+------------------+\n|summary| age|\n+-------+------------------+\n| count| 395|\n| mean|16.696202531645568|\n| stddev| 1.276042724605625|\n| min| 15.0|\n| max| 22.0|\n+-------+------------------+\n\nNone\n+-------+------------------+\n|summary| Medu|\n+-------+------------------+\n| count| 395|\n| mean| 2.749367088607595|\n| stddev|1.0947351414285367|\n| min| 0.0|\n| max| 4.0|\n+-------+------------------+\n\nNone\n+-------+------------------+\n|summary| Fedu|\n+-------+------------------+\n| count| 395|\n| mean|2.5215189873417723|\n| stddev|1.0882005458269435|\n| min| 0.0|\n| max| 4.0|\n+-------+------------------+\n\nNone\n+-------+------------------+\n|summary| traveltime|\n+-------+------------------+\n| count| 395|\n| mean|1.4481012658227848|\n| stddev|0.6975047549086825|\n| min| 1.0|\n| max| 4.0|\n+-------+------------------+\n\nNone\n+-------+------------------+\n|summary| studytime|\n+-------+------------------+\n| count| 395|\n| mean|2.0354430379746837|\n| stddev|0.8392403464185557|\n| min| 1.0|\n| max| 4.0|\n+-------+------------------+\n\nNone\n+-------+------------------+\n|summary| failures|\n+-------+------------------+\n| count| 395|\n| mean|0.3341772151898734|\n| stddev|0.7436509736062507|\n| min| 0.0|\n| max| 3.0|\n+-------+------------------+\n\nNone\n+-------+------------------+\n|summary| famrel|\n+-------+------------------+\n| count| 395|\n| mean|3.9443037974683546|\n| stddev|0.8966586076885047|\n| min| 1.0|\n| max| 5.0|\n+-------+------------------+\n\nNone\n+-------+------------------+\n|summary| freetime|\n+-------+------------------+\n| count| 395|\n| mean|3.2354430379746835|\n| stddev|0.9988620396657206|\n| min| 1.0|\n| max| 5.0|\n+-------+------------------+\n\nNone\n+-------+------------------+\n|summary| goout|\n+-------+------------------+\n| count| 395|\n| mean| 3.108860759493671|\n| stddev|1.1132781740183422|\n| min| 1.0|\n| max| 5.0|\n+-------+------------------+\n\nNone\n+-------+-----------------+\n|summary| Dalc|\n+-------+-----------------+\n| count| 395|\n| mean|1.481012658227848|\n| stddev|0.890741428090967|\n| min| 1.0|\n| max| 5.0|\n+-------+-----------------+\n\nNone\n+-------+------------------+\n|summary| Walc|\n+-------+------------------+\n| count| 395|\n| mean|2.2911392405063293|\n| stddev|1.2878965924510932|\n| min| 1.0|\n| max| 5.0|\n+-------+------------------+\n\nNone\n+-------+------------------+\n|summary| health|\n+-------+------------------+\n| count| 395|\n| mean|3.5544303797468353|\n| stddev|1.3903033913095775|\n| min| 1.0|\n| max| 5.0|\n+-------+------------------+\n\nNone\n+-------+-----------------+\n|summary| absences|\n+-------+-----------------+\n| count| 395|\n| mean|5.708860759493671|\n| stddev|8.003095687108182|\n| min| 0.0|\n| max| 75.0|\n+-------+-----------------+\n\nNone\n+-------+-----------------+\n|summary| G1|\n+-------+-----------------+\n| count| 395|\n| mean|10.90886075949367|\n| stddev|3.319194671507669|\n| min| 3.0|\n| max| 19.0|\n+-------+-----------------+\n\nNone\n+-------+------------------+\n|summary| G2|\n+-------+------------------+\n| count| 395|\n| mean|10.713924050632912|\n| stddev|3.7615046595560298|\n| min| 0.0|\n| max| 19.0|\n+-------+------------------+\n\nNone\n+-------+------------------+\n|summary| G3|\n+-------+------------------+\n| count| 395|\n| mean|10.415189873417722|\n| stddev|4.5814426109978434|\n| min| 0.0|\n| max| 20.0|\n+-------+------------------+\n\nNone\n+-------+------------------+\n|summary| pass|\n+-------+------------------+\n| count| 395|\n| mean|0.6708860759493671|\n| stddev|0.4704873536371964|\n| min| 0.0|\n| max| 1.0|\n+-------+------------------+\n\nNone\n</div>","arguments":{},"addedWidgets":{},"removedWidgets":[],"datasetInfos":[]},"errorSummary":null,"error":null,"workflows":[],"startTime":1520365908523,"submitTime":1520365906929,"finishTime":1520365913765,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{},"streamStates":{},"nuid":"9958c957-ee28-4af6-a7cf-eafeb81e0b8d"},{"version":"CommandV1","origId":1240587378362199,"guid":"5a2d0ec5-fbdf-4a02-9d95-ad235657c728","subtype":"command","commandType":"auto","position":13.0,"command":"%md El siguiente paso es ver la **correlación** entre las columnas y luego eliminar las independientes que estén bastante correladas con otras, esto es, superior al 0.80\n\nPara ello se crean dos funciones:\n* Una que recorra el dataframe y obtenga la correlación columna por columna\n* Otra que obtenga el nombre de las columnas independientes que no estén correladas\nDespués, utilizando select se seleccionan las columnas no correladas además de las columnas objetivo (que corresponden a las dos últimas del dataframe):","commandVersion":1,"state":"finished","results":null,"errorSummary":null,"error":null,"workflows":[],"startTime":0,"submitTime":1520365906935,"finishTime":0,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{},"streamStates":{},"nuid":"0c0b5301-ae74-4f89-8391-d4f9ab30007a"},{"version":"CommandV1","origId":1240587378362200,"guid":"ee601948-fb22-4f60-83af-216e91b4a2bd","subtype":"command","commandType":"auto","position":14.0,"command":"def obtenerCorrelacionColumnasDataframe(dataframe, cols=COLS_NUMERICAS):\n \"\"\"\n Obtiene la correlación entre todas columnas del dataframe.\n\n :param dataframe: dataframe del que se quiere obtener la correlación de las columnas. \n :param cols: lista con las columnas que se quiere obtener la correlación. Cada elemento tiene que ser una \n lista donde la posicion 0 es el nombre de la columna. Por defecto es la variable COLS_NUMERICAS\n :return: lista donde cada element es una list con el nombre de la columna 1, nombre columna 2 y correlación \n \"\"\"\n \n longitudCols = len(cols)\n # lista con las listas nombre columna 1, nombre columna 2, correlación\n todasNombresCorrelacion = list()\n numeroactualCols1 = 0\n \n # Recorre todas las columnas en cols. Esta sera columna 1\n for col1 in cols:\n \n # Las siguientes columnas seran columna 2 de tal forma que se pueda crear (columna 1, columna 2, correlación)\n numeroactualCols2 = numeroactualCols1 + 1\n while numeroactualCols2 < longitudCols:\n col2 = cols[numeroactualCols2]\n # Se calcula la correlación entre columna 1 y columna 2\n correlacion = dataframe.corr(col1[0], col2[0])\n # Se crea la lista nombre columna 1 - nombre columna 2 - correlación\n nombresCorrelacion = [col1[0], col2[0], correlacion]\n todasNombresCorrelacion.append(nombresCorrelacion)\n numeroactualCols2 += 1\n \n numeroactualCols1 += 1\n return todasNombresCorrelacion\n\ndef obtenerCabecerasNoCorrelacionadas(listaCol1Col2Correlacion, cols=COLS_NUMERICAS, \n colsTarget=COLS_NUMERICAS[-NUMERO_COLUMNAS_TARGET_EN_COLS_NUMERICAS:], \n umbral=UMBRAL_CORRELACION):\n \"\"\"\n Obtiene todas las cabeceras cuyas correlación es inferior al umbral.\n\n :param listaCol1Col2Correlacion: lista cuyos elementos son listas con el formato \n nombre columna 1, nombre columna 2, correlacion\n :param cols: lista con las columnas de las correlaciones. Cada elemento tiene que ser una lista donde \n la posicion 0 es el nombre de la columna. Por defecto es la variable COLS_NUMERICAS.\n :param colsTarget: lista con las columnas de las correlaciones que son target y no se eliminaran.\n Cada elemento tiene que ser una lista donde la posicion 0 es el nombre de la columna. \n Por defecto es la variable COLS_NUMERICAS[-NUMERO_COLUMNAS_TARGET_EN_COLS_NUMERICAS:].\n :param umbral: umbral que dice si dos columnas estan correlaciondas y por tanto 1 de ellas sera eliminada. Por \n defecto es UMBRAL_CORRELACION, si es superior a 1 o menor que 0 se pone a valor UMBRAL_CORRELACION\n :return: lista con el nombre de las columnas que no estan correlacionadas con otras, ademas de las columnas target\n \"\"\"\n \n # Se comprueba que el umbral sea mayor que 0 y menor que 1. Si no se pone el de por defecto\n if umbral < 0 or umbral > 1:\n umbral = UMBRAL_CORRELACION\n \n # Se obtienen todos los nombres de las columnas. A partir de aqui se iran eliminando las que estan correlacionadas\n cabeceras = obtenerNombreCabeceras(cols)\n nombreColsTarget = obtenerNombreCabeceras(colsTarget)\n \n # Se recorre la lista con las correlaciones. Si es mayor que el umbral y ninguna de las columnas son \n # target, se elimina una de ellas\n for col1Col2Correlacion in listaCol1Col2Correlacion:\n if col1Col2Correlacion[0] not in nombreColsTarget and col1Col2Correlacion[1] not in nombreColsTarget:\n if (-umbral >= col1Col2Correlacion[2] or umbral <= col1Col2Correlacion[2]) and col1Col2Correlacion[0] in cabeceras:\n cabeceras.remove(col1Col2Correlacion[0])\n return cabeceras","commandVersion":1,"state":"finished","results":{"type":"html","data":"<div class=\"ansiout\"></div>","arguments":{},"addedWidgets":{},"removedWidgets":[],"datasetInfos":[]},"errorSummary":null,"error":null,"workflows":[],"startTime":1520365913775,"submitTime":1520365906945,"finishTime":1520365913859,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{"collapsed":true},"streamStates":{},"nuid":"9e9626e0-e055-413f-8639-c60281f84616"},{"version":"CommandV1","origId":1240587378362201,"guid":"ae47cf4b-5e29-4b7b-b727-53a957ad8d2b","subtype":"command","commandType":"auto","position":15.0,"command":"col1Col2Correlaciones = obtenerCorrelacionColumnasDataframe(dataframe)\nprint 'Correlación entre columnas columna 1 - columna 2 - correlación: {0}'.format(col1Col2Correlaciones)","commandVersion":1,"state":"finished","results":{"type":"html","data":"<div class=\"ansiout\">Correlación entre columnas columna 1 - columna 2 - correlación: [['age', 'Medu', -0.16365841893281532], ['age', 'Fedu', -0.16343806892527799], ['age', 'traveltime', 0.070640721164526], ['age', 'studytime', -0.0041400368161871245], ['age', 'failures', 0.2436653766417202], ['age', 'famrel', 0.05394009587744188], ['age', 'freetime', 0.016434388838665423], ['age', 'goout', 0.12696387964294406], ['age', 'Dalc', 0.1311246047175499], ['age', 'Walc', 0.11727605242651408], ['age', 'health', -0.062187368517449965], ['age', 'absences', 0.17523007904603075], ['age', 'G1', -0.06408149744707453], ['age', 'G2', -0.14347404903545966], ['age', 'G3', -0.16157943813834091], ['age', 'pass', -0.1796448857824074], ['Medu', 'Fedu', 0.6234551120806473], ['Medu', 'traveltime', -0.1716393046970288], ['Medu', 'studytime', 0.06494413671030172], ['Medu', 'failures', -0.23667996261654262], ['Medu', 'famrel', -0.003914458428754357], ['Medu', 'freetime', 0.03089086656740817], ['Medu', 'goout', 0.06409443819310306], ['Medu', 'Dalc', 0.019834098565639183], ['Medu', 'Walc', -0.0471234596948511], ['Medu', 'health', -0.04687782940166639], ['Medu', 'absences', 0.10028481768782291], ['Medu', 'G1', 0.20534099673858763], ['Medu', 'G2', 0.21552716763090277], ['Medu', 'G3', 0.2171474961386058], ['Medu', 'pass', 0.11539617179051495], ['Fedu', 'traveltime', -0.1581940541571005], ['Fedu', 'studytime', -0.009174638901949176], ['Fedu', 'failures', -0.2504084444567766], ['Fedu', 'famrel', -0.0013697268092250842], ['Fedu', 'freetime', -0.012845528019013766], ['Fedu', 'goout', 0.04310466836949364], ['Fedu', 'Dalc', 0.002386429408145786], ['Fedu', 'Walc', -0.01263101794647439], ['Fedu', 'health', 0.014741537267178507], ['Fedu', 'absences', 0.024472887015969096], ['Fedu', 'G1', 0.19026993555786875], ['Fedu', 'G2', 0.16489339339923348], ['Fedu', 'G3', 0.15245693890425885], ['Fedu', 'pass', 0.10805700850956021], ['traveltime', 'studytime', -0.1009091192839759], ['traveltime', 'failures', 0.09223874620951145], ['traveltime', 'famrel', -0.01680798637615146], ['traveltime', 'freetime', -0.01702494423214223], ['traveltime', 'goout', 0.02853967410672468], ['traveltime', 'Dalc', 0.1383253089894946], ['traveltime', 'Walc', 0.13411575164528627], ['traveltime', 'health', 0.007500606030374158], ['traveltime', 'absences', -0.012943775156628408], ['traveltime', 'G1', -0.09303999158232139], ['traveltime', 'G2', -0.1531979633172172], ['traveltime', 'G3', -0.11714205281614883], ['traveltime', 'pass', -0.04444648416244207], ['studytime', 'failures', -0.17356303141597584], ['studytime', 'famrel', 0.039730703839917815], ['studytime', 'freetime', -0.14319840716795162], ['studytime', 'goout', -0.06390367501441127], ['studytime', 'Dalc', -0.1960192634947601], ['studytime', 'Walc', -0.2537847308302832], ['studytime', 'health', -0.07561586301890927], ['studytime', 'absences', -0.06270017540323977], ['studytime', 'G1', 0.1606119154546957], ['studytime', 'G2', 0.1358799992144901], ['studytime', 'G3', 0.09781968965319615], ['studytime', 'pass', 0.07461252094184531], ['failures', 'famrel', -0.04433662626543531], ['failures', 'freetime', 0.09198747098855871], ['failures', 'goout', 0.12456092193402661], ['failures', 'Dalc', 0.13604693121654637], ['failures', 'Walc', 0.1419620299857151], ['failures', 'health', 0.06582728172101751], ['failures', 'absences', 0.06372583253905979], ['failures', 'G1', -0.35471761301563526], ['failures', 'G2', -0.3558956345525743], ['failures', 'G3', -0.36041494046165], ['failures', 'pass', -0.33773129596942664], ['famrel', 'freetime', 0.15070144377905123], ['famrel', 'goout', 0.06456841063112216], ['famrel', 'Dalc', -0.07759435740692666], ['famrel', 'Walc', -0.113397308366576], ['famrel', 'health', 0.09405572832242202], ['famrel', 'absences', -0.04435409460402552], ['famrel', 'G1', 0.022168315615496578], ['famrel', 'G2', -0.018281347153154437], ['famrel', 'G3', 0.051363428881282126], ['famrel', 'pass', 0.04668335769255122], ['freetime', 'goout', 0.2850187149682027], ['freetime', 'Dalc', 0.2090008483532011], ['freetime', 'Walc', 0.14782181283995183], ['freetime', 'health', 0.0757333570108621], ['freetime', 'absences', -0.0580779220848172], ['freetime', 'G1', 0.012612930233135167], ['freetime', 'G2', -0.01377713859256361], ['freetime', 'G3', 0.011307240308312946], ['freetime', 'pass', -0.018321373056005917], ['goout', 'Dalc', 0.2669938480100155], ['goout', 'Walc', 0.42038574547178864], ['goout', 'health', -0.009577253881629917], ['goout', 'absences', 0.04430222043248772], ['goout', 'G1', -0.149103966787707], ['goout', 'G2', -0.16225003415973238], ['goout', 'G3', -0.13279147350332887], ['goout', 'pass', -0.18339868866900033], ['Dalc', 'Walc', 0.6475442300180083], ['Dalc', 'health', 0.07717958218132989], ['Dalc', 'absences', 0.11190802615038602], ['Dalc', 'G1', -0.09415879189027292], ['Dalc', 'G2', -0.06412018316253443], ['Dalc', 'G3', -0.05466004056673592], ['Dalc', 'pass', -0.05734277138982311], ['Walc', 'health', 0.09247631696073404], ['Walc', 'absences', 0.13629110147995085], ['Walc', 'G1', -0.1261792080381347], ['Walc', 'G2', -0.08492735257290994], ['Walc', 'G3', -0.0519393237422462], ['Walc', 'pass', -0.02995685285227269], ['health', 'absences', -0.029936710931689304], ['health', 'G1', -0.07317207325530405], ['health', 'G2', -0.09771986553990955], ['health', 'G3', -0.061334604877121224], ['health', 'pass', -0.06566751132095153], ['absences', 'G1', -0.031002900949028266], ['absences', 'G2', -0.031776703626707176], ['absences', 'G3', 0.03424731615006917], ['absences', 'pass', -0.09224367359659309], ['G1', 'G2', 0.8521180663648059], ['G1', 'G3', 0.801467932017414], ['G1', 'pass', 0.6649786012219562], ['G2', 'G3', 0.9048679892693008], ['G2', 'pass', 0.7254069957220743], ['G3', 'pass', 0.77004217031929]]\n</div>","arguments":{},"addedWidgets":{},"removedWidgets":[],"datasetInfos":[]},"errorSummary":null,"error":null,"workflows":[],"startTime":1520365913863,"submitTime":1520365906951,"finishTime":1520365937175,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{},"streamStates":{},"nuid":"f99c763d-01d9-4428-8ee8-d07d34048ba7"},{"version":"CommandV1","origId":1240587378362202,"guid":"848d9612-389c-4466-93d8-dff441f00992","subtype":"command","commandType":"auto","position":16.0,"command":"cabecerasParaSelect = obtenerCabecerasNoCorrelacionadas(col1Col2Correlaciones)\nprint 'Total cabeceras cuya correlación no es superior al umbral (mas las columnas target): {0}. Estas cabeceras son: {1}'.format(len(cabecerasParaSelect), cabecerasParaSelect)\n\ncabecerasEliminadas = list()\nfor col in obtenerNombreCabeceras():\n if col not in cabecerasParaSelect:\n cabecerasEliminadas.append(col)\nprint 'Total cabeceras eliminadas: {0}. Cabeceras eliminadas: {1}'.format(len(cabecerasEliminadas), cabecerasEliminadas)","commandVersion":1,"state":"finished","results":{"type":"html","data":"<div class=\"ansiout\">Total cabeceras cuya correlación no es superior al umbral (mas las columnas target): 16. Estas cabeceras son: ['age', 'Medu', 'Fedu', 'traveltime', 'studytime', 'failures', 'famrel', 'freetime', 'goout', 'Dalc', 'Walc', 'health', 'absences', 'G2', 'G3', 'pass']\nTotal cabeceras eliminadas: 1. Cabeceras eliminadas: ['G1']\n</div>","arguments":{},"addedWidgets":{},"removedWidgets":[],"datasetInfos":[]},"errorSummary":null,"error":null,"workflows":[],"startTime":1520365937180,"submitTime":1520365906956,"finishTime":1520365937254,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{},"streamStates":{},"nuid":"da9aed85-b0a4-4bfc-9da8-13cd142778cf"},{"version":"CommandV1","origId":1240587378362203,"guid":"73ea0f53-d0d9-4b33-bd67-f91b69e752af","subtype":"command","commandType":"auto","position":17.0,"command":"dataframeReducido = dataframe.select(cabecerasParaSelect)\ndataframeReducido.show(5)","commandVersion":1,"state":"finished","results":{"type":"html","data":"<div class=\"ansiout\">+----+----+----+----------+---------+--------+------+--------+-----+----+----+------+--------+----+----+----+\n| age|Medu|Fedu|traveltime|studytime|failures|famrel|freetime|goout|Dalc|Walc|health|absences| G2| G3|pass|\n+----+----+----+----------+---------+--------+------+--------+-----+----+----+------+--------+----+----+----+\n|18.0| 4.0| 4.0| 2.0| 2.0| 0.0| 4.0| 3.0| 4.0| 1.0| 1.0| 3.0| 6.0| 6.0| 6.0| 0.0|\n|17.0| 1.0| 1.0| 1.0| 2.0| 0.0| 5.0| 3.0| 3.0| 1.0| 1.0| 3.0| 4.0| 5.0| 6.0| 0.0|\n|15.0| 1.0| 1.0| 1.0| 2.0| 3.0| 4.0| 3.0| 2.0| 2.0| 3.0| 3.0| 10.0| 8.0|10.0| 1.0|\n|15.0| 4.0| 2.0| 1.0| 3.0| 0.0| 3.0| 2.0| 2.0| 1.0| 1.0| 5.0| 2.0|14.0|15.0| 1.0|\n|16.0| 3.0| 3.0| 1.0| 2.0| 0.0| 4.0| 3.0| 2.0| 1.0| 2.0| 5.0| 4.0|10.0|10.0| 1.0|\n+----+----+----+----------+---------+--------+------+--------+-----+----+----+------+--------+----+----+----+\nonly showing top 5 rows\n\n</div>","arguments":{},"addedWidgets":{},"removedWidgets":[],"datasetInfos":[{"name":"dataframeReducido","typeStr":"pyspark.sql.dataframe.DataFrame","schema":{"fields":[{"metadata":{},"name":"age","nullable":true,"type":"double"},{"metadata":{},"name":"Medu","nullable":true,"type":"double"},{"metadata":{},"name":"Fedu","nullable":true,"type":"double"},{"metadata":{},"name":"traveltime","nullable":true,"type":"double"},{"metadata":{},"name":"studytime","nullable":true,"type":"double"},{"metadata":{},"name":"failures","nullable":true,"type":"double"},{"metadata":{},"name":"famrel","nullable":true,"type":"double"},{"metadata":{},"name":"freetime","nullable":true,"type":"double"},{"metadata":{},"name":"goout","nullable":true,"type":"double"},{"metadata":{},"name":"Dalc","nullable":true,"type":"double"},{"metadata":{},"name":"Walc","nullable":true,"type":"double"},{"metadata":{},"name":"health","nullable":true,"type":"double"},{"metadata":{},"name":"absences","nullable":true,"type":"double"},{"metadata":{},"name":"G2","nullable":true,"type":"double"},{"metadata":{},"name":"G3","nullable":true,"type":"double"},{"metadata":{},"name":"pass","nullable":true,"type":"double"}],"type":"struct"},"tableIdentifier":null}]},"errorSummary":null,"error":null,"workflows":[],"startTime":1520365937258,"submitTime":1520365906962,"finishTime":1520365937540,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{},"streamStates":{},"nuid":"9c6e0415-f12e-4406-8a71-b5c67834bdab"},{"version":"CommandV1","origId":1240587378362253,"guid":"3ca3d13c-9005-4f1a-ac01-bd6fddbd50af","subtype":"command","commandType":"auto","position":17.25,"command":"%md \n___\n## Creación dataframes listos para los modelos\n\nLos dos último pasos antes de crear los modelos son:\n* Añadir las variables independientes en un vector. Después se guardarán en cache los dos conjuntos para que el rendimiento sea mejor.\n* Separar el conjunto entre conjunto de entrenamiento y el de test. La relación será 70/30","commandVersion":0,"state":"finished","results":null,"errorSummary":null,"error":null,"workflows":[],"startTime":0,"submitTime":1520365906967,"finishTime":0,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":null,"streamStates":{},"nuid":"5587e06d-b685-4085-85da-50f3bfe6dfaa"},{"version":"CommandV1","origId":1240587378362205,"guid":"dc5022a0-ee00-45fb-bc99-fff8c9ee01e9","subtype":"command","commandType":"auto","position":19.0,"command":"# Antes de crear el VectorAssembler se obtienen el nombre de las columnas de las variables independientes\n# Para ello se coge la lista con las columnas no correladas y se eliminan las target (que seran las ultimas en COLS_NUMERICAS)\ncabecerasVectorAssembler = cabecerasParaSelect[:]\nfor cabeceraTarget in obtenerNombreCabeceras()[-NUMERO_COLUMNAS_TARGET_EN_COLS_NUMERICAS:]:\n cabecerasVectorAssembler.remove(cabeceraTarget)\n\n# Se crea el VectorAssembler poniendo el resultado en COL_FEATURES[0] columna\nvectorAssembler = VectorAssembler(\n inputCols=cabecerasVectorAssembler, \n outputCol=COL_FEATURES[0])\n\ndataframeEnsamblado = vectorAssembler.transform(dataframeReducido)\ndataframeEnsamblado.show(3)\n\ndataframeEnsamblado.cache()","commandVersion":1,"state":"finished","results":{"type":"html","data":"<div class=\"ansiout\">+----+----+----+----------+---------+--------+------+--------+-----+----+----+------+--------+---+----+----+--------------------+\n| age|Medu|Fedu|traveltime|studytime|failures|famrel|freetime|goout|Dalc|Walc|health|absences| G2| G3|pass| features|\n+----+----+----+----------+---------+--------+------+--------+-----+----+----+------+--------+---+----+----+--------------------+\n|18.0| 4.0| 4.0| 2.0| 2.0| 0.0| 4.0| 3.0| 4.0| 1.0| 1.0| 3.0| 6.0|6.0| 6.0| 0.0|[18.0,4.0,4.0,2.0...|\n|17.0| 1.0| 1.0| 1.0| 2.0| 0.0| 5.0| 3.0| 3.0| 1.0| 1.0| 3.0| 4.0|5.0| 6.0| 0.0|[17.0,1.0,1.0,1.0...|\n|15.0| 1.0| 1.0| 1.0| 2.0| 3.0| 4.0| 3.0| 2.0| 2.0| 3.0| 3.0| 10.0|8.0|10.0| 1.0|[15.0,1.0,1.0,1.0...|\n+----+----+----+----------+---------+--------+------+--------+-----+----+----+------+--------+---+----+----+--------------------+\nonly showing top 3 rows\n\n<span class=\"ansired\">Out[</span><span class=\"ansired\">11</span><span class=\"ansired\">]: </span>DataFrame[age: double, Medu: double, Fedu: double, traveltime: double, studytime: double, failures: double, famrel: double, freetime: double, goout: double, Dalc: double, Walc: double, health: double, absences: double, G2: double, G3: double, pass: double, features: vector]\n</div>","arguments":{},"addedWidgets":{},"removedWidgets":[],"datasetInfos":[{"name":"dataframeEnsamblado","typeStr":"pyspark.sql.dataframe.DataFrame","schema":{"fields":[{"metadata":{},"name":"age","nullable":true,"type":"double"},{"metadata":{},"name":"Medu","nullable":true,"type":"double"},{"metadata":{},"name":"Fedu","nullable":true,"type":"double"},{"metadata":{},"name":"traveltime","nullable":true,"type":"double"},{"metadata":{},"name":"studytime","nullable":true,"type":"double"},{"metadata":{},"name":"failures","nullable":true,"type":"double"},{"metadata":{},"name":"famrel","nullable":true,"type":"double"},{"metadata":{},"name":"freetime","nullable":true,"type":"double"},{"metadata":{},"name":"goout","nullable":true,"type":"double"},{"metadata":{},"name":"Dalc","nullable":true,"type":"double"},{"metadata":{},"name":"Walc","nullable":true,"type":"double"},{"metadata":{},"name":"health","nullable":true,"type":"double"},{"metadata":{},"name":"absences","nullable":true,"type":"double"},{"metadata":{},"name":"G2","nullable":true,"type":"double"},{"metadata":{},"name":"G3","nullable":true,"type":"double"},{"metadata":{},"name":"pass","nullable":true,"type":"double"},{"metadata":{"ml_attr":{"attrs":{"numeric":[{"idx":0,"name":"age"},{"idx":1,"name":"Medu"},{"idx":2,"name":"Fedu"},{"idx":3,"name":"traveltime"},{"idx":4,"name":"studytime"},{"idx":5,"name":"failures"},{"idx":6,"name":"famrel"},{"idx":7,"name":"freetime"},{"idx":8,"name":"goout"},{"idx":9,"name":"Dalc"},{"idx":10,"name":"Walc"},{"idx":11,"name":"health"},{"idx":12,"name":"absences"},{"idx":13,"name":"G2"}]},"num_attrs":14}},"name":"features","nullable":true,"type":{"class":"org.apache.spark.ml.linalg.VectorUDT","pyClass":"pyspark.ml.linalg.VectorUDT","sqlType":{"fields":[{"metadata":{},"name":"type","nullable":false,"type":"byte"},{"metadata":{},"name":"size","nullable":true,"type":"integer"},{"metadata":{},"name":"indices","nullable":true,"type":{"containsNull":false,"elementType":"integer","type":"array"}},{"metadata":{},"name":"values","nullable":true,"type":{"containsNull":false,"elementType":"double","type":"array"}}],"type":"struct"},"type":"udt"}}],"type":"struct"},"tableIdentifier":null}]},"errorSummary":null,"error":null,"workflows":[],"startTime":1520365937544,"submitTime":1520365906979,"finishTime":1520365937928,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{},"streamStates":{},"nuid":"79468cec-1578-4f12-be33-b152fbc51de0"},{"version":"CommandV1","origId":1240587378362206,"guid":"ec13a3c3-a8ca-444d-aa87-a6810571f9e6","subtype":"command","commandType":"auto","position":20.0,"command":"# Se divide el dataframe en entrenamiento y test\ndataframeEnsambladoDividido = dataframeEnsamblado.randomSplit([0.7, 0.3], 1234)\ndataframeEnsambladoEntrenamiento = dataframeEnsambladoDividido[0]\ndataframeEnsambladoTest = dataframeEnsambladoDividido[1]","commandVersion":1,"state":"finished","results":{"type":"html","data":"<div class=\"ansiout\"></div>","arguments":{},"addedWidgets":{},"removedWidgets":[],"datasetInfos":[{"name":"dataframeEnsambladoEntrenamiento","typeStr":"pyspark.sql.dataframe.DataFrame","schema":{"fields":[{"metadata":{},"name":"age","nullable":true,"type":"double"},{"metadata":{},"name":"Medu","nullable":true,"type":"double"},{"metadata":{},"name":"Fedu","nullable":true,"type":"double"},{"metadata":{},"name":"traveltime","nullable":true,"type":"double"},{"metadata":{},"name":"studytime","nullable":true,"type":"double"},{"metadata":{},"name":"failures","nullable":true,"type":"double"},{"metadata":{},"name":"famrel","nullable":true,"type":"double"},{"metadata":{},"name":"freetime","nullable":true,"type":"double"},{"metadata":{},"name":"goout","nullable":true,"type":"double"},{"metadata":{},"name":"Dalc","nullable":true,"type":"double"},{"metadata":{},"name":"Walc","nullable":true,"type":"double"},{"metadata":{},"name":"health","nullable":true,"type":"double"},{"metadata":{},"name":"absences","nullable":true,"type":"double"},{"metadata":{},"name":"G2","nullable":true,"type":"double"},{"metadata":{},"name":"G3","nullable":true,"type":"double"},{"metadata":{},"name":"pass","nullable":true,"type":"double"},{"metadata":{"ml_attr":{"attrs":{"numeric":[{"idx":0,"name":"age"},{"idx":1,"name":"Medu"},{"idx":2,"name":"Fedu"},{"idx":3,"name":"traveltime"},{"idx":4,"name":"studytime"},{"idx":5,"name":"failures"},{"idx":6,"name":"famrel"},{"idx":7,"name":"freetime"},{"idx":8,"name":"goout"},{"idx":9,"name":"Dalc"},{"idx":10,"name":"Walc"},{"idx":11,"name":"health"},{"idx":12,"name":"absences"},{"idx":13,"name":"G2"}]},"num_attrs":14}},"name":"features","nullable":true,"type":{"class":"org.apache.spark.ml.linalg.VectorUDT","pyClass":"pyspark.ml.linalg.VectorUDT","sqlType":{"fields":[{"metadata":{},"name":"type","nullable":false,"type":"byte"},{"metadata":{},"name":"size","nullable":true,"type":"integer"},{"metadata":{},"name":"indices","nullable":true,"type":{"containsNull":false,"elementType":"integer","type":"array"}},{"metadata":{},"name":"values","nullable":true,"type":{"containsNull":false,"elementType":"double","type":"array"}}],"type":"struct"},"type":"udt"}}],"type":"struct"},"tableIdentifier":null},{"name":"dataframeEnsambladoTest","typeStr":"pyspark.sql.dataframe.DataFrame","schema":{"fields":[{"metadata":{},"name":"age","nullable":true,"type":"double"},{"metadata":{},"name":"Medu","nullable":true,"type":"double"},{"metadata":{},"name":"Fedu","nullable":true,"type":"double"},{"metadata":{},"name":"traveltime","nullable":true,"type":"double"},{"metadata":{},"name":"studytime","nullable":true,"type":"double"},{"metadata":{},"name":"failures","nullable":true,"type":"double"},{"metadata":{},"name":"famrel","nullable":true,"type":"double"},{"metadata":{},"name":"freetime","nullable":true,"type":"double"},{"metadata":{},"name":"goout","nullable":true,"type":"double"},{"metadata":{},"name":"Dalc","nullable":true,"type":"double"},{"metadata":{},"name":"Walc","nullable":true,"type":"double"},{"metadata":{},"name":"health","nullable":true,"type":"double"},{"metadata":{},"name":"absences","nullable":true,"type":"double"},{"metadata":{},"name":"G2","nullable":true,"type":"double"},{"metadata":{},"name":"G3","nullable":true,"type":"double"},{"metadata":{},"name":"pass","nullable":true,"type":"double"},{"metadata":{"ml_attr":{"attrs":{"numeric":[{"idx":0,"name":"age"},{"idx":1,"name":"Medu"},{"idx":2,"name":"Fedu"},{"idx":3,"name":"traveltime"},{"idx":4,"name":"studytime"},{"idx":5,"name":"failures"},{"idx":6,"name":"famrel"},{"idx":7,"name":"freetime"},{"idx":8,"name":"goout"},{"idx":9,"name":"Dalc"},{"idx":10,"name":"Walc"},{"idx":11,"name":"health"},{"idx":12,"name":"absences"},{"idx":13,"name":"G2"}]},"num_attrs":14}},"name":"features","nullable":true,"type":{"class":"org.apache.spark.ml.linalg.VectorUDT","pyClass":"pyspark.ml.linalg.VectorUDT","sqlType":{"fields":[{"metadata":{},"name":"type","nullable":false,"type":"byte"},{"metadata":{},"name":"size","nullable":true,"type":"integer"},{"metadata":{},"name":"indices","nullable":true,"type":{"containsNull":false,"elementType":"integer","type":"array"}},{"metadata":{},"name":"values","nullable":true,"type":{"containsNull":false,"elementType":"double","type":"array"}}],"type":"struct"},"type":"udt"}}],"type":"struct"},"tableIdentifier":null}]},"errorSummary":null,"error":null,"workflows":[],"startTime":1520365937932,"submitTime":1520365906985,"finishTime":1520365938008,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{"collapsed":true},"streamStates":{},"nuid":"ceeaa4c6-b942-45bf-923f-1d0609a50a81"},{"version":"CommandV1","origId":1240587378362207,"guid":"e7e512e8-4d12-4e70-a9a8-f7628ff7fb93","subtype":"command","commandType":"auto","position":21.0,"command":"%md \n___\n## Predicción: modelo de regresión \n\nPara la contrucción del modelo de predicción se utiliza una regresión lineal con **cross validation**. Los valores que se le pasará son:\n* regParam: 0.0, 0.01, 0.05, 0.5\n* maxIter: 5, 10\n* numFolds: 5\n\nUna vez conseguido el modelo, se muestra el intercept y los coeficientes del mejor de ellos. Se puede ver el gran peso que tiene G2 en la predicción de G3:","commandVersion":1,"state":"finished","results":null,"errorSummary":null,"error":null,"workflows":[],"startTime":0,"submitTime":1520365906990,"finishTime":0,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{"collapsed":true},"streamStates":{},"nuid":"2e8235cb-03c0-420b-945b-45427f1910b8"},{"version":"CommandV1","origId":1240587378362208,"guid":"41827cb2-697a-448e-93b7-6f9e8b380600","subtype":"command","commandType":"auto","position":22.0,"command":"# Se crea el evaluador para este modelo siendo la columna objetivo COL_G3[0]\nevaluatorRegression = RegressionEvaluator(labelCol=COL_G3[0])\n\n# Se crea la regresión lineal con solve=normal \nlinearRegression = LinearRegression(solver='normal', labelCol=COL_G3[0], featuresCol=COL_FEATURES[0])\n# Crossvalidation: los parámetros escogidos son:\n# * regParam: 0.0, 0.01, 0.05, 0.5\n# * maxIter: 5, 10\n# * numFolds: 5\ngridLinearRegression = ParamGridBuilder(). \\\n addGrid(linearRegression.regParam, [0.0, 0.01, 0.05, 0.5]). \\\n addGrid(linearRegression.maxIter, [5, 10]).build()\ncrossValidatorLinearRegression = CrossValidator(estimator=linearRegression, \\\n estimatorParamMaps=gridLinearRegression, \\\n evaluator=evaluatorRegression, \\\n numFolds=5)\n# Se obtiene el modelo con los datos de entrada\ncrossValidatorLinearRegressionModel = crossValidatorLinearRegression.fit(dataframeEnsambladoEntrenamiento)\n\n# Se muestra el intercept y los coeficientes del mejor modelo\nprint 'Intercept del mejor modelo: {0}'.format(crossValidatorLinearRegressionModel.bestModel.intercept)\nprint 'Coeficientes del mejor modelo: {0}'.format(crossValidatorLinearRegressionModel.bestModel.coefficients)","commandVersion":1,"state":"finished","results":{"type":"html","data":"<div class=\"ansiout\">Intercept del mejor modelo: 0.159102589329\nCoeficientes del mejor modelo: [-0.255636495026,0.0761739764658,-0.0840239257989,0.194363281662,0.0497564636639,-0.0533716651345,0.333939362372,0.155305675718,-0.0101076316204,-0.259643718293,0.209367818941,0.109428705673,0.0461642921152,1.08545599624]\n</div>","arguments":{},"addedWidgets":{},"removedWidgets":[],"datasetInfos":[]},"errorSummary":null,"error":null,"workflows":[],"startTime":1520365938013,"submitTime":1520365907002,"finishTime":1520365965581,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{},"streamStates":{},"nuid":"70265ed0-afdf-4b17-9b29-893d0db15b07"},{"version":"CommandV1","origId":1240587378362257,"guid":"9ce62348-352c-4a1d-b012-c15aeacbd86a","subtype":"command","commandType":"auto","position":22.125,"command":"%md \n\nSe obtiene la predicción para el conjunto de entrenamiento y el de test con el mejor modelo para posteriormente mostrar el **RMSE**:","commandVersion":0,"state":"finished","results":null,"errorSummary":null,"error":null,"workflows":[],"startTime":0,"submitTime":1520365907007,"finishTime":0,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":null,"streamStates":{},"nuid":"2111395d-3660-4984-a045-9414da4b6c8f"},{"version":"CommandV1","origId":1240587378362256,"guid":"14f9ee62-4306-4453-9eb0-59a9867cb934","subtype":"command","commandType":"auto","position":22.25,"command":"# Se obtiene la predicción sobre el conjunto de test y entrenamiento\ndataframeEnsambladoEntrenamientoPrediccion = crossValidatorLinearRegressionModel.bestModel.transform(dataframeEnsambladoEntrenamiento)\ndataframeEnsambladoTestPrediccion = crossValidatorLinearRegressionModel.bestModel.transform(dataframeEnsambladoTest)\n\n# Se obtiene el RMSE sobre los dos conjuntos\nrmseLinearRegressionEntrenamiento = evaluatorRegression.evaluate(dataframeEnsambladoEntrenamientoPrediccion, {evaluatorRegression.metricName: 'rmse'})\nrmseLinearRegressionTest = evaluatorRegression.evaluate(dataframeEnsambladoTestPrediccion, {evaluatorRegression.metricName: 'rmse'})\n# Se imprime por pantalla\nprint 'RMSE en training: {0}'.format(rmseLinearRegressionEntrenamiento)\nprint 'RMSE en test: {0}'.format(rmseLinearRegressionTest)","commandVersion":0,"state":"finished","results":{"type":"html","data":"<div class=\"ansiout\">RMSE en training: 1.89468001799\nRMSE en test: 1.8409760391\n</div>","arguments":{},"addedWidgets":{},"removedWidgets":[],"datasetInfos":[{"name":"dataframeEnsambladoEntrenamientoPrediccion","typeStr":"pyspark.sql.dataframe.DataFrame","schema":{"fields":[{"metadata":{},"name":"age","nullable":true,"type":"double"},{"metadata":{},"name":"Medu","nullable":true,"type":"double"},{"metadata":{},"name":"Fedu","nullable":true,"type":"double"},{"metadata":{},"name":"traveltime","nullable":true,"type":"double"},{"metadata":{},"name":"studytime","nullable":true,"type":"double"},{"metadata":{},"name":"failures","nullable":true,"type":"double"},{"metadata":{},"name":"famrel","nullable":true,"type":"double"},{"metadata":{},"name":"freetime","nullable":true,"type":"double"},{"metadata":{},"name":"goout","nullable":true,"type":"double"},{"metadata":{},"name":"Dalc","nullable":true,"type":"double"},{"metadata":{},"name":"Walc","nullable":true,"type":"double"},{"metadata":{},"name":"health","nullable":true,"type":"double"},{"metadata":{},"name":"absences","nullable":true,"type":"double"},{"metadata":{},"name":"G2","nullable":true,"type":"double"},{"metadata":{},"name":"G3","nullable":true,"type":"double"},{"metadata":{},"name":"pass","nullable":true,"type":"double"},{"metadata":{"ml_attr":{"attrs":{"numeric":[{"idx":0,"name":"age"},{"idx":1,"name":"Medu"},{"idx":2,"name":"Fedu"},{"idx":3,"name":"traveltime"},{"idx":4,"name":"studytime"},{"idx":5,"name":"failures"},{"idx":6,"name":"famrel"},{"idx":7,"name":"freetime"},{"idx":8,"name":"goout"},{"idx":9,"name":"Dalc"},{"idx":10,"name":"Walc"},{"idx":11,"name":"health"},{"idx":12,"name":"absences"},{"idx":13,"name":"G2"}]},"num_attrs":14}},"name":"features","nullable":true,"type":{"class":"org.apache.spark.ml.linalg.VectorUDT","pyClass":"pyspark.ml.linalg.VectorUDT","sqlType":{"fields":[{"metadata":{},"name":"type","nullable":false,"type":"byte"},{"metadata":{},"name":"size","nullable":true,"type":"integer"},{"metadata":{},"name":"indices","nullable":true,"type":{"containsNull":false,"elementType":"integer","type":"array"}},{"metadata":{},"name":"values","nullable":true,"type":{"containsNull":false,"elementType":"double","type":"array"}}],"type":"struct"},"type":"udt"}},{"metadata":{},"name":"prediction","nullable":false,"type":"double"}],"type":"struct"},"tableIdentifier":null},{"name":"dataframeEnsambladoTestPrediccion","typeStr":"pyspark.sql.dataframe.DataFrame","schema":{"fields":[{"metadata":{},"name":"age","nullable":true,"type":"double"},{"metadata":{},"name":"Medu","nullable":true,"type":"double"},{"metadata":{},"name":"Fedu","nullable":true,"type":"double"},{"metadata":{},"name":"traveltime","nullable":true,"type":"double"},{"metadata":{},"name":"studytime","nullable":true,"type":"double"},{"metadata":{},"name":"failures","nullable":true,"type":"double"},{"metadata":{},"name":"famrel","nullable":true,"type":"double"},{"metadata":{},"name":"freetime","nullable":true,"type":"double"},{"metadata":{},"name":"goout","nullable":true,"type":"double"},{"metadata":{},"name":"Dalc","nullable":true,"type":"double"},{"metadata":{},"name":"Walc","nullable":true,"type":"double"},{"metadata":{},"name":"health","nullable":true,"type":"double"},{"metadata":{},"name":"absences","nullable":true,"type":"double"},{"metadata":{},"name":"G2","nullable":true,"type":"double"},{"metadata":{},"name":"G3","nullable":true,"type":"double"},{"metadata":{},"name":"pass","nullable":true,"type":"double"},{"metadata":{"ml_attr":{"attrs":{"numeric":[{"idx":0,"name":"age"},{"idx":1,"name":"Medu"},{"idx":2,"name":"Fedu"},{"idx":3,"name":"traveltime"},{"idx":4,"name":"studytime"},{"idx":5,"name":"failures"},{"idx":6,"name":"famrel"},{"idx":7,"name":"freetime"},{"idx":8,"name":"goout"},{"idx":9,"name":"Dalc"},{"idx":10,"name":"Walc"},{"idx":11,"name":"health"},{"idx":12,"name":"absences"},{"idx":13,"name":"G2"}]},"num_attrs":14}},"name":"features","nullable":true,"type":{"class":"org.apache.spark.ml.linalg.VectorUDT","pyClass":"pyspark.ml.linalg.VectorUDT","sqlType":{"fields":[{"metadata":{},"name":"type","nullable":false,"type":"byte"},{"metadata":{},"name":"size","nullable":true,"type":"integer"},{"metadata":{},"name":"indices","nullable":true,"type":{"containsNull":false,"elementType":"integer","type":"array"}},{"metadata":{},"name":"values","nullable":true,"type":{"containsNull":false,"elementType":"double","type":"array"}}],"type":"struct"},"type":"udt"}},{"metadata":{},"name":"prediction","nullable":false,"type":"double"}],"type":"struct"},"tableIdentifier":null}]},"errorSummary":null,"error":null,"workflows":[],"startTime":1520365965584,"submitTime":1520365907020,"finishTime":1520365966023,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":null,"streamStates":{},"nuid":"0b0a333f-2373-46ef-9e11-8e2587a40e94"},{"version":"CommandV1","origId":1240587378362254,"guid":"d395ff1a-8312-40e0-b0b0-c1e4208aaa77","subtype":"command","commandType":"auto","position":22.5,"command":"%md \n\nComo se puede observer el error en el conjunto de entrenamiento es ligeramente superior al de test. No obstante ninguno supera el valor 2.\n\nA continuación se muestran en un gráfico la nota real frente a la predicha tanto para el conjunto de test como para el de entrenamiento. Como se podrá observar la gran mayoría se están al rededor de la líena azul que sería la perfección. En los que se puede ver una gran diferencia entre lo predicho y lo real es cuando esta última es 0:","commandVersion":0,"state":"finished","results":null,"errorSummary":null,"error":null,"workflows":[],"startTime":0,"submitTime":1520365907026,"finishTime":0,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":null,"streamStates":{},"nuid":"05bf974b-2ab3-4ec8-a441-b93c9117865c"},{"version":"CommandV1","origId":1240587378362255,"guid":"eb9ac970-6d60-4d74-ba73-482ba50fc5d0","subtype":"command","commandType":"auto","position":22.75,"command":"# Se crea la lista con la nota real y la predicha\nxEntrenamiento, yEntrenamiento = list(), list()\nfor entrenamientoPrediccion in dataframeEnsambladoEntrenamientoPrediccion.collect():\n xEntrenamiento.append(entrenamientoPrediccion[COL_G3[0]])\n yEntrenamiento.append(entrenamientoPrediccion[COL_PREDICTION[0]])\nxTest, yTest = list(), list()\nfor testPrediccion in dataframeEnsambladoTestPrediccion.collect():\n xTest.append(testPrediccion[COL_G3[0]])\n yTest.append(testPrediccion[COL_PREDICTION[0]])\n\n# Se crea el gráfico y se muestra\nplt.clf()\nplt.xlim(0, 20)\nplt.ylim(0, 20)\nplt.xlabel('Nota real')\nplt.ylabel('Nota segun el modelo')\nplt.title('Nota real vs prediccion Regresion lineal conjunto test')\n\nplt.plot([0, 20], [0, 20], 'b')\n# Se pasan los datos de entrenamiento y test al gráfico\nplt.plot(xEntrenamiento, yEntrenamiento, 'go', label='Entrenamiento')\nplt.plot(xTest, yTest, 'ro', label='Test')\nplt.legend(loc='lower right')\n\nplt.show()\ndisplay()\n","commandVersion":0,"state":"finished","results":{"type":"image","data":"data:image/png;base64,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U848heX9l1NZWAkGOMz6eBYvnvkiixcuTug718ker7mqluvMmjWLuXPnUlhYyOmnn86bb77JE088wT/+8Q/+93//l8zMTDp16sT06dN54IEHWL16da1lXjWXdZkZZWVljBgxgi1btnDWWWfRsWNH+vXrB8Du3bsZO3YsCxcu5KijjuKKK64gOzubl156icmTJ/O3v/2Nhx56qE6sn3zyCSeddBKHH344V111FZs3b+aJJ57gvPPO44UXXuC0006rvu/y5cu5+eabOe200xg7diydO3dm9erVzJkzhwULFlBUVMSZZ55ZZ4ytW7dy6qmn0rFjRy6//HI2b97MY489xqhRo1i0aBETJkxg69atnHPOOZSXl/PYY49x6aWXsmjRIk466aQ6X9u9LVu2jDPPPJOtW7dy1llnceGFF7Jx40aeffZZvva1r/Hss88yatSoUL8/RUVFXHTRRQBcdNFF9O3bl6VLl3LvvfcyZ84cXn/9dfr27buvl44ki7vrSJEDGAQ4E3CuYDd5vAvkRh1Xqh7g48BLwf8P/Kio49GhQ4eORB5VfxOWLl3q+zL5hskeGx9zplPniI2P+XU3XrfPx2iOZI9nZh6LxXz69On1Hj//+c9r3X/69OluZp6Xl+f/93//V+vc5Zdf7rFYzJ988slat59++ukei8UajCE/P99jsZifeeaZvmPHjjrnp02b5mbm119/vVdWVlbfXllZ6d/5znc8Fov5nDlzqm//5JNPqp/XjBkzaj3W888/72bmY8aMqXV7SUmJb9q0qc7Y69at8169evnAgQPrnKsa45prrql1++zZs93MvEuXLn7uuef6rl27qs+99tprbmZ+wQUX1PqcBx980GOxmD/00EPVt+3evdsPP/xwb9eunb/22mu17r9+/Xrv3bu39+rVy8vKyqpvT/T3p7S01Lt06eJt2rTxN954o9a5//zP/3Qz87POOqvez61p6dKlDjgwyJvws7mv++lo5GsYdQA6anwzaiYg03EuZzcduTvquFLtAM8Evxvcwf8EnhN1TDp06NCR6KM5CUj+8fnOtLrJANNxpuH5g/L3+RjNkezxqi6iGzq6dOlS6/5VF7i33HJLncd66aWX3Mz8hhtuqHV7UxOQd999t865yspK79q1q/fq1csrKirqnN+6davHYjG/5JJLqm+rSkD69etXK2Gp0rdvX+/e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","arguments":{},"addedWidgets":{},"removedWidgets":[],"datasetInfos":[]},"errorSummary":null,"error":null,"workflows":[],"startTime":1520365966027,"submitTime":1520365907036,"finishTime":1520365967987,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":null,"streamStates":{},"nuid":"1fecce5e-dde6-4521-8a3f-081f2a6e30af"},{"version":"CommandV1","origId":1240587378362209,"guid":"c26a9813-3d7d-4491-bd52-6213a3592c19","subtype":"command","commandType":"auto","position":23.0,"command":"%md \n___\n## Clasificación: árboles de decisión \n\nPara la contrucción del modelo de clasificación se ha obtado por un árbol de decisión con **cross validation**. Los valores que se le pasará son:\n* maxDepth: 3, 6, 10\n* maxBins: 20, 40, 80\n* numFolds: 5\n\nUna vez conseguido el modelo, se muestra el número de nodos, la profundidad y el árbol en sí del mejor de ellos:","commandVersion":1,"state":"finished","results":null,"errorSummary":null,"error":null,"workflows":[],"startTime":0,"submitTime":1520365907041,"finishTime":0,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{},"streamStates":{},"nuid":"82fb7b4f-100b-4e27-a115-b6e691e4268c"},{"version":"CommandV1","origId":1240587378362210,"guid":"fde250cd-12fa-4618-92ff-b1fab5b06acf","subtype":"command","commandType":"auto","position":24.0,"command":"# Se crea el evaluador para este modelo siendo la columna objetivo COL_PASS[0]\nevaluatorBinaryClassification = BinaryClassificationEvaluator(labelCol=COL_PASS[0])\n\n# Se crea el árbol de decisión\ndecisionTreeClassifier = DecisionTreeClassifier(labelCol=COL_PASS[0], featuresCol=COL_FEATURES[0])\n# Crossvalidation: los parámetros escogidos son:\n# * maxDepth: 3, 6, 10\n# * maxBins: 20, 40, 80\n# * numFolds: 5\ngridTreeClassifier = ParamGridBuilder(). \\\n addGrid(decisionTreeClassifier.maxDepth, [3, 6, 10]). \\\n addGrid(decisionTreeClassifier.maxBins, [20, 40, 80]).build()\ncrossValidatorDecisionTree = CrossValidator(estimator=decisionTreeClassifier, \\\n estimatorParamMaps=gridTreeClassifier, \\\n evaluator=evaluatorBinaryClassification, \\\n numFolds=5)\n# Se obtiene el modelo con los datos de entrada\ncrossValidatorDecisionTreeModel = crossValidatorDecisionTree.fit(dataframeEnsambladoEntrenamiento)\n\n# Se muestra el número de nodos, profundida y el árbol mejor modelo\nprint 'Número del nodos del mejor modelo: {0}'.format(crossValidatorDecisionTreeModel.bestModel.numNodes)\nprint 'Profundidad del mejor modelo: {0}'.format(crossValidatorDecisionTreeModel.bestModel.depth)\nprint 'Árbol mejor modelo: {0}'.format(crossValidatorDecisionTreeModel.bestModel.toDebugString)","commandVersion":1,"state":"finished","results":{"type":"html","data":"<div class=\"ansiout\">Número del nodos del mejor modelo: 11\nProfundidad del mejor modelo: 3\nÁrbol mejor modelo: DecisionTreeClassificationModel (uid=DecisionTreeClassifier_49a0b3f004100f97dec6) of depth 3 with 11 nodes\n If (feature 13 <= 9.0)\n If (feature 13 <= 7.0)\n Predict: 0.0\n Else (feature 13 > 7.0)\n If (feature 0 <= 18.0)\n Predict: 0.0\n Else (feature 0 > 18.0)\n Predict: 0.0\n Else (feature 13 > 9.0)\n If (feature 13 <= 10.0)\n If (feature 11 <= 4.0)\n Predict: 1.0\n Else (feature 11 > 4.0)\n Predict: 1.0\n Else (feature 13 > 10.0)\n Predict: 1.0\n\n</div>","arguments":{},"addedWidgets":{},"removedWidgets":[],"datasetInfos":[]},"errorSummary":null,"error":null,"workflows":[],"startTime":1520365967991,"submitTime":1520365907052,"finishTime":1520366012790,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{},"streamStates":{},"nuid":"f5ebc91a-5ce6-4594-be2e-92263f01c045"},{"version":"CommandV1","origId":1240587378362321,"guid":"f3e28d62-b771-4496-8e92-0b2bf0b24cd4","subtype":"command","commandType":"auto","position":24.5,"command":"%md \nSe puede ver que el campo más significativo en este árbol es feature 13 que corresponde a G2. Era de esperar que tuviese mucha importancia porque está muy correlado con la variable dependiente.\n\nA continuación se obtiene la predicción para el conjunto de entrenamiento y el de test con el mejor modelo para posteriormente mostrar el **área bajo la curva ROC**:","commandVersion":0,"state":"finished","results":null,"errorSummary":null,"error":null,"workflows":[],"startTime":0,"submitTime":1520365907057,"finishTime":0,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":null,"streamStates":{},"nuid":"830a67b5-6f9b-4a31-aaa6-0da3c526305c"},{"version":"CommandV1","origId":1240587378362322,"guid":"f2fa8d55-0c84-419c-ba06-da8235d980a0","subtype":"command","commandType":"auto","position":24.75,"command":"# Se obtiene la predicción sobre el conjunto de test y entrenamiento\ndataframeEnsambladoEntrenamientoClasificacionPrediccion = crossValidatorDecisionTreeModel.bestModel.transform(dataframeEnsambladoEntrenamiento)\ndataframeEnsambladoTestClasificacionPrediccion = crossValidatorDecisionTreeModel.bestModel.transform(dataframeEnsambladoTest)\n\n# Se obtiene el RMSE sobre los dos conjuntos\narearocDecisionTreeEntrenamiento = evaluatorBinaryClassification.evaluate(\\\n dataframeEnsambladoEntrenamientoClasificacionPrediccion, \\\n {evaluatorBinaryClassification.metricName: 'areaUnderROC'})\narearocDecisionTreeTest = evaluatorBinaryClassification.evaluate(\\\n dataframeEnsambladoTestClasificacionPrediccion, \\\n {evaluatorBinaryClassification.metricName: 'areaUnderROC'})\n# Se imprime por pantalla\nprint 'Área bajo la curva ROC en training: {0}'.format(arearocDecisionTreeEntrenamiento)\nprint 'Área bajo la curva ROC en test: {0}'.format(arearocDecisionTreeTest)","commandVersion":0,"state":"finished","results":{"type":"html","data":"<div class=\"ansiout\">Área bajo la curva ROC en training: 0.971723336239\nÁrea bajo la curva ROC en test: 0.959290540541\n</div>","arguments":{},"addedWidgets":{},"removedWidgets":[],"datasetInfos":[{"name":"dataframeEnsambladoEntrenamientoClasificacionPrediccion","typeStr":"pyspark.sql.dataframe.DataFrame","schema":{"fields":[{"metadata":{},"name":"age","nullable":true,"type":"double"},{"metadata":{},"name":"Medu","nullable":true,"type":"double"},{"metadata":{},"name":"Fedu","nullable":true,"type":"double"},{"metadata":{},"name":"traveltime","nullable":true,"type":"double"},{"metadata":{},"name":"studytime","nullable":true,"type":"double"},{"metadata":{},"name":"failures","nullable":true,"type":"double"},{"metadata":{},"name":"famrel","nullable":true,"type":"double"},{"metadata":{},"name":"freetime","nullable":true,"type":"double"},{"metadata":{},"name":"goout","nullable":true,"type":"double"},{"metadata":{},"name":"Dalc","nullable":true,"type":"double"},{"metadata":{},"name":"Walc","nullable":true,"type":"double"},{"metadata":{},"name":"health","nullable":true,"type":"double"},{"metadata":{},"name":"absences","nullable":true,"type":"double"},{"metadata":{},"name":"G2","nullable":true,"type":"double"},{"metadata":{},"name":"G3","nullable":true,"type":"double"},{"metadata":{},"name":"pass","nullable":true,"type":"double"},{"metadata":{"ml_attr":{"attrs":{"numeric":[{"idx":0,"name":"age"},{"idx":1,"name":"Medu"},{"idx":2,"name":"Fedu"},{"idx":3,"name":"traveltime"},{"idx":4,"name":"studytime"},{"idx":5,"name":"failures"},{"idx":6,"name":"famrel"},{"idx":7,"name":"freetime"},{"idx":8,"name":"goout"},{"idx":9,"name":"Dalc"},{"idx":10,"name":"Walc"},{"idx":11,"name":"health"},{"idx":12,"name":"absences"},{"idx":13,"name":"G2"}]},"num_attrs":14}},"name":"features","nullable":true,"type":{"class":"org.apache.spark.ml.linalg.VectorUDT","pyClass":"pyspark.ml.linalg.VectorUDT","sqlType":{"fields":[{"metadata":{},"name":"type","nullable":false,"type":"byte"},{"metadata":{},"name":"size","nullable":true,"type":"integer"},{"metadata":{},"name":"indices","nullable":true,"type":{"containsNull":false,"elementType":"integer","type":"array"}},{"metadata":{},"name":"values","nullable":true,"type":{"containsNull":false,"elementType":"double","type":"array"}}],"type":"struct"},"type":"udt"}},{"metadata":{},"name":"rawPrediction","nullable":true,"type":{"class":"org.apache.spark.ml.linalg.VectorUDT","pyClass":"pyspark.ml.linalg.VectorUDT","sqlType":{"fields":[{"metadata":{},"name":"type","nullable":false,"type":"byte"},{"metadata":{},"name":"size","nullable":true,"type":"integer"},{"metadata":{},"name":"indices","nullable":true,"type":{"containsNull":false,"elementType":"integer","type":"array"}},{"metadata":{},"name":"values","nullable":true,"type":{"containsNull":false,"elementType":"double","type":"array"}}],"type":"struct"},"type":"udt"}},{"metadata":{},"name":"probability","nullable":true,"type":{"class":"org.apache.spark.ml.linalg.VectorUDT","pyClass":"pyspark.ml.linalg.VectorUDT","sqlType":{"fields":[{"metadata":{},"name":"type","nullable":false,"type":"byte"},{"metadata":{},"name":"size","nullable":true,"type":"integer"},{"metadata":{},"name":"indices","nullable":true,"type":{"containsNull":false,"elementType":"integer","type":"array"}},{"metadata":{},"name":"values","nullable":true,"type":{"containsNull":false,"elementType":"double","type":"array"}}],"type":"struct"},"type":"udt"}},{"metadata":{},"name":"prediction","nullable":false,"type":"double"}],"type":"struct"},"tableIdentifier":null},{"name":"dataframeEnsambladoTestClasificacionPrediccion","typeStr":"pyspark.sql.dataframe.DataFrame","schema":{"fields":[{"metadata":{},"name":"age","nullable":true,"type":"double"},{"metadata":{},"name":"Medu","nullable":true,"type":"double"},{"metadata":{},"name":"Fedu","nullable":true,"type":"double"},{"metadata":{},"name":"traveltime","nullable":true,"type":"double"},{"metadata":{},"name":"studytime","nullable":true,"type":"double"},{"metadata":{},"name":"failures","nullable":true,"type":"double"},{"metadata":{},"name":"famrel","nullable":true,"type":"double"},{"metadata":{},"name":"freetime","nullable":true,"type":"double"},{"metadata":{},"name":"goout","nullable":true,"type":"double"},{"metadata":{},"name":"Dalc","nullable":true,"type":"double"},{"metadata":{},"name":"Walc","nullable":true,"type":"double"},{"metadata":{},"name":"health","nullable":true,"type":"double"},{"metadata":{},"name":"absences","nullable":true,"type":"double"},{"metadata":{},"name":"G2","nullable":true,"type":"double"},{"metadata":{},"name":"G3","nullable":true,"type":"double"},{"metadata":{},"name":"pass","nullable":true,"type":"double"},{"metadata":{"ml_attr":{"attrs":{"numeric":[{"idx":0,"name":"age"},{"idx":1,"name":"Medu"},{"idx":2,"name":"Fedu"},{"idx":3,"name":"traveltime"},{"idx":4,"name":"studytime"},{"idx":5,"name":"failures"},{"idx":6,"name":"famrel"},{"idx":7,"name":"freetime"},{"idx":8,"name":"goout"},{"idx":9,"name":"Dalc"},{"idx":10,"name":"Walc"},{"idx":11,"name":"health"},{"idx":12,"name":"absences"},{"idx":13,"name":"G2"}]},"num_attrs":14}},"name":"features","nullable":true,"type":{"class":"org.apache.spark.ml.linalg.VectorUDT","pyClass":"pyspark.ml.linalg.VectorUDT","sqlType":{"fields":[{"metadata":{},"name":"type","nullable":false,"type":"byte"},{"metadata":{},"name":"size","nullable":true,"type":"integer"},{"metadata":{},"name":"indices","nullable":true,"type":{"containsNull":false,"elementType":"integer","type":"array"}},{"metadata":{},"name":"values","nullable":true,"type":{"containsNull":false,"elementType":"double","type":"array"}}],"type":"struct"},"type":"udt"}},{"metadata":{},"name":"rawPrediction","nullable":true,"type":{"class":"org.apache.spark.ml.linalg.VectorUDT","pyClass":"pyspark.ml.linalg.VectorUDT","sqlType":{"fields":[{"metadata":{},"name":"type","nullable":false,"type":"byte"},{"metadata":{},"name":"size","nullable":true,"type":"integer"},{"metadata":{},"name":"indices","nullable":true,"type":{"containsNull":false,"elementType":"integer","type":"array"}},{"metadata":{},"name":"values","nullable":true,"type":{"containsNull":false,"elementType":"double","type":"array"}}],"type":"struct"},"type":"udt"}},{"metadata":{},"name":"probability","nullable":true,"type":{"class":"org.apache.spark.ml.linalg.VectorUDT","pyClass":"pyspark.ml.linalg.VectorUDT","sqlType":{"fields":[{"metadata":{},"name":"type","nullable":false,"type":"byte"},{"metadata":{},"name":"size","nullable":true,"type":"integer"},{"metadata":{},"name":"indices","nullable":true,"type":{"containsNull":false,"elementType":"integer","type":"array"}},{"metadata":{},"name":"values","nullable":true,"type":{"containsNull":false,"elementType":"double","type":"array"}}],"type":"struct"},"type":"udt"}},{"metadata":{},"name":"prediction","nullable":false,"type":"double"}],"type":"struct"},"tableIdentifier":null}]},"errorSummary":null,"error":null,"workflows":[],"startTime":1520366012796,"submitTime":1520365907068,"finishTime":1520366013294,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":null,"streamStates":{},"nuid":"70e84da7-e65f-4cc3-b53f-baf7aba30641"},{"version":"CommandV1","origId":1240587378362211,"guid":"0de9d38d-a6d3-499a-acd5-6d2fc29e081d","subtype":"command","commandType":"auto","position":25.0,"command":"%md\nComo se puede observar está muy cerca del ideal. Y por último se dibuja la curva ROC. El área bajo la curva no es la misma que la obtenida a través del modelo. Esto puede deberse a que no se está teniendo en cuenta la probabilidad que estima el modelo:","commandVersion":1,"state":"finished","results":null,"errorSummary":null,"error":null,"workflows":[],"startTime":0,"submitTime":1520365907073,"finishTime":0,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{"collapsed":true},"streamStates":{},"nuid":"879154ac-c567-477b-b4e2-4e325120d1e4"},{"version":"CommandV1","origId":1240587378362212,"guid":"5908c1f4-f914-4a13-9919-af2e7317a838","subtype":"command","commandType":"auto","position":26.0,"command":"# Se crea la lista con la nota real y la predicha\nxEntrenamiento, yEntrenamiento = list(), list()\nfor entrenamientoPrediccion in dataframeEnsambladoEntrenamientoClasificacionPrediccion.collect():\n xEntrenamiento.append(entrenamientoPrediccion[COL_PASS[0]])\n yEntrenamiento.append(entrenamientoPrediccion[COL_PREDICTION[0]])\nxTest, yTest = list(), list()\nfor testPrediccion in dataframeEnsambladoTestClasificacionPrediccion.collect():\n xTest.append(testPrediccion[COL_PASS[0]])\n yTest.append(testPrediccion[COL_PREDICTION[0]])\n\n# Se obtienen los falsos positivos y verdaderos positivos y el valor bajo la curva para el test y el entrenamiento\nfalsePositiveRateEntrenamiento, truePositiveRateEntrenamiento, thresholdsEntrenamiento = roc_curve(xEntrenamiento, yEntrenamiento)\nrocAucEntrenamiento = auc(falsePositiveRateEntrenamiento, truePositiveRateEntrenamiento)\nfalsePositiveRateTest, truePositiveRateTest, thresholdsTest = roc_curve(xTest, yTest)\nrocAucTest = auc(falsePositiveRateTest, truePositiveRateTest)\n\n# Se crea el gráfico y se muestra\nplt.clf()\nplt.title('Curva ROC con Arbol de decision')\n# Se pasan los datos de entrenamiento y test al gráfico\nplt.plot(falsePositiveRateEntrenamiento, truePositiveRateEntrenamiento, 'g', label='AUC Entrenamiento = %0.2f'% rocAucEntrenamiento)\nplt.plot(falsePositiveRateTest, truePositiveRateTest, 'r', label='AUC Test = %0.2f'% rocAucTest)\nplt.legend(loc='lower right')\nplt.plot([0,1], [0,1], 'r--')\nplt.xlim(0, 1)\nplt.ylim(0, 1)\nplt.ylabel('True Positive Ratio')\nplt.xlabel('False Positive Ratio')\nplt.show()\ndisplay()","commandVersion":1,"state":"finished","results":{"type":"image","data":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAYAAACadoJwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3XmYpFV59/HvPcOszDAD3TggKm5xjUbBuMUNl7gkiivG14jbqzEatxiXJGo7Jm4x0VeNGuOCW4IE3KLRiHEhiiKIIrjggoiyCLMzKzAz9/vHeYqprn6qt+mup6rr+7muvqr7qe2u6prp+tW5zzmRmUiSJElSLyxqugBJkiRJw8MAIkmSJKlnDCCSJEmSesYAIkmSJKlnDCCSJEmSesYAIkmSJKlnDCCSJEmSesYAIkmSJKlnDCCSJEmSesYAIkmSJKlnDCCSJEmSesYAIkmSJKlnDCCSJEmSesYAIkmSJKlnDCCSJEmSesYAIkmSJKlnDCCSJEmSesYAIkmSJKlnDCCSJEmSesYAIkmSJKlnDCCSJEmSesYAIkmSJKlnDCCSJEmSesYAIkmSJKlnDCCSJEmSesYAIkmSJKlnDCCSJEmSesYAIkmSJKlnDCCSJEmSesYAIkmSJKlnDCCSJEmSesYAIkmSJKlnDCCSJEmSesYAIkmSJKlnDCCSJEmSesYAIkmSJKlnDCCSJEmSesYAIknqexGxPyK+Oij3ERG/iohfzsVtzeK+n149lpN7eJ+vq+7zAbO8/oer699irmuT1H8MINICFxG3j4h3RcRFEbE1Iq6LiCsi4vMR8ayIWNp0jfMlIh5Yvalp/7q+evyfjIj7T3H9xRHx7Ij4UkRcXT13V0fEmdXxxVNcf2VEvCQivtJ2/S0R8Z2I+PuIuNXcPuL+EhFPbXveH9p0PT2WQ3b/eZD3ebDXlzRADmm6AEnzJyJeC7wWCODbwFeAHcA64EHA+4HnAfdsqMRe+RXw4er7lcDxwOOAx0bESZn5yc4rRMQxwOeAuwG/BT4PXAUcBTyS8tw9PyIek5lX1Fz/3sAZwNHA5cB/AVcChwJ3B14B/FVE3DszL5izR9pfngPsp7z+ngv8T7PlaB69CzgV+PUsr/8q4E3AhH9LkhYeA4i0QEXE3wCvAy4DnpSZ3625zKOAl/W4tCb8KjNf334gIl5JecPzD8AnO85bAfw3cCfgFOAFmbmn7fzlwHuAZwD/VYWI9vNvD3yJEnZeCbwtM/d33MexwFuAw+boMfaViLgd8ADgy8ARwGMi4sjM3NBsZZoPmbkZ2HwQ178auHruKpLUz2zBkhag6s3tGHA98Ki68AGQmV8AHtF2vVbL0mu73O6Evvb2fvOIeEREfK1q9doXETetTs+fpNYvVte/U9uxZ0TEGRFxSUTsiohtEfHNiHjqzJ6JSX2wOr1lRBzRcd7LgDsDZ2fms9vDBUD187OBbwF3AV7acf1/BlYBb87Mf+wMH9VtXJaZf0IZmZqWiHhy1c61KSJ2R8SlEfHvEXF8x+WWRsSrIuLCiNhZPX//GxFPqrnNY6vn/0PV95+IiA3V7Z8XEX803fo6PJfSUnMKZfRpKSWw1T2urq+hmsseHREfq1radkXEdyPiKV1uNyLieRFxbkRsj4gd1ffPi4iY5ePqvI+/iIgfVs/X5VHaHScNlRHxlOoxbqmu9+OI+NuYYTtkRNwmIk6PiM3VYzu7+lAByqhT3XWOiYh/rv5t7YmIjRHx2Yi4R5fLL6qer29Wv5NdEfHziHh/RNym7XK1c0Ai4v4R8bmI+E11f1dFxLc7/4+JSeaARMRJ1eu3df8XVq/vCc9X6/+oKO2Pb42Iy6r7/XlEvGIaT6ukHnAERFqYngUsAf49M38y2QUz84YZ3G63Hu0EnkQJM18A3gvcIjOvjIgvAw+LiDtn5o/arxQRRwEPBc7LzB+3nfUe4IfAWZS2pxHgUcDHIuJ2mTk2g5qno/M5+L/VY/r7blfIzIyIN1Baq55LGU0hIm4JPATYDbx1qjue7vMfER8GTgY2UEZsNgA3A04ALgbOry63BDiTMvrwE0oYWgk8ETgtIn4vM19dcxe3BM4FLgE+Shm1eDLwmYh4aGaeNZ0622o4GdgGfLq6/3+iPK/dnpPa11DHZQ6nhL4twIeAtcBJwL9FxE0z8586Lv9x4CmUtqD3V/fxOMrr6w+Ap033MdWJiHcAL6S01r2P8jo6EbgXJXBdV3OdD1GC2G8oLXpbgXsDfwc8OCIeVhdYa27ntsA5lOfkC8APgNtSnu//pubfakQcR3ltrKWM0H0SGAUeC3wzIh6bmf/ddvkllNf3QynP4b8B11JeK48FvkF5vUDNHI6IeASldXEb8J+U9qojgDsCfw60j0rWzgGJiDdS2rM2VPe/g9IC+UbgDyPiDzNzb8ftLKke39HVc7O3qvfNEbEsM/+u834k9Vhm+uWXXwvsi9Jrvw941gyv90BKz/5ru5x/KfDLjmNPr66zF3hYzXX+pDr/H2rOe3lV5/M7jt+q5rKHVI/rOuDoGT6er9ac9+rqvAs6jt+sOn4dsGyK219OGWXaB9y0Ovan1fX/dw5/n8+tbvPbwKqO8wJY1/bzX1eX/RywqO34aPX72wfcu+34sdXl9wGv7rjtP6zO+/wM6239zt/Tduz06j5OqLn8pK+h6jKtGk/tOH4ssAnYA9yy7fhTquucB6xoO76iOrYP+JOa+5jwWulSz32qy/8UWNN2fCklJO2v+bfyjOr46cDSjvNeW9X0wmne/5nV5f+i4/ij256rk9uOLwZ+AewC7tdxnaMo85SuAJa0HX9jdVufbj9enbcEGGn7eay6zwe0Hftkdex3a+o/ouPnU6rL3qLt2L2r+78UOLLt+CJKoNkHvKrjdlqv8c/R9u8XOJISXDcDi+fq36Zffvk1uy9bsKSF6ejq9PIe3udnMvPLdccpn4A+tabt5emUT40/0X4wMy/tvJEsn3K+mxJEHjLD2m4ZEWPV11si4iuUT1+3An/WcdnWc7cpMyd8gt1R0x7Km1+Am3Zcfy6f+xdSPtn9s8zc0VFDZumfb3kW5U3bX2bbJ+mZuZHyKXtQRiI6XQa8oeO2z6R88j3TRQqeU9X7kbZjH+bAZPRuur2GWvZRPg1vr/Ey4J2UN8TtIxrPqmp4VWbubrv8bsq8nG7Pw3S1bv8Nmbmt7favp4TAOi+mvN6fXV2u3d9T3hxP2WYYZYGEh1LebL+7/bzM/Bxl5LDTHwG3Bt6Vmd/suM5vKXOhjqL6txURiyijFLuAP8+OkbrMvCEzNzG51ojGnglnlDkjU3l2dRt/n21zh6rX9cuq87r9Dl/U/u+3uv5ngTXA7adx35LmkS1YkubKeXUHM3NPRPwH5Y3CwyntIa12kDsBn+x8MxIRN6e80XwwpQ1nRftNAsfMsLZjKZ8wt9sMPDgzL5zhbfVURKykzEf57VS1RsQq4DbA5Zn585qLtPa4uHvNeRdkZl2L3W8on0RPt97bUFZYuzgzv9N21n9TVhN7bEQc0eUNaO1rqM2vq8DR6euUT+DbH9fdKUGs7s34WZQwU/c8TFfruv9bc943q9u/UZSFDe5KaSV6ac0UlKCMut1xBvf9zS6/s69TWvDa3ac6vWVE1LUw/k5Vwx0pv6s7UN6sn1MFlNn4N0rL27kRcRrwNcq8qumudNV6nF/rPCMzfx4RlwO3iojVmbm97extdR9iUF7LUNrWJDXIACItTFdR3kDM9I36wZjsTcqHKZ+KP50qgFDaUTo/JSfK3hjnUd78fIPSy72N8obultVtLJthbWdl5oOr218LPIHyyfHnIuL3M/OamscxUvWLdx0FibIa1kj145XV6VXV6Vw992ur0+m8aVvTUUOn1vG1Nedt7XKdvcxswZLWCMe432tm7ouIfwP+kvK7f1vNdad6o9ttlaTW9da0HVsDbM7x8wPaa9lIacuZrdZ9Taip7fbbHU55g38kE8PwuKsfzH1X6p7H1uv0iVPc96rq+5m87upvLPPTEfHHlNGKZ1JeGxFlUYq/zsyplmWezuv55lWt7QFkstcylHY0SQ2yBUtamL5JebMz01alVstOtw8n6t64whSbiGXmt4GfU5ZiPSwiDqHME9gIfLHj4i+jvFl7VmY+ODNfkpljWZbRPZMuq/tMV2ZuzcwPUt4I35wyIbn9/N9QPik9hPJJ/mROqC7368xsBZBWe8s9ImL1wdRaab2Zmk6gabUCHdXl/KM7Ljenqt/r06sf3xwdm0BSfrdBCaOdprMR3boux1uPt/1xbQOOiJrNIqtjo5QJ1bPVuq8JNbXdft3lv5+Ziyf5ms4Hg13vu1L3+99GeX4fM8X9tyZoz+R111VmfjEzH0r5N/0QSvC8MyX832GKqzf6epY0fwwg0sJ0CqXX/AlT/ZHvWMpyS3V685rL3ZbxnzDP1Ecok7afTOlHHwX+LTM7l1ptLe35qZrbeBBzt1vyvwA/Ah4XEffpOO8DlDfKf9PtytV8lr+p6nlf63hm/ooyWX45ZZL9pKZaejUzd1FWBFsXEb83xWV3UFYlOqZ9idQ2D65Ouy6LfJAeC9yEMjH7A12+fgncLqbYhb6LW9Qt00oJggDfbzv2fcrfuM5WJCiLEyzm4J6H77XdVqf70/Epe2bupLze7lyNwh2M1uO8X828KjjwfLQ7h/Karns+6lxMCSF3rVarOyiZuTszv56Zf0WZ3L6UsprVZFqP80GdZ1Sv75sBl2bmwQRJSQ0wgEgLUNUn/zpKq9IXomOfiJZqmcz2EYiLKZ8KnxgRo22XW06Z6HswPkp5s35y9TWh/aryq+r0QR21PpwyKXVOVBNZxyhvyt7QcfbbKEvY3i8iPlA9/vZallPeTP8BcBHw/zqu/yJKS8hfR8RfdvkU/hYRcSrTm1/xzqrO90XHHhNRtL9B/BDl//a3VhOJW5cbBV7Dgb055kNr74/XZOZz674obz6nmozezWLgLe1vuquWvRdRAvfH2y77oep+3lTNv2hdfgXw5qrODzJ7H65u/28j4sY5BdVr401drvM2yr/JUyJiQpiPiLURMeW8lGoOxZeBWwF/0XEbJ1IfMj5LCacviIjaN/4Rce/Wa7369/EeyhLK/9IZlCNiSfv/EV1u7/51r30OjGjsmuz6HPgdvrrj/6NFlGWdg/LvUNKAcQ6ItEBl5puqP/5jwHkR8S3gu5R19NdR3qT8DmXvh9Z19lZ7G7wauCAiPk35f+JhlF7wK6k3ZVtUZl4eEV+jtGHsBS7KzB/UXPQ9lH7xMyLijOo+f5cygf0/KK1bcyIzPxURFwAPrPZf+HJ1fGcVeP6zquVREfEFSm/9OsqeJEdRPgV/TE7cqPDiiPhDyj4PbwVeXK28dSVwKPB7lPCyn/JmeKo6PxAR96Os8vTziPgsZTLzTSmjGh/kwJ4K/0j5ZPlE4AdV3Sspe2wcCbwlM78182drclUQeAilre6zk1z0NEpge0JEvDAzW60+02mtu5Cyx8b5EXEmpa3nSZSRuZe3TzzOzFOrN+NPAn4UEZ+hhI7HUuYSfSIzP8EsZea3IuJdlADww+q12toHZDM18xYy85Rq8YXnA5dExJcoq4wdQQkTD6C86X7+NEp4AWVZ5v9XvVZb+4A8lvK6fUzHfe+NiMdT5mD9V/X/wQWUEHBz4PerGo7mwKpV6ykroD0a+FlEfJ4SrG9B+T/hrygfLHTzTspo3NmUDxauB46nvGYvpWP1u06Z+e2I+AfKSGLrOd5JeX3fmTJH7B8nuw1JfSobWv+3378obxLWUz4d3kR5o3DyDK6/BvhX4BrKG76vAndv+nH5NXxflCUn30F587aV8ubiCsoGY8+gY33/6jqvoMzZ2EN54/AmSkvRpcAlHZd9Oh17DkxSy1Ory+4FXjLJ5e5NaWPaROnv/l/Km6AHVtd/zTQfe+vyX5nkMn9cXeY7Nectpoy6nEmZ8HtddfplyjKsk+4nQHnj/2LgK5Twch2lze08yrKrx87wd/kUyopAWyhvHFubBt6t43JLKauIXUh5w7aNsvLTSTW3eWz1+D/Y5T6/BuydRm1/X93OW6dx2fdVl33xdF9Drd8jJfh9tHo+d1XP5ZMnud7zKCF7R/V1HvC8ye5jhr+T51Naq3ZTll5+J7C67t9K23UeRQkJv63+jV1JaZFaD9xuBvd9a0oo30wJBmdTNnLs+nxSWh/fWL02dlBGPH9a3c5TaNs7prr8ouoxnlNddnt1+fcCt267XN0+IE+krIT10+q6W6v7fT1te4hUlz2F8v/CLWpqPonyf8C26nd+UfX6Xlpz2cme9wk1+uWXX818ReZctVMvLBFxLOU/sssoPcsPAp6ZmZN92tO6blAmot6Fsrb6Jsp/4LcAjsvMSya5uiRJkrRg2YLV3ZXAUZl5TdU/P9X69O2eRFlz/QmZ+WmAiDgd+BnlE64/netiJUmSpEHgJPQusuzyes3Ul6z1BMqmYZ9uu72NlCHuEyNiyVzUKEmSJA0aA8j8uDsHlmhsdy6lJ/x2vS1HkiRJ6g8GkPlxNPU7t7aO3bSHtUiSJEl9wwAyP1ZQVrvptIey1OSKmvMkSZKkBc9J6PNjN2WzqU7LKevQ7667UkSMUPY6+BUH1mGXJElS/1hO2U/oS5m5qeFaBpIBZH5cRWnD6tQ61m0zt4dT1kyXJElSf3sq8O9NFzGIDCDz4wLgfjXH703ZROlnXa73q+r0qcDFc1+W+tDbgZc2XYR6xt/3cPH3PVz8fR+Eo2HJnWH1LWD1KKw6HFavhtUrYfVyWLUMVi+FVYfA6ljE4bGINYfAYYckhy7dz8qlydJut73rENi+tHztWFZOdy5h7+5D2HPdYnbvXsyO3Yu4ds8itu0ONu8MNu5Irt62j6uvup4rNm1lI9ewg/3l9gLukOUD41/15tlZeAwgBykijqLsev6LzNxXHT4DeEJEPD4zP1VdbpSyK+x/ZuYNXW6u1XZ1cWbWraKlBSYitvm7Hh7+voeLv+/hMtS/77IB86HAWsp7orU139eel9XXovrWdfYDO5ayd9tycutyFm1aweKty2HbcthafW1bzv5dS7h25xK27VzKph1L2bhtGVdvXMlVV6/i8p1LuRrYCGyoTjfmWNbN1Z3BwwVsl581A8gkIuIFlH8kx1SHHhMRN6++f2dmbgfeDJxM6QX8dXXeGcBLgFMi4s6UF/vzKZP+X9eT4iVJkqYjYhFwGFOEhSnOW1x30/th3+4l7Nm5hBu2LWffluWweQWLNq5kyYZDWb55BYdsbQ8Ty+Da5ey+dhmbti1jw9blXL1/0Y3BYQPUfr81x3L/PD07mgcGkMn9FXCL6vsEHld9AXwM2F4dH/eiz8z9EfFI4K3ACymrXp0LnJyZP+9B3ZIkaVhELOVAEJhpcFhLCR+19sOevYvYft0h7N61hOu2LWPvlhXs37QSNqzkhmsOZdvVq7huw0oO3XAoq7csZ1ErSGxdDnuWsCiDPYwPDpOFiY05lrvm/DlSXzGATCIzbzWNyzwTeGbN8W3Ac6svSZKkiUo/zwomDwhTBYmVk9zDtcDWhG17F7F91xJ2X7uMnZtXsG3DSi67ajXx21UsuXI1S69czYqrD2XVNatYs2kFa7csZ/UNh7CcsupTy3UcCAtXMnmY2ABszrEbW9QHQ8SJlPd2TyRzb9PlLEQGEKlZpzZdgHrK3/dw8fc9DEr70qq7wJlE3JXpjzq0/7yky63vA7YBW9u+tgFX7Q22bV7BDVetZt9v1sCla1l06VqW/upwll22hpVXrmb1xpWs2buYI4FR4PZQO1F7K+ODw4/pHiY2AjtyLHO2T1dfizgE+DvgVcCnKfNSDCDzwAAiNSgzfYMyRPx9Dxd/3wOivOk8mPalNUBcWH/r1zE+OGwFNgO/bPt5637Yds0qdn/3aOK7x7D4/KNZduE6ll9+GKv3L+JIuDFEHAncrDo9vOb+9jIxOFxcc6y93anbwjjDJWId5UODBwAvB/6JXKBBqw8YQCRJ0uCKWM7sRh1a36+a5NZ3MD48bAWuAH7ExGBx4/ebVrDt5Mex+Au3YzVMCBCt72/Zcay9zan9/tuDw8+Bb1MfJjYA2xbs6MR8irgvcDplIv1DyDyr4YoWPAOIJElqxvjlW2cy6tD+c+3yrZRFYural37BxOBQFyS2tfr/Y30sZ2KAaH1/m5pjR1BWvmy3H9jE+MBwKd3DxMYcS5d5nU/l9fdC4J+Ac4Ank9lts2jNIQOIJEmanYjFHFi+dbbtS7XLtwI3UB8Ofk3NqEPNzzvIiUuzxvqI6n47w8Tt274vp+uj9X3dKMluxgeG3wDfoz5MbKAsFTtYk7EXvpXAXwDvAl5J933aNMcMIJIkDavxy7fOpn2p6/KtwC4mBoSrgZ8ySftS29ee6fTgx/pYCoxwIFDciVaIOBAg2sPGKPXvfzYzPjj8gO5hYmOO5c6palOfy9xJxPGUfd3UQwYQSZIG0fjlW2fbvrRiknu4lokjC79i+u1L18/4IZXRiVXA0RwIEO0hoq4Nak3NTd3A+Namq4Ef0n0y9qYcc7nVoWT4aIQBRJKkJpTlW1cz+/altXT/O76P+nBwJdNrX9pOHny7UKyPxZTRibrg0O1Y3ZyOaxkfGn5C9zCxAdjuZGypfxlAJEmajfHLt86mfWkNEF1ufQ8TA8Im4BKm1760az6WEI31sZLph4nWUrGdj3Ef1RKwHAgQP2fyydgzHk2R1L8MIJKk4VSWbz2Y9qVDJ7n11vKt7QHhckob0HTal+Z99aNYH4soj2O6YWKU+h23dzI+TFwKnEv3+RPbcmzi5HBpXkScANyKzA81XYoOMIBIkgZP3DhX4GDal+p2hYayXGorFLSHg58xvfala1vLt/ZSrI9lTAwRk4WJESauQJWUydjtoxHnM/lk7N3z+bikWSn/R7wCeCNll/pT3FiwfxhAJEm9N3751tm0L61l4j4LLTcAW5gYFi5jeu1LO5p+o1JNxj6M6YeJIynzSTpdx/gwcQVwAV3CBLDZpWI18CLWAB8BTqQEkNc2/W9a4xlAJEkzV5ZvPZj2pbo3yy2t5VvbA8JvgYuZun1pK9NcvrWXYn0cwoElYKc7GXtJzU1tZXxwuIjuYWIDsNPJ2BoqEXcFPkn5d/QYMj/XcEWqYQCRpGFTWhNWMvsJ1GuB5ZPcQ1370i+ZXvvStn7fDKwanTiUmYWJw2tuai8Tg8NPao61vt+UY/393EiNijgZ+BfKXjOPIPOShitSFwYQSRo045dvnSo8dAsS3f7/30v9yMIVTK99aXvd7tP9rFoq9nCmHyaOpD6AbWfiyk7foj5MbACudXRCmiMRdwBOobRevYB0blI/M4BIUq9FLOFAEJjJqEPr58OYevnW9oCwEfgF02tfmpflW3sp1sdyZhYmjmDifJL9lGVv24PDL+keJjbl2PyvXCWpi8yLiTgOuHDQ/w8bBgYQSZqJ0r60nIPb/2Gy5Vu3MzEc/JrS6z+d9qXr5uyx9oGq3Wkt0w8TR1L//O5mfHC4jAOrO9W1PG1xqVhpwGT+oOkSND0GEEnDZfzyrbOdQD3Z8q11Iws/Y3rtS9fOxe7T/SzWx1LGT8aeKkyMUP+3qrVUbCs4TLay04Ycy13z9qAkSTNiAJE0WMryrTNtX+r8vtvyrddTP7LwK6bXvtT48q29VI1OrGb6y8SOUp7/TtczPjj8lrJhX7fJ2JtzrPf7bEiS5oYBRFJvRSzj4NqXJlu+dScTw8GVlJWFpmpf2tqL3af7WbVU7BFMP0wcSf1oUGveSfvKTv9L9/kTO5yMLWlKEfegtJr+vOlSdHAMIJKm78DyrQfTvtRt+dakvHHtHFn4JdNvX3KJ0jaxPlYyszBxOBMnt+9jYnD4Wc2x9snY18/n45I0ZMrfnucA7wJOBZ7RaD06aAYQaZiU5Vtbu0/Ppn1pLbC4y623lm/tDAiXM732pYFbvrWXYn0sogSE6YaJI4EVNTe1k/HB4RLgO3SfjL3V0QlJjYlYCbwHeDrwXuClzRakuWAAkQbJ+OVbZ9O+NNnyrbuZGA6uoexlMHX7EuwepvkPByvWxzJmFiZGmDh3JTmwVGwrOFxG9zCxMcdcG1/SgIi4LWVX898BTibzYw1XpDliAJF65cDyrQfTvrRyknu4lokjC78GLmTq9qVtpG0zs1VNxl7D9Fd2GqV+LssexgeHyymrO3WbjL0lxxb2qlmShlTEicBHKR+E3YvMixquSHPIACJNV2lfai3fOtv2pSVdbr21fGtnQLiY6bUvLfjlW3sp1scSyojDdMPEKPW/2y2MDw4X0T1MbAR22u4kaehFPAb4DPBp4Jlkbmu4Is0xA4iGR8QhHJj/MJv2pamWb93C+HCwGbiU6bUv7bR9aX5UoxOHMv0wcSTld97pBsYHhw3Aj+keJjblmJPiJWkWvkSZaP5R/zYuTAYQDY6yfOvBtC+tmuTWdzBxZOFKyhvM6bQvDfXyrb0U62MxZanY6YaJUepX3trO+ODwU+Bs6sPEBuBaRyckqQcyrwM+0nQZmj8GEPVG3Pgp9MG0Ly3rcuut5Vs7A8IvmF770jbSTc2aEutjBdMPE0dSwkfnRPr9TAwMl9A9TGzMsbxuPh+XJEmqZwDR9JTdp1cz+/altXRfvvUG6kcWfsP02pd2uHxrf6iWil3D9MPEKCWYdtrFxJWdvkv3+RNbc8zXgCRJg8AAovEiVgHvB45hfHg4bJJr7WLiyMI1lM3Kpm5fcvnWvhXrYykzW9lplIlBMynzYdpHIb7PJJOxcyx3zefjkiQ1LOI2wGV2IAwnA4g63QX4E+CzwA+YXvuSy7cOgGoy9mpmNhm7Lnhez/jQcBVlqd9uk7E355h/YCRJlYiTgA8BY8A/NVyNGmAAUafR6vTPybyq0Uo0qVgfh1CWip3JZOylNTe1jfGh4Ud0DxMbgB1OxpYkzVjZTPetwIuBU4H3NVuQmmIAUaeR6nRTo1UMoVgfhzKzMHFEzc3sZWJg+Cndw8SmHHMES5I0zyKOAU4D7gm8EHi37dfDywCiTiPAdtuqDk41Gftwph8mjgRW1NzUDiau7HQO9WFiA7DN0QlJUl+JOAH4BGVZT9ZRAAAgAElEQVTRmQeS+e2GK1LDDCDqNIqjHxPE+ljGzMLECBM3LdxPeW7bg8Ov6B4mNuaY+4tIkgZYxLOBfwW+DjyFzGuaLUj9wACiTiOUN8ELVjUZu7VU7HRXeKrbxHAP41ubfgN8jy5hAtiSY7lvvh6XJEl96DzgjcDrSP8GqjCAqNMIAzYCEutjCQeWgJ1qz4nWad1rfwvjg0P7yk4TJmXnWO6ctwclSdJCkHkh5e+pdCMDiDqNApc3defV6MQqZhYm1tbc1A2MDw5XU1Z36rb3xCaXipUkSZp/BhB1GgEumKsbi/WxmLJa03TDxJHAspqbupbxweGnwDfpPn9iu5OxJUmS+o8BRJ0mbcGK9bGCmYWJI4DouJl91X20j0L8gu5hYlOO5XVz8ugkSdLcilhOumiKps8AogMigklWwYr18Q7gRTVn7WJ8mLgUOJfu8ye25ljun+vyJUlSj0U8HDiFiMeSeW7T5WgwGEDUbjXlNdFtFazfB74K/AMHwsTGHMtdvSlPkiT1hYhFwGuAMeCLlE4GaVoMIGo31S7oRwGn5Vh+qUf1SJKkfhMxAnwceDglgLyBtLNB02cAUbvR6nRCAKlWp1pHWU1KkiQNo4h7AGdQVqx8BJlnNlyRBlDnTs0abq0RkLoWrFXASuC3vStHkiT1jYjnAGcD1wDHGz40WwYQtZusBeuo6tQREEmShtNNgA8C9yfzsqaL0eCyBUvtRoE9ZO2k8nXVqSMgkiQNpzeS7rGlg+cIiNqN0H0FrNYIiAFEkqRhZPjQHDGAqN1kmxCuA64HtvauHEmSJC00BhC167oJIWUE5Ooc89MPSZIkzZ4BRO2masGy/UqSpIUq4r5EfIGIlU2XooXNAKJ2U7VguQKWJEkLTUQQ8SLgLGA1Zel9ad4YQNRuqhYsR0AkSVpIIlYBpwLvAN4FPJjMa5otSgudy/Cq3VQtWG44JEnSQhFxR+CTwM2Bk8g8veGKNCQcAVFR+j1XUDMCEusjKC1YjoBIkrQQRJwEnAck8PuGD/WSAUQtk+2CvhZYigFEkqTBF7EYeBnwOeBeZF7ccEUaMrZgqaUVQOpasFq7oDsJXZKkQZe5j4iHAdvdXFBNMICoZbIREHdBlyRpIcm8tukSNLxswVLLaHVqAJEkSdK8MYCoZQTYC9R9IrIO2A3s6GlFkiRJWnAMIGopmxDW94IeBfw2x+wTlSRpIETctdpcUOo7BhC1TLYLupsQSpI0KCJOBs4BnkHE8qbLkToZQNQy2S7o63AFLEmS+lvEMiLeC3wEOA34AzL3NFyVNIGrYKllql3Qv9PDWiRJ0kxEHAucAdwFeA7wQZfYVb9yBEQtU7VgOQIiSVI/ing48D1KN8MfkPkBw4f6mQFELbUtWLE+FgE3wTkgkiT1n4gjgU9ROhWOJ/P8hiuSpmQLllq6tWCNAIsxgEiS1H8yNxBxP+AHZO5vuhxpOgwggoglwGHUt2Ctq05twZIkqR9lfr/pEqSZsAVLUEY5wF3QJUmSNM8MIIIDAaSuBasVQBwBkSRJ0kEzgAgmHwFZB2zPsdzVw3okSVJLxG2JuHvTZUhzxQAiKCtgQfcWLNuvJElqQsSJwHeBtzZdijRXDCCCMgKSwJaa89wDRJKkXos4hIg3AZ8Bvgo8oeGKpDnjKliCEkC2kLmv5rx1OAIiSVLvRNwEOBV4IPBy4J/cWFALiQFE0GUTwspRwE97WIskScMr4r7A6ZQ9uB5C5lkNVyTNOVuwBN03IQRbsCRJ6o2I3wfOAn4JHGf40EJlABGUADJhBCTWxyGU0RFbsCRJmn/nA88HHkzmlU0XI80XA4igewvWkUBgAJEkaf5l7ifz/WTe0HQp0nwygAi6t2Ctq05twZIkSdKcMIAIurRgcWAXdEdAJEmSNCcMIMMuYjFwBJMHkGt6V5AkSQtYxE2JWNl0GVKTDCBaS5nn0a0Fa0uO5XW9LUmSpAUo4kHA94G/a7gSqVEGkC4iYmlEvCUiroiIXRFxTkQ8dJrXfWhEfDUiNkTEloj4TkT86XzXPEsj1Wm3ERDbryRJOhgRQcQrgK8APwTe0nBFUqMMIN19BHgJ8DHgRcBe4AtRNgjqKiIeA3wJWAKMAX8D7AI+GhEvnteKZ2e0Ou0WQJyALknSbEWsAT5FCR1vBv6QTFubNdTcCb1GRNwTeDLwssx8e3XsY5RPLf4BuN8kV38BcCVwQmbura77r8DFwDOAd8xf5bPSGgHp1oLlCIgkSbMRcVfgk5Rl7U8k8z8brkjqC46A1HsiZcTj/a0DmXkd8EHgPhFxzCTXPQzY0gof1XX3Ud7g756fcg9KK4BsrjnPFixJkmYj4o+Bc4CdwPGGD+kAA0i9uwE/y8wdHcfPbTu/m68Dd46I10fEbSLi1hHxGuB4+rPncxTYTub1NeetwxYsSZJm4yKqDy7JvKTpYqR+YgtWvaOBq2qOX0VZMeqmk1z39cCtgL8FXl0d2wk8ITM/N5dFzpHaTQhjfSyjLM/rCIgkSTOVeRnwwqbLkPqRIyD1VgB1S8/uaTu/m+uBnwGnA38CPBX4LvBv1dySftNtE8KbVKcGEEmSJM0ZR0Dq7QaW1Rxf3nZ+N+8G7pmZx7UORMTpwI8oE9DvM1dFzpFR6gPIuurUFixJkiTNGQNIvauob7M6ujq9su5KEbEEeBYdcz0yc29EfBF4QUQc0j5BvYu3R8S2jmOnZuapU5c+YyPAb2qOt3ZBdwREkqQ6EctIN+tdyCLiKcBTOg6vaaKWhcQAUu8C4EERsapjIvq9gazOrzNCeU4X15y3hNLytpiywtZkXpqZ35tZybM2Qv3jOYryWDf0qA5JkgZHxD2A/yDihWT+V9PlaH5UH/6O+wA4Io4Dzm+mooXBOSD1zqAEiee2DkTEUso+Hudk5hXVsZtHxO3brncNsBV4XEQc0nbdVcCjgZ9k/31S0m0OyDpgY45NOVojSdLwKLuaPxc4m7KIyw8brkgaOI6A1MjMc6t5G2+KiHXALyjh41jgmW0X/RjwAKogl5n7I+Ifgb8DvhMRH6U8x88GjgFe0bMHMR0RQZkDUrcJoXuASJLULmIl8B7g6cB7gZfagiXNnAGku6dRgsSfAocDFwJ/lJlnt10mgf3tV8rMN0bEL4EXA6+lTGa/kLIM72d6UfgMrKa8BupGQI7CCeiSJBURt6V0SNwOOJnMjzVckTSwDCBdZNmY75XVV7fLnNDl+CeAT8xTaXOptQt6txasy3pYiyRJ/Sni0ZSuhw3Avci8qOGKpIHmHJDhNlqd2oIlSVJ3NwG+BtzD8CEdPAPIcJtqBMQWLEmSMj8IPJ7MziXyJc2CAWS41QaQWB8rgcNwBESSpCIzmy5BWigMIMNtFNhD5q6O461d0A0gkiRJmlMGkOE2Qv38j1YAsQVLkiRJc8oAMty6bUJ4VHXqCIgkaeGLuCMRXyRiZOoLSzpYBpDhNkr3ALKvy3mSJC0cEScB51I2G17bcDXSUDCADLfJWrCuybHcX3OeJEmDL2IJEW8HTgM+D9yTzEsarkoaCm5EONxGgJ/VHHcPEEnSwhVxDCV43At4EfDPrnIl9Y4BZLh1a8FyDxBJ0sIUcQLwCeAG4AFkfrvhiqShYwvWcOvWguUIiCRpofpL4IfAcYYPqRmOgAyriJXACrpPQj+rtwVJktQT/wfYTebepguRhpUBZHh12wU9sAVLkrRQZW5vugRp2NmCNbxaAaSzBWsVsBJbsCRJkjQPDCDDq3YEhAObEDoCIkmSpDlnABleo9VpZwBZV506AiJJGjwRxxLxyqbLkNSdAWR4jQB7gWs7jrdGQAwgkqTBEvFw4HvAnxMxOtXFJTXDADK8RoBNNRsvHQVcD2ztfUmSJM1CxCIiXgt8EfgOZYndumXmJfUBV8EaXpNuQphj7ggrSRoAESPAx4BHAGPAG8jc32xRkiZjABlebkIoSRpsEccDn6Ss4PgIMs9suCJJ02AAGV6lBWsi9wCRJPW/iOXA54DLgQeSeVnDFUmaJueADK9uLViOgEiS+l/mHuCRwP0NH9JgMYAML1uwJEmDLfMHZF7XdBmSZsYAMrwmtGDF+ghswZIkSdI8MoAMo4ilwGFMbMFaCyzFERBJkiTNEwPIcDqiOu1swWptQugIiCSpeRE3IeK+TZchaW65CtZwGqlOO0dA1lWnjoBIkppVgsd/ANcScRcy9zVdkqS54QjIcOoWQFojIAYQSVIzIoKIFwFnAZcCDzV8SAuLAWQ4jVandS1Yu4EdvS1HkiQgYhXw78A7gHcBDybzymaLkjTXbMEaTiNAAls7jq8Dfptjmb0vSZI01CLuAHwKuDlwEpmnN1yRpHliABlOI8CWmiFt9wCRJPVexK2A84BfA79P5sUNVyRpHtmCNZxGqd+E0D1AJElN+BXwl8C9DB/SwmcAGU4TNiGsOAIiSeq9zCTz/WQ6B1EaAgaQ4TRZAHEERJIkSfPGADKcJrRgxfpYBNwER0AkSZI0jwwgw6luBGQEWIwBRJI0HyLWEHFE02VIap4BZDjVBZDWJoS2YEmS5lbEXYHvAu9puhRJzTOADJuIxcARTAwg66pTR0AkSXMn4mTgHGAn8LcNVyOpDxhAhs9aIKjfBR0cAZEkzYWI5UT8C/AR4DTgPmRe0nBVkvqAGxEOn5HqtG4EZHuO5a4e1yNJWmgijgXOAO4KPBf4AJnZbFGS+oUBZPiMVqd1c0Bsv5IkHZyIewP/BWwH/oDM7zZckaQ+YwvW8GmNgNS1YNl+JUk6WL8APgMcZ/iQVMcRkOHTCiCbO46vwxEQSdLBytwIPLvpMiT1L0dAhs8osJ3M6zuO24IlSZKkeWcAGT4jTGy/AluwJEmS1AMGkOEzYRPCWB+HUEZGHAGRJE0tYmnTJUgaXAaQ4TPKxBWwjqTsDWIAkSRNLuK2wHlEPLPpUiQNJgPI8KlrwXITQknS1CJOBM4HVlankjRjBpDhM6EFi7ICFjgCIkmqE3EIEW+mLK/7VeAeZF7YcFWSBpTL8A6fuhas1gjINT2uRZLU7yLWAacCDwReAfyju5pLOhgGkGESEdS3YK0DtuRYXtf7oiRJfSvivsDplPcLDyHz680WJGkhsAVruKym/BGpGwGx/UqS1OkI4BLg7oYPSXPFEZDhMlqd1gUQJ6BLksbL/DwR/2XLlaS55AjIcBmpTutasBwBkSRNZPiQNMcMIMOlFUBswZIkSVIjDCDDxRYsSZIkNcoAMlxGgN1k7modiPWxDDgcR0AkafhEHEPEfxJxbNOlSBoeBpDhUrcJ4U2qUwOIJA2TiBOA7wHHcaBFV5LmnQFkuEy2CaEtWJI0DCKCiFcC/wNcRFli93sNVyVpiBhAhku3TQjBERBJWvgi1gCfBt5cfT2czA3NFiVp2LgPyHCpa8E6CkjAP0CStJBF3BX4JHAk8BgyP9dwRZKG1IIIIBFxa6A1ge6yzPxlk/X0sRHgZx3H1gEbcyz3NlCPJKl3XgDsoIx6+HdSUmMGOoBExCOAtwG37zh+MfCXmfmlRgrrX6NMbMFyDxBJGg4vASBzd8N1SBpyAxtAIuJhwOcob55fD/ykOuuOwP8FPh8Rj8zM/2moxH7UrQXLCeiStNAZPCT1iYENIMDrKKHjfpl5bfsZEfF24OzqMgYQgIiVwAomBpB1wGW9L0iSJEnDaJBXwbob8KHO8AFQHfsQcPeeV9W/Wmu824IlSZKkxgxyALkeWDPJ+YdVl1HRCiC2YEnSQhQxQsRriBjkv+2ShsAg/yf1NeBFEXFc5xkRcTfgRcBXe15V/5oQQGJ9rARW4wiIJA22iHsA5wMvBm7dcDWSNKlBngPyCuDbwLkR8Q3gp9Xx2wP3BzYDr2yotn40Wp22t2C5CaEkDbKIAJ4DvAu4AHgAmb9utihJmtzAjoBk5i8o80DeD9yK8h/wc6rv/xW4e3UZFSPAXmB727FWALEFS5IGTVlc5BTgfcAHMHxIGhCDPAJCZl4B/DlAlE+ByMxstKj+VZbgHf/8HFWdOgIiSYMk4raUXc1/B3gamR9vuCJJmraBDiDtDB5TGqV+Avq+muOSpH5VJpl/ClgO3IvMixquSJJmZGACSES8B0jghZm5v/p5KpmZL5jn0gbFCBOX4F0HXJNjub+BeiRJs5G5n4g/Aa4gc1vT5UjSTA1MAAEeD+wHXlKdPp4SSCaTgAGk6LYLuu1XkjRoMn/cdAmSNFsDE0Ay86jJftaURikrpLRzDxBJkiT11MCughURN4mIpZOcvzQibtLLmvpctxYsR0AkSZLUMwMbQICrgCdOcv7jqsuosAVLkgZFxCoiTmi6DEmaDwPTglUjpjh/CVPPERkOZaToMMbvgh7YgiVJ/SfijpQldkeJuBWZO5suSZLm0kAFkCibLq1qO3RYlzartcAT8NP9liOq0/YWrFXACnyOJKl/RJwEfAi4jLKxoOFD0oIzaC1YL6e0VV1FGd14d9vP7V8/AU6k7Ayr0n4F41uwWpP4HQGRpKZFLCXi/wGnAf9J2d/j4oarkqR5MVAjIMBXgb2U9qvXA2cAP+i4TAI7gfMz85u9La9vjVan7QFkXXXqCIgkNSniGOA/gHsCLwTejZvrSlrABiqAZOY3gG8ARMShwKmZeWGzVQ2E1ghIewtWawTEACJJTYlYC5xP+XDtAWR+u+GKJGneDVoL1o0y86/nM3xUy/i+JSKuiIhdEXFORDx0Btd/ckR8KyJ2RMSWiDg7Ih40X/VOYYQyMrS17dhRwPUdxyRJvZS5FXglcJzhQ9KwGKgRkDoRcTxwHLCGiYEqM/Ots7zpj1B2W3878AvgGcAXIuJBmfmtKWp6HfAa4HTgFMqKXL8LHDPLWg7WKLCFzH1tx9YBV+eYw/yS1KjMjzRdgiT10sAGkIhYA3wWuD9lTkhyYGnebDs24wASEfcEngy8LDPfXh37GPBD4B+A+01y3XtTwsdLM/OdM73veVK3CaF7gEiSJKnnBrYFixIE7gU8C7gTJXA8Grgr8GHgAuDYWd72Eyn9uO9vHcjM64APAveJMmGwm5cAV7XCRzVXpWndNiF0BSxJkiT11CAHkEcD78sydL2hOrYnM3+Ymc8GLgfeNMvbvhvws8zc0XH83Lbzu3kwcF5EvDgiNgDbI+LKiHjBLGuZC6NMDCDrcAREkuZfxDIi1k19QUkaDoMcQA4HLqq+b23U1D7a8EXgUbO87aMp+4l0uooy0nLTuitFWc1klNKi9XrgjcBJwPeBd0XEc2ZZz8GyBUuSmhBxLPBN4HQiYqqLS9IwGOQAchXVXhaZuYcyCnKXtvPXcWBOyEytAK6rOb6n7fw6rV3ajwCenZlvz8wzgD8Gfgy8epb1HKxxLVixPoJqEnpD9UjSwhfxCOB7lA+mXureHpJUDHIA+Sal3anlDOAVEfGyiHg58FLgrFne9m5gWc3x5W3nd7sewA3AJ1sHs/zROQ24WUTcbJY1HYzOFqy1wFIcAZGkuRexiIgx4AvAOcDxZJ7fcFWS1DcGdhUsyvK4j4yIZdUE8THg9ziw6tW5lB1lZ+Mq6tusjq5Or+xyvc2UUZItOfGTrmuq08Mp81Mm8/aI2NZx7NTMPHWK600Usbi6z7pNCB0BkaS5FDECfBx4OOXv0hvI3N9sUZJmKyKeAjyl4/CaJmpZSAY2gGTm9ylzK1o/bwTuF2Wi377q59m6AHhQRKzqmIh+b8rSvhd0qSkj4gLgHhFxSGbubTu7tXLWhpqrdnppZn5vNoXXWEtpRWsfAWlNhnQERJLmSsTtgDMp7biPIPPMhiuSdJCqD3/HfQAcEccBjmoehEFuwaqVmVe3wscUy+VO5gxKOHtu60BELKVsRnhOZl5RHbt5RNy+47qnAYuBp7dddznwVOBHmdnrN/0j1Wl7AGmNgBhAJGnuXA58jbKrueFDkroY2BGQyVSh4JXA/+HAvI1py8xzI+J04E3ViEprJ/RjgWe2XfRjwAMYH+TeB/xf4N1VHb8GTgZuTpmM3muj1WlnC9ZuoHOZYUnSbGXuYvzfCElSjYELIBHxO8CfAbcBtgCnZ+YXq/N+l7L87WMorVKnH8RdPQ34O+BPKXMoLgT+KDPPbrtMAuN6ezNzT0ScQNko8ZmUpYEvAB6Vmf9zEPXMVt0IyDrgtznmiiySJEnqrYEKIBFxD8rwdvt+H0+PiL+gjEK8nbJ87j8Db8/My2Z7X5l5PWUU5ZWTXOaELsc3UnZo7wetALK57Zh7gEiSJKkRAxVAKCuK7AMeB3wDuBXwfsqGf4cC/wKsz8zOXb+H2ShwLSVQtRyFK2BJ0sxFHALsd2UrSZq9QZuEfh/g3Zn52czcnGVd9ZdSlkN7b2a+yPAxwbhNCCvrcAREkmamzAk8E3hV06VI0iAbtAByOHBxx7GfVKeuOFKvLoA4AiJJMxFxX8qu5ncCzp7i0pKkSQxaAAlKC1a71s/ddicfdqO0rYAV62MRcBMcAZGkqUUEES8CzgJ+SVli96yGq5KkgTZoc0AAHhYRa9t+PpSyGtWJEXGHzgtn5nt6Vll/GgF+0/HzYgwgkjS5iFXAB4AnA28DXkXmDc0WJUmDbxADyNNp2+SvzQtrjiVgABm/c3trE0JbsCSpm/KB1qcoezg9icwzGq5IkhaMQQsgd2y6gAE0rgWLMgEdHAGRpMmspSzrfg8yf9p0MZK0kAxUAEn/CMxMRDBxErojIJI0lcxziDje5XYlae4N2iR0zcxqSsjsDCDbcyx3NVOSJA0Iw4ckzQsDyMI2Wp22BxD3AJEkSVJjDCAL20h12j4H5CgMIJIkSWqIAWRhawWQzhYs539IGm4Ra4g4lYjfa7oUSRo2BpCFzRYsSeoUcVfgu8AjObAyoCSpRxZMAImIZVFWfdIBI8BuctyEc0dAJA2viKcB5wA7gOPJPLPhiiRp6Ax0AImIu0bEZyJiG7ATOKE6PhoRp0XE/ZqtsHHjluCN9XEIZVTEERBJwyViGRHvBT4KfAK4L5mXNFyVJA2lgQ0gEXFPyqdYxwGfAW4c/cjMjcAxwPOaqa5vjDK+/epIyvNkAJE0PCKOBb4JPBN4DpnPInN3w1VJ0tAaqI0IO7wJuAS4F7ASeFrH+f9Tc2zYjDBxBSywBUvScHkm5QOZPyDz/KaLkaRhN7AjIJTg8YEs8xuy5vzLgaN7W1Lf6dwFvTXZ0hEQScPk74HjDB+S1B8GOYDsm+L8m1LmhQyzzhas1gjINQ3UIknNyNxL5pamy5AkFYMcQM4FHld3RkSsAE4GvtHTivpPXQvWlhzL6xqqR5IkSUNukOeAvA74akR8Cji1OnbHiLgp8ArKJPQnNVRbv6hrwbL9SpIkSY0Z2BGQzDwbOBG4O3BadfidlCUW1wAnZub3GyqveRErgRW4C7qkhS5iJRGvJmJZ06VIkqY2yCMgZOZ/R8RtgHsCv0MJVJcA52Tm3kaLa95IddreguUIiKSFJeK2wBnA7SirH57TbEGSpKkMbACJiEMzc2dm7qf8wfGPznitANI5AvKDBmqRpLkXcSLwEWADcC8yL2q4IknSNAxsCxZwTbXb+eMjYnnTxfSh0erUFixJC0vEIUS8ibIJ7VeBexg+JGlwDHIA+VfgvpSh92si4uMR8eiIWNJwXf1iXAtWrI9lwOHYgiVpkEWsA86kLDbyCuAJZG5rtihJ0kwMbADJzJdm5s2BB1Imnj8E+CwljJwSEY+IiMWNFtmsEWAvsL36+SbVqQFE0iD7CHAn4CFkvpXMuo1oJUl9bGDngLRk5jeAb0TEC4EHAU8GHk/ZB2QzcGRz1TWqLMF74I9zaxNCW7AkDbIXALvJvLLpQiRJszPwAaQlyxvtr0XEJcBlwKuAI5qtqlGjTFwBCxwBkTTIMi9pugRJ0sFZEAGk2nzwpOrrXkAC3+LA/iDDqHMTwqMoz8uGZsqRJEmSBjiARJmI+ERKy9V9KfNZvgO8DDg9M69osLx+UBdANubY0O+PIkmSpAYNbAABrqCEju8DfwOclpmXNVtSXxmlPDctbkIoqf+VlQwfQOZXmi5FkjQ/BjmAjFFCxy+aLqRP1Y2AOAFdUv+KOIbSOns8Ebcm86qmS5Ikzb2BDSCZ+Yama+hznQFkHWVyviT1n4gTgE8ANwAPNnxI0sI1MAEkIk4CyMz/aP95Kq3LD5WIpcBhjF8F6yjKHBlJ6h8RQdlQ8I3A14GnkHlNozVJkubVwAQQyidjGRGfyczrq5+nksDwBZADyw/bgiWpf0WsAT4MPJYSQF5L5r5Ga5IkzbtBCiB3BKjCx40/q9ZIdboJINbHSmA1TkKX1C/KZPNvAzcFHkPm5xquSJLUIwMTQDLzp5P9rHFGq9NWC5abEErqL5k3EPF64Dw3F5Sk4bKo6QJmKyJ+HBF/NMn5j4yIH/eypj4ybgSE0n4FtmBJ6ieZnzB8SNLwGdgAAtwBWDPJ+WuA2/eoln4zQpn/srX62REQSZIk9YVBDiBQ3mR3czdgW68K6TOjwOa2yZxHAfsYPyldkiRJ6rmBmQMCEBEvAF7QduitEfGamouupXzqP4wrYEH9JoTX5Fjub6geScMoYhGwzj09JEntBiqAANcCV1Tf3wHYwsS2ogR+CpwPvKN3pfWVuk0Ibb+S1DsRI8DHgVsRcRcyb2i6JElSfxioAJKZHwM+BhAR3wZem5lfbraqvjSKe4BIakrEPYAzgFXA/zF8SJLaDewckMy8j+GjqxHG74LuCIik+RcRRDwXOBu4BjiOzDMbrkqS1GcGZgQkIu4JkJnntv88ldblh0zdHJCzGqpF0jCIWAm8B3g68F7gpWRe12xRkqR+NDABBDgHyIhYUe2Gfg6Tr4IV1fmLe1Fcn7mxBSvWR2ALlqT5FLEO+BJwO+BkSrusJEm1BimAPBKgCh83/qwOEYuBwznQgrUKWIEtWJLmzybge8DTyLyo6WIkSf1tYAJIZgcXrRoAACAASURBVH5psp91o7WU0R93QZfUG5l7gWc1XYYkaTAM7CT0biLiphFxq6braNBoddoZQBwBkSRJUuMGNoBExJ9HxEc7jr0X+A3wi4j4VpR16IdN6zG3WrDWVacGEEmSJDVuYAMI8DzKxoQARMRDgT8DPgK8HLgTMNZMaY1qBZD2EZDrga3NlCNpQShL7A5M264kqX8NcgA5FvhR289PBi4Dnp2ZbwP+GfjjJgprWKsFa3N1ug64OsdyshXDJKm7iFXAqcDbmi5FkjT4BjmALAb2t/38h8AXM298o/1L4OieV9W8EeBaDqwWdhS2X0marYg7AOcCfwR8o+FqJEkLwCAHkJ8DjwGIiAcDNwP+u+38YxjOtqO6TQhdAUvSzEWc9P/Zu/P4qOrr/+OvMwlL2GHCVhUpKODPKggIVBRQFBeq+EWlKqCoUGsVKda9KgIK1erX1i9WBREQLS5UQKiIRQULKiiKVqviBrig7FEWWZLz+2NmYpYJCSHJnZu8n4/HfUxy13MzIdwz57MAbxKbU+lY3J8JOCIREakEwpyA/AU43cy+Bf5JLCGZn2d7L+C9AOIKWu4khHFNUQVERPaHWTXM7gOeAuYCXXH/KOCoRESkkghth0J3f8zMtgBnEKt0/J+77wEws0bALmBqcBEGJspPI2BBrAKiOVNEpGTMfgY8DXQFhgMP4OpDJiIiZSe0CQiAu88l9ulcwfWbiSUmVVGU2FDE2Ggz4p3QA41IRMKkLtAI6IH760EHIyIilU+oExAAM6sJHEdsVCyIjYS11N13BRdVoKLAyvjXDYDqqAmWiJSU+8eY/QL3nOJ3FhER2X+hTkDMbBjwJ2IP2hZf7cBWM7vR3ScFFlxwMvmpCVZiFnRVQESk5JR8iIhIOQptAmJmFwAPA28D/wd8GN90BHAV8JCZ/eDuTwYUYsUzM/KPgpVIQFQBEREREZGUENoEBLgeWAqc6O5786xfbmZPAIvi+1SdBCTWdjudnxKQpvFXJSAiIiIikhLCPAxvO+CpAskHAPF1TxKrhlQliVnQ8zbB2glsCyYcEUk5ZjUwewCzXkGHIiIiVVOYE5AfiE0+WJRD4vtUJdH4a94KyLc+SkNoighgdiix2cyHsu+/nyIiIuUmzAnI88DVZnZ2wQ1m1o9YP5B/VnhUwSqYgDRDza9EBMDsVGJ95poA3XF/POCIRESkigpzH5AbgO7AP8xsDbAqvr4NsSF5PwNuDCi2oCSaYOVNQDQClkhVZhYBbgVGAS8Ag4jNlSQiIhKI0FZA3P07oANwM7AWaBtf1gI3AcfE96lKosBO3HfEv2+KKiAiVZdZlFgleFR8+ZWSDxERCVqYKyC4+3bgrvgi+YfgBVVARKq6c4AuwOm4Lwg6GBEREQhhAmKxT/QGAT8n9rD9rLt/EGxUKSN3EkIbbRFibb1VARGpuiYBs3FfH3QgIiIiCaFKQMysBbAcaMxPM5/famYXuvvM4CJLGXkrIFEgDSUgIlWXuwNKPkREJKWErQ/I7UBDYh3QOwPnE3vAvt9is4BXdclmQVcTLBERERFJGaGqgAA9gEnufk/8+7fNbCcwm9ikg/8NLLLUkAl8HP9as6CLiIiISMoJWwWkBfBWgXVvEWuO1bjiw0k5qoCIVCVm6Zhdi1m9oEMREREpqbAlIOnA7gLrEt+nVXAsqahgAvKDj8odkldEKhOzJsACYqMA9go2GBERkZILWxMsgPZmtjXP9/UAB7qYWc2CO7v78xUWWZDMagEZxEfBQnOAiFReZscBzxD74KU37ouCDUhERKTkwpiAXBdfChqX52sn1izLqTqVkWj8NW8FRAmISGUSG2xjOHAvsAwYgPs3wQYlIiKyf8KWgJwedAApLFkCov4fIpWFWR3gEeDXwH3ADbjvCTYoERGR/ReqBMQ1k+++ZMZfEwlIU+CjgGIRkbL3V6AvsarHM0EHIyIiUlph64QuRUtUQBJ9QFQBEalcbgGOVfIhIiJhF6oKiOxTFNgL/GCjLZ1YRUR9QEQqC/d1wLqgwxARETlQqoBUHpnAJtyd2JwohhIQEREREUkxSkAqjyj5m1+BmmCJiIiISIpRAlIEM6tuZneZ2ddmtsPM3jCzk0txnn+ZWY6Z3V8eceaRdxLCpvFXVUBEwsLMMOsddBgiIiLlTQlI0aYBvwemA1cT61/xvMUmACsRM+sPdCM2H0l5izXBiklUQNZXwHVF5ECZ1QeeBRZidlTQ4YiIiJSnUCcgZtbczP5iZu+a2TozOz6+Pmpmd5vZ0aU8bxdiY+3f6O43uvsjQG9gDXB3Cc9RA7gH+BOx/hjlrWATrC0+yndVwHVF5EDE/k69BZwInIX7fwKOSEREpFyFNgExszbAu8ClwGagCVAdwN03AacCV5Xy9OcSq3hMSqxw913AZOCXZnZQCc5xA7HE455SxrC/CjbBUvMrkVRnNhh4A9gOdMJ9bsARiYiIlLvQJiDEKhE7gXbAeRSuMswDepby3B2AVe6+rcD65Xm2F8nMWhBLQK6PJy4VoWATLHVAF0lVZjUwexB4DHgK+CXunwUclYiISIUI8zwgvYBx7v6NmUWTbF8NlKRSkUxzko+3v45YovOzYo6/F3jbK2rCMLPqQF3yN8FSBUQkFZkZ8DzQHRgGTI4Pny0iIlIlhDkBSQcKVijyigJ7SnnuDCBZ5eLHPNuTMrMTgf8BupTy2qXRKP6atwnWygq8voiUlLtj9hfgetxXBB2OiIhIRQtzE6x3gT7JNphZGrFO5MuTbS+BnUCNJOtr5tle1HX/Cjzm7m+X8tqlkagAqQmWSBi4z1XyISIiVVWYKyB/AuaY2X3Ak/F1DeMjYd0CHEURCUoJrCN5M6vm8ddvijjuYqAN8BszOzS+LtE3pW583Xp3T5rA5HGfmWUVWDfD3WcUsX9m/HWjjbYaQEPUBEtERETkgJjZBcAFBVbXDyKWyiS0CYi7zzWz3wD/S2yeDoCn4687gGHu/nIpT78S6GVmdQp0RE/M6VFU86ZDgGrAawXDJZacXESsedZzxVx/5H5WUPJWQJrEv1YCIiIiInIA4h/+5vsA2Mw6AqpiH4DQJiAA7v6ImT0DnAEcRqxJ2WfA8+6++QBOPRO4FkgkOFiso/cQ4A13/zq+7hCglrt/HD9uBvBOkvPNBv4JTKT0zcL2JUosydkKtIqvUxMskaDEOpo3xV0fBIiIiBQQ6gQEwN2zKJCZlsE5l8cTm/Fm1hT4lFjycShwSZ5dpwM9iPelcfdVwKqC54s9i/CFl98Y/5nAZtyzGW1N4+v04CMSBLNawAPA6Zi1JfY3SkREROJCm4CYWZPi9wJ3X1/KSwwGxgKDiPWpeA/o6+5L854eyClJGPGlvOSdhLBZ/FobyvF6IpKMWWvgH8T6gl2u5ENERKSw0CYgxD7hL8lDfVppTu7uu4lNJnjDPvY5sYTnKlUM+6FgArLRR/necr6miORldhaxiQU3AF1x/0/AEYmIiKSkMCcgv6NwApIGtAQGAl8Dkys4pqBk8tMkhE1R8yuRimOWDowBbgJmAZeo8iEiIlK00CYg7v5QUdvM7A5gGeGe52R/RIFER3jNASJSUczqAHOAXsD1wD2a1VxERGTfKuUDurt/T6z6cW3QsVSQgk2wVAERqRjbiSX/vXH/s5IPERGR4oW2AlICTvLJBCujgk2w3ggwFpGqI5Zw/C7oMERERMKk0iUg8fk6ehCrfrwXcDjlzyyN2ChdeSsgaoIlIiIiIikptAmIme0k+ShYNQAj1gzpqgoNKhgNiN3vJhtttYC6qAmWiIiIiKSo0CYgwF8pnIA4sIXYbOjz4kPpVnaZ8deNxJpfgRIQkbJlloZ7dtBhiIiIVAZhTkBuA7JdDwXR+OsmYs2vQE2wRMpGrEnn3cBBmA1QJ3MREZEDF8pRsMysJrADuC7oWFJA3gREFRCRsmJ2EPAKcCXwasDRiIiIVBqhrIC4+49m9h2xJKSqSzTBSlRAsvmpQ7qIlIbZicCTwB6gJ+6vBRyRiIhIpRHKCkjc48BAi81CXJVFge9x30MsAVnvozwn4JhEwsnMMLsBWAi8D3RU8iEiIlK2wvzw/gbQF3jXzB4FVgM7C+7k7s9XcFwVLe8khE1R8yuR0jGrD0wD+gHjgVvV8VxERKTshTkB+Ueer/9cYJsTG5rWgbQKiygYeSch1BwgIqVXC2gH9MP9uaCDERERqazCnICcHnQAKSJvBaQZ8FGAsYiEl/s6zI5U1UNERKR8hSoBMbMewIfuvsHdFwQdT4qIAl/Gv24KLAouFJGQU/IhIiJS7sLWCf0V4JSgg0gxmcRmQTfUBEtEREREUlzYEhALOoAUFCXWB6QOkIE6oYuIiIhICgtbAiJ5mRk/9QHRLOgi+2IWwWwUZucFHYqIiEhVFsYExIMOIIXUI9aPJ28CogqISEFmUeCfwCjg5wFHIyIiUqWFqhN63ONm9ngJ93V3D+M9llQ0/rqRWAd0UAIikp/ZscBMYs0UT0cDWIiIiAQqjA/nC4FVQQeRIhIJyCbgCGA3sDW4cERSSKyJ4m+A+4F3gR64rwk2KBEREQljAjLN3f8edBApIjP+mmiC9Z2PcjVREzGrBTwIXBR/HYn7rmCDEhEREQhnAiI/yVsBaYqaX4kknAScB1yE+/SggxEREZGfhLETuvwkCuzEfQeaA0TkJ+7zgNZKPkRERFKPEpBwSwzBC7EERBUQkQT3dUGHICIiIoWFqgmWuythyi+T2AhYoCZYIiIiIhICeqAPtyiwyUabEUtA1ARLRERERFKaEpBwSzTBagBURxUQqSrMDLPfYtY86FBERERk/ygBCbdEE6zELOiqgEjlZ1YHmEFseN1+AUcjIiIi+ylUfUCkkEQFJJGAqAIilZvZEcA/gEOAAbg/E3BEIiIisp9UAQm3RALSNP69EhCpvMwGAG8CDhyr5ENERCSclICEVWym5wx+aoK1E9gWaEwi5cGsOmZ/AZ4CngO64v5RwFGJiIhIKSkBCa+8s6A3A771Ue4BxiNSXm4BfgcMBwbirkRbREQkxNQHJLzyJiCaA0Qqs3uAebgvDzoQEREROXBKQMIrM/6aaIKlEbCkcnL/HlDyISIiUkmoCVZ4qQIiIiIiIqGjBCS8osBe4AdUARERERGRkFACEl6ZwEa7HQOaoAqIhJlZL8ws6DBERESk/CkBCa/EHCBRIA0lIBJGZjUwexB4BTgl6HBERESk/KkTengVnAVdTbAkXMwOBWYCRwFDcX8x4IhERESkAigBCa9MfhoBC1QBkTAxOxX4O/A90B33FQFHJCIiIhVETbDCK1EBaRr/XhUQSX1mEcxGAfOBN4BOSj5ERESqFlVAwitvE6wffJTvCDgekZJ4FLgIuA0Yh3tOwPGIiIhIBVMCEl6JJljNUfMrCY8pwN/V30NERKTqUgISRmbVgbrEKiAdUAIiYeG+OOgQREREJFjqAxJOjeKviSZY6v8hIiIiIqGgBCScMuOvG4l1QlcFRERERERCQQlIOEXjr6qASOoxa1r8TiIiIlJVKQEJpyjAfzPZSqwaogqIBM8sHbPxwCeYtQg6HBEREUlN6oQeTpmA97mIaoChBESCFqt6zAB6AjcCXwYbkIiIiKQqJSDhFAU2f12PJvHv1QRLgmN2HPAMkAb0xn1RsAGJiIhIKlMTrHDKOwkhqAIiQTAzzK4GFgOfAx2VfIiIiEhxlICEUyaxBCTR2Xd9gLFIVWSWRqzJ1V+B+4GTcP8m2KBEREQkDNQEK5yixIbgbQZs8VG+K+B4pKpxz8bsC2AA7s8EHY6IiIiEhxKQcIoCH6M5QCRI7jcFHYKIiIiEj5pghVOiCZbmABERERGRUFECEk55m2CpAiIiIiIioaEEJGxinX8b8lMndCUgUn7M9DdCREREypQeLsKnAbHJB9UES8pPbIjdG4AXMVNfMRERESkzSkDCJxNgQy2yiFVCVAGRsmVWH5gF/AlYBniwAYmIiEhlok82wycKsOCw3O+VgEjZMTsa+AfQGDgL97kBRyQiIiKVjCog4RMFmNOWavHv1QRLyobZRcAbwDagk5IPERERKQ9KQMInE+BfrakZ/14VEDkwZjUwewiYBjwJHIf7ZwFHJSIiIpWUmmCFTxT4PqsmmcTa5m8IOB4Jv5rAccAwYDLu6vMhIiIi5UYJSPhE+WkErI0+yvcGHI+EnXsWZh1x/S6JiIhI+VMTrPDJJDYJoeYAkbKj5ENEREQqiBKQ8MlbAVEHdBEREREJFSUg4ZM3AVEFRERERERCRQlI+KgJluyf2Kzmv8HsiqBDEREREVECEj5qgiUlZ1YLmAI8DLQLOBoRERERjYIVKmYGRL+vzvdAXVQBkX0xO4zYrOaHAxfhPj3giERERERUAQmZekD6qiiJEYuUgEhyZv2AFUAG0FXJh4iIiKQKJSDhEgV4t1nu+6YmWJKfWTpm44HZwEvAsbj/J+CoRERERHIpAQmXKMA7zXObzqkCIgUdA1wDXAecg3tWwPGIiIiI5KM+IOGSCbCyGTWAbGKd0UV+4v4mZq1w/zroUERERESSUQUkXKIA/21MHWC9j/KcgOORVKTkQ0RERFKYEpBwiQI7t2QQRc2vRERERCSElICES2ISQs0BIiIiIiKhpAQkXPJOQqgKSFVldh5mbYIOQ0RERKQ0lICESyIBaYoSkKrHrBpm9wFPAxcFHY6IiIhIaWgUrHDJdNgAHIeaYFUtZgcBTwFdgOHAA8EGJCIiIlI6SkDCJboznc+IzW6tCkhVYXYi8CSwB+iJ++sBRyQiIiJSamqCVQQzq25md5nZ12a2w8zeMLOTS3BcfzN70sw+M7PtZvaRmd1jZvXLIKzo+trsjn+tBKSyMzPMrgcWAu8DHZV8iIiISNgpASnaNOD3wHTgamAv8LyZHVfMcQ8D7eLHDQfmA1cBr5lZjQOMKfPL+mTHv1YTrMpvKHAX8CegD+7rA45HRERE5ICpCVYSZtYF+DXwB3e/L75uOrFPoe8Gjt/H4ee4+6sFzvc2sYRmIPBoKYOqBdT8rGHuGlVAKr/HgM9wfznoQERERETKiiogyZ1LrOIxKbHC3XcBk4FfWqxDcFIFk4+4WfHXIw4gpijAJ1HSgd3A1gM4l4SB+y4lHyIiIlLZKAFJrgOwyt23FVi/PM/2/dE8/rrxAGLKBPikETWB73yU+wGcS0REREQkEEpAkmsOrEuyfh1gwM/283w3EKuozDyAmKIAnzWiNmp+JSIiIiIhpQQkuQxgV5L1P+bZXiJmdiFwKXCPu392ADFFAdY0oD7qgF55mP0SM/XFEhERkSpDCUhyO4FkI1bVzLO9WGZ2AvAIsZGwbjnAmKLA3s0ZZKIKSPiZRTAbBSwFBgcdjoiIiEhF0Sevya0jeTOrRF+Ob4o7gZm1B+YA7wHnuXvOflz/PjPLyrviZth1J2x0oylKQMLNLAo8DpwKjCI2QpqIiIikGDO7ALigwOqymNutSlMCktxKoJeZ1SnQEb0b4PHtRTKz1sALxBKFM9x9x35ef6S7v13gpH912AS0QU2wwsusM7G+QHWA03B/MeCIREREpAjuPgOYkXedmXUEVgQTUeWgJljJzSSWnP0mscLMqgNDgDfc/ev4ukPMrG3eA82sKfAisU7np7n75jKKKbonQhZQDVVAwic2q/lviDW5Wk9sVnMlHyIiIlLlqAKShLsvN7NngPHxhOJTYsnHocAleXadDvQgfyK3AGhJbMLCE8ws76m/c/eFpQwr84cabE+cp5TnkOCMIdYP6EFgJLF5ZURERESqHCUgRRsMjAUGAQ2J9eXo6+5L8+zjQMG+HUfFX69Pcs7FQGkTkOjmjNzKhyog4fMMsAr36UEHIiIiIhIkJSBFcPfdxObvuGEf+5yYZF1aOYUU/bYOX8e/VgISNu7vEUtiRURERKo09QEJj8wv6wGxIYALztAuIiIiIhIKSkDCINYBvu7aBrEO6D7KPeiQRERERERKQwlIODQCWFOfGqj5Veoyyww6BBEREZFUpwQkHDIBVjegNhoBK/XEhti9GliDWYegwxERERFJZUpAwiEK8HU96qMKSGoxq0NsgqK/Ag8DHwQbkIiIiEhq0yhY4RAFWFeHhqgCkjrMjgD+ARwCDMD9mYAjEhEREUl5qoCEQ6ZDzpYMGqMKSGowGwC8SWwumGOVfIiIiIiUjBKQcIg6bM2OkIYSkOCZ3Qs8BcwFuuL+UcARiYiIiISGEpBwiO5O4/v412qCFbzvgKuBC3HXnCwiIiIi+0F9QMIhc1t1tse/VgUkaO53Bx2CiIiISFipAhIO0aya7I5/rQqIiIiIiISWEpBwiG6oxV7gBx/lO4IORkRERESktJSAhEPmurqAml9VHDP92xAREREpB3rICofoN3VJRwlIxTC7CFiKWa2gQxERERGpbJSApDqzNKDhV/Woifp/lC+zGpg9CEwDPiI2x4eIiIiIlCGNgpX6GgL2ZT1qowpI+TE7FJgJHAUMAybjrgREUpKZtQAyg45DRKQS2ujua4MOorJTApL6ogDr6lIPVUDKh9mpwN+B74HuuK8IOCKRIplZi0gk8nFOTk7NoGMREalsIpHIj2bWVklI+VICkvqiAN/VoT6qgJStWEfzW4FRwHxgMO6bgw1KpFiZOTk5NR9//HGOOOKIoGMREak0PvzwQwYNGlSTWIVZCUg5UgKS+jIBNtTCUAJS1qoBpxFLQO7EPSfgeERK7IgjjqBjx45BhyEiIrLflICkvijA5gxATbDKlvsuzHrgvifoUERERESqCo2ClfqieyLs2JsGqAJS9pR8iIiIiFQoJSCpL3NnOtvjX68PNBIRERERkQOkBCT1RbNqsgvY4qN8V9DBiIiIiIgcCCUgqS+6OYNs1PyqdMzOwuzmoMMQERERkRglIKkvur42oA7o+8csHbNxwBygU3zIXRERkUJ69epFJKL/JkQqiv61pb7MdXVJQxWQkjNrAiwArgeuA87VELsildudd95JJBIhEonwySefFLnfkCFDiEQiPPbYY0XuM3r0aCKRCGPGjEm6ffPmzYwdO5bu3bvTuHFjqlevTmZmJj169GD8+PGsX1+y7nrTpk3LjbmopVWrViU6V1HWrFlDJBLh0ksvPaDzVHZmFkgCUtnen3nz5tGrVy8aNGhA3bp16dat2z7/rRVl27Zt/PGPf+SII44gIyODRo0acdppp/Hyyy8n3f+FF15g+PDhHHPMMTRq1IiMjAzatWvHyJEjS/zvUSqWhuFNfdFv6igBKTGz44BngDSgN+6LA45IRCrA5MmTiUQiuDuTJk3i7rvvTrqfmWFmxZ6vqH3mzZvHoEGD+OGHHzjssMPo378/TZo0ISsri2XLlnHrrbcyfvx4Pv30U5o0aVKi2Dt06MDZZ5+ddFuDBg1KdA45MNOnT2fHjh1BhxFqEyZM4OqrryYzM5PBgwdTvXp1Zs6cyZAhQ3j//feL/DdZ0NatW+nevTsffvghv/jFL7jiiivYtm0bc+bM4eSTT2by5Mlccsklufvv2rWLM844gxo1atCjRw9OOeUUsrOzefnll/nrX//Kk08+yZIlS2jdunV53bqUghKQVBb7HzC6ri67UROsfYv9rIYD9wJvAL/G/ZtggxKRirBgwQJWr17NJZdcwvz585k2bRrjxo0jPb30/8W5e6F1ixcvpn///lSrVo2pU6cyePDgQvt88MEHjBgxgh9//LHE1+rQoQO33XZbqWPdl2T3IYUdfPDBgVy3srw/a9as4brrriMajbJixQoOOeQQAG677TY6d+7MvffeyznnnEPXrl2LPdeoUaP48MMPOffcc3nyySdzK1Pjxo2jU6dODB8+nFNPPZWf/exnAKSlpXHnnXfyu9/9jvr16+c71xVXXMHDDz/MNddcw5w5c8r4ruVAqAlWaqsHpK+rQy1UASlOS+BPwP3ASUo+RKqOSZMmYWYMGzaMgQMHsnHjRmbNmlWm13B3Lr/8crKzs7n//vuTJh8ARx55JAsXLuSggw4q0+sntGzZklatWrFjxw6uu+46Dj30UGrWrMnhhx9e6BPm0aNH06pVK8yMqVOn5mvalWgWs3jx4tzmZm+++SZ9+/YlGo2SlpbG2rVrc8/19ddfc9VVV9G6dWtq1qxJZmYm/fr146233ioU4+23304kEuHVV19l5syZdO3aldq1axONRrngggv45pvCf57ffvttRowYQYcOHYhGo2RkZNCmTRuuvfZatm7dWmj/RPO1xx57jH/961/06NGDunXr0qRJEy699FKysrIAeOeddzjzzDNp1KgRdevWpV+/fqxZs6bQ+fbVB2TBggWcccYZNG7cmJo1a3LYYYdx/fXX516jPN8fiP3uPfTQQ3Tp0oW6detSp04dunTpwkMPPZQyCczkyZPZvXs3w4cPz00+AOrXr8/NN9+cew8lMXv2bMwstylkQmZmJtdccw07d+7k0UcfzV2fnp7OTTfdVCj5AHIT+0WLFpXyzqS8qAKS2qIAm2oBSkD2zf0LzNrhvrb4nUWksli/fj1z586lbdu2dOvWjbp163LvvfcyceJEzjvvvDK7zuLFi1m1ahUHH3xwidrrp6Wlldm18zIz9uzZw6mnnsq6des444wzSE9PZ/bs2dx4443s2rWLW2+9FYATTzyRrKws/vKXvxRq5tWhQ4d8533ttdcYN24cJ5xwApdddhkbN26kevXqQCw56NOnD1u3buXUU0/lnHPOYePGjcyePZvjjz+e2bNnc9ppp+WL0cx44IEHmDt3LmeddRa9evVi2bJlPPXUU7z33nusXLmSatWq5R4zadIkZs+eTc+ePTnllFPIyclhxYoV/O///i8vvPACy5Yto3bt2oV+FnPmzGHevHmceeaZXHHFFbz22mtMnTqVNWvWMG7cOHr37k2PHj0YOnQo//nPf5g7dy5ffPEF7733ZF9NxQAAIABJREFUXqFzJWt2N3r0aEaPHk00GuVXv/oVTZo04b333uOee+5h/vz5vP7669SpU6dc359BgwYxY8YMWrRowbBhwzAzZs2axe9+9zuWLl3K9OnTi/mtKX+vvPIKAKeeemqhbaeffjpAkf03Cvr229jjTrL+T61atcLdeemll7jllluKPVfid+xAqqFSPvSOpLZYApIBqAlW8ZR8iFQ5jz76KHv27GHIkCFArALRqVMnXnnlFT7//PMD7sSdsGTJEiD2SXlJ+pDsj5UrVzJ69Oik27p161booe6bb76hQ4cOLFy4kBo1agCxT3rbtGnDfffdx80330xaWho9evTg0EMPzX3A3Vczr3/96188/PDDDB06NN/67OxsBgwYwI4dO1i0aBHHH3987rZx48bRuXNnLrvsMlavXp0voXB3FixYwFtvvcX/+3//L3f9wIEDefLJJ5kzZw7nnntu7vqbb76Zv/3tb4V+tlOmTOGyyy7jb3/7G9ddd12+be7O3Llzefnll/PF1adPHxYuXEjfvn155JFHOP/883O3DR06lClTpjB37lzOPPPMIn8eEHuoHj16NN27d+f555+nbt26udsee+wxhgwZwqhRo7j33nvzHVeW78+MGTOYMWMGnTp14tVXXyUjI/ZAcMcdd9CjRw/+/ve/07dv33z3WJR3332X2bNnF7tfXiNHjqRevXrF7vfxxx8D0KZNm0LbmjVrRu3atfnqq6/48ccfqVmz5j7PlZmZybfffssXX3xBu3bt8m37/PPP812vOJMnTwZ+SoIkdSgBSW2ZABtVARGRA7Rjzw4+2vhRhV+3XWY7alWrVW7nf+SRR0hLS8vXJGrIkCGsWLGCSZMmMX78+DK5zrp16zCzcukr8O677/Luu+8m3TZixIiknyrff//9uQ+3AI0bN6Zfv35Mnz6djz/+ON9Df0l06NChUPIB8M9//pPPP/+c6667Lt9DPsQeLK+//npGjhzJSy+9lK8Kkoi9YBzDhg1jxowZLF++PF8CkrfZTl5Dhgxh5MiRLFiwoFACAnDhhRcWimvw4MEsXLiQo446qtCD+UUXXcSjjz7KypUri01A7r//fsyMiRMn5ks+Euf5y1/+whNPPFEoAUkcWxbvz6OPPoqZ8ac//Sk3+QDIyMjgrrvu4uSTTy6UZBVl5cqVRY7sVpRLLrmkRAlIojlasmZQifU7duwgKyur2AQkkTiOGjWKGTNm5DbD2rBhA/fddx8AW7ZsKTamN998kzFjxlCvXj3Gjh1b7P5SsZSApLYowOZaOLAh4FhEJMQ+2vgRnSZ2qvDrrvjNCjo271gu537ppZf4/PPPOf3002nevHnu+gsvvJA//OEPTJ06lTvuuKPcmkOVlYsvvjhfm/bi1K9fn5///OeF1ice4kvycFZQly5dkq5//fXXAVi9enXSKs0nn3yCu/Phhx8WaobVqVPh37eiYty7dy8PPfQQTz31FP/973/JysoiJ+en0dO//vrrpPElu0aic3LHjoV/7xJ9c7766quk58vrjTfeoFq1ajz99NNJt+/evZsNGzawZcsWGjZsmLu+LN+fd955h0gkQs+ePQtt69mzJ2lpabzzzjslOtfFF1/MxRdfXOJrB2XMmDG8+OKLzJw5kw8//JDevXuzfft25syZw8EHH8zatWuLHTJ51apVnHnmmezdu5enn3466fshwVICktqieyLs2VmNrT7K9wYdTODMegE7cF8edCgiYdMusx0rfrMikOuWl4kTJ2JmhR6qGjZsyJlnnsmzzz7LnDlz6N+/f+62xINL3ofbgnJycgrNC9G8eXPcvcgH4YpU1NC8iXbu2dnZ+33OZs2aJV2/adMmAGbOnFnksWbGtm3bCq1PFmdRMQ4YMIDZs2fTunVrzj77bJo1a5ZbQbjvvvvYtWtX0usm+8Q9cY19bduzZ0+R95OwadMmsrOz91k1SNx73gSkLN+frKwsGjVqlLQPQ1paGpmZmWzYEPznk/Xr12fTpk1kZWXl+1kkFFchyatZs2a8+eabjB07lnnz5vHggw+SmZnJBRdcwNVXX81hhx22zyGuV61axYknnsjWrVt56qmn6Nu3b+lvTMqNEpDUlvl9DXZR1ZtfxRoFXweMBx4HlICI7Kda1WqVWyUiCBs3bswdVvP8889P2gQl0XwmbwKSeABKPFgXdW7I/yCZaOazaNEi3L3M+4EEraj7qV+/PmbGc889V24PcitWrGD27Nn06dOH559/Pl/i5+7cdddd5XLd4tSvXx93z/19CCqGzZs3k52dXaiSl52dzcaNG0vURArKtw9I27Ztee2111i1alWhoXa//fZbtm/fziGHHFJs86uExo0bc//993P//ffnW5/o7F5UxS5RMdmyZQszZ87kV7/6VYmuJxVPCUhqi26tyV6qcgd0s/rAVOBsYBxQPoPli0ioTJ06ld27d9O5c+dCIzolzJkzh4ULF7JmzRoOPfRQANq3b4+75zYtSiaxrX379rnrevbsSdu2bVm1ahVTpkzZ50hY7k52dnZKjLyTeGgtTVUEYp3g3Z1XX3213BKQTz/9FIAzzzyzUNOaZcuWsXPnznK5bnG6devG888/z4cffsgRRxxRLtco7v055phjePnll3n11Vc58cQT821bvHgx2dnZSZuhJVOefUBOOukkli5dygsvvFAoAXn++ecB6N27935dO5lp06ZhZlx44YWFtv3nP//h5JNP5ocffmDWrFmF+iRJatE8IKktuqEqd0A3Oxp4CzgROAv3P+Jeuv9FRaRSeeSRRzAzHnzwQSZOnJh0ufzyy8nJyeGRRx7JPe5//ud/qF+/Ps8991zSYUGnTJnCypUrOeyww/J1bjYzHn74YdLS0hg+fDhPPPFE0rj++9//0qdPn6RzXQShYcOGmFm+OT32R79+/WjdujUPPPAA8+fPT7rPG2+8sV8TLxbUsmVLoPBcDevXr+eqq64q9XkP1MiRI3F3hg0bxrp16wpt37FjB8uWLTugaxT3/lx66aW4OzfddFO+RGznzp3ceOONmBmXXXZZia518cUXk52dvV9LixYtSnTuSy65hBo1ajBhwoR886xs2bKFcePGYWZcfvnl+Y75/vvv+fjjj3OH3U1wd7Zv317oGtOnT2f69Ol0796dfv365du2cuVKTjzxRLZv385zzz2n5CMEgv94RvYl87s6pFEVExCzwcDDwCrgNNw/CzgiEUkRixYtYtWqVbRv336fn/5edtll3HnnnUyZMiV3UrN69eoxdepULrjgAvr06cNpp53G0UcfTXZ2NsuXL2fx4sU0bNiQJ554olCzpB49ejBr1iwGDx7M4MGDGTt2LL169aJx48ZkZWXx1ltvsWzZMurWrZtvxKLivPPOO0UOwwuxmaFLq3bt2nTt2pV///vfDBo0iDZt2pCWlka/fv34xS9+Uezx6enpPPvss5x22mn07duX4447jg4dOlCrVi2+/PJL3nzzTb744gvWrVtX4uY1BR177LF0796dZ599lu7du3P88cfz3XffMX/+fNq1a5fbqbyg8p6E76STTuKuu+7ipptu4vDDD+eMM87g5z//Odu2bWPNmjUsXryYE044IfcT/tIo6v0566yzOOqoo7jggguYM2cOzzzzDEceeSRnn302Zsbs2bNZvXp1kc0PK1rLli3585//zIgRI+jcuTO//vWvqV69OjNnzuTrr7/m2muvLVQZmTVrFpdccglDhgzJNwjDjh07aNq0KaeccgqtW7cmEomwdOlSXn/9dY488shCgwJs3bqV3r17574uXbqUpUuXFoqxpM3JpIK4u5YUWYCOgAMd3R2HlQ92Yje3c23QsVXoAmc4uMMUh4zA49GiJYWWxN+JFStWeFU1cOBAj0QiPmHChGL37dOnj0ciEZ89e3a+9R988IFfeuml3qpVK8/IyPDatWt7u3btfMSIEb527dp9nnPz5s1+xx13ePfu3T0zM9OrV6/u0WjUu3fv7uPGjfMNGzaU6D6mTp3qkUhkn0taWlq+Y1q2bOmtWrVKer7bb7/dI5GIL168ON/6zz77zM866yzPzMz0tLQ0j0QiPm3aNHd3X7RokUciER8zZsw+Y92wYYPfdNNNftRRR3nt2rW9bt263qZNGz/vvPP873//u2dnZxcbh7v76tWrPRKJ+KWXXppv/ZYtW/zKK6/0n//8556RkeGHHXaY33LLLb5z586k95z42SXuI6993VNR1+/Vq1ehn3XC0qVL/de//rUfdNBBXqNGDW/SpIkfc8wxfu211xb6d1jW70/Cgw8+6Mcee6zXrl3ba9eu7Z07d/YHH3ww6XWCNG/ePO/Vq5fXq1fP69Sp4126dPHp06cn3TfxHhZ8L/bs2eNDhw71du3aeZ06dbxOnTp+zDHH+J/+9CffuXNnofMk3tPiljVr1hQb/4oVKzzfc1gxf4eL209L0YvFf5CSAsysI7AC6OTub+eYfXVHDw4adRKDfZQ/HnR8FcYsApwGzEe/oCL5JP5OrFixIukwoyIiUjpvv/12oqrayd3fLmq/gs9rFRVfZaImWKkts0pOQuieA5S+pi0iIiIiKUud0FOVWa0I1NgUS0Cq7ihYIiIiIlKpKAFJXVGATbF+jFWrAiIiIiIilZYSkNSVCbCpFtlA0TNmhZVZB8xqBR2GiIiIiFQsJSCpKwqwtSabfJTnBB1MmTEzzH4DLAP+EHQ4IiIiIlKxlICkrlgTrFoUnv0orGIVjynE5veYDNwdbEAiIiIiUtE0ClbqytwTwbfWrCQJiNlhwEygDXAR7tMDjkhEREREAqAKSOqKZtVgr1sl6IBu1g94C6gNdFXyISIiIlJ1KQFJXdFNlWEOELPfArOBV4DOuP8n4IhEREREJEBKQFKUQ+Z3dUgj/HOAzAeuAfrjnhV0MCIiIiISLPUBSVF7IjTZUIsIYa+AuK8B7gs6DBERERFJDaqApKi9EZpqEkIRERERqWyUgKQog8yNsT4gYW+CJSIiIiKSSwlIikrPoUFoOqGbNQo6BBEREREJByUgKagJpFfLIWNLBnuBrUHHs09mA4DVmJ0SdCgiUnXdeeedRCIRIpEIn3zySZH7DRkyhEgkwmOPPVbkPqNHjyYSiTBmzJik2zdv3szYsWPp3r07jRs3pnr16mRmZtKjRw/Gjx/P+vXr9xnrtGnTcmMtyZKWllayH8IBmDBhApFIhGeffbbcr7W/Nm7cyJVXXsmhhx5KzZo1adGiBb/97W+L/Tkn88ILL9CnTx8aNWpERkYG7dq1Y9SoUezcubNEx994442578vy5cv3+/oiEqNO6CnoGKgP8H0Ntvoo96DjScqsGrGZzH8PPAm8HmxAIlKVTZ48mUgkgrszadIk7r777qT7mRlmVuz5itpn3rx5DBo0iB9++IHDDjuM/v3706RJE7Kysli2bBm33nor48eP59NPP6VJkyZJz9GhQwduv/32fOtWr17N1KlTadmyJUOGDClRLGWppD+Xivbdd9/RrVs31q5dy6mnnsqgQYN47733mDhxIvPnz+f111/nZz/7WYnOde+993LdddeRkZFB//79ad68OcuWLWPs2LEsWLCAV155hYyMjCKPX7JkCffccw9169Zl27ZtZXWLIlWSEpAU1AoaAGytwYagY0nK7CDgKaArcDUwAU/RRElEKr0FCxawevVqLrnkEubPn8+0adMYN24c6eml/y8u2Z+0xYsX079/f6pVq8bUqVMZPHhwoX0++OADRowYwY8//ljkudu3b0/79u0LnTuRgNx2222ljru0UvVP+DXXXMPatWsZNWpUvp/L+PHj+eMf/8jvf/97nn766WLPs3r1am666SYyMjJYvnw5Rx55ZO62W265hXHjxnHnnXdyxx13JD1++/btDBkyhN69e1O3bl1mzZp14DcnUoWpCVYKahqvgGzJSMH+H2YnAm8DLYEeuP9fyv7PJSJVwqRJkzAzhg0bxsCBA9m4cWOZPyC6O5dffjnZ2dncf//9SZMPgCOPPJKFCxdy0EEHlen181qyZAlnn302zZo1o0aNGrRs2ZLhw4ezYUPhz6w++eQTLrnkElq3bk1GRgaZmZm0b9+eq666KvdT/GOPPZarr74agHPPPTdf06/NmzeX230UZ/PmzTzzzDM0atSIm266Kd+26667jqZNmzJr1qwSNcWaO3cue/fu5fzzz8+XfADcfvvtZGRk8PDDD5OdnZ30+N///vds2rSJyZMnp2SlSCRslICkoIbxBGRDbb4KOpZ8zEYCC4H3gY64q9mViARq/fr1zJ07l7Zt29KtWzeGDBmCuzNx4sQyvc7ixYtZtWoVBx10EJdeemmx+5dXv40JEybQs2dPFi1aRJ8+fRg5ciQdOnTgb3/7G127ds2XhKxZs4bOnTvz5JNP0rFjR0aOHMmgQYNo0aIFU6ZMyU0uLr/8cs444wwABgwYwO2335671KpVq1zuoyT+/e9/s3fvXnr16kW1atXybUtPT6d3797k5OSwePHiYs/17bffYma0atWq0Lb09HQOPvhgNm/ezMqVKwttnzdvHpMnT+a+++7j4IMPLv0NiUguNcFKQXWhYbbBt3VYG3QsBWQBdwG34p78YyIRkQr06KOPsmfPntx+E0ceeSSdOnXilVde4fPPP0/6wFkaS5YsAaBXr16BfQL+7rvvMnLkSH7xi1/w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XcjMzOTLL7/kueeeY/v27Tz44IN07969Im9NpGoLOgPS8tNCPKN+E/zaU/i03K8JnRxWO2x06BP0/WvRoqX4BVVAcj8VnzBhQrH79unTxyORiM+ePTvf+g8++MAvvfRSb9WqlWdkZHjt2rW9Xbt2PmLECF+7du0+z7l582a/4447vHv37p6ZmenVq1f3aDTq3bt393HjxvmGDRv2+54WLVrkkUjETzrppGL3feedd3zw4MHeokULr1GjhmdmZvrRRx/tw4cPz1cBWbJkiV9++eV+9NFHe6NGjbx27drepk0bv/zyy33VqlWFzvvcc895165dvU6dOh6JRDwSifimTZv2+17K2oYNG/zKK6/Mvd+DDz7Yr7jiCv/uu++S7p+ZmelpaWmFYv/HP/7hvXr18iZNmniNGjX8oIMO8oEDB/rKlSv3Kx5VQCovVUAqbrH4D1JSgJl1JD5OzcO/YtnDc71beV0IGApMAN4FzsN9TblcS0TKVO7fiRUr6FiJOpWLiATt7bffTlRVO7n720Xtl/g7XNx+UrTCQztISvihRrl2QDfgf4DJwAlKPkRERESkoqgPSIraWoOvyu3k7jmYnY377nK7hoiIiIhIEqqApKhv61C+VQklHyIiIiISACUgKerzRnwedAwiIiIiImVNCUgK+qEaZNXkm6DjEBEREREpa0pAUtDWmsCBzoJu9kvMxpdFPCIiIiIiZUUJSArKis359F2pDjYzzK4GXgWOx6xW2UUmIiIiInJglICkoB9qku2jfMd+H2hWB5gB/BX4P+AkvBTnEREREREpJxqGNwVtS+fH/T7I7AjgH8AhwADcnynruEREREREDpQqICloezrb9+sAswHAm/HvjlXyISIiIiKpShWQFLQjnR9KvLNZA+BBYC4wDPdt5RWXiKSODz/8MOgQREQqFf1drThKQFLQ9jS2lHhn962YdQLW4O7lF5WIpIiNkUjkx0GDBtUMOhARkcomEon8mJOTszHoOCo7JSApaEeEzft1gPvq8olERFKNu681s7ZAZtCxiIhUNjk5ORvdfW3QcVR2SkCKYGbVgbHAIKAh8B5wi7svLMGxPwP+ApxCrJ/NK8BId/+iJNfebqUcgldEqoT4f476D1JEREJJndCLNg34PTAduBrYCzxvZsft6yAzqw0sAk4A7gBuA44BFplZw5Jc+HtnXenDFhER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","arguments":{},"addedWidgets":{},"removedWidgets":[],"datasetInfos":[]},"errorSummary":null,"error":null,"workflows":[],"startTime":1520366013299,"submitTime":1520365907083,"finishTime":1520366014206,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{},"streamStates":{},"nuid":"ed5f31e6-e755-4746-987e-29d5a5f7e893"},{"version":"CommandV1","origId":1240587378362213,"guid":"6e2074d9-8b8f-47b6-8968-bfe4a1ac9bc4","subtype":"command","commandType":"auto","position":27.0,"command":"%md \n___\n## Conclusión\nComo se ha visto, es muy sencillo la carga de datos en RDD/dataframe, modificación de los distintos campos y preparación para los modelos.\n\nA modo de ejemplo, aunque no se ha utilizado en la tarea, se podría escalar todas las columnas en el dataframe de la siguiente manera:\n```python\nscaler = StandardScaler(inputCol=COL_FEATURES[0], outputCol='scaled'+COL_FEATURES[0], withStd=True, withMean=True)\nscalerModel = scaler.fit(dataframeEnsamblado)\nscaledData = scalerModel.transform(dataframeEnsamblado)\nscaledData.select(COL_FEATURES[0], 'scaled'+COL_FEATURES[0]).show(3)```\n\nDespués se pueden crear modelos de predicción y clasificación con distintos algoritmos. Si se quisiese utilizar otro algoritmo, bastaría con cambiar la clase ya que todas tienen la misma interfaz. De hecho, se podría utilizar un bucle con distintos algorimos y quedarnos con el mejor de ellos.","commandVersion":1,"state":"finished","results":null,"errorSummary":null,"error":null,"workflows":[],"startTime":0,"submitTime":1520365907089,"finishTime":0,"collapsed":false,"bindings":{},"inputWidgets":{},"displayType":"table","width":"auto","height":"auto","xColumns":null,"yColumns":null,"pivotColumns":null,"pivotAggregation":null,"customPlotOptions":{},"commentThread":[],"commentsVisible":false,"parentHierarchy":[],"diffInserts":[],"diffDeletes":[],"globalVars":{},"latestUser":"a user","commandTitle":"","showCommandTitle":false,"hideCommandCode":false,"hideCommandResult":false,"iPythonMetadata":{},"streamStates":{},"nuid":"4ce57b59-b6f2-4b8a-b70b-015ef41f296a"}],"dashboards":[{"version":"DashboardViewV1","origId":1240587378362251,"guid":"e155ea99-f65b-427c-91bf-5c87101bfd1e","nuid":"3e0c8d1d-5171-4f49-98b2-3e8b92731ced","title":"ML Students PySpark","width":1024,"layoutOption":{"stack":true,"grid":true},"elements":[],"globalVars":{}}],"guid":"18a86ef6-569b-4737-b765-1f0ebc11740c","globalVars":{},"iPythonMetadata":{"nbformat":4,"IPythonMetadata":{"kernelspec":{"display_name":"Python 2","language":"python","name":"python2"},"language_info":{"mimetype":"text/x-python","name":"python","pygments_lexer":"ipython2","codemirror_mode":{"name":"ipython","version":2},"version":"2.7.14","nbconvert_exporter":"python","file_extension":".py"}}},"inputWidgets":{}};</script>
<script
src="https://databricks-prod-cloudfront.cloud.databricks.com/static/7f9cefa92f0da43a505f7213ef5a6bb5d4a409ec4e0540a0a55701946063455d/js/metrics-graphics.js"
onerror="window.mainJsLoadError = true;"></script>
<script
src="https://databricks-prod-cloudfront.cloud.databricks.com/static/7f9cefa92f0da43a505f7213ef5a6bb5d4a409ec4e0540a0a55701946063455d/js/notebook-main.js"
onerror="window.mainJsLoadError = true;"></script>
</head>
<body>
<script>
if (window.mainJsLoadError) {
var u = 'https://databricks-prod-cloudfront.cloud.databricks.com/static/7f9cefa92f0da43a505f7213ef5a6bb5d4a409ec4e0540a0a55701946063455d/js/notebook-main.js';
var b = document.getElementsByTagName('body')[0];
var c = document.createElement('div');
c.innerHTML = ('<h1>Network Error</h1>' +
'<p><b>Please check your network connection and try again.</b></p>' +
'<p>Could not load a required resource: ' + u + '</p>');
c.style.margin = '30px';
c.style.padding = '20px 50px';
c.style.backgroundColor = '#f5f5f5';
c.style.borderRadius = '5px';
b.appendChild(c);
}
</script>
</body>
</html>