进度

今天完整地进行了行业维度的清洗分析,把行业代码根据国家标准清洗出格式为  “编码·门类·大类·中类·小类”  的数据格式

过程

1、先把国家标准编码转化为json数据

2、根据原始数据编码逐层遍历json数据,补全缺失数据和问题数据。

代码

  1 import pandas as pd
2 import xlwt
3 rank10="" #A
4 rank11="" #A的名字
5 rank20=""
6 rank21=""
7 rank30=""
8 rank31=""
9 rank40=""
10 rank41=""
11 finalstr=""
12 def std_excel():
13 # dict={"A":{"01":{"011":"谷物种植","0111":"稻谷种植"} ,
14 # "02":{"021":"林木育种和育苗","0211":"林木育种"}},
15 #
16 # "B":{"06":{ "0610":"烟煤和无烟煤开采洗选","0620":"褐煤开采洗选"},
17 # "07":{"0710":"石油开采","0720":"天然气开采"}}
18 # }
19
20 # layer1=dict['A']
21 # print("第一层 A:\n",layer1)
22 #
23 # layer2 = dict['A']['01']
24 # print("第二层 01农业:\n", layer2)
25 #
26 # layer3 = dict['A']['01']["011"]
27 # print("第三层 :\n", layer3)
28 #读取标准文件
29 df = pd.read_excel('GBT4754-2011.xlsx')
30 #首先寻找第一层大写字母层的数据 定位行loc[] 定位
31 # print(df.columns.values[0]) #A
32 my_dict={"A":{}}
33 new_dict={"A":
34 {"农、林、牧、渔业":
35 {"01":
36 {"农业":
37 {"001":
38 {"谷物种植":
39 {
40 "0111":"稻谷种植","0112":"小麦种植"
41 }
42 }
43 }
44 }
45 }
46 }
47 }
48 # new_dict["A"].update(
49 # {df.loc[0].values[0]:df.loc[0].values[1]}
50 # )
51 # print("excel表的行数:\n",len(df.index.values))
52 # print("测试字典:\n",new_dict)
53 # print(df.loc[80].values)
54 # print("一个单元格数据的数据类型:\n",type(df.loc[0].values[0]))
55
56 #测试完毕 开始构建行业领域分类字典
57 industry_json={}
58 #开始遍历表格 0 - 1423
59 for i in range(len(df.index.values)):
60 #由于表格的第一列数据被判定为int型 所以要转化成str
61 temp=df.loc[i].values
62 one = str(temp[0])
63 # print(len(one))
64 two = str(temp[1])
65 # print("数据格式:\n",type(temp[0]))
66 #通过判断values[0]的字符串的长度判断处于字典的哪一层 如果长度是1 那么在第一层门类 如果长度是2那么在第二层大类 如果长度是3那么在第三层中类
67 if(len(one)==1):
68 global rank10
69 global rank11
70 rank10=one
71 rank11=two
72 my_dict.update({rank10:{rank11:{}}})
73 if(len(one)==2):
74 global rank20
75 global rank21
76 rank20 = one
77 rank21 = two
78 my_dict[rank10][rank11].update({rank20:{rank21:{}}})
79 if (len(one) == 3):
80 global rank30
81 global rank31
82 rank30 = one
83 rank31 = two
84 my_dict[rank10][rank11][rank20][rank21].update({rank30:{rank31:{}}})
85 #这里做了代码的前三位字符串切分,为了判断一下有没有小类跳过中类的情况,需要直接跨过中类存储,少了一层字典{}
86 if (len(one) == 4):
87 global rank40
88 global rank41
89 rank40 = one
90 rank41 = two
91 divide_rank40=rank40[:3]
92 # print(divide_rank40,rank30)
93 if(divide_rank40==rank30):
94 # print("!!!!!~~~~~~~~~~~~")
95 my_dict[rank10][rank11][rank20][rank21][rank30][rank31].update({rank40:rank41})
96 else:
97 my_dict[rank10][rank11][rank20][rank21].update({rank40: rank41})
98 #得到最终的字典my_dict
99 # print(my_dict.keys())
100 # print(my_dict)
101 return my_dict
102 def is_excit(qb03):
103 global finalstr
104 #设置个标记,初始值False 说明默认找不到这个编码 如果找到了则设为 True 如果最终是False则重新分割字符串回调函数
105 flag = False
106 #获取字典
107 my_dict={}
108 my_dict.update(std_excel())
109 # print(my_dict)
110 #门类KEY
111 category=""
112 #大类
113 big_class=""
114 #中类
115 medium_class=""
116 #小类
117 small_class=""
118 # 遍历第一层 门类
119
120 for items in my_dict.items():
121 res = ""
122 for layer_0 in items[1].items():
123 # print("门类:\n",layer_0)
124 # print("门类名称:\n",layer_0[0])
125 category=layer_0[0]
126 """
127 --------------------------------------------------
128 """
129 # 遍历第二层大类
130 """
131 每进入一层遍历第一个for循环是进入一个这样格式的数据 ( 编码:{ } )
132 之后第二个for循环进入那个字典{ }
133 字典构建的方式是 上一层是key 下一层是对应的value 同时它作为下一层的key
134
135 """
136 #进入第一层(A:{ } )
137 for layer_10 in layer_0[1].items():
138 # print("大类编码(两位):\n",layer_10[0])
139 #进入A对应的{ }
140 for layer_11 in layer_10[1].items():
141 # print("大类:\n",layer_11)
142 big_class = layer_11[0]
143 # 自己调用自己补全缺失值
144 if(len(qb03)==2 and qb03==layer_10[0]):
145 print("缺失值补全:\n", finalstr)
146 flag=True
147 res = finalstr + "·" + category + "·" + big_class + "·" + big_class + "·" + big_class
148 # print(res)
149 return res
150 # print("大类名称:\n",big_class)
151 """
152 --------------------------------------------------
153 """
154 #进入大类(01,{ })
155 for layer_20 in layer_11[1].items():
156 #进入01对应的 { }
157 #判断第二层下一级的名称是三位还是四位,如果是三位那么是正常的中类划分,如果是四位,那么是跳过了中类划分到了小类
158 if(len(layer_20[0])==4):
159 small_class=layer_20[1]
160 # print("大类直接分到小类:\n",small_class)
161 #判断字符串
162 if(qb03==layer_20[0]):
163 print("跨过中类的小类,判断成功!",qb03)
164 flag=True
165 res = qb03+ "·"+ category + "·" + big_class + "·"+small_class+ "·"+small_class
166 return res
167 else:
168 #这个分支的意思是有的类别只到了大类,没有中类直接分到了四位数的小类,所以必须分开遍历,字符串不能按字典遍历
169 for layer_21 in layer_20[1].items():
170 # print("中类:\n",layer_21)
171 medium_class = layer_21[0]
172 # print("中类名称:\n",medium_class)
173 # 这里是个大坑,我的遍历是进入值的那一层,编码在上一级的遍历 layer_20[0]
174 if (qb03 == layer_20[0]):
175 print("三位中类判断成功!", qb03)
176 flag=True
177 res = qb03 + "·" + category + "·" + big_class + "·" + medium_class+ "·" + medium_class
178 return res
179 #继续划分到小类
180 for layer_30 in layer_21[1].items():
181 #这个layer_30就是最后一层的四位数数据了 格式: ('0111', '稻谷种植') 是一个tuple 索引0是编码1是名称
182 small_class=layer_30[1]
183 # print("小类名称:\n",small_class)
184 #--------------------------------------------------------------------------------
185 # 判断字符串
186 if (qb03 == layer_30[0]):
187 print("正常四位小类判断成功!", qb03)
188 flag=True
189 res=qb03+"·"+category+"·"+big_class+"·"+medium_class+"·"+small_class
190 return res
191 if(flag==False):
192 finalstr = qb03
193 new_qb03=qb03[:2]
194 return is_excit(new_qb03)
195 def clean():
196 """
197 1、读取源数据表格
198 2、逐个把数据传入is_exist()方法获得返回值存回excel表格
199 :return:
200 """
201 df=pd.read_excel("2013_year_data.xlsx")
202 # print(df.loc[0].values)
203 res=[]
204 temp_res=""
205 #range(len(df.index.values))
206 for i in range(len(df.index.values)):
207 # print(df.loc[i].values[0])
208 temp_res=is_excit(str(df.loc[i].values[0]))
209 print(temp_res)
210 if(temp_res!=None):
211 res.append(temp_res)
212 else:
213 res.append(str(df.loc[i].values[0]))
214 # print(res)
215 #把结果存储到excel表
216 workbook = xlwt.Workbook(encoding='utf-8')
217 sheet = workbook.add_sheet('sheet1', cell_overwrite_ok=True)
218 sheet.col(0).width=256*100
219 sheet.write(0, 0, "data")
220 for i in range(len(res)):
221 sheet.write(i+1, 0, res[i])
222 workbook.save('2013_res_data.xls')
223 return None
224 if __name__ == '__main__':
225 # print()
226 #311 2662 610
227 # res=is_excit("610")
228 # print("----------------------")
229 # print(res)
230 # print("----------------------")
231
232 clean()

