zoukankan      html  css  js  c++  java
  • 数据分析练习报告

    一、项目进展

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

    二、追加规范地域,行政区划代码两字段(参考博客: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'	', '', 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'	','',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
    
    

           

     

  • 相关阅读:
    python学习(二十三) String(下) 分片和索引
    python学习(二十二) String(上)
    微服务网关
    【转】linux 软连接 硬链接
    设计模式--观察者模式
    设计模式--策略模式
    ubuntu-server 安装redis
    【转】linux的hostname修改详解
    【转】ftp的两种模式
    【转】linux下find查找命令用法
  • 原文地址:https://www.cnblogs.com/goubb/p/12483796.html
Copyright © 2011-2022 走看看