炼数成金数据分析课程---9、食物数据分析实例
一、总结
一句话总结:
大纲+实例学习法:重大纲,细节先略,主实例
好东西是大部分人都会觉得好的:比如那些博客,比如教学视频,比如我,比如生活中的方方面面
完全不必纠结任何事;不同时刻的心境真的不一样,你要知道,下一个心境和这个区别很大,所以完全没必要纠结什么
1、对食物数据分析一般可以分析什么?
比如食物中哪种食物的某样成分含量最高
比如每组食物的Zn元素的含量是多少
2、如何查看食物中哪种食物的某样成分含量最高?
1、ndata = pd.merge(nutrients, info, on='id', how='outer') #连接 食物描述 和 营养成分
2、by_nutrient = ndata.groupby(['nutgroup', 'nutrient'])
3、get_maximum = lambda x: x.xs(x.value.idxmax())
4、max_foods = by_nutrient.apply(get_maximum)[['value', 'food']] #获取值最大的食物
3、如何查看每组食物的Zn元素的含量是多少?
1、ndata = pd.merge(nutrients, info, on='id', how='outer')
2、result = ndata.groupby(['nutrient', 'fgroup'])['value'].quantile(0.5) #求中位数
3、result['Zinc, Zn']
#连接 食物描述 和 营养成分:能够获取不同食物里面所含的营养成分 ndata = pd.merge(nutrients, info, on='id', how='outer') result = ndata.groupby(['nutrient', 'fgroup'])['value'].quantile(0.5) #求中位数 result['Zinc, Zn']
4、打开比较大的txt文件用什么?
直接用chrome:效果比notepad++和sublim速度快很多,而且,文件还很好的被格式化了
5、打开比较大的json文件用什么?
直接用chrome:又快格式也规整
6、python中json访问数据库的方式?
db=json.load(open('data/foods-2011-10-03.json'))
只访问db[0]的键:db[0].keys() #key()方法访问key()
访问键和值:db[0]['nutrients'][0] #python中的json数据如何访问-数组方式
7、如何取营养物质的前7种?
1、db=json.load(open('data/foods-2011-10-03.json'))
2、nutrients=DataFrame(db[0]['nutrients'])
3、nutrients[:7] #取营养物质的前7种
8、如何构建食物的营养成分数据?
1、db=json.load(open('data/foods-2011-10-03.json'))
2、for rec in db:
3、 fnuts = DataFrame(rec['nutrients']) #rec是循环变量,表示db数据集中的每一条数据
4、 nutrients.append(fnuts)
db=json.load(open('data/foods-2011-10-03.json')) for rec in db: fnuts = DataFrame(rec['nutrients']) #rec是循环变量,表示db数据集中的每一条数据 fnuts['id'] = rec['id'] #给fnuts增加id字段,这个id字段是食品的id nutrients.append(fnuts)
9、如何构建食物信息数据?
1、db=json.load(open('data/foods-2011-10-03.json'))
2、info_keys=['description','group','id','manufacturer']
3、info=DataFrame(db,columns=info_keys)
10、如何对食物信息重命名?
1、col_mapping = {'description' : 'food','group' : 'fgroup'}
2、info = info.rename(columns=col_mapping, copy=False) #重命名
col_mapping = {'description' : 'food', 'group' : 'fgroup'} info = info.rename(columns=col_mapping, copy=False) #重命名 info
11、如何连接食物信息和营养成分信息?
ndata = pd.merge(nutrients, info, on='id', how='outer')
12、如何求 食物信息和营养成分联合数据的 中位数?
1、ndata = pd.merge(nutrients, info, on='id', how='outer')
2、result = ndata.groupby(['nutrient', 'fgroup'])['value'].quantile(0.5) #求中位数
quantile
英 ['kwɒntaɪl] 美
n. [计] 分位数;分位点
二、食物数据分析实例
1、数据介绍
每一条数据分为portions,description,tags,nutrients,group,id,manufacturer 这些东西
db[0].keys()
[u'portions',
u'description',
u'tags',
u'nutrients',
u'group',
u'id',
u'manufacturer']
每一个物品的营养nutrients要检测很多中,比如第一件食品就是162种(比如要检测什么蛋白质,钙,镁等)
每件食品所包含的营养成分是不一样的,所以要检测的种数也是不一样的
这是其中营养物质中蛋白质Protein的一条数据
db[0]['nutrients'][0]
{u'description': u'Protein',
u'group': u'Composition',
u'units': u'g',
u'value': 25.18}
db[0].keys()
[u'portions',
u'description',
u'tags',
u'nutrients',
u'group',
u'id',
u'manufacturer']
每一个物品的营养nutrients要检测很多中,比如第一件食品就是162种(比如要检测什么蛋白质,钙,镁等)
每件食品所包含的营养成分是不一样的,所以要检测的种数也是不一样的
description group units value
0 Protein Composition g 25.180
1 Total lipid (fat) Composition g 29.200
2 Carbohydrate, by difference Composition g 3.060
3 Ash Other g 3.280
4 Energy Energy kcal 376.000
5 Water Composition g 39.280
6 Energy Energy kJ 1573.000
7 Fiber, total dietary Composition g 0.000
8 Calcium, Ca Elements mg 673.000
9 Iron, Fe Elements mg 0.640
10 Magnesium, Mg Elements mg 22.000
这是其中营养物质中蛋白质Protein的一条数据
db[0]['nutrients'][0]
{u'description': u'Protein',
u'group': u'Composition',
u'units': u'g',
u'value': 25.18}

2、代码
1 # -*- coding: utf-8 -*- 2 from pandas import Series, DataFrame 3 import matplotlib.pyplot as plt 4 plt.rc('figure', figsize=(10, 6)) 5 import pandas as pd 6 import json 7 #6000+数据 8 db=json.load(open('data/foods-2011-10-03.json')) 9 #2条数据 10 #db=json.load(open('data/food_small.json')) 11 len(db) 12 #print(db) 13 14 db[0].keys() #key()方法访问key() 15 db[0]['nutrients'][0] #python中的json数据如何访问-数组方式 16 17 nutrients=DataFrame(db[0]['nutrients']) 18 nutrients 19 nutrients[:7] #取营养物质的前7种 20 21 #只提取数据中的'description','group','id','manufacturer'这几样 22 info_keys=['description','group','id','manufacturer'] 23 info=DataFrame(db,columns=info_keys) 24 25 #info 26 info[:5] #取前五条 27 28 pd.value_counts(info.group)[:10] #pandas包统计物品数据 29 #pd.value_counts(info.group) 30 31 nutrients = [] 32 33 #将 营养成分 记录下来 34 for rec in db: 35 fnuts = DataFrame(rec['nutrients']) #rec是循环变量,表示db数据集中的每一条数据 36 fnuts['id'] = rec['id'] #给fnuts增加id字段,这个id字段是食品的id 37 nutrients.append(fnuts) 38 39 fnuts 40 #nutrients #单纯的各个营养成分拼接的表 41 42 43 nutrients = pd.concat(nutrients, ignore_index=True) #将营养成分连接起来 44 45 nutrients 46 47 nutrients.duplicated().sum() #重复项的数目 48 nutrients = nutrients.drop_duplicates() #去掉重复项 49 nutrients 50 51 #重命名:方便观测数据 52 col_mapping = {'description' : 'food', 53 'group' : 'fgroup'} 54 info = info.rename(columns=col_mapping, copy=False) #重命名 55 info 56 57 col_mapping = {'description' : 'nutrient', 58 'group' : 'nutgroup'} 59 nutrients = nutrients.rename(columns=col_mapping, copy=False) 60 nutrients 61 62 #连接 食物描述 和 营养成分:能够获取不同食物里面所含的营养成分 63 ndata = pd.merge(nutrients, info, on='id', how='outer') 64 65 ndata 66 67 68 #ndata.ix[30000] #.ix is deprecated. 69 ndata.loc[30000] #查找第30000行的信息的情况 70 71 #根据营养成分和分组,画出中位数的表 72 result = ndata.groupby(['nutrient', 'fgroup'])['value'].quantile(0.5) #求中位数 73 result 74 result['Zinc, Zn'] #取 Zinc, Zn 这一行的数据 75 result['Zinc, Zn'].order().plot(kind='barh') 76 77 # 找营养成分最丰富的或最不丰富的 78 by_nutrient = ndata.groupby(['nutgroup', 'nutrient']) 79 80 get_maximum = lambda x: x.xs(x.value.idxmax()) 81 get_minimum = lambda x: x.xs(x.value.idxmin()) 82 83 max_foods = by_nutrient.apply(get_maximum)[['value', 'food']] #获取值最大的食物 84 max_foods 85 86 # make the food a little smaller 87 max_foods.food = max_foods.food.str[:50] 88 max_foods.food 89 90 max_foods.loc['Amino Acids']['food']