部分json数据(格式)

 1 {
2 'A': {
3 '农、林、牧、渔业': {
4 '01': {
5 '农业': {
6 '011': {
7 '谷物种植': {
8 '0111': '稻谷种植',
9 '0112': '小麦种植',
10 '0113': '玉米种植',
11 '0119': '其他谷物种植'
12 }
13 },
14 '012': {
15 '豆类、油料和薯类种植': {
16 '0121': '豆类种植',
17 '0122': '油料种植',
18 '0123': '薯类种植'
19 }
20 },
21 '013': {
22 '棉、麻、糖、烟草种植': {
23 '0131': '棉花种植',
24 '0132': '麻类种植',
25 '0133': '糖料种植',
26 '0134': '烟草种植'
27 }
28 },
29 '014': {
30 '蔬菜、食用菌及园艺作物种植': {
31 '0141': '蔬菜种植',
32 '0142': '食用菌种植',
33 '0143': '花卉种植',
34 '0149': '其他园艺作物种植'
35 }
36 },
37 '015': {
38 '水果种植': {
39 '0151': '仁果类和核果类水果种植',
40 '0152': '葡萄种植',
41 '0153': '柑橘类种植',
42 '0154': '香蕉等亚热带水果种植',
43 '0159': '其他水果种植'
44 }
45 },
46 '016': {
47 '坚果、含油果、香料和饮料作物种植': {
48 '0161': '坚果种植',
49 '0162': '含油果种植',
50 '0163': '香料作物种植',
51 '0169': '茶及其他饮料作物种植'
52 }
53 },
54 '0170': '中药材种植',
55 '0190': '其他农业'
56 }
57 },
58 '02': {
59 '林业': {
60 '021': {
61 '林木育种和育苗': {
62 '0211': '林木育种',
63 '0212': '林木育苗'
64 }
65 },
66 '0220': '造林和更新',
67 '0230': '森林经营和管护',
68 '024': {
69 '木材和竹材采运': {
70 '0241': '木材采运',
71 '0242': '竹材采运'
72 }
73 },
74 '025': {
75 '林产品采集': {
76 '0251': '木竹材林产品采集',
77 '0252': '非木竹材林产品采集'
78 }
79 }
80 }
81 },

 完整版行业分类 关注订阅号【靠谱杨阅读人生】回复【行业】获取

python 处理国家标准行业编码(编码·门类·大类·中类·小类)的更多相关文章

  1. 小白的Python之路 day1 字符编码

    字符编码 python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill) ASCII(American Standard Code for Information Interc ...

  2. python之旅:字符编码

    一 了解字符编码的知识储备 一 计算机基础知识 知识储备:cpu.内存.硬盘 二 文本编辑器存取文件的原理(nodepad++,pycharm,word) #1.打开编辑器就打开了启动了一个进程,是在 ...

  3. python进阶10 MySQL补充 编码、别名、视图、数据库修改

    python进阶10 MySQL补充    编码.别名.视图.数据库修改 一.编码问题 #MySQL级别编码 #修改位置: /etc/mysql/mysql.conf.d/mysqld.cnf def ...

  4. python 3 学习字符串和编码

    字符串和编码 阅读: 895464 字符编码 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字 ...

  5. python(10)- 字符编码

    一 什么是编码? 基本概念很简单.首先,我们从一段信息即消息说起,消息以人类可以理解.易懂的表示存在.我打算将这种表示称为“明文”(plain text).对于说英语的人,纸张上打印的或屏幕上显示的英 ...

  6. python基础——6(字符编码,文件操作)

    今日内容: 1.字符编码: 人识别的语言与机器识别的语言转化的媒介 *****     2.字符与字节: 字符占多少字节,字符串转化 ***     3.文件操作: 操作硬盘中的一块区域:读写操作  ...

  7. python(4)- 字符编码

    一 什么是编码? 基本概念很简单.首先,我们从一段信息即消息说起,消息以人类可以理解.易懂的表示存在.我打算将这种表示称为“明文”(plain text).对于说英语的人,纸张上打印的或屏幕上显示的英 ...

  8. python文件操作:字符编码与文件处理

    一.字符编码 二.文件处理 一.字符编码 储备知识点: 1. 计算机系统分为三层: 应用程序 操作系统 计算机硬件 2. 运行python程序的三个步骤 1. 先启动python解释器 2. 再将py ...

  9. python 2和3 字符编码

    在字符编码问题上,python2 和python3 还是有点不同的.今日写篇博客,彻底理清这个问题.. 字符编码问题的由来: 这要从计算发展历史来看待这个问题了,一开始,歪果仁使用ASCII码,8位( ...

  10. Python基础之字符串和编码

    字符串和编码 字符串也是一种数据类型,但是字符串比较特殊的是还有个编码问题. 因为计算机自能处理数字,如果徐娅处理文本,就必须先把文本转换为数字才能处理,最早的计算机子设计时候采用8个比特(bit)作 ...

随机推荐

  1. Java I/O 教程(九) FileWriter和FileReader

    FileWriter Java FileWriter 用于往文件中写入字符数据. 不像FileOutputStream类,你无需转换字符串成字节数组,因为它提供了直接写字符串的方法. 类定义 publ ...

  2. 详解SSL证书系列(1)什么是SSL证书?

    你一定遇到过这种情况,打开一个网站,浏览器弹出警告"您与此网站之间建立的连接不安全.由于此连接不安全,因此信息(如密码或信用卡)不会安全地发送到此网站,并且可能被其他人截获或看到" ...

  3. pyqt5学习示例

    python代码编写pyqt5 主窗口的类型:有三种窗口 # 相关函数方法 setWindowTitle() # 设置主窗口的标题 resize() # 设置窗口的大小 statusBar() # 创 ...

  4. 【Azure 事件中心】适用Mirror Maker生产数据发送到Azure Event Hub出现发送一段时间后Timeout Exception: Expiring 18 record(s) for xxxxxxx: 79823 ms has passed since last append

    问题描述 根据"将 Apache Kafka MirrorMaker 与事件中心配合使用"一文,成功配置了Mirror Maker来发送数据到Event Hub中.为什么只能成功运 ...

  5. win上vscode配置ffmpeg

    参考博客https://blog.csdn.net/leixiaohua1020/article/details/38868499 https://blog.csdn.net/weixin_37515 ...

  6. 三: MySQL的数据目录

    # MySQL的数据目录 1. MySQL8的主要目录结构 1.1 数据库文件的存放路径 MySQL数据库文件的存放路径:/var/lib/mysql/ MySQL服务器程序在启动时会到文件系统的某个 ...

  7. Codeforces Round 303 (Div. 2)C. Kefa and Park(DFS、实现)

    @ 目录 题面 链接 题意 题解 代码 总结 题面 链接 C. Kefa and Park 题意 求叶节点数量,叶节点满足,从根节点到叶节点的路径上最长连续1的长度小于m 题解 这道题目主要是实现,当 ...

  8. linux 前端 jenkins打包失败 permission 权限安装 root 安装nodejs,没有权限,另一个账号,需要chmod将文件权限打开

    linux 前端 jenkins打包失败 permission 权限安装 root 安装nodejs,没有权限,另一个账号,需要chmod将文件权限打开 开始以为nodejs版本问题 最后发现是安装n ...

  9. 词根 ten 展开 持有 /tin/tent/tain “to hold”

    词根 ten 展开 持有 /tin/tent/tain "to hold" 记忆方式:en是拿出.忘了从哪里看的了.t是动作过去. 如果是 过去的时候已经拿出来,那就是 展开 延展 ...

  10. 线上机器 swap 过高导致告警

    哈喽大家好,我是咸鱼. 今天收到了一个告警,说有台服务器上的 swap 过高,已经用了 50% 以上了. 登录机器查看一下内存以及 swap 的使用情况. [root@localhost ~]# fr ...