{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# **식약처 레시피로 이름구분 및 단위 기준 전처리**\n", "레시피 데이터 전처리 및 단위기준 일치사전 만들기\n", "```\n", "계량법 안내\n", "1큰술(1T, 1Ts) = 1숟가락 \t15ml = 3t (밥숟가락 뜨면 1큰술)\n", "1작은술(1t, 1ts) 5ml (티스푼으로는 2스푼이 1작은술)\n", "1컵(1Cup, 1C) \t200ml = 16T (한국,중국,일본) (서양(미국)은 1C가 240~250ml)\n", "1종이컵 \t180ml; 1oz \t28.3g\n", "1파운드(lb) \t약 0.453 킬로그램(kg)\n", "1갤런(gallon) \t약 3.78 리터(ℓ)\n", "1꼬집 \t약 2g 정도이며 '약간'이라고 표현하기도 함\n", "조금 \t약간의 2~3배\n", "적당량 \t기호에 따라 마음대로 조절해서 넣으란 표현\n", "1줌 \t 한손 가득 (예시 : 멸치 1줌 = 국멸치인 경우 12~15마리, 나물 1줌은 50g) 크게 1줌 = 2줌 [1줌의 두배]\n", "1주먹 \t여자 어른의 주먹크기, 고기로는 100g\n", "1토막 \t2~3cm두께 정도의 분량\n", "마늘 1톨 \t깐 마늘 한쪽\n", "생강 1쪽 \t마늘 1톨의 크기와 비슷\n", "생강 1톨 \t아기 손바닥만한 크기의 통생강 1개\n", "고기 1근 \t600g\n", "채소 1근 \t400g\n", "채소 1봉지 \t200g 정도\n", "```" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'16T, 1C, 1Cup, 1T, 1Ts, 1oz, 1t, 1ts, 1갤런, 1근, 1꼬집, 1봉지, 1작은술, 1종이컵, 1주먹, 1줌, 1쪽, 1컵, 1큰술, 1큰줌, 1토막, 1톨, 1파운드, 3t, gallon, lb, 약간, 적당량, 조금'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "units = {\n", " \"15ml\":[\"1큰술\",\"1T\",\"1Ts\",\"3t\"],\n", " \"5ml\":[\"1작은술\",\"1t\",\"1ts\"], \n", " \"200ml\":[\"1컵\",\"1Cup\",\"1C\"],\n", " \"250ml\":[\"16T\", \"1C\"],\n", " \"180ml\":[\"1종이컵\"],\n", " \"28.3g\":[\"1oz\"],\n", " \"453g\":[\"1파운드\",\"lb\"],\n", " \"3780ml\":[\"1갤런\",\"gallon\"],\n", " \"2g\":[\"1꼬집\",'약간'],\n", " \"4g\":[\"조금\"],\n", " \"6g\":[\"조금\"],\n", " \"10g\":[\"적당량\"],\n", " \"50g\":[\"1줌\"], # 나물\n", " \"100g\":[\"1큰줌\"], # 나물\n", " \"13마리\":[\"1줌\"], # 멸치\n", " \"26마리\":[\"1큰줌\"], # 멸치\n", " \"100g\":[\"1주먹\"], # 여자 어른의 주먹크기\n", " \"3cm\":[\"1토막\"],\n", " \"1알\":[\"1톨\",\"1쪽\"], # 마늘, 생강 등\n", " \"600g\":[\"1근\"], # 고기\n", " \"400g\":[\"1근\"], # 채소\n", " \"200g\":[\"1봉지\"],\n", "}\n", "\n", "unit_tokens = []\n", "for _ in [v for k,v in units.items()]:\n", " unit_tokens += _\n", "\", \".join(sorted(set(unit_tokens)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "# **1 식약처 레시피 데이터 살펴보기**\n", "- Step1 => Step2 => Step3 단계별 결과값 저장하기\n", "\n", "## **01 레시피 데이터 상태분석**\n", "수집된 데이터 형태 및 내용 분석\n", "1. 분석결과 **1~12 개** 로 분류기준이 불안정\n", "1. 메뉴별 **중간 묵음들이** 존재\n", "1. **Key:Value** 로 정리하며 **데이터 짝수개** 맞추기\n", "\n", "```python\n", "df_safe = pd.DataFrame('원본자료.xls')\n", "df_safe_names = {key_id_num : 레시피 이름}\n", "```" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1198, 2) 메뉴명 재료정보\n", "1193 토마토 미소 된장국 토마토 50g, 두부 30g, 양파 15g, 표고버섯 15g, 멸치 5g, 고추 8...\n", "1194 미역 미소국 미소된장 3.5g, 건미역 2g, 가츠오부시 0.3g, 미향 0.3g\n", "1195 홍합 배춧국 홍합 50g, 배추 50g, 무 30g, 마늘 2g, 파 3g, 홍고추 1g, 소금...\n", "1196 얼큰 콩나물 수제비 콩나물 50g, 황태머리 40g, 고추장 10g, 밀가루 100g, 고춧가루 5g,...\n", "1197 단호박 생선탕수, 키위소스 동태살 120g, 단호박 10g, 당근 15g, 오이 15g, 양파 15g, 전분 ...\n" ] } ], "source": [ "import json, re\n", "import pandas as pd\n", "df_safe = pd.read_csv(\"data/food_recipe_safe.csv\")\n", "df_safe = df_safe.loc[:, ['메뉴명','재료정보']]\n", "print(df_safe.shape, df_safe.tail())" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(1, 459),\n", " (2, 127),\n", " (3, 202),\n", " (4, 190),\n", " (5, 95),\n", " (6, 76),\n", " (7, 24),\n", " (8, 14),\n", " (9, 9),\n", " (10, 1),\n", " (12, 1)]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from collections import Counter\n", "df_safe.재료정보 = [_.split('\\n') for _ in df_safe.재료정보.fillna('')]\n", "df_safe_names = {no:_ for no,_ in enumerate(df_safe.메뉴명)}\n", "sorted(dict(Counter([len(_) for no, _ in enumerate(df_safe[\"재료정보\"])])).items(),\\\n", " key=lambda x:x[0], reverse = False) # Value 기준 정렬" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Step3 에서 구분에 오류가 나는 부분을 전처리\n", "# Key 와 혼동되는 Item 레시피 전처리 진행\n", "result = []\n", "for item in df_safe[\"재료정보\"]:\n", " temp = [_.replace(\"약간\",\"약간(5g)\") for _ in item]\n", " result.append(temp)\n", "df_safe[\"재료정보\"] = result" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## **02 중간묶음 작업기준의 표시**\n", "깔대기 방식으로\n", "- Step1 => Step2 => Step3 단계별 결과값 저장하기\n", "1. **재료명만 나눠서 존재시** 1개로 묶는작업 진행\n", "1. **중간 메뉴이름** 이 포함시 구분작업을 추가로 진행" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
메뉴명ValuesKeysKey_index재료정보
0칼륨 듬뿍 고구마죽21[0][고구마죽, 고구마 100g(2/3개), 설탕 2g(1/3작은술), 찹쌀가루 3g(...
1누룽지 두부 계란죽42[0, 2][채소준비, 애호박 30g(1/6개), 표고버섯 20g(2개), 당근 5g(3×2×...
\n", "
" ], "text/plain": [ " 메뉴명 Values Keys Key_index \\\n", "0 칼륨 듬뿍 고구마죽 2 1 [0] \n", "1 누룽지 두부 계란죽 4 2 [0, 2] \n", "\n", " 재료정보 \n", "0 [고구마죽, 고구마 100g(2/3개), 설탕 2g(1/3작은술), 찹쌀가루 3g(... \n", "1 [채소준비, 애호박 30g(1/6개), 표고버섯 20g(2개), 당근 5g(3×2×... " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 재료정보의 value 갯수\n", "df_safe.insert(1, \"Values\", [len(_) for _ in df_safe[\"재료정보\"]])\n", "\n", "# 중간 구분가능 Key 갯수의 확인\n", "result = []\n", "result_key = []\n", "result_recipe = []\n", "for _ in range(len(df_safe)):\n", " # 레시피 구분데이터\n", " data = df_safe.loc[_]\n", " count, temp = 0, []\n", " for no,_ in enumerate(data[\"재료정보\"]):\n", " # 재료정보 List 전처리를 위한 위치값 탐지기\n", " if \"\".join(re.findall(\"[가-힣]+\", _)) == _.replace(' ',\"\"):\n", " count += 1\n", " temp.append(no)\n", " \n", " # 유효한 Key 값이 발견되었으나\n", " if count != 0:\n", " # 0번 index 값이 없을때..\n", " if 0 not in temp:\n", " result_recipe.append([data['메뉴명']] + data['재료정보'])\n", " temp = [0] + [_+1 for _ in temp]\n", " else:\n", " result_recipe.append(data['재료정보'])\n", " else:\n", " result_recipe.append(data['재료정보'])\n", " \n", " result.append(count)\n", " result_key.append(temp)\n", "\n", "df_safe.insert(2, \"Keys\", result)\n", "df_safe.insert(3, \"Key_index\", result_key)\n", "df_safe[\"재료정보\"] = result_recipe\n", "df_safe.head(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## **03 중간묶음 내용 살펴보기**\n", "분류값, Key 내용을 **Key, Value** 로 구분 및 작업의 진행" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# _ = [(10, 5), (8, 5), \n", "# (7, 4), (8, 4), (9, 4), (12, 4),\n", "# (6, 3), (7, 3), (8, 3), (9, 3),\n", "# (4, 2), (5, 2), (6, 2), (7, 2), \n", "# (5, 1), (4, 1), (3, 1), (2, 1), (1, 1), # Key 1개는 1개로 묶는다\n", "# (1, 0), (2, 0), (3, 0), (5, 0), (4, 0), (7, 0), (6, 0)] # Key 없으면 다 묶는다\n", "\n", "# # Key 가 아닌값이 중간에 Key 처럼 존재시...\n", "# # Key 내용이 붙어있거나, 마지막일 땐, 몰아주기 (거의 레시피일 확률이 높다..)\n", "# df_safe[(df_safe.Values==7) & (df_safe.Keys==4)].iloc[0,3]\n", "# df_safe[(df_safe.Values==8) & (df_safe.Keys==5)].iloc[0,3]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Counter({(2, 1): 10,\n", " (4, 2): 67,\n", " (6, 3): 39,\n", " (8, 4): 13,\n", " (10, 5): 1,\n", " (3, 1): 15,\n", " (9, 4): 7,\n", " (7, 3): 19,\n", " (6, 2): 6,\n", " (5, 2): 17,\n", " (4, 1): 6,\n", " (5, 1): 1,\n", " (2, 0): 117,\n", " (1, 0): 456,\n", " (3, 0): 187,\n", " (5, 0): 77,\n", " (4, 0): 117,\n", " (7, 0): 3,\n", " (6, 0): 31,\n", " (7, 2): 2,\n", " (8, 2): 1,\n", " (9, 3): 2,\n", " (12, 4): 1,\n", " (1, 1): 3})" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sorted(Counter([(df_safe.Values[_], df_safe.Keys[_]) \n", " for _ in range(len(df_safe))]), \n", " key=lambda x :x[1], reverse=True)\n", "\n", "Counter([(df_safe.Values[_], df_safe.Keys[_]) \n", " for _ in range(len(df_safe))])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "# **2 식약처 레시피 Key 값 구분작업**\n", "## 분석결과를 바탕으로 진행" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## **01 지금까지 작업한 내용의 확인**\n", "분류값, Key 내용을 **Key, Value** 기준의 확인" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
메뉴명ValuesKeysKey_index재료정보
0칼륨 듬뿍 고구마죽21[0][고구마죽, 고구마 100g(2/3개), 설탕 2g(1/3작은술), 찹쌀가루 3g(...
1누룽지 두부 계란죽42[0, 2][채소준비, 애호박 30g(1/6개), 표고버섯 20g(2개), 당근 5g(3×2×...
\n", "
" ], "text/plain": [ " 메뉴명 Values Keys Key_index \\\n", "0 칼륨 듬뿍 고구마죽 2 1 [0] \n", "1 누룽지 두부 계란죽 4 2 [0, 2] \n", "\n", " 재료정보 \n", "0 [고구마죽, 고구마 100g(2/3개), 설탕 2g(1/3작은술), 찹쌀가루 3g(... \n", "1 [채소준비, 애호박 30g(1/6개), 표고버섯 20g(2개), 당근 5g(3×2×... " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for no, _ in enumerate(range(len(df_safe))):\n", " data = df_safe.loc[_]\n", " if data.Keys != 0:\n", " if 0 not in data[\"Key_index\"]:\n", " print(no, data[\"Key_index\"], data[\"Values\"])\n", "\n", "df_safe.head(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## **02 Key 를 내용으로 작업의 진행**\n", "분류값, Key 내용을 **Key, Value** 로 구분 및 작업의 진행" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['영양밥',\n", " '찹쌀 60g, 은행 20g(8알), 잣 5g(5알), 호두 10g(1알), 생땅콩 10g(6알), 밤 20g(2개)',\n", " '떡갈비',\n", " '쇠갈비살 150g',\n", " '1차 양념 : 설탕 2g(1/3작은술), 꿀 2g(1/3작은술), 매실액 5g(1작은술),',\n", " '참기름 5g(1작은술)',\n", " '2차 양념 : 저염간장 5g(1작은술), 무염피스타치오 10g(4알), 다진 대파 10g(2작은술), 다진 마늘 5g(1작은술), 후추약간(5g)',\n", " '저염간장',\n", " '레드와인 5g(1작은술), 간장 5g(1작은술), 양파 10g(1/10개),',\n", " '마른 홍고추 2g(1/2개), 마른 다시마 5g(3×2cm), 마늘 5g(1쪽), 생강 약간(5g)',\n", " '곁들임',\n", " '아스파라거스 20g(1개), 더덕 15g(1개), 무염피스타치오']" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_safe[df_safe.Values==12].index[0]\n", "temp = df_safe.loc[df_safe[df_safe.Values==12].index[0]]\n", "temp[\"재료정보\"]" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "# 맨 앞 인덱스가 없는 데이터는 더이상 없다..\n", "for _ in df_safe.Key_index:\n", " if len(_) > 0:\n", " if 0 not in _:\n", " print(_)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'만두소': ['곤드레나물 50g, 큰새우 4마리, 돼지고기 50g, 두부 30g(1/9모), 부추 10g(6줄기), 청양고추 10g(1개), 파 5g(2cm), 마늘 2g(1/2쪽), 후추 2g(1/3작은술), 참기름 3g(1/2작은술), 식용유 약간(5g)'],\n", " '만두피': ['라이스페이퍼 30g(6장), 부추 3g(2줄기), 물 100ml(1/2컵)'],\n", " '초간장': ['저염간장 5g(1작은술), 식초 5g(1작은술)']}" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 범위 index 를 추가하여 Key, Value 테스트\n", "temp = df_safe.loc[456]\n", "temp_index = temp.Key_index + [len(temp.재료정보)]\n", "{temp[\"재료정보\"][temp_index[_]]:temp[\"재료정보\"][temp_index[_]+1:temp_index[_+1]]\n", " for _ in range(len(temp.Key_index))}" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "# 테이블 전체를 대상으로 전처리 작업을 진행\n", "result = []\n", "for _ in range(len(df_safe)):\n", " result_temp = {}\n", " temp = df_safe.loc[_]\n", " # 내부에 Key 값이 포함된 경우\n", " if temp.Keys != 0:\n", " temp_index = temp.Key_index + [len(temp.재료정보)]\n", " for _ in range(len(temp.Key_index)):\n", " result_temp[temp[\"재료정보\"][temp_index[_]]] = temp[\"재료정보\"][temp_index[_]+1:temp_index[_+1]]\n", " # Key 가 없는경우\n", " else:\n", " result_temp[temp.메뉴명] = temp.재료정보\n", " result.append(result_temp)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
메뉴명ValuesKeysKey_index재료정보
0칼륨 듬뿍 고구마죽21[0]{'고구마죽': ['고구마 100g(2/3개), 설탕 2g(1/3작은술), 찹쌀가루...
1누룽지 두부 계란죽42[0, 2]{'채소준비': ['애호박 30g(1/6개), 표고버섯 20g(2개), 당근 5g(...
\n", "
" ], "text/plain": [ " 메뉴명 Values Keys Key_index \\\n", "0 칼륨 듬뿍 고구마죽 2 1 [0] \n", "1 누룽지 두부 계란죽 4 2 [0, 2] \n", "\n", " 재료정보 \n", "0 {'고구마죽': ['고구마 100g(2/3개), 설탕 2g(1/3작은술), 찹쌀가루... \n", "1 {'채소준비': ['애호박 30g(1/6개), 표고버섯 20g(2개), 당근 5g(... " ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_safe[\"재료정보\"] = result\n", "df_safe.head(2)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "# df_org = pd.read_csv(\"data/food_recipe_safe.csv\")\n", "# df_org = df_org.loc[:,['메뉴명','조리방법','요리종류','재료정보','이미지경로(소)','이미지경로(대)']]\n", "# df_org.재료정보 = [json.dumps(_ ,ensure_ascii=False) for _ in result]\n", "# # df_org.to_csv(\"data/food_recipe_safe_new.csv\", index=None)\n", "# df_org.head(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "# **3 식약처 레시피 Value 값 구분작업**\n", "1. 원칙은 Key 내부에 전체 레시피 Value 1개만 포함되어야 한다\n", "1. Value 가 여러개 포함되어 Value 내부에 Key 가 포함된 경우의 식별이 필요\n", "\n", "## **01 Key 를 구분 후, Value 내용들 살피기**\n", "```python\n", "df_org = pd.read_csv(\"data/food_recipe_safe.csv\")\n", "df_org = df_org.loc[:,['메뉴명','조리방법','요리종류','재료정보','이미지경로(소)','이미지경로(대)']]\n", "df_org.재료정보 = [json.dumps(_ ,ensure_ascii=False) for _ in result]\n", "# df_org.to_csv(\"data/food_recipe_safe_new.csv\", index=None)\n", "df_org.head(2)\n", "```" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
메뉴명Key_ValuesKey_Value_nums재료정보
0칼륨 듬뿍 고구마죽{'고구마죽': 1}[1]{'고구마죽': ['고구마 100g(2/3개), 설탕 2g(1/3작은술), 찹쌀가루...
1누룽지 두부 계란죽{'채소준비': 1, '누룽지 죽': 1}[1, 1]{'채소준비': ['애호박 30g(1/6개), 표고버섯 20g(2개), 당근 5g(...
\n", "
" ], "text/plain": [ " 메뉴명 Key_Values Key_Value_nums \\\n", "0 칼륨 듬뿍 고구마죽 {'고구마죽': 1} [1] \n", "1 누룽지 두부 계란죽 {'채소준비': 1, '누룽지 죽': 1} [1, 1] \n", "\n", " 재료정보 \n", "0 {'고구마죽': ['고구마 100g(2/3개), 설탕 2g(1/3작은술), 찹쌀가루... \n", "1 {'채소준비': ['애호박 30g(1/6개), 표고버섯 20g(2개), 당근 5g(... " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = []\n", "for item in df_safe[\"재료정보\"]:\n", " temp = list(item.keys()) # Key 이름\n", " temp_dict = {_:len(item[_]) for _ in item}\n", " result.append(temp_dict)\n", "\n", "df_safe.insert(4, \"Key_Values\", result)\n", "df_safe = df_safe.loc[:, [\"메뉴명\",\"Key_Values\",\"재료정보\"]]\n", "df_safe.insert(2, \"Key_Value_nums\", [list(_.values()) for _ in df_safe.Key_Values])\n", "df_safe.head(2)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
메뉴명Key_ValuesKey_Value_nums재료정보
0칼륨 듬뿍 고구마죽{'고구마죽': 1}pass{'고구마죽': ['고구마 100g(2/3개), 설탕 2g(1/3작은술), 찹쌀가루...
1누룽지 두부 계란죽{'채소준비': 1, '누룽지 죽': 1}pass{'채소준비': ['애호박 30g(1/6개), 표고버섯 20g(2개), 당근 5g(...
\n", "
" ], "text/plain": [ " 메뉴명 Key_Values Key_Value_nums \\\n", "0 칼륨 듬뿍 고구마죽 {'고구마죽': 1} pass \n", "1 누룽지 두부 계란죽 {'채소준비': 1, '누룽지 죽': 1} pass \n", "\n", " 재료정보 \n", "0 {'고구마죽': ['고구마 100g(2/3개), 설탕 2g(1/3작은술), 찹쌀가루... \n", "1 {'채소준비': ['애호박 30g(1/6개), 표고버섯 20g(2개), 당근 5g(... " ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = []\n", "for _ in df_safe.Key_Value_nums:\n", " if list(set(_)) == [1]:\n", " result.append('pass')\n", " else: \n", " result.append('work')\n", "\n", "df_safe.Key_Value_nums = result\n", "df_safe.head(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## **02 Value 의 갯수가 여럿일 때**\n", "1. 우선 합치기...\n", "1. 합친 뒤, \":\" 구분자 포함시 Key : Value 추가로 나누기" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "# key 내부 Value 의 데이터를 1개로 전처리\n", "# 작업을 하면서 중간구분자 \":\" 포함 데이터 확인하기\n", "temp_list = []\n", "for idx in list(df_safe.index):\n", " temp = df_safe.loc[idx]\n", " temp_dict = {}\n", " for key in list(temp['Key_Values'].keys()):\n", " temp_token = \" \".join(temp[\"재료정보\"][key])\n", " # 추가 작업할 내용 ㅜㅜ (정보 내부에 \":\" 가 포함시.)\n", " if temp_token.find(\":\") != -1:\n", " temp_list.append([idx, key, temp_token])\n", "\n", " temp_dict[key] = temp_token\n", " temp[\"재료정보\"] = temp_dict" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
메뉴명Mid_Key재료정보
1127두부선과 저나트륨 겨자 간장소스Yes{'두부선과 저나트륨 겨자 간장소스': '두부 80g, 표고버섯마른것 10g, 쇠고...
1148삼색 콩튀김Yes{'삼색 콩튀김': '완두콩 7.5g, 강남콩 7.5g, 제비콩 7.5g, 찹쌀가루...
1151카프라제Yes{'카프라제': '생 모짜렐라치즈 20g, 토마토 35g, 발사믹식초 2.5g[소스...
\n", "
" ], "text/plain": [ " 메뉴명 Mid_Key \\\n", "1127 두부선과 저나트륨 겨자 간장소스 Yes \n", "1148 삼색 콩튀김 Yes \n", "1151 카프라제 Yes \n", "\n", " 재료정보 \n", "1127 {'두부선과 저나트륨 겨자 간장소스': '두부 80g, 표고버섯마른것 10g, 쇠고... \n", "1148 {'삼색 콩튀김': '완두콩 7.5g, 강남콩 7.5g, 제비콩 7.5g, 찹쌀가루... \n", "1151 {'카프라제': '생 모짜렐라치즈 20g, 토마토 35g, 발사믹식초 2.5g[소스... " ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = []\n", "for _ in list(df_safe.index):\n", " if _ in [_[0] for _ in temp_list]:\n", " result.append('Yes')\n", " else: result.append('Pass')\n", " \n", "df_safe = df_safe.loc[:, [\"메뉴명\", \"재료정보\"]]\n", "df_safe.insert(1, \"Mid_Key\", result)\n", "df_safe[df_safe.Mid_Key=='Yes'].tail(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## **02-alpha 작업용 함수의 적용 및 과정분석**\n", "노가다고 30개 정도 진행하다 보니 규칙이 보임\n", "1. 규칙내용 : `- 중간Key :` 내용이 문자열 중간에 포함\n", "1. 이러한 규칙을 사용하여 **value 구분점 분리** 및 **중간 key** 추가하기" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'[절임물]'" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import re\n", "reg_token = \"-.*:\"\n", "reg_token = \"\\[.*\\]\"\n", "texts = \"오이고추 160g [절임물] 해물육수 30g, 어간장 10g\"\n", "token = re.findall(reg_token, texts)\n", "token = \"\".join(token)\n", "token" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [], "source": [ "temp = \"콩나물 70g, 배 50g[소스료리]콩 10g 쌀 20g\"" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'- 절임물 :'" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import re\n", "reg_token = \"-.*:\"\n", "texts = \"오이고추 160g - 절임물 : 해물육수 30g, 어간장 10g\"\n", "token = re.findall(reg_token, texts)\n", "token = \"\".join(token)\n", "token" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['오이고추 160g ', ' 해물육수 30g, 어간장 10g']" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "texts.split(token)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## **02-beta 작업용 함수의 적용 및 과정분석**\n", "노가다고 30개 정도 진행하다 보니 규칙이 보임\n", "1. 규칙내용 : `- 중간Key :` 내용이 문자열 중간에 포함\n", "1. 이러한 규칙을 사용하여 **value 구분점 분리** 및 **중간 key** 추가하기" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [], "source": [ "import re\n", "# reg_token = \"-.*:\"\n", "reg_token = \"\\[.*\\]\"\n", "result = []\n", "for _ in list(df_safe.index):\n", " temp = df_safe.loc[_] \n", " temp_keys = list(temp[\"재료정보\"].keys())\n", " temp_dict = {}\n", " for k in temp_keys:\n", " temp_dict[k] = temp[\"재료정보\"][k]\n", " # 중간 구분자가 포함된 경우\n", " if temp[\"재료정보\"][k].find(\":\") != -1:\n", " # 구분점이 있는 경우 : dict 2개로 저장\n", " if len(re.findall(reg_token, temp[\"재료정보\"][k])) != 0:\n", " temp_token_key = re.findall(reg_token, temp[\"재료정보\"][k])\n", " temp_token_key = \"\".join(temp_token_key)\n", " #temp_token_key = temp_token_key.replace(\"-\",\"\").replace(\":\",\"\").strip()\n", " temp_token_key = temp_token_key.replace(\"[\",\"\").replace(\"]\",\"\").replace(\":\",\"\").strip()\n", " temp_tokens = temp[\"재료정보\"][k].split(temp_token_key)\n", " temp_dict[k] = temp_tokens[0].replace(\"[\",\"\")\n", " # 구분자 작업 뒤 이름이 포함된 경우, Key 수정작업\n", " temp_values = temp_tokens[-1].replace(\"]\",\"\")\n", " if temp_values.find(\":\") != -1:\n", " temp_values_list = temp_values.split(\":\")\n", " if len(temp_values_list) == 2:\n", " \n", " temp_dict[temp_token_key] = temp_tokens[-1].replace(\"]\",\"\")\n", " else:\n", " temp_dict[k] = temp[\"재료정보\"][k]\n", " result.append(temp_dict)\n", " # result.append(temp_dict)" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [], "source": [ "df_safe[\"재료정보\"] = result\n", "df_safe.to_csv('data/food_recipe_safe_new_keys_new.csv', index=None)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "# **4 Mid Key 내용의 수정 및 편집**\n", "다 왔다. 자료들의 형태와 내용의 분류를 규칙으로 작업이 끝났다.\n", "1. 나머지 269개의 다양한 형태들의 편집 과정\n", "1. 개별 작업을 어떻게 함수화 할 것인가..\n", "1. **Dict 을 csv** 로 저장 후 **Dict** 으로 변환 호출시 **[ast 모듈의](https://hashcode.co.kr/questions/472/%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84-dict%EB%A1%9C-%EB%B0%94%EA%BF%80-%EC%88%98-%EC%9E%88%EB%82%98%EC%9A%94)** 사용\n", "```python\n", "import ast\n", "ast.literal_eval(\"{'muffin' : 'lolz', 'foo' : 'kitty'}\")\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## **01 내용 살펴보기**\n", "1. 중간과정 CSV 로 저장 후, 호출\n", "1. 우선 합치기...\n", "1. 합친 뒤, \":\" 구분자 포함시 Key : Value 추가로 나누기" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1198, 2)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
메뉴명재료정보
0칼륨 듬뿍 고구마죽{'고구마죽': '고구마 100g(2/3개), 설탕 2g(1/3작은술), 찹쌀가루 ...
1누룽지 두부 계란죽{'채소준비': '애호박 30g(1/6개), 표고버섯 20g(2개), 당근 5g(3...
\n", "
" ], "text/plain": [ " 메뉴명 재료정보\n", "0 칼륨 듬뿍 고구마죽 {'고구마죽': '고구마 100g(2/3개), 설탕 2g(1/3작은술), 찹쌀가루 ...\n", "1 누룽지 두부 계란죽 {'채소준비': '애호박 30g(1/6개), 표고버섯 20g(2개), 당근 5g(3..." ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import ast\n", "import pandas as pd\n", "# df_safe = pd.read_csv(\"data/food_recipe_safe_new_keys.csv\")\n", "df_safe = pd.read_csv('data/food_recipe_safe_new_keys.csv')\n", "df_safe[\"재료정보\"] = [ast.literal_eval(_) for _ in df_safe[\"재료정보\"]]\n", "df_safe = df_safe.iloc[:,[0,-1]]\n", "print(df_safe.shape)\n", "df_safe.head(2)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
메뉴명Mid_Key재료정보
0칼륨 듬뿍 고구마죽0{'고구마죽': '고구마 100g(2/3개), 설탕 2g(1/3작은술), 찹쌀가루 ...
1누룽지 두부 계란죽0{'채소준비': '애호박 30g(1/6개), 표고버섯 20g(2개), 당근 5g(3...
\n", "
" ], "text/plain": [ " 메뉴명 Mid_Key 재료정보\n", "0 칼륨 듬뿍 고구마죽 0 {'고구마죽': '고구마 100g(2/3개), 설탕 2g(1/3작은술), 찹쌀가루 ...\n", "1 누룽지 두부 계란죽 0 {'채소준비': '애호박 30g(1/6개), 표고버섯 20g(2개), 당근 5g(3..." ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = []\n", "for idx in list(df_safe.index):\n", " count, temp = 0, df_safe.loc[idx]\n", " temp_keys = list(temp['재료정보'].keys())\n", " for k in temp_keys:\n", " if temp[\"재료정보\"][k].find(':') != -1: count += 1\n", " else: pass\n", " result.append(count)\n", "df_safe.insert(1, 'Mid_Key', result)\n", "df_safe.head(2)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 메뉴명 Mid_Key 재료정보\n", "202 누룽지새우튀김 1 {'누룽지새우튀김': '새우(100g), 소금(0.3g), 후춧가루(0.02g) 튀...\n", "207 생선카레튀김 2 {'생선카레튀김': '생선살(150g), 생강(10g), 정종(10g), 녹말가루(...\n", "208 삼겹가지볶음 1 {'삼겹가지볶음': '삼겹살(100g), 생강(5g), 정종(10g), 가지(50g...\n", "(233, 3)\n" ] }, { "data": { "text/plain": [ "{'두부 달걀전': '두부 60g, 카레가루 0.4g, 후춧가루 0.1g, 밀가루 1.6g, 식용유 4g, 청고추 0.5g, 홍고추 0.5g ',\n", " '소스소개': '저나트륨초간장소스:간장 1g, 식초 1.5g, 설탕 0.3g, 통깨 0.1g'}" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "idx_key = list(df_safe[df_safe.Mid_Key!=0].index)[-4]\n", "print(df_safe[df_safe.Mid_Key!=0].head(3))\n", "print(df_safe[df_safe.Mid_Key!=0].shape)\n", "df_safe.loc[idx_key][\"재료정보\"]" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "'tuple' object is not callable", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mdf_safe\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdf_safe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mMid_Key\u001b[0m\u001b[0;34m==\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: 'tuple' object is not callable" ] } ], "source": [ "df_safe[df_safe.Mid_Key==0].shape()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## **02-beta 작전상 후퇴? 아님 수작업으로 보완하기..**\n", "1. 우선 합치기...\n", "1. 합친 뒤, \":\" 구분자 포함시 Key : Value 추가로 나누기" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"{'돼지머리수육맑은전골': '돼지머리 200g, 우동면 100g, 미나리 20g, 청고추 15g', '소스': '일본 된장 30g, 다진마늘 10g, 다진대파 10g, 청주 15g, 무 25g', '육수': '해물육수 300g, 청양고추 20g, 맛간장 15g'}\"" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_safe.loc[idx_num][\"재료정보\"]" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "ename": "AttributeError", "evalue": "'str' object has no attribute 'keys'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mtemp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf_safe\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdf_safe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mMid_Key\u001b[0m\u001b[0;34m!=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0midx_num\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtemp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miloc\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnum\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf_safe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mloc\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0midx_num\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"재료정보\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeys\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0mdf_safe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mloc\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0midx_num\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"재료정보\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mAttributeError\u001b[0m: 'str' object has no attribute 'keys'" ] } ], "source": [ "# 0 ~ 235\n", "num = 0\n", "temp = df_safe[df_safe.Mid_Key!=0]\n", "idx_num = temp.iloc[num,:].name\n", "print(list(df_safe.loc[idx_num][\"재료정보\"].keys()))\n", "df_safe.loc[idx_num][\"재료정보\"]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'돼지머리수육맑은전골': '돼지머리 200g, 우동면 100g, 미나리 20g, 청고추 15g', '소스': '일본 된장 30g, 다진마늘 10g, 다진대파 10g, 청주 15g, 무 25g', '육수': '해물육수 300g, 청양고추 20g, 맛간장 15g'}\n", "수정완료\n" ] } ], "source": [ "# 수작업 수정한 내용\n", "temp_dict = {\n", " '돼지머리수육맑은전골': '돼지머리 200g, 우동면 100g, 미나리 20g, 청고추 15g',\n", " '소스': '일본 된장 30g, 다진마늘 10g, 다진대파 10g, 청주 15g, 무 25g',\n", " '육수' : '해물육수 300g, 청양고추 20g, 맛간장 15g'}\n", "\n", "print(temp_dict)\n", "df_safe.loc[idx_num,\"재료정보\"] = str(temp_dict)\n", "# df_safe.loc[idx_num,\"재료정보\"] = temp_dict\n", "df_safe.to_csv('data/food_recipe_safe_new_keys.csv', index=None)\n", "print(\"수정완료\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_safe = pd.read_csv('data/food_recipe_safe_new_keys.csv')" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [], "source": [ "df_safe.to_csv(\"data/food_recipe_safe_new_keys_new.csv\", index=None)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'고추김치': '오이고추 160g 절임물 : 해물육수 30g, 어간장 10g',\n", " '소': '영양부추 20g, 연근 20g, 무 20g, 고춧가루 15g, 생강청 15g, 통깨 1g'}" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'고추김치': '오이고추 160g 절임물 : 해물육수 30g, 어간장 10g',\n", " '소': '영양부추 20g, 연근 20g, 무 20g, 고춧가루 15g, 생강청 15g, 통깨 1g'}" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_safe.iloc[idx_num,-1] " ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"{'고추김치': '오이고추 160g', '절임물': '해물육수 30g, 어간장 10g', '소': '영양부추 20g, 연근 20g, 무 20g, 고춧가루 15g, 생강청 15g, 통깨 1g'}\"" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "str(temp_dict)" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'고추김치': '오이고추 160g',\n", " '절임물': '해물육수 30g, 어간장 10g',\n", " '소': '영양부추 20g, 연근 20g, 무 20g, 고춧가루 15g, 생강청 15g, 통깨 1g'}" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ast.literal_eval(str(temp_dict))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.9" } }, "nbformat": 4, "nbformat_minor": 4 }