数据分析练习报告

一、项目进展

  项目功能完成了追加规范地域,行政区划代码两字段,完成了关键字的提取,行业分类。还有行业代码没有对应以及数据展示没有完成。

 

二、追加规范地域,行政区划代码两字段(参考博客:https://www.cnblogs.com/zlc364624/p/12482427.html

  1 #!/usr/bin/env python
  2 # -*- coding: utf-8 -*-
  3 
  4 
  5 import urllib.request, urllib.parse, urllib.error
  6 import json
  7 import hashlib
  8 import MySQLdb
  9 
 10 
 11 MyAK = 'xxxx'
 12 MySK = 'xxxx'
 13 lat = 0
 14 lng = 0
 15 dictjson = {}  # 声明一个字典
 16 
 17 def JingWei(address):
 18     global lat, lng
 19     # 产生sn码
 20     queryStr = "/geocoding/v3/?address=" + address + '&output=json&ak=' + MyAK
 21     encodedStr = urllib.parse.quote(queryStr, safe="/:=&?#+!$,;'@()*[]")
 22     rawStr = encodedStr + MySK
 23     sn = (hashlib.md5(urllib.parse.quote_plus(rawStr).encode("utf8")).hexdigest())
 24 
 25     # 生成url
 26     url = urllib.parse.quote("http://api.map.baidu.com" + queryStr + "&sn=" + sn, safe="/:=&?#+!$,;'@()*[]")
 27     # print('Retrieving', url)
 28 
 29     # 从API读取数据
 30     uh = urllib.request.urlopen(url)
 31     data = uh.read().decode()
 32     # print('Retrieved', len(data), 'characters')
 33 
 34     # 解析数据
 35     try:
 36         js = json.loads(data)
 37     except:
 38         js = None
 39 
 40     if not js or 'status' not in js or js['status'] != 0:
 41         print('======Failure====')
 42         print(data)
 43         return
 44 
 45     # print(json.dumps(js, indent=4, ensure_ascii=False))
 46 
 47     # 获取经纬度坐标和地址类型
 48     lat = js["result"]["location"]["lat"]
 49     lng = js["result"]["location"]["lng"]
 50     # print('纬度', lat, '经度', lng)
 51     level = js["result"]["level"]
 52     # print('地址类型', level)
 53 
 54 
 55 # 基于百度地图API下的经纬度信息来解析地理位置信息
 56 def getlocation(lat, lng):
 57     # print(lat,"ss",lng)
 58     url = '/reverse_geocoding/v3/?ak='+MyAK+'&output=json&coordtype=wgs84ll&location='+str(lat)+','+str(lng)
 59     encodedStr = urllib.parse.quote(url, safe="/:=&?#+!$,;'@()*[]")
 60     rawStr = encodedStr + MySK
 61     sn = (hashlib.md5(urllib.parse.quote_plus(rawStr).encode("utf8")).hexdigest())
 62     # 生成url
 63     url = urllib.parse.quote("http://api.map.baidu.com" + url + "&sn=" + sn, safe="/:=&?#+!$,;'@()*[]")
 64     # print('Retrieving', url)
 65     req = urllib.request.urlopen(url)  # json格式的返回数据
 66     res = req.read().decode("utf-8")  # 将其他编码的字符串解码成unicode
 67     # print(json.loads(res))
 68     return json.loads(res)
 69 
 70 
 71 def jsonFormat(lat, lng):
 72     str = getlocation(lat, lng)
 73     global dictjson
 74     dictjson={}
 75     # get()获取json里面的数据
 76     jsonResult = str.get('result')
 77     address = jsonResult.get('addressComponent')
 78     # 国家
 79     country = address.get('country')
 80     # 国家编号(0:中国)
 81     country_code = address.get('country_code')
 82     #
 83     province = address.get('province')
 84     # 城市
 85     city = address.get('city')
 86     # 城市等级
 87     city_level = address.get('city_level')
 88     # 县级
 89     district = address.get('district')
 90     # 区划代码
 91     adcode=address.get('adcode')
 92     # 街道
 93     street=address.get('street')
 94     # 街道编号
 95     street_number=address.get('street_number')
 96     # 把获取到的值,添加到字典里(添加)
 97     # dictjson['country']=country
 98     # dictjson['country_code'] = country_code
 99     dictjson['province'] = province+city+district+street+street_number
100     dictjson['adcode'] = adcode
101     # dictjson['city_level'] = city_level
102     # dictjson['district']=district
103     return dictjson
104 
105 def getInfo():
106     Data = []
107 
108     # 打开数据库连接
109     db = MySQLdb.connect("127.0.0.1", "root", "root", "datax", charset='utf8')
110 
111     # 使用cursor()方法获取操作游标
112     cursor = db.cursor()
113 
114     # SQL 查询语句
115     sql = "SELECT * FROM exam23"
116     try:
117         # 执行SQL语句
118         cursor.execute(sql)
119         # 获取所有记录列表
120         results = cursor.fetchall()
121         print(results)
122         for row in results:
123             data = {}
124             # data['序号'] = row[10]
125             data['地址'] = row[0]
126             # if data["地址"] == None:
127             #     data['地址'] = row[11].split()[0]
128             # if data["地址"] == "":
129             #     data['地址'] = row[11].split()[0]
130             # if ' ' in row[15]:
131             # data['完成单位'] = row[11].split()[0]
132             # else:
133             #     data['完成单位'] = row[15]
134             Data.append(data)
135         print(len(Data))
136         for data in Data:
137             if data["地址"]==None:
138                 print(data)
139             if data["地址"]=='':
140                 print(data)
141             if len(data["地址"])<2:
142                 print(data)
143         print(Data)
144         Data.sort(reverse=True)
145         for i in range(1, len(Data)-1):
146            if  Data[i]["地址"] == Data[i-1]["地址"]:
147                Data
148 
149 
150     except:
151         print("Error: unable to fecth data")
152 
153 
154     # 关闭数据库连接
155     db.close()
156     return Data
157 
158 def update(Data):
159     # for data in Data:
160     # 打开数据库连接
161     db = MySQLdb.connect("localhost", "root", "root", "datax", charset='utf8')
162 
163     # 使用cursor()方法获取操作游标
164     cursor = db.cursor()
165     for data in Data:
166         # SQL 更新语句
167         sql = "UPDATE exam23 SET 行政区划编码 = '%s',规范地域 = '%s' WHERE 序号 = '%s'" % (data['行政区划编码'],data['规范地域'],data['序号'])
168         try:
169             # 执行SQL语句
170             cursor.execute(sql)
171             # 提交到数据库执行
172             db.commit()
173         except:
174             # 发生错误时回滚
175             db.rollback()
176 
177     # 关闭数据库连接
178     db.close()
179 
180 
181 def getInfo1():
182     Data = []
183     Data1 = []
184 
185     # 打开数据库连接
186     db = MySQLdb.connect("127.0.0.1", "root", "hjy173780", "datax", charset='utf8')
187 
188     # 使用cursor()方法获取操作游标
189     cursor = db.cursor()
190 
191     # SQL 查询语句
192     sql = "SELECT * FROM exam21"
193     try:
194         # 执行SQL语句
195         cursor.execute(sql)
196         # 获取所有记录列表
197         results = cursor.fetchall()
198         print(results)
199         print(len(results[0]))
200         for row in results:
201             data = {}
202             data['行政区划编码'] = row[18]
203             data['规范地域'] = row[19]
204             # if data["地址"] == None:
205             #     data['地址'] = row[11].split()[0]
206             # if data["地址"] == "":
207             #     data['地址'] = row[11].split()[0]
208             # if ' ' in row[15]:
209             # data['完成单位'] = row[11].split()[0]
210             # else:
211             #     data['完成单位'] = row[15]
212             if data not in Data:
213                 Data.append(data)
214 
215         print(len(Data))
216         print(Data)
217 
218         for data in Data:
219             print(data['规范地域'])
220             if data['规范地域'] != None:
221                 if '' in data['规范地域']:
222                     data['规范地域'] = data['规范地域'][:data['规范地域'].index('')+1]
223                 if data not in Data1:
224                     Data1.append(data)
225 
226 
227         print(len(Data1))
228         print(Data1)
229 
230 
231     except:
232         print("Error: unable to fecth data")
233 
234 
235     # 关闭数据库连接
236     db.close()
237     return Data
238 
239 def update1(Data):
240     # for data in Data:
241     # 打开数据库连接
242     db = MySQLdb.connect("localhost", "root", "hjy173780", "datax", charset='utf8')
243 
244     # 使用cursor()方法获取操作游标
245     cursor = db.cursor()
246     for data in Data:
247         # SQL 更新语句
248         sql = "UPDATE exam21 SET 规范地域 = '%s' where 行政区划编码 = '%s'" % (data['规范地域'],data['行政区划编码'])
249         try:
250             # 执行SQL语句
251             cursor.execute(sql)
252             # 提交到数据库执行
253             db.commit()
254         except:
255             # 发生错误时回滚
256             db.rollback()
257 
258     # 关闭数据库连接
259     db.close()
260 
261 if __name__ == "__main__":
262     data = getInfo1()
263     update1(data)
264     # datas = getInfo()
265     # Data = []
266     # for data in datas:
267     #     print(data["地址"])
268     #     JingWei(data["地址"])
269     #     jsonFormat(lat, lng)
270     #     data['行政区划编码']=dictjson.get('adcode')
271     #     data['规范地域']=dictjson.get('province')
272     #     Data.append(data)
273     # print(Data)
274     # update(Data)
275     # JingWei("北京市地铁建筑安装工程公司")
276     # jsonFormat(lat, lng)
277     # # print(jsonFormat(lat,lng))
278     # print(dictjson.get('province')[:dictjson.get('province').index('区')+1]+"    行政区划代码"+dictjson.get('adcode'))
279     # JingWei("深圳大学")
280     # jsonFormat(lat, lng)
281     # # print(jsonFormat(lat, lng))
282     # print(dictjson.get('province')[:dictjson.get('province').index('区')+1]+"    行政区划代码"+dictjson.get('adcode'))
View Code

 

三、jieba关键字提取

设计思路:从数据库中获取关键字构建自定义的分词库,进行分词提取。

知识追加:TF-IDF分词法中停词文本语料库就是文本中出现次数追多的词,最无用的词(简单的来说就是像去掉标点符号那样)。逆向文本频率文本语料库就是一些在文章中不常见的词语,出现次数少的词。

 1 content = "该课题针对TDI(甲苯二异氰酸酯)生产废渣污染问题,将TDI废渣进行催化水解生成TDA(甲苯二胺)单体,实现了资源再生。创新点如下:1、确定了在温和反应条件下TDA高收率的水解催化剂和相转移催化剂;2、研发了高粘度、高沸点物料的连续化液固分离技术,实现了万吨级工业化生产,并形成了工艺技术软件包;3、开发了催化剂、水的循环利用和集成换热技术,降低了能耗和生产成本。采用该工艺生产的TDA,产品检测合格,满足TDI生产和其他用户要求。该技术已获得中国和美国发明专利(CN 102633651B;US 8,658,828 B2)及实用新型专利(CN 203222567 U),并制定了企业标准(Q/CFY01-2014)。该技术实现了TDI生产过程中排放的焦油废渣的回收利用,具有明显的经济效益、社会效益和环境效益。"
 2 
 3 # 第一个参数:待提取关键词的文本
 4 # 第二个参数:返回关键词的数量,重要性从高到低排序
 5 # 第三个参数:是否同时返回每个关键词的权重
 6 # 第四个参数:词性过滤,为空表示不过滤,若提供则仅返回符合词性要求的关键词
 7 # 加载停止词(Stop Words)文本语料库
 8 jieba.analyse.set_stop_words("stop_words.txt")
 9 # 加载逆向文件频率(IDF)文本语料库
10 jieba.analyse.set_idf_path("idf.txt.big");
11 keywords = jieba.analyse.extract_tags(content, topK=5, withWeight=True, allowPOS=('n','v',),)
12 print(keywords)
View Code

 

四,爬取《国民经济行业分类与代码》的数据表

知识点积累:1、爬取数据出现乱码现象:encodingapparent_encoding不一致。解决办法

1 response_data = requests.get(url, headers=headers)
2 print(response_data.encoding)
3 print(response_data.apparent_encoding)
4 response_data.encoding = response_data.apparent_encoding
View Code

      2、BeautiSoup方法:将爬取的数据通过lxml解析。(使用该方法结合select方法会很快的找到相应的数据

      3、select方法:F12打开浏览器编辑器。选择想爬取的数据,复制路径(右击copy-->copy selector),将路径的后部分作为参数即可。

      

 

  1 #!/usr/bin/env python
  2 # -*- coding: utf-8 -*-
  3 import requests
  4 from bs4 import BeautifulSoup
  5 import re
  6 import xlwt
  7 import string
  8 import json
  9 import os
 10 
 11 
 12 
 13 def deal(Str):
 14     # print(type(Str))
 15     Str = str(Str)
 16     item = []
 17     try:
 18         datas = re.findall('>(.*?)</', Str, re.S)
 19         # print(datas)
 20         for data in datas:
 21             data = re.sub(r'<.*?>', '', data)
 22             if len(data) >= 1:
 23                 data = re.sub(r'\t', '', data)
 24                 data = re.sub(r'\xa0', '', data)
 25                 data = re.sub(r' ', '', data)
 26                 item.append(data)
 27     except:
 28         print(str)
 29     return item
 30 
 31 
 32 url = "http://114.xixik.com/hangyefenlei/"
 33 headers = {
 34 
 35     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'
 36 }
 37 response_data = requests.get(url, headers=headers)
 38 print(response_data.encoding)
 39 print(response_data.apparent_encoding)
 40 response_data.encoding = response_data.apparent_encoding
 41 if response_data.text:
 42     # print(response_data.text)
 43     soup = BeautifulSoup(response_data.text, "lxml")
 44     director = soup.select("table > tbody > tr")
 45     # print(type("".join(director)))
 46     # datas = director[0].split(',')
 47 
 48     print(director[0])
 49     Data = []
 50     for data in director:
 51         item = deal(data)
 52         # print(data)
 53         Data.append(item)
 54     print(Data)
 55     # print(datas)
 56     # print(len(datas))
 57 
 58 
 59     # parent = ["0","0","0","0"]
 60     # m=0
 61     A = ''
 62     finalCodes = []
 63     for item in Data:
 64         if item[4]=="":
 65             continue
 66         code = {}
 67         if item[0]!='':
 68             A = item[0]
 69             code["code"] = A
 70         else:
 71              code["code"] =A + item[0]+item[1]+item[2]+item[3]
 72         code["name"] = item[4]
 73         code["intro"] = item[5]
 74         finalCodes.append(code)
 75         # if item[0]!='':
 76         #     if len(item[0])<=parent
 77 
 78     f = xlwt.Workbook(encoding='utf-8')
 79     sheet01 = f.add_sheet(u'sheet1', cell_overwrite_ok=True)
 80     sheet01.write(0, 0, 'code')  # 第一行第一列
 81     sheet01.write(0, 1, 'name')
 82     sheet01.write(0, 2, 'intro')
 83 
 84     for i in range(len(finalCodes)):
 85         sheet01.write(i + 1, 0, finalCodes[i]['code'])
 86         sheet01.write(i + 1, 1, finalCodes[i]['name'])
 87         sheet01.write(i + 1, 2, finalCodes[i]['intro'])
 88     f.save('D:\\爬虫数据\\行业代码\\industrycode.xls')
 89 # if __name__ == '__main__':
 90 data = "<tr><td><b>A</b></td><td><b> </b></td><td><b> </b></td><td>                 </td><td><b>农、林、牧、渔业</b></td><td>                  本门类包括01~05大类</td></tr>"
 91 item = deal(data)
 92 print(item)
 93 #     data1 = ""
 94 #     datas = re.findall('>(.*?)</',data,re.S)
 95 #     print(datas)
 96 #     Data = []
 97 #     for data in datas:
 98 #         data = re.sub(r'<.*?>', '', data)
 99 #         if len(data)>=1:
100 #             data = re.sub(r'\t','',data)
101 #             data = re.sub(r'\xa0', '', data)
102 #             data = re.sub(r' ', '', data)
103 #             Data.append(data)
104 #
105 #     print(Data)
View Code

 

 

五、贝叶斯公式实现行业分类

 1 def buildBY():
 2     Data = getdatas1() + getdatas2()
 3     types = []
 4     intros = []
 5     print(len(Data))
 6     for data in Data:
 7         data['intro'] = draw_key_word(data['intro'])    # 关键字提取
 8         types.append(data['type'])
 9         intros.append(data['intro'])
10 
11     print(Data)
12     df_train = pd.DataFrame({'content_clean': intros, 'label': types})  # 使用panadas收集数据集
13     train_data = df_train.tail()
14     print(train_data)
15     label_mapping = {}
16     mapping = df_train.label.unique()   # 结果集数据去重
17     n = 1
18     for item in mapping:
19         label_mapping[item] = n
20         n = n + 1
21     print(label_mapping)
22     df_train['label'] = df_train['label'].map(label_mapping)    # 处理结果数据集,最终形成这种样子:[1,2,3,4,5]
23     print(df_train['label'])
24     print(df_train.head())
25 
26     labels = []
27     for label in df_train['label']:
28         labels.append(label)
29 
30     print(labels)
31 
32     # words = []
33     # for line_index in range()
34     # vec = TfidfTransformer(analyzer='word', max_features=200,lowercase=False)
35     vec = CountVectorizer(analyzer='word', max_features=200, lowercase=False)   # 构建多维度数据模型
36     vec.fit(intros)
37 
38     classifier = MultinomialNB()         # 实例化一个贝叶斯对象   
39     classifier.fit(vec.transform(intros), labels)   # 开始训练
40 
41     return label_mapping,intros,classifier,vec,mapping
42 
43 
44 def deal_data(Data):
45     label_mapping, intros, classifier, vec, mapping = buildBY()
46 
47     for data in Data:
48         intro = data['deal_intro']
49         The_type = []
50         for n in range(len(label_mapping)):
51             test_words = []
52             for i in range(1):
53                 test_words.append(intro)
54             test_labels = []
55             for i in range(1):
56                 test_labels.append(n)
57             score = classifier.score(vec.transform(test_words), test_labels)   # 计算测试用例符合要求的概率
58             if score > 0.8:
59                 The_type.append(mapping[n])
60             print(score, len(test_labels), len(test_words))
61         final_type = " ".join(The_type)
62         print(final_type)
63         data['type'] = final_type
64 
65     return Data
View Code

 


       

 

posted @ 2020-03-12 23:55  余鱼瑜渔  阅读(316)  评论(0编辑  收藏  举报