{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\nimport os\nprint(os.listdir(\"../input\"))\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"07952b03ae868231da7889a432e7d34c38467424"},"cell_type":"markdown","source":"# my first eda \nPlease tell me if I make mistake  \n## Contents\n* [metadata_train/test.csv](#metadata_[train/test].csv)  \n    * [Overview](#Overview)\n    * [check null](#checknull)\n    * [check target](#checktarget)\n    * [check metadata](#checkmetadata)\n* [train/test.parquet](#[train/test].parquet)\n    * [train.parquet](#train.parquet)\n        * [Overview](#p-Overview)\n        * [check waves](#checkwaves)\n    * [test.parquet](#test.parquet)\n"},{"metadata":{"trusted":true,"_uuid":"9d706354da6dfc0da0c173efe616d7df0cf2fb2a","_kg_hide-input":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\n%matplotlib inline\nimport seaborn as sns\nimport pyarrow.parquet as pq\nimport gc","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true,"scrolled":true},"cell_type":"code","source":"train_meta_df = pd.read_csv(\"../input/metadata_train.csv\")\ntest_meta_df = pd.read_csv(\"../input/metadata_test.csv\")","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"9a02df3f21ac3af0f5a18dc3e98336561cf70de7"},"cell_type":"markdown","source":"<a name=\"metadata_[train/test].csv\"></a>\n# metadata_[train/test].csv\n* id_measurement: the ID code for a trio of signals recorded at the same time.\n* signal_id: the foreign key for the signal data.\n* phase: the phase ID code within the signal trio. The phases may or may not all be impacted by a fault on the line.\n* target: 0 if the power line is undamaged, 1 if there is a fault.  (only train)\n<a name=\"Overview\"></a>\n## Overview"},{"metadata":{"trusted":true,"_uuid":"a3a322109d243d59d4965fd5cc989f463a8edbc2"},"cell_type":"code","source":"print(\"metadata_train shape is {}\".format(train_meta_df.shape))\nprint(\"metadata_test shape is {}\".format(test_meta_df.shape))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7723e08f42080f4294a2b1b3519f461c20761d57"},"cell_type":"code","source":"train_meta_df.head(6)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"55c1a78af6bf914842b7bee92a72d26c79802107"},"cell_type":"code","source":"test_meta_df.head()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"18f2cef7fb0cd8b5f690d0e4a14aaf54d6d995a7"},"cell_type":"markdown","source":"<a name=\"checknull\"></a>\n## check null"},{"metadata":{"trusted":true,"_uuid":"cfc66095ae6384e0fe7ddc041b1396dc67daf1fd","scrolled":true},"cell_type":"code","source":"train_meta_df.isnull().sum()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7b4c5a8f3a33f16e480a971d9874354b232b5a94"},"cell_type":"code","source":"test_meta_df.isnull().sum()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"12cdf7eb16a555470e1efe642c7ad5bc4c3ac21c"},"cell_type":"markdown","source":"they have **no** nulls"},{"metadata":{"_uuid":"733a0cc4798ff18f0ce619957adc6f33c8141e01"},"cell_type":"markdown","source":"<a name=\"checktarget\"></a>\n## check target\ntarget: 0 if the power line is undamaged, 1 if there is a fault."},{"metadata":{"trusted":true,"_uuid":"11b4efcfb120690e143a9dfb5135631277182d11","_kg_hide-input":true},"cell_type":"code","source":"fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 4))\nsns.countplot(x=\"target\", data=train_meta_df, ax=ax1)\nsns.countplot(x=\"target\", data=train_meta_df, hue=\"phase\", ax=ax2)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true,"_uuid":"cf70b57a0535db6bafe9168ff191768684a09ac1"},"cell_type":"code","source":"target_count = train_meta_df.target.value_counts()\nprint(\"negative(target=0) target: {}\".format(target_count[0]))\nprint(\"positive(target=1) target: {}\".format(target_count[1]))\nprint(\"positive data {:.3}\".format((target_count[1]/(target_count[0]+target_count[1]))*100))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"ab7f7d585357ccb9eda70f89fdbe1add4b89b90c"},"cell_type":"markdown","source":"<font color=\"red\">  fault data is too small </font>  \nTarget is almost uniformly distributed in all phases  "},{"metadata":{"trusted":true,"scrolled":false,"_uuid":"31270cfdfc28077c2d26c1287ffe9640d0aa0ac5"},"cell_type":"code","source":"miss = train_meta_df.groupby([\"id_measurement\"]).sum().query(\"target != 3 & target != 0\")\nprint(\"not all postive or negative num: {}\".format(miss.shape[0]))\nmiss","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"b68abc73f0e548a45a64294524d1d5736c41fe80"},"cell_type":"markdown","source":"**Data with the same id is not always all positive or negative.**"},{"metadata":{"_uuid":"6f8f4af2c83607bcbcf8adac2452e410a91b72e6"},"cell_type":"markdown","source":"<a name=\"checkmetadata\"></a>\n## check metadata\n### id_measurement"},{"metadata":{"_kg_hide-input":true,"trusted":true,"_uuid":"d48d9e2d303917e28c3f278bd774bcc19d84e35c"},"cell_type":"code","source":"print(\"id_measurement have {} uniques in train\".format(train_meta_df.id_measurement.nunique()))\nprint(\"id_measurement have {} uniques in test\".format(test_meta_df.id_measurement.nunique()))","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true,"_uuid":"d736e2ad456a0adcbfa998657f72c4884240132d","_kg_hide-output":true,"scrolled":true},"cell_type":"code","source":"fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 4))\ng = sns.catplot(x=\"id_measurement\", data=train_meta_df, ax=ax1, kind=\"count\")\nlabel = list(range(train_meta_df.id_measurement.min(), train_meta_df.id_measurement.max(), 1000))\nax1.set_xticks(label, [str(i) for i in label])\nax1.patch.set_facecolor('green')\nax1.patch.set_alpha(0.2)\nplt.close(g.fig)\ng = sns.catplot(x=\"id_measurement\", data=test_meta_df, ax=ax2, kind=\"count\")\nlabel = list(range(test_meta_df.id_measurement.min(), test_meta_df.id_measurement.max(), 1000))\nax2.set_xticks(label, [str(i) for i in label])\nax2.patch.set_facecolor('yellow')\nax2.patch.set_alpha(0.2)\nplt.close(g.fig)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"9e9c51dc7d6f0370dc3978100f4e867abeca9036","scrolled":true},"cell_type":"code","source":"train_meta_df.id_measurement.value_counts().describe()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7c4e9143586861bf1bcac4bc2d0c4ecf0b127a0f"},"cell_type":"code","source":"test_meta_df.id_measurement.value_counts().describe()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"7afd6bc89f67a0c31b6a3a74d0c6ad772b4c24d9"},"cell_type":"markdown","source":"id_measurement:  3 data per one unique id  \nbecause  electric transmission lines have three-phase alternating current(maybe)  \n### phase"},{"metadata":{"trusted":true,"_uuid":"7d72103840d6c955976fde46ea91378409f78190","_kg_hide-input":true},"cell_type":"code","source":"print(\"phase have {} uniques in train\".format(train_meta_df.phase.unique()))\nprint(\"phase have {} uniques in test\".format(test_meta_df.phase.unique()))\nprint(\"they are phase numbering\")","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"f247c207ca8aa2ec9b0ad79fcf7ee76f7d4ec631"},"cell_type":"markdown","source":"# Let's look parquet data\nhow to read parquet files  \nref: https://www.kaggle.com/sohier/reading-the-data-with-python"},{"metadata":{"trusted":true,"_uuid":"198015fee473aaae1a3e5da0e55fb14fcb819ac6"},"cell_type":"code","source":"gc.collect()\nsubset_train_df = pq.read_pandas('../input/train.parquet').to_pandas()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"9d1fc2df0cc39d666447086d208903e7aee755a8"},"cell_type":"markdown","source":"<a name=\"[train/test].parquet\"></a>\n# [train/test].parquet\nThe signal data. Each **<font color=\"red\">column</font>** contains one signal; 800,000 int8 measurements as exported with pyarrow.parquet version 0.11.  \n<font color=\"red\">Please note that this is different than our usual data orientation of one row per observation; </font>  \nthe switch makes it possible loading a subset of the signals efficiently.   \nIf you haven't worked with Apache Parquet before, please refer to either the Python data loading starter kernel.  \n\n<a name=\"train.parquet\"></a>\n# train.parquet\n<a name=\"p-Overview\"></a>\n## Overview"},{"metadata":{"trusted":true,"_uuid":"8b1627d409a7018b0cbc4d3eb1eb4db39de14fd2"},"cell_type":"code","source":"nan = 0\nfor col in range(len(subset_train_df.columns)):\n    nan += np.count_nonzero(subset_train_df.loc[col, :].isnull())\nprint(\"train.parquet have {} nulls\".format(nan))\nprint(\"train.parquet shape is {}\".format(subset_train_df.shape))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7ab4850e04887b370815f0111d5b5938802a8c2c"},"cell_type":"code","source":"subset_train_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"71867716f644e84b9613ab3c7b1cbb8e45f3e996"},"cell_type":"markdown","source":"please care Each **<font color=\"red\">column</font>**  contains one signal !  \nso I do transpose this data  "},{"metadata":{"trusted":true,"_uuid":"7b07ea4671d1730b02b685132820682f66662483"},"cell_type":"code","source":"subset_train_df = subset_train_df.T","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true,"_uuid":"0dd0c6258261a0a5a82d3be3f32a77eae75e619a"},"cell_type":"code","source":"print(\"train shape is {}\".format(subset_train_df.shape))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"601ff83ea2a0cf7b46279ae5a5784df546b2fedc"},"cell_type":"markdown","source":"<a name=\"checkwaves\"></a>\n## check waves"},{"metadata":{"trusted":true,"_uuid":"a75762cbfa745713d55649b11eb7b1615e62974f","_kg_hide-input":true},"cell_type":"code","source":"fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 5), sharey=True)\nfor i in range(3):\n    sns.lineplot(x=subset_train_df.columns, y=subset_train_df.iloc[i, :], ax=ax1, label=[\"phase:\"+str(train_meta_df.iloc[i, :].phase)])\nax1.set_xlabel(\"example of undamaged signal\", fontsize=18)\nax1.set_ylabel(\"amp\", fontsize=18)\nax1.patch.set_facecolor('blue')\nax1.patch.set_alpha(0.2)\nfor i in range(3, 6):\n    sns.lineplot(x=subset_train_df.columns, y=subset_train_df.iloc[i, :], ax=ax2, label=[\"phase:\"+str(train_meta_df.iloc[i, :].phase)])\nax2.set_xlabel(\"example of damaged signal\", fontsize=18)\nax2.set_ylabel(\"amp\", fontsize=18)\nax2.patch.set_facecolor('red')\nax2.patch.set_alpha(0.2)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"7e1e90a8333d9bd73d6a3753ddf099f2f0e9c33d"},"cell_type":"markdown","source":"we can see three-phase and some noise  \nI don't see big difference  \nIs this difference is big noise?  \nso let's look more data  "},{"metadata":{"_kg_hide-input":true,"trusted":true,"_uuid":"414192f999074213847786ba4a4207b0c1fcf1f4"},"cell_type":"code","source":"neg_index = train_meta_df.query(\"target == 0 & phase == 0\").head(9).index.values\npos_index = train_meta_df.query(\"target == 1 & phase == 0\").head(9).index.values","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b2ad78d89cd568411150923328f96c6ff431da8c","_kg_hide-input":true,"scrolled":false},"cell_type":"code","source":"fig, axes = plt.subplots(3, 3, figsize=(20, 12), sharex=True, sharey=True)\nfig.suptitle(\"Undamaged examples\", size=18)\nfor x, index in enumerate(neg_index):\n    for phase in range(3):\n        sns.lineplot(x=subset_train_df.columns, y=subset_train_df.iloc[index+phase, :], ax=axes[x//3, x%3])\n    axes[x//3, x%3].patch.set_facecolor('blue')\n    axes[x//3, x%3].patch.set_alpha(0.2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"f83b4f5e77aa7279bf979f19f0db4fac8dab2094","_kg_hide-input":true},"cell_type":"code","source":"fig, axes = plt.subplots(3, 3, figsize=(20, 12), sharex=True, sharey=True)\nfig.suptitle(\"Damaged examples\", size=18)\nfor x, index in enumerate(pos_index):\n    for phase in range(3):\n        sns.lineplot(x=subset_train_df.columns, y=subset_train_df.iloc[index+phase, :], ax=axes[x//3, x%3])\n        axes[x//3, x%3].patch.set_facecolor('red')\n        axes[x//3, x%3].patch.set_alpha(0.2)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"b737dd4fa6ca1431931216dad5c7025dabfd3aaa"},"cell_type":"markdown","source":"I cannot tell them apart.  \nIs this noise or dameged?  \nDid I maked a mistake in plot.....?  "},{"metadata":{"trusted":true,"_uuid":"2da1ee53fbf3fcadd0ad1b9975cb8f2550b222cb"},"cell_type":"code","source":"del subset_train_df, fig, axes\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"8a08f6a1a6ad08a38c94152b40d1ed917fabeadf"},"cell_type":"markdown","source":"<a name=\"test.parquet\"></a>\n## test.parquet\ntest.parquet is too big (20337, 800000)  \nso I will read test data in 6 parts  \n### 1/6 (0～3389 columns)"},{"metadata":{"trusted":true,"_uuid":"f365981e6644e3779d48a6f9d345b5cc4aeefcdd","_kg_hide-input":true},"cell_type":"code","source":"INPUT_NUM = 3390\nTRAIN_NUM = 8712\nshapes = []\nnulls = 0","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true,"_uuid":"c5b2838c2e252b75ff3623a1b9e73c361c7f3bc1"},"cell_type":"code","source":"subset_test_df = pq.read_pandas('../input/test.parquet', columns=[str(i) for i in range(TRAIN_NUM + INPUT_NUM)]).to_pandas()\nnan = 0\nfor col in range(len(subset_test_df.columns)):\n    nan += np.count_nonzero(subset_test_df.loc[col, :].isnull())\nshapes.append(subset_test_df.shape)\nnulls += nan\nprint(\"1st of the six test.parquet shape is {}\".format(subset_test_df.shape))\nprint(\"1st of the six test.parquet have {} nulls\".format(nan))","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"trusted":true,"_uuid":"63074a5d22efb6fbc886b8f4f8d1586600408bdb"},"cell_type":"code","source":"del subset_test_df\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"93c117967c48d08be5b761bee2ee9134cb805383"},"cell_type":"markdown","source":"### 2/6 (3390～6779 columns)"},{"metadata":{"_kg_hide-input":true,"trusted":true,"_uuid":"244215b04efccb7893fcd3272fe0cba8696b815e"},"cell_type":"code","source":"subset_test_df = pq.read_pandas('../input/test.parquet', columns=[str(i) for i in range(TRAIN_NUM + INPUT_NUM, TRAIN_NUM + INPUT_NUM*2)]).to_pandas()\nnan = 0\nfor col in range(len(subset_test_df.columns)):\n    nan += np.count_nonzero(subset_test_df.loc[col, :].isnull())\nshapes.append(subset_test_df.shape)\nnulls += nan\nprint(\"2nd of the six test.parquet shape is {}\".format(subset_test_df.shape))\nprint(\"2nd of the six test.parquet have {} nulls\".format(nan))\n","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"trusted":true,"_uuid":"a5be4980e733218e7f7e72bed96fe3768dbb054c"},"cell_type":"code","source":"del subset_test_df\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"eeb216efd2d9a5a35febf23ff80c2513ea612b8f"},"cell_type":"markdown","source":"### 3/6 (6780～10169 columns)"},{"metadata":{"trusted":true,"_uuid":"278ee9496e6b1ca4635992148832aaec03d760fe","_kg_hide-input":true},"cell_type":"code","source":"subset_test_df = pq.read_pandas('../input/test.parquet', columns=[str(i) for i in range(TRAIN_NUM + INPUT_NUM*2, TRAIN_NUM + INPUT_NUM*3)]).to_pandas()\nnan = 0\nfor col in range(len(subset_test_df.columns)):\n    nan += np.count_nonzero(subset_test_df.loc[col, :].isnull())\nshapes.append(subset_test_df.shape)\nnulls += nan\nprint(\"3rd of the six test.parquet shape is {}\".format(subset_test_df.shape))\nprint(\"3rd of the six test.parquet have {} nulls\".format(nan))\n","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"trusted":true,"_uuid":"c2a7356c7f92c4f35dcd6970070db7556643ba16"},"cell_type":"code","source":"del subset_test_df\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"35a8a91f972cb0d0884515f83b594cf2a281b428"},"cell_type":"markdown","source":"### 4/6 (10169～13559 columns)"},{"metadata":{"trusted":true,"_uuid":"d4342670f4e9b3dbdcbff5d013dbdf93df951c63","_kg_hide-input":true},"cell_type":"code","source":"subset_test_df = pq.read_pandas('../input/test.parquet', columns=[str(i) for i in range(TRAIN_NUM + INPUT_NUM*3, TRAIN_NUM + INPUT_NUM*4)]).to_pandas()\nnan = 0\nfor col in range(len(subset_test_df.columns)):\n    nan += np.count_nonzero(subset_test_df.loc[col, :].isnull())\nshapes.append(subset_test_df.shape)\nnulls += nan\nprint(\"4th of the six test.parquet shape is {}\".format(subset_test_df.shape))\nprint(\"4th of the six test.parquet have {} nulls\".format(nan))\n","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"trusted":true,"_uuid":"c58da0151523bf230cb55c0db4100c71ace57293"},"cell_type":"code","source":"del subset_test_df\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"e23061fb07001d5752956224b853f930f6a59eb5"},"cell_type":"markdown","source":"### 5/6 (13560～16949 columns)"},{"metadata":{"trusted":true,"_uuid":"6da00ca697dc0329da93562595a83d234365995d","_kg_hide-input":true},"cell_type":"code","source":"subset_test_df = pq.read_pandas('../input/test.parquet', columns=[str(i) for i in range(TRAIN_NUM + INPUT_NUM*4, TRAIN_NUM + INPUT_NUM*5)]).to_pandas()\nnan = 0\nfor col in range(len(subset_test_df.columns)):\n    nan += np.count_nonzero(subset_test_df.loc[col, :].isnull())\nshapes.append(subset_test_df.shape)\nnulls += nan\nprint(\"5th of the six test.parquet shape is {}\".format(subset_test_df.shape))\nprint(\"5th of the six test.parquet have {} nulls\".format(nan))\n","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"trusted":true,"_uuid":"6c413838852b8c8b2724b5df9c225037a73dc422"},"cell_type":"code","source":"del subset_test_df\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"3172fa3180abae4a5b85834a615af3ab580e6077"},"cell_type":"markdown","source":"### 6/6 (16950～20336 columns)"},{"metadata":{"_kg_hide-input":true,"trusted":true,"_uuid":"1b5b415bc508d0bfd1ed0afbf82ec9bd82b16f90"},"cell_type":"code","source":"subset_test_df = pq.read_pandas('../input/test.parquet', columns=[str(i) for i in range(TRAIN_NUM + INPUT_NUM*5, TRAIN_NUM + 20337)]).to_pandas()\nnan = 0\nfor col in range(len(subset_test_df.columns)):\n    nan += np.count_nonzero(subset_test_df.loc[col, :].isnull())\nshapes.append(subset_test_df.shape)\nnulls += nan\nprint(\"6th of the six test.parquet shape is {}\".format(subset_test_df.shape))\nprint(\"6th of the six test.parquet have {} nulls\".format(nan))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"59f43b9adc695e0b424b5c75458bdc7edf8165f0","_kg_hide-input":true},"cell_type":"code","source":"print(\"train.parquet have {} nulls\".format(nulls))\nindex = 0\nfor shape in shapes:\n    index += shape[1]\nprint(\"train.parquet shape is ({}, {})\".format(index, shapes[0][0]))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"fd8476a63394de852e761d7e407aa65cde18bd9e"},"cell_type":"markdown","source":"**Thank you for watching!**  \n## In Progress\n* Make simple model\n* serch more effective feature"},{"metadata":{"trusted":true,"_uuid":"3ae3c401057407e48f28241508e2c0f3d9286804"},"cell_type":"code","source":"print(\"test\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"dbde3f1223b88bddd9a3ddd12c22a41fc0db8038"},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}