{"cells":[{"metadata":{},"cell_type":"markdown","source":"# 0. Load Data"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":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\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 read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"!pip install py7zr\nimport py7zr","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import py7zr\nfrom subprocess import check_output\n\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        archive = py7zr.SevenZipFile(os.path.join(dirname, filename), mode='r')\n        archive.extractall(path=\"/kaggle/working\")\n        archive.close()\n\nprint(check_output([\"ls\", \"../working\"]).decode(\"utf8\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train = pd.read_csv(\"../working/train.csv\")\ndf_test = pd.read_csv(\"../working/test.csv\")\ndf_sub = pd.read_csv(\"../working/sample_submission.csv\")\ndf_stores = pd.read_csv(\"../working/stores.csv\")\ndf_items = pd.read_csv(\"../working/items.csv\")\ndf_trans = pd.read_csv(\"../working/transactions.csv\")\ndf_oil = pd.read_csv(\"../working/oil.csv\")\ndf_holiday = pd.read_csv(\"../working/holidays_events.csv\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 1. Basic EDA"},{"metadata":{},"cell_type":"markdown","source":"## 1) train.csv"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train.info()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train.tail()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_columns = df_train.columns.tolist()\n\nfor i in range(0, len(train_columns)):\n    print(\"***\",train_columns[i],\"***\")\n    print(df_train[train_columns[i]].nunique(),'개')\n    print(df_train[train_columns[i]].value_counts(normalize=False, sort=True, dropna=False))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 2) test.csv\n- Test data, with the date, store_nbr, item_nbr combinations that are to be predicted, along with the onpromotion information.\n- NOTE: The test data has a small number of items that are not contained in the training data. Part of the exercise will be to predict a new item sales based on similar products.\n- The public / private leaderboard split is based on time. All items in the public split are also included in the private split.\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_test.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_test.info()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_test.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_test.tail()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_columns = df_test.columns.tolist()\n\nfor i in range(0, len(test_columns)):\n    print(\"***\",test_columns[i],\"***\")\n    print(df_test[test_columns[i]].nunique(),'개')\n    print(df_test[test_columns[i]].value_counts(normalize=False, sort=True, dropna=False))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# onpromotion true 데이터 확인\n\ndf_test[df_test['onpromotion'] == True ]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 3) sample_submission.csv"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_sub.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 4) stores.csv\n- Store metadata, including city, state, type, and cluster.\n- cluster is a grouping of similar stores.\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_stores.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_stores.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_stores.tail()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"stores_columns = df_stores.columns.tolist()\n\nfor i in range(1, len(stores_columns)):\n    print(\"***\",stores_columns[i],\"***\")\n    print(df_stores[stores_columns[i]].nunique(),'개')\n    print(df_stores[stores_columns[i]].value_counts(normalize=False))\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_stores['city'].nunique()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 5) items.csv\n\n- Item metadata, including family, class, and perishable.\n- NOTE: Items marked as perishable have a score weight of 1.25; otherwise, the weight is 1.0.\n\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_items.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_items.info()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_items.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_items.tail()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"item_columns = df_items.columns.tolist()\n\nfor i in range(0, len(item_columns)):\n    print(\"***\",item_columns[i],\"***\")\n    print(df_items[item_columns[i]].nunique(),'개')\n    print(df_items[item_columns[i]].value_counts(normalize=False))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# perishable 제품에 주로 어던 카테고리가 속하는지 확인\n\ndf_items[df_items['perishable'] == 1]['family'].value_counts(normalize=False)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 6) transactions.csv\n\n- The count of sales transactions for each date, store_nbr combination. Only included for the training data timeframe.\n\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_trans.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_trans.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_trans.tail()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_trans['transactions'].describe()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"trans_columns = df_trans.columns.tolist()\n\nfor i in range(0, len(trans_columns)):\n    print(\"***\",trans_columns[i],\"***\")\n    print(df_trans[trans_columns[i]].nunique(),'개')\n    print(df_trans[trans_columns[i]].value_counts(normalize=False))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 7) oil.csv\n\n- Daily oil price. Includes values during both the train and test data timeframe. (Ecuador is an oil-dependent country and it's economical health is highly vulnerable to shocks in oil prices.)\n\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_oil.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_oil.info()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_oil.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_oil.tail()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"oil_columns = df_oil.columns.tolist()\n\nfor i in range(0, len(oil_columns)):\n    print(\"***\",oil_columns[i],\"***\")\n    print(df_oil[oil_columns[i]].nunique(),'개')\n    print(df_oil[oil_columns[i]].value_counts(normalize=False, sort=True, dropna=False))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# NaN값이 있는 일자 확인\n\ndf_oil[df_oil['dcoilwtico'] == 'NaN']\n# null_value = df_oil.loc[[0],['dcoilwtico']].to_string\n# null_value","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 8) holidays_events.csv\n- Holidays and Events, with metadata\n- NOTE: Pay special attention to the transferred column. A holiday that is transferred officially falls on that calendar day, but was moved to another date by the government. A transferred day is more like a normal day than a holiday. To find the day that it was actually celebrated, look for the corresponding row where type is Transfer. For example, the holiday Independencia de Guayaquil was transferred from 2012-10-09 to 2012-10-12, which means it was celebrated on 2012-10-12. Days that are type Bridge are extra days that are added to a holiday (e.g., to extend the break across a long weekend). These are frequently made up by the type Work Day which is a day not normally scheduled for work (e.g., Saturday) that is meant to payback the Bridge.\n- Additional holidays are days added a regular calendar holiday, for example, as typically happens around Christmas (making Christmas Eve a holiday).\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_holiday.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_holiday.info()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_holiday.head(50)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_holiday.tail()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_holiday[df_holiday['type'] == 'Bridge']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_holiday[df_holiday['type'] == 'Work Day']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"holiday_columns = df_holiday.columns.tolist()\n\nfor i in range(0, len(holiday_columns)):\n    print(\"***\",holiday_columns[i],\"***\")\n    print(df_holiday[holiday_columns[i]].nunique(),'개')\n    print(df_holiday[holiday_columns[i]].value_counts(normalize=False, sort=True, dropna=False))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Basic Visualization"},{"metadata":{"trusted":true},"cell_type":"code","source":"import seaborn as sns \nimport matplotlib.pyplot as plt\n%matplotlib inline","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 1) stores"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_stores.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Stores distribution across cities\n\nfig, ax = plt.subplots()\nfig.set_size_inches(8, 8)\nax = sns.countplot(y=df_stores['city'], data=df_stores) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Stores distribution across states\n\nfig, ax = plt.subplots()\nfig.set_size_inches(8, 8)\nax = sns.countplot(y=df_stores['state'], data=df_stores) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Different types of stores\n\nfig, ax = plt.subplots()\nfig.set_size_inches(10, 7)\nax = sns.countplot(x=\"type\", data=df_stores, palette=\"Set2\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Types of stores across cities\n\nct = pd.crosstab(df_stores.city, df_stores.type)\nct","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ct.plot.bar(figsize = (12, 6), stacked=True)\nplt.legend(title = 'type')\n\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Types of stores across states\n\nct = pd.crosstab(df_stores.state, df_stores.type)\n\nct.plot.bar(figsize = (12, 6), stacked=True)\nplt.legend(title = 'type')\n\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_stores.sort_values(by=['state'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Distribution of different clusters\n\nfig, ax = plt.subplots()\nfig.set_size_inches(12, 7)\nax = sns.countplot(x=\"cluster\", data=df_stores)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Types against clusters\n\nplt.style.use('seaborn-white')\n\ntype_cluster = df_stores.groupby(['type','cluster']).size()\ntype_cluster\n# diffrence between .size() vs .count()\n# => size includes NaN values, count does not:","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"type_cluster.unstack().plot(kind='bar',stacked=True, colormap= 'PuBu', figsize=(13,11),  grid=False)\nplt.title('Stacked Barplot of Store types and their cluster distribution', fontsize=18)\nplt.ylabel('Count of clusters in a particular store type', fontsize=16)\nplt.xlabel('Store type', fontsize=16)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# cluster of stores across the different cities\n\nplt.style.use('seaborn-white')\ncity_cluster = df_stores.groupby(['city','cluster']).store_nbr.size()\ncity_cluster.unstack().plot(kind='bar',stacked=True, colormap= 'viridis', figsize=(13,11),  grid=False)\nplt.title('Stacked Barplot of Store cluster opened for each city')\nplt.ylabel('Count of stores for a particular city')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 2) items"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_items.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Distribution of various families of items\n\nfig, ax = plt.subplots()\nfig.set_size_inches(12, 8)\nax = sns.countplot(y = \"family\", data = df_items)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Distribution of perishable goods by family\n\nct = pd.crosstab(df_items.family, df_items.perishable)\nct.plot.bar(figsize = (12, 7), stacked=True)\nplt.legend(title='perishable')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Distrbution of number of unique classes per family of items.\n\nxc = df_items.groupby(['family'])['class'].nunique()\nxc","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"xc2 = df_items.groupby(['family'])['class'].size()\nxc2","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig, ax = plt.subplots()\nfig.set_size_inches(12, 6)\nxc.plot.bar(color='skyblue')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 3) transactions"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_trans.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 스토어별 총 업무량 규모\n\namount = (df_trans.groupby(['store_nbr']).sum())\nfig, ax = plt.subplots()\nfig.set_size_inches(12, 8)\nax = sns.barplot(x = amount.index, y= \"transactions\", data = amount)\nax.set_xticklabels(ax.get_xticklabels(), rotation = 75, fontsize = 9)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"amount_trans = pd.merge(amount, df_stores, left_on='store_nbr', right_on='store_nbr', how='left')\namount_trans.sort_values(by=['transactions'], ascending=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 스토어별 총 업무량 회수\n\nnumber = (df_trans.groupby(['store_nbr']).count())\nfig, ax = plt.subplots()\nfig.set_size_inches(12, 8)\nax = sns.barplot(x = number.index, y= \"transactions\", data = number)\nax.set_xticklabels(ax.get_xticklabels(), rotation = 75, fontsize = 9)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"number_trans= pd.merge(number, df_stores, left_on='store_nbr', right_on='store_nbr', how='left')\nnumber_trans.sort_values(by=['transactions'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 일자별 총 업무량 규모\n\namount_date = (df_trans.groupby(['date']).sum())\nfig, ax = plt.subplots()\nfig.set_size_inches(12, 8)\nax = sns.barplot(x = amount_date.index, y= \"transactions\", data = amount_date)\nax.set_xticklabels(ax.get_xticklabels(), rotation = 75, fontsize = 9)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"amount_date","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 일자정보 연/월/일로 나누기\n\nre_trans = df_trans.copy()\ndates = re_trans['date'].str.split('-')\nprint(dates)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"re_trans['year'] = dates.str.get(0)\nre_trans['month'] = dates.str.get(1)\nre_trans['day'] = dates.str.get(2)\n# re_trans.drop('date',inplace=True, axis=1)\nre_trans = re_trans[['year','month','day','store_nbr','transactions']]\nre_trans","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 일일 업무량이 가장 큰 데이터\ndf_trans[df_trans['transactions'] == df_trans['transactions'].max()]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# transactions양이 가장 많은 날(top 100)\ntop_trans = df_trans.nlargest(100, 'transactions')\nprint(top_trans.date.unique())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 일잂 업무량이 가장 작은 데이터\ndf_trans[df_trans['transactions'] == df_trans['transactions'].min()]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# transactions양이 가장 적은 날(top 100)\nlower_transe = df_trans.sort_values('transactions', ascending=True).head(100)\nprint(lower_transe.date.unique())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 연도별 총 거래량 변화\n\nyear_amount = (re_trans.groupby(['year']).sum())\nfig, ax = plt.subplots()\nfig.set_size_inches(12, 8)\nax = sns.barplot(x = year_amount.index, y= \"transactions\", data = year_amount)\nax.set_xticklabels(ax.get_xticklabels(), fontsize = 9)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"year_amount[['transactions']]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"re_trans","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 각 월별 업무량 변화 추이 (x= year / hue = month)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 4) oil"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_oil.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# missingno 라이브러리 활용하여 null값 확인\n\nimport missingno as msno\n\nmsno.matrix(df_oil)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# oil 가격 최대치 일자 확인\ndf_oil[df_oil['dcoilwtico'] == df_oil['dcoilwtico'].max()]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# oil 가격 최소치 일자 확인\ndf_oil[df_oil['dcoilwtico'] == df_oil['dcoilwtico'].min()]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# ax = sns.boxplot(x=df_oil[\"dcoilwtico\"])\nsns.boxplot(x = \"dcoilwtico\",  data = df_oil)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_oil['dcoilwtico'].describe()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 오일가격의 변화추이\nsns.lineplot(data=df_oil, x=\"date\", y=\"dcoilwtico\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 5) holidays_events"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_holiday.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig, ax = plt.subplots()\nfig.set_size_inches(8, 6)\nax = sns.countplot( y=\"type\", data=df_holiday, palette=\"RdBu\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.style.use('seaborn-white')\nholiday_local_type = df_holiday.groupby(['locale_name', 'type']).size()\nholiday_local_type.unstack().plot(kind='bar',stacked=True, colormap= 'magma_r', figsize=(12,10),  grid=False)\nplt.title('Stacked Barplot of locale name against event type')\nplt.ylabel('Count of entries')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}