Язык Wolfram Language

Расширенный доступ к базе знаний Wolfram Knowledgebase

Анализа и сравнение продуктов питания "Superfoods"

В данном примере речь пойдет о продуктах с очень высоким содержанием одного или нескольких питательных веществ. Мы рассмотрим набор таких "супер-продуктов" и противопоставим их более "типичным" продуктам. Для этого, мы воспользуемся данными о продуктах питания из базы знаний Wolfram Knowledgebase. Мы определим отличительные характеристики, подходящие для определения пищевых продуктов, достойных эпитета "супер".

Для начала, определим список супер-продуктов с высоким содержанием питательных веществ.

In[1]:=
Click for copyable input
superfoodsRawData = {{"greek yogurt", {"TotalProtein"}}, {"quinoa", \ {"TotalProtein"}}, {"blueberries", {"TotalFiber", "VitaminC"}}, {"kale", {"TotalFiber", "Calcium", "Iron"}}, {"chia", {"Magnesium", "Iron", "Calcium", "Potassium"}}, {"oatmeal", {"TotalFiber"}}, {"broccoli", \ {"TotalFiber", "VitaminC", "TotalFolate"}}, {"strawberries", {"VitaminC"}}, {"salmon", \ {"TotalProtein"}}, {"watermelon", {"TotalSugar", "VitaminA", "VitaminC", "TotalCalories"}}, {"lima beans", {"TotalFiber"}}, {"edamame", {"TotalFiber"}}, {"spinach", {"Calcium", "VitaminK"}}, {"pistachios", {"TotalProtein", "TotalFiber", "Potassium"}}, {"eggs", {"TotalProtein"}}, {"almonds", \ {"TotalFiber", "Potassium", "Calcium", "VitaminE", "Magnesium", "Iron"}}, {"pumpkin", {"BetaCarotene"}}, {"apples", \ {"TotalFiber", "TotalCalories"}}, {"lentils", {"TotalProtein", "Iron"}}};

Преобразуем эту информацию в набор данных, Dataset, для упрощения вычислений.

In[2]:=
Click for copyable input
superfoodsDatset = Dataset[<|"Food" -> #1, "Nutrients" -> #2|> & @@@ superfoodsRawData]
Out[2]=

Воспользуемся функцией Interpreter языковых объектов Wolfram Language для супер-продуктов.

In[3]:=
Click for copyable input
superfoodsDatset1 = superfoodsDatset[All, KeySort[Prepend[#, <| "FoodEntity" -> Interpreter["Food"][#Food]|>]] &];

Перечислим питательные вещества, содержащиеся в этих продуктах.

In[4]:=
Click for copyable input
Union @@ Normal[superfoodsDatset1[[All, "Nutrients"]]]
Out[4]=

Генерируем правила для преобразования данных питательных веществ в их соответствующие свойства.

In[5]:=
Click for copyable input
superfoodsDatset2 = superfoodsDatset1 /. AssociationMap[ EntityProperty["Food", "Relative" <> # <> "Content"] &, Union @@ Normal[superfoodsDatset1[[All, "Nutrients"]]]]
Out[5]=

Определим наиболее распространенные питательные вещества в нашем наборе данных, Dataset.

In[6]:=
Click for copyable input
mostCommonProperties = superfoodsDatset2[Counts[Flatten[#]] &, "Nutrients"][TakeLargest[5]]
Out[6]=

Определим суперпродукты с высоким содержанием клетчатки и сравним их с почти 9000 других пищевых продуктов. Визуализируем эти данные с помощью сглаженной гистограммы, на которой серая кривая показывает функцию плотности вероятности содержания волокон клетчатки в данных продуктах питания.

In[7]:=
Click for copyable input
fiberDataset = superfoodsDatset2[ Select[ContainsAny[#Nutrients, {EntityProperty["Food", "RelativeTotalFiberContent"]}] &], KeyDrop["Nutrients"]];
код на языке Wolfram Language целиком
In[8]:=
Click for copyable input
foodTypeColors = <| Entity["FoodType", "Kale"] -> Directive[ColorData[97, 1]], Entity["FoodType", "Apple"] -> Directive[ColorData[97, 2]], Entity["FoodType", "Broccoli"] -> Directive[ColorData[97, 3]], Entity["FoodType", "Blueberry"] -> Directive[ColorData[97, 4]], Entity["FoodType", "Edamame"] -> Directive[ColorData[97, 5]], Entity["FoodType", "LimaBean"] -> Directive[ColorData[97, 6]], Entity["FoodType", "Oatmeal"] -> Directive[ColorData[97, 7]], Entity["FoodType", "PistachioNut"] -> Directive[ColorData[97, 8]], Entity["FoodType", "Almond"] -> Directive[ColorData[97, 9]] |>;
In[9]:=
Click for copyable input
property = EntityProperty["Food", "RelativeTotalFiberContent"];
In[10]:=
Click for copyable input
data = DeleteMissing[ EntityValue[EntityClass["Food", "DataSource" -> "USDA"], property]];
In[11]:=
Click for copyable input
fiberData = Flatten[data] /. {Quantity[a_, ___] :> a};
In[12]:=
Click for copyable input
epilog = MapIndexed[ With[{prop = #FoodEntity[property], head = Log, foodType = First[Cases[#FoodEntity, Entity["FoodType", _String], Infinity, 1]]}, Tooltip[ { foodTypeColors[foodType], AbsoluteThickness[3], Line[{{head[First[prop]], 0}, {head[First[prop]], 80}}] }, #Food] ] &, Reverse@SortBy[Normal[fiberDataset], Last]];
In[13]:=
Click for copyable input
SmoothHistogram[ fiberData, Automatic, "PDF", PlotRange -> {{.02, .4}, Full}, ScalingFunctions -> {"Log", None}, AspectRatio -> 1/3, Epilog -> epilog, PlotStyle -> GrayLevel[0, .01], Filling -> Axis, FillingStyle -> GrayLevel[0, .15], PlotTheme -> {"HeightGrid"}, PlotLegends -> LineLegend @@ Transpose[Reverse /@ List @@@ Normal[foodTypeColors]], PlotLabel -> "Fiber content of \"superfoods\"", FrameLabel -> {"Fiber (g/g)"} ]
Out[13]=

Проведем похожий анализ для супер-продуктов, богатых белком.

In[14]:=
Click for copyable input
proteinDataset = superfoodsDatset2[ Select[ContainsAny[#Nutrients, {EntityProperty["Food", "RelativeTotalProteinContent"]}] &], KeyDrop["Nutrients"]];
код на языке Wolfram Language целиком
In[15]:=
Click for copyable input
foodTypeColors = <| Entity["FoodType", "Yogurt"] -> Directive[ColorData[97, 1]], Entity["FoodType", "Egg"] -> Directive[ColorData[97, 2]], Entity["FoodType", "Quinoa"] -> Directive[ColorData[97, 3]], Entity["FoodType", "PistachioNut"] -> Directive[ColorData[97, 4]], Entity["FoodType", "Salmon"] -> Directive[ColorData[97, 5]], Entity["FoodType", "Lentil"] -> Directive[ColorData[97, 6]] |>;
In[16]:=
Click for copyable input
property = EntityProperty["Food", "RelativeTotalProteinContent"];
In[17]:=
Click for copyable input
dataset = proteinDataset;
In[18]:=
Click for copyable input
data = DeleteMissing[ EntityValue[EntityClass["Food", "DataSource" -> "USDA"], property]];
In[19]:=
Click for copyable input
proteinData = Flatten[data] /. {Quantity[a_, ___] :> a};
In[20]:=
Click for copyable input
epilog = MapIndexed[ With[{prop = #FoodEntity[property], head = Log, foodType = First[Cases[#FoodEntity, Entity["FoodType", _String], Infinity, 1]]}, Tooltip[ { Replace[foodTypeColors[foodType], _Missing -> Black], AbsoluteThickness[3], Line[{{head[First[prop]], 0}, {head[First[prop]], 80000}}] }, #Food] ] &, Reverse@SortBy[Normal[dataset], Last]];
In[21]:=
Click for copyable input
SmoothHistogram[ proteinData, Automatic, "PDF", PlotRange -> {{.02, .4}, Full}, ScalingFunctions -> {"Log", None}, Epilog -> epilog, AspectRatio -> 1/3, PlotStyle -> GrayLevel[0, .01], Filling -> Axis, FillingStyle -> GrayLevel[0, .15], PlotLegends -> LineLegend @@ Transpose[Reverse /@ List @@@ Normal[foodTypeColors]], PlotTheme -> {"HeightGrid"}, PlotLabel -> "Protein content of \"superfoods\"", FrameLabel -> {"Protein (g/g)"} ]
Out[21]=

Создадим визуальные обозначения для супер-продуктов. Для этого, подберем подходящие изображения.

In[22]:=
Click for copyable input
GraphicsGrid[ Partition[ ims = EntityValue[ Cases[superfoodsDatset2[All, "FoodEntity"] // Normal, Entity["FoodType", _], Infinity], "Image"], UpTo[5]]]
Out[22]=

В качестве схемы изображения, воспользуемся эмблемой супермена.

In[23]:=
Click for copyable input
Entity["Lamina", "SupermanInsigniaLamina"]["Image"] // ImageCrop
Out[23]=

Воспользуемся простым способом обработки изображений для преобразования изображения эмблемы супермена в фоновое изображение.

In[24]:=
Click for copyable input
background = ColorNegate[ Binarize[Entity["Lamina", "SupermanInsigniaLamina"]["Image"], .99]]
Out[24]=

Создадим облако, состоящее из изображений супер-продуктов.

In[25]:=
Click for copyable input
wc = WordCloud[(RandomReal[{0.6, 1.2}] -> #) & /@ ims, background]
Out[25]=

Совместим облако и подготовленных ранее фон.

In[26]:=
Click for copyable input
ImageMultiply[{ColorReplace[background, Black -> LightGray], wc}]
Out[26]=

Родственные примеры

de en es fr ja ko pt-br zh