Pythonで健康的な食材を扱う(Nutritionix API編)

Foodtec

はじめに

健康意識が高まる中,食事のトラッキングが人気を集めています.Nutritionixは,食品栄養情報を提供するオンラインプラットフォームであり,他のアプリケーションに統合できるAPIがあります.この記事では,PythonでNutritionix APIを使用して,どんな食品でも栄養情報を取得する方法を紹介します.

料理とデータサイエンス

今日,世界中でデータサイエンスはますます重要な役割を果たしています.データサイエンスは,私たちの社会の様々な側面で活用されています.その1つが料理です.最近の技術革新により,料理は単なる食べ物の調理から,より科学的かつ複雑なプロセスになっています.データサイエンスを料理に応用することで,食品業界は革命的な変革をしています.

https://hamaruki.com/cooking-and-data-science/

USDAタグとは

USDAタグとは,アメリカ合衆国農務省(USDA)が提供する食品栄養データベースにおいて,特定の食品を識別するために使用される一意のタグ(識別子)です.これらのタグは,食品に関する情報を効率的に管理し,栄養成分の正確な計算を可能にするために使用されます.USDAタグは,一般的に,栄養情報を提供するAPIやアプリケーションで使用されます.

Nutritionix

Nutritionix(ニュートリショニクス)は、栄養価情報のデータベースやAPIを提供する企業で、食品やレシピなどの栄養価データを取得・管理・提供しています。この情報は、ダイエットアプリや健康管理アプリ、フードデリバリーサービスなどで使用されています。また、フードサービス業界においても、メニューのカロリーや栄養価情報を提供するためのツールとして利用されています。

Nutritionix API

Nutritionix APIは,Pythonを使って栄養情報を簡単に取得することができるAPIです.このAPIを使えば,食品の栄養成分を簡単に取得できるため,健康的な食材を選ぶ際に役立ちます.

https://trackapi.nutritionix.com/docs/

Pythonで健康的な食材を扱う(調査編)

健康的な食材を選ぶことは,私たちの健康に非常に大きな影響を与える重要な要素です.Pythonは,健康的な食材の選択に役立つ様々な方法を提供してくれます.ここでは,健康的な食材とPythonの関係について探求していきます.

https://hamaruki.com/healthy-food-products-at-python/

Nutritionix APIの設定

Nutritionix APIを使用するには,アカウントを作成してAPIキーを取得する必要があります.以下の手順に従って行うことができます.

  1. Nutritionix APIのウェブサイトにアクセスします
  2. 「サインアップ」ボタンをクリックします

  1. 必要な情報を入力し,「アカウントを作成する」をクリックします
  2. アカウントを作成したら,APIコンソールに移動します.ここで「APIキーを取得」ボタンをクリックして,APIキーを取得できます.

必要なパッケージのインストール

PythonでNutritionix APIを使用するには,requestsパッケージをインストールする必要があります.次のコマンドをターミナルで実行することでインストールできます.


pip install requests

食品の栄養情報の取得

PythonでNutritionix APIを使用して,食品の栄養情報を取得するには,APIエンドポイントにGETリクエストを送信する必要があります.栄養情報を取得するためのエンドポイントは https://trackapi.nutritionix.com/v2/natural/nutrients です.

以下は,食品の栄養情報を取得する例です.


import requests # HTTPリクエストを送信するためのライブラリ
import json # JSON形式を扱うためのライブラリ
import pprint # デバッグ用の出力を整形するためのライブラリ
import pandas as pd # データ解析のためのライブラリ

url = 'https://trackapi.nutritionix.com/v2/natural/nutrients'
# Nutritionix APIの認証情報を設定する
headers = {
    'accept': 'application/json', # レスポンスとしてJSON形式で受け取ることを指定
    'x-app-id': 'XXXXXXXXXXXXXX', # 自身のアプリケーションIDを設定
    'x-app-key': 'YYYYYYYYYYYYYYYYYYYYY', # 自身のアプリケーションキーを設定
    'x-remote-user-id': 'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ', # ユーザIDを設定
    'Content-Type': 'application/json' # リクエストのデータ形式を指定
}
payload = {
    "query": "piza", # 検索クエリを指定
    "num_servings": 0, # 検索対象とする食品のサービングサイズを指定
    "line_delimited": False,
    "use_raw_foods": False,
    "include_subrecipe": False,
    "lat": 0,
    "lng": 0,
    "meal_type": 0,
    "use_branded_foods": False,
    "taxonomy": False,
    "ingredient_statement": False,
    "last_modified": False
}

# 指定した認証情報と検索条件を使ってAPIにリクエストを送信する
response = requests.post(url, headers=headers, data=json.dumps(payload))

# レスポンスをJSON形式で取得し、出力する
print(response.json())

このコードは、Nutritionix APIを使用して、特定の食品の栄養素情報を取得するためのものです。具体的には、以下の手順を実行しています。

POST リクエスト

requests ライブラリを使用して、Nutritionix APIに POST リクエストを送信しています。このとき、以下の情報をリクエストヘッダーとして送信しています。

  • accept: レスポンスのデータ形式を指定するための情報
  • x-app-id、x-app-key、x-remote-user-id: Nutritionix APIの認証情報
  • Content-Type: リクエストボディのデータ形式を指定するための情報

食品の情報を指定

payload 変数に、取得したい食品の情報を指定しています。具体的には、以下の情報を指定しています。

  • query: 取得したい食品名のクエリ
  • num_servings、line_delimited、use_raw_foods、include_subrecipe、lat、lng、meal_type、use_branded_foods、taxonomy、ingredient_statement、last_modified: 取得する情報の詳細な指定

JSON形式で出力

response.json() を用いて、取得した栄養素情報をJSON形式で出力しています。


{'foods': [{'food_name': 'piza', 'brand_name': None, 'serving_qty': 1, 'serving_unit': 'large slice', 'serving_weight_grams': 170, 'nf_calories': 452.2, 'nf_total_fat': 16.47, 'nf_saturated_fat': 7.59, 'nf_cholesterol': 28.9, 'nf_sodium': 1016.6, 'nf_total_carbohydrate': 56.66, 'nf_dietary_fiber': 3.91, 'nf_sugars': 6.09, 'nf_protein': 19.36, 'nf_potassium': 292.4, 'nf_p': 367.2, 'full_nutrients': [{'attr_id': 203, 'value': 19.363}, {'attr_id': 204, 'value': 16.473}, {'attr_id': 205, 'value': 56.661}, {'attr_id': 207, 'value': 4.097}, {'attr_id': 208, 'value': 452.2}, {'attr_id': 209, 'value': 45.815}, {'attr_id': 210, 'value': 0.34}, {'attr_id': 211, 'value': 1.326}, {'attr_id': 212, 'value': 1.7}, {'attr_id': 213, 'value': 0.714}, {'attr_id': 214, 'value': 1.785}, {'attr_id': 221, 'value': 0}, {'attr_id': 255, 'value': 73.389}, {'attr_id': 262, 'value': 0}, {'attr_id': 263, 'value': 0}, {'attr_id': 268, 'value': 1892.1}, {'attr_id': 269, 'value': 6.086}, {'attr_id': 287, 'value': 0.221}, {'attr_id': 291, 'value': 3.91}, {'attr_id': 301, 'value': 319.6}, {'attr_id': 303, 'value': 4.216}, {'attr_id': 304, 'value': 40.8}, {'attr_id': 305, 'value': 367.2}, {'attr_id': 306, 'value': 292.4}, {'attr_id': 307, 'value': 1016.6}, {'attr_id': 309, 'value': 2.278}, {'attr_id': 312, 'value': 0.1785},

....

なお、APIの認証情報は、 YOUR_APP_ID、YOUR_APP_KEY、x-remote-user-id の部分に、それぞれ実際の認証情報を入力してから実行する必要があります。また、取得したい食品名は、 query の値を変更することで指定することができます。

栄養情報の解析

栄養情報を取得したら,Pythonで解析して必要な情報を取得することができます.以下は,例です.

USDA タグのテーブルの作成

responseの栄養素はattr_idで管理されています.そこで,attr_idUSDA タグに変換するテーブルを作成します.

https://docs.google.com/spreadsheets/d/14ssR3_vFYrVAidDLJoio07guZM80SMR5nxdGpAX-1-A/edit#gid=309222162

下記はNutritionix API v2 - Full Nutrient USDA Field Mapping [PUBLIC] - Full Nutrient Mapping - Nutritionix API v2.csvの中身です.


attr_id,2018 NFP,usda_tag,name,unit,v2/natural [common],v2/search/item [cpg],v2/search/item [restaurant],Notes,bulk_csv_field
301,1,CA,"Calcium, Ca",mg,1,1,1,,nf_calcium_mg
205,1,CHOCDF,"Carbohydrate, by difference",g,1,1,1,,nf_total_carbohydrate
601,1,CHOLE,Cholesterol,mg,1,1,1,,nf_cholesterol
208,1,ENERC_KCAL,Energy,kcal,1,1,1,,nf_calories
606,1,FASAT,"Fatty acids, total saturated",g,1,1,1,,nf_saturated_fat
204,1,FAT,Total lipid (fat),g,1,1,1,,nf_total_fat
605,1,FATRN,"Fatty acids, total trans",g,1,1,1,,nf_trans_fatty_acid
303,1,FE,"Iron, Fe",mg,1,1,1,,nf_iron_mg
291,1,FIBTG,"Fiber, total dietary",g,1,1,1,,nf_dietary_fiber
306,1,K,"Potassium, K",mg,1,1,1,,nf_potassium
307,1,NA,"Sodium, Na",mg,1,1,1,,nf_sodium
203,1,PROCNT,Protein,g,1,1,1,,nf_protein
269,1,SUGAR,"Sugars, total",g,1,1,1,,nf_sugars
539,1,SUGAR_ADD,"Sugars, added",g,1,1,1,,nf_added_sugars
324,1,VITD,Vitamin D,IU,1,1,1,,nf_vitamin_d_mcg
299,1,SUGAR_ALC,Sugar Alcohol,g,0,1,0,,
1001,1,#N/A,Erythritol,g,0,1,0,,
1006,1,#N/A,Allulose,g,0,1,0,,
1002,1,#N/A,Glycerin,g,0,1,0,,
290,1,XYL,Xylitol,g,0,1,0,,
261,1,SORB,Sorbitol,g,0,1,0,,
260,1,MANOL,Mannitol,g,0,1,0,,
1003,1,#N/A,Maltitol,g,0,1,0,,
1004,1,#N/A,Isomalt,g,0,1,0,,
1005,1,#N/A,Lactitol,g,0,1,0,,
513,0,ALA_G,Alanine,g,1,0,0,,
221,0,ALC,"Alcohol, ethyl",g,1,0,0,,
511,0,ARG_G,Arginine,g,1,0,0,,
207,0,ASH,Ash,g,1,0,0,,
514,0,ASP_G,Aspartic acid,g,1,0,0,,
454,0,BETN,Betaine,mg,1,0,0,,
262,0,CAFFN,Caffeine,mg,1,0,0,,
639,0,CAMD5,Campesterol,mg,1,0,0,,
322,0,CARTA,"Carotene, alpha",µg,1,0,0,,
321,0,CARTB,"Carotene, beta",µg,1,0,0,,
326,0,CHOCAL,Vitamin D3 (cholecalciferol),µg,1,0,0,,
421,0,CHOLN,"Choline, total",mg,1,0,0,,
334,0,CRYPX,"Cryptoxanthin, beta",µg,1,0,0,,
312,0,CU,"Copper, Cu",mg,1,0,0,,
507,0,CYS_G,Cystine,g,1,0,0,,
268,0,ENERC_KJ,Energy,kJ,1,0,0,,
325,0,ERGCAL,Vitamin D2 (ergocalciferol),µg,1,0,0,,
610,0,F10D0,10:00,g,1,0,0,,
611,0,F12D0,12:00,g,1,0,0,,
696,0,F13D0,13:00,g,1,0,0,,
612,0,F14D0,14:00,g,1,0,0,,
625,0,F14D1,14:01,g,1,0,0,,
652,0,F15D0,15:00,g,1,0,0,,
697,0,F15D1,15:01,g,1,0,0,,
613,0,F16D0,16:00,g,1,0,0,,
626,0,F16D1,16:1 undifferentiated,g,1,0,0,,
673,0,F16D1C,16:1 c,g,1,0,0,,
662,0,F16D1T,16:1 t,g,1,0,0,,
653,0,F17D0,17:00,g,1,0,0,,
687,0,F17D1,17:01,g,1,0,0,,
614,0,F18D0,18:00,g,1,0,0,,
617,0,F18D1,18:1 undifferentiated,g,1,0,0,,
674,0,F18D1C,18:1 c,g,1,0,0,,
663,0,F18D1T,18:1 t,g,1,0,0,,
859,0,F18D1TN7,18:1-11t (18:1t n-7),g,1,0,0,,
618,0,F18D2,18:2 undifferentiated,g,1,0,0,,
670,0,F18D2CLA,18:2 CLAs,g,1,0,0,,
675,0,F18D2CN6,"18:2 n-6 c,c",g,1,0,0,,
669,0,F18D2TT,"18:2 t,t",g,1,0,0,,
619,0,F18D3,18:3 undifferentiated,g,1,0,0,,
851,0,F18D3CN3,"18:3 n-3 c,c,c (ALA)",g,1,0,0,,
685,0,F18D3CN6,"18:3 n-6 c,c,c",g,1,0,0,,
627,0,F18D4,18:04,g,1,0,0,,
615,0,F20D0,20:00,g,1,0,0,,
628,0,F20D1,20:01,g,1,0,0,,
672,0,F20D2CN6,"20:2 n-6 c,c",g,1,0,0,,
689,0,F20D3,20:3 undifferentiated,g,1,0,0,,
852,0,F20D3N3,20:3 n-3,g,1,0,0,,
853,0,F20D3N6,20:3 n-6,g,1,0,0,,
620,0,F20D4,20:4 undifferentiated,g,1,0,0,,
855,0,F20D4N6,20:4 n-6,g,1,0,0,,
629,0,F20D5,20:5 n-3 (EPA),g,1,0,0,,
857,0,F21D5,21:05,g,1,0,0,,
624,0,F22D0,22:00,g,1,0,0,,
630,0,F22D1,22:1 undifferentiated,g,1,0,0,,
858,0,F22D4,22:04,g,1,0,0,,
631,0,F22D5,22:5 n-3 (DPA),g,1,0,0,,
621,0,F22D6,22:6 n-3 (DHA),g,1,0,0,,
654,0,F24D0,24:00:00,g,1,0,0,,
671,0,F24D1C,24:1 c,g,1,0,0,,
607,0,F4D0,4:00,g,1,0,0,,
608,0,F6D0,6:00,g,1,0,0,,
609,0,F8D0,8:00,g,1,0,0,,
645,0,FAMS,"Fatty acids, total monounsaturated",g,1,0,0,,
646,0,FAPU,"Fatty acids, total polyunsaturated",g,1,0,0,,
693,0,FATRNM,"Fatty acids, total trans-monoenoic",g,1,0,0,,
695,0,FATRNP,"Fatty acids, total trans-polyenoic",g,1,0,0,,
313,0,FLD,"Fluoride, F",µg,1,0,0,,
417,0,FOL,"Folate, total",µg,1,0,0,,
431,0,FOLAC,Folic acid,µg,1,0,0,,
435,0,FOLDFE,"Folate, DFE",µg,1,0,0,,
432,0,FOLFD,"Folate, food",µg,1,0,0,,
212,0,FRUS,Fructose,g,1,0,0,,
287,0,GALS,Galactose,g,1,0,0,,
515,0,GLU_G,Glutamic acid,g,1,0,0,,
211,0,GLUS,Glucose (dextrose),g,1,0,0,,
516,0,GLY_G,Glycine,g,1,0,0,,
512,0,HISTN_G,Histidine,g,1,0,0,,
521,0,HYP,Hydroxyproline,g,1,0,0,,
503,0,ILE_G,Isoleucine,g,1,0,0,,
213,0,LACS,Lactose,g,1,0,0,,
504,0,LEU_G,Leucine,g,1,0,0,,
338,0,LUT+ZEA,Lutein + zeaxanthin,µg,1,0,0,,
337,0,LYCPN,Lycopene,µg,1,0,0,,
505,0,LYS_G,Lysine,g,1,0,0,,
214,0,MALS,Maltose,g,1,0,0,,
506,0,MET_G,Methionine,g,1,0,0,,
304,0,MG,"Magnesium, Mg",mg,1,0,0,,
428,0,MK4,Menaquinone-4,µg,1,0,0,,
315,0,MN,"Manganese, Mn",mg,1,0,0,,
406,0,NIA,Niacin,mg,1,0,0,,
573,0,NULL,"Vitamin E, added",mg,1,0,0,,
578,0,NULL,"Vitamin B-12, added",µg,1,0,0,,
257,0,NULL,Adjusted Protein,g,1,0,0,,
664,0,NULL,22:1 t,g,1,0,0,,
676,0,NULL,22:1 c,g,1,0,0,,
856,0,NULL,18:3i,g,1,0,0,,
665,0,NULL,18:2 t not further defined,g,1,0,0,,
666,0,NULL,18:2 i,g,1,0,0,,
305,0,P,"Phosphorus, P",mg,1,0,0,,
410,0,PANTAC,Pantothenic acid,mg,1,0,0,,
508,0,PHE_G,Phenylalanine,g,1,0,0,,
636,0,PHYSTR,Phytosterols,mg,1,0,0,,
517,0,PRO_G,Proline,g,1,0,0,,
319,0,RETOL,Retinol,µg,1,0,0,,
405,0,RIBF,Riboflavin,mg,1,0,0,,
317,0,SE,"Selenium, Se",µg,1,0,0,,
518,0,SER_G,Serine,g,1,0,0,,
641,0,SITSTR,Beta-sitosterol,mg,1,0,0,,
209,0,STARCH,Starch,g,1,0,0,,
638,0,STID7,Stigmasterol,mg,1,0,0,,
210,0,SUCS,Sucrose,g,1,0,0,,
263,0,THEBRN,Theobromine,mg,1,0,0,,
404,0,THIA,Thiamin,mg,1,0,0,,
502,0,THR_G,Threonine,g,1,0,0,,
323,0,TOCPHA,Vitamin E (alpha-tocopherol),mg,1,0,0,,
341,0,TOCPHB,"Tocopherol, beta",mg,1,0,0,,
343,0,TOCPHD,"Tocopherol, delta",mg,1,0,0,,
342,0,TOCPHG,"Tocopherol, gamma",mg,1,0,0,,
501,0,TRP_G,Tryptophan,g,1,0,0,,
509,0,TYR_G,Tyrosine,g,1,0,0,,
510,0,VAL_G,Valine,g,1,0,0,,
318,0,VITA_IU,"Vitamin A, IU",IU,1,0,0,,
320,0,VITA_RAE,"Vitamin A, RAE",µg,1,0,0,,
418,0,VITB12,Vitamin B-12,µg,1,0,0,,
415,0,VITB6A,Vitamin B-6,mg,1,0,0,,
401,0,VITC,"Vitamin C, total ascorbic acid",mg,1,0,0,,
328,0,VITD,Vitamin D (D2 + D3),µg,1,0,0,,
430,0,VITK1,Vitamin K (phylloquinone),µg,1,0,0,,
429,0,VITK1D,Dihydrophylloquinone,µg,1,0,0,,
255,0,WATER,Water,g,1,0,0,,
309,0,ZN,"Zinc, Zn",mg,1,0,0,,
344,,TOCTRA,"Tocotrienol, alpha",mg,1,0,0,,
345,,TOCTRB,"Tocotrienol, beta",mg,1,0,0,,
346,,TOCTRG,"Tocotrienol, gamma",mg,1,0,0,,
347,,TOCTRD,"Tocotrienol,delta",mg,1,0,0,,

IDの変換

Pandasを使用してNutritionix APIのID変換テーブルのCSVファイルを読み込み,JSONファイルから抽出された情報をマージするコードです.


# CSVファイルを読み込みます
nutrient_df = pd.read_csv('data/Nutritionix API v2 - Full Nutrient USDA Field Mapping [PUBLIC] - Full Nutrient Mapping - Nutritionix API v2.csv')

# JSONファイルからfull_nutrients情報を取得します
full_nutrients = pd.DataFrame(response.json()['foods'][0]['full_nutrients'])

# データフレームの列の一部だけを選択して,mergeを実行します
select_columns = ["attr_id", "value", "usda_tag", "name", "unit"]
merged_df = pd.merge(nutrient_df, full_nutrients, on='attr_id', how='outer')[select_columns]

これで食品にどの栄養素が入っているかを見ることができました.


print(full_nutrients2)
     attr_id     value    usda_tag                          name  unit
0        301  319.6000          CA                   Calcium, Ca    mg
1        205   56.6610      CHOCDF   Carbohydrate, by difference     g
2        601   28.9000       CHOLE                   Cholesterol    mg
3        208  452.2000  ENERC_KCAL                        Energy  kcal
4        606    7.5905       FASAT  Fatty acids, total saturated     g
..       ...       ...         ...                           ...   ...
156      309    2.2780          ZN                      Zinc, Zn    mg
157      344    0.1020      TOCTRA            Tocotrienol, alpha    mg
158      345    0.0000      TOCTRB             Tocotrienol, beta    mg
159      346    0.0000      TOCTRG            Tocotrienol, gamma    mg
160      347    0.0000      TOCTRD             Tocotrienol,delta    mg

簡易栄養素情報の取得

次のコードは代表的な栄養素の情報のみを取得します.


# JSONファイルからnf_タグを抽出します
nf_tags = [x for x in response.json()['foods'][0].keys() if 'nf_' in x]

# nf_タグの値を保持するための辞書を作成します
nf_data = {}
for nf_tag in nf_tags:
    nf_data[nf_tag] = response.json()['foods'][0][nf_tag]

# 辞書を転置して,DataFrameを作成します
df_nf_data = pd.DataFrame([nf_data]).T

print(df_nf_data)
                             0
nf_calories             452.20
nf_total_fat             16.47
nf_saturated_fat          7.59
nf_cholesterol           28.90
nf_sodium              1016.60
nf_total_carbohydrate    56.66
nf_dietary_fiber          3.91
nf_sugars                 6.09
nf_protein               19.36
nf_potassium            292.40
nf_p                    367.20

このコードは,食品の栄養素情報を示すデータです.各行は,栄養素の種類を示す nf_ で始まる列名と,その栄養素の量を示す数値からなります.具体的には,以下の栄養素の量が示されています.

  • nf_calories: カロリー
  • nf_total_fat: 総脂質量
  • nf_saturated_fat: 飽和脂肪酸の量
  • nf_cholesterol: コレステロールの量
  • nf_sodium: ナトリウムの量
  • nf_total_carbohydrate: 総炭水化物の量
  • nf_dietary_fiber: 食物繊維の量
  • nf_sugars: 総糖分の量
  • nf_protein: 総タンパク質量
  • nf_potassium: カリウムの量
  • nf_p: リンの量

数値は,それぞれの栄養素の量を示しています.たとえば,nf_calories452.20 であり,この食品のカロリーが452.20kcalであることを示しています.

まとめ

Pythonを使用して,Nutritionix APIから食品の栄養情報を取得する方法を紹介しました.APIキーを取得し,requestsパッケージを使用してAPIエンドポイントにGETリクエストを送信することで,どんな食品でも簡単に栄養情報を取得することができます.

FAQs

1. Nutritionix APIを使用するためには,アカウントを作成する必要がありますか?

はい,Nutritionix APIを使用するには,アカウントを作成してAPIキーを取得する必要があります.

2. Python以外のプログラミング言語でNutritionix APIを使用できますか?

はい,Nutritionix APIは多くのプログラミング言語で使用することができます.

3. Nutritionix APIは無料ですか?

いいえ,Nutritionix APIは有料です.詳細については,Nutritionix APIのウェブサイトをご確認ください.

4. 栄養情報を取得できなかった場合,どうすればよいですか?

食品の名前や説明をより具体的にすることで,栄養情報を取得できる可能性が高くなります.

5. Nutritionix APIは,どのような種類の栄養情報を提供していますか?

Nutritionix APIは,カロリー,タンパク質,脂質,炭水化物,飽和脂肪酸,トランス脂肪酸,繊維,ナトリウム,ビタミン,ミネラル,およびその他の栄養素に関する情報を提供しています.提供される栄養情報の詳細については,Nutritionix APIのドキュメントを参照してください.

コメント

タイトルとURLをコピーしました