python数据分析之单因素分析线性拟合及地理编码

目录

一、单因素分析线性拟合

  • 功能:线性拟合,单因素分析,对散点图进行线性拟合,并放大散点图的局部位置
  • 输入:某个xlsx文件,包含'患者密度(人/10万人)'和'人口密度(人/平方千米)'两列
  • 输出:对这两列数据进行线性拟合,绘制散点

实现代码:

import pandas as pd
from pylab import mpl
from scipy import optimize
import numpy as np
import matplotlib.pyplot as plt
def f_1(x, A, B):
    return A*x + B
def draw_cure(file):
    data1=pd.read_excel(file)
    data1=pd.DataFrame(data1)
    hz=list(data1[\'患者密度(人/10万人)\'])
    rk=list(data1[\'人口密度(人/平方千米)\'])
    hz_gy=[]
    rk_gy=[]
    for i in hz:
        hz_gy.append((i-min(hz))/(max(hz)-min(hz)))
    for i in rk:
        rk_gy.append((i-min(rk))/(max(rk)-min(rk)))
    n=[\'玄武区\',\'秦淮区\',\'建邺区\',\'鼓楼区\',\'浦口区\',\'栖霞区\',\'雨花台区\',\'江宁区\',\'六合区\',\'溧水区\',\'高淳区\',
       \'锡山区\',\'惠山区\',\'滨湖区\',\'梁溪区\',\'新吴区\',\'江阴市\',\'宜兴市\',
       \'鼓楼区\',\'云龙区\',\'贾汪区\',\'泉山区\',\'铜山区\',\'丰县\',\'沛县\',\'睢宁县\',\'新沂市\',\'邳州市\',
       \'天宁区\',\'钟楼区\',\'新北区\',\'武进区\',\'金坛区\',\'溧阳市\',
       \'虎丘区\',\'吴中区\',\'相城区\',\'姑苏区\',\'吴江区\',\'常熟市\',\'张家港市\',\'昆山市\',\'太仓市\',
       \'崇川区\',\'港闸区\',\'通州区\',\'如东县\',\'启东市\',\'如皋市\',\'海门市\',\'海安市\',
       \'连云区\',\'海州区\',\'赣榆区\',\'东海县\',\'灌云县\',\'灌南县\',
       \'淮安区\',\'淮阴区\',\'清江浦区\',\'洪泽区\',\'涟水县\',\'盱眙县\',\'金湖县\',
       \'亭湖区\',\'盐都区\',\'大丰区\',\'响水县\',\'滨海县\',\'阜宁县\',\'射阳县\',\'建湖县\',\'东台市\',
       \'广陵区\',\'邗江区\',\'江都区\',\'宝应县\',\'仪征市\',\'高邮市\',
       \'京口区\',\'润州区\',\'丹徒区\',\'丹阳市\',\'扬中市\',\'句容市\',
       \'海陵区\',\'高港区\',\'姜堰区\',\'兴化市\',\'靖江市\',\'泰兴市\',
       \'宿城区\',\'宿豫区\',\'沭阳县\',\'泗阳县\',\'泗洪县\']
    mpl.rcParams[\'font.sans-serif\'] = [\'FangSong\']
    plt.figure(figsize=(16,8),dpi=98)
    p1 = plt.subplot(121)
    p2 = plt.subplot(122)
    p1.scatter(rk_gy,hz_gy,c=\'r\')
    p2.scatter(rk_gy,hz_gy,c=\'r\')
    p1.axis([0.0,1.01,0.0,1.01])
    p1.set_ylabel(\"患者密度(人/10万人)\",fontsize=13)
    p1.set_xlabel(\"人口密度(人/平方千米)\",fontsize=13)
    p1.set_title(\"人口密度—患者密度相关性\",fontsize=13)
    for i,txt in enumerate(n):
        p1.annotate(txt,(rk_gy[i],hz_gy[i]))
    A1, B1 = optimize.curve_fit(f_1, rk_gy, hz_gy)[0]
    x1 = np.arange(0, 1, 0.01)
    y1 = A1*x1 + B1
    p1.plot(x1, y1, \"blue\",label=\'一次拟合直线\')
    x2 = np.arange(0, 1, 0.01)
    y2 = x2
    p1.plot(x2, y2,\'g--\',label=\'y=x\')
    p1.legend(loc=\'upper left\',fontsize=13)
    # # plot the box
    tx0 = 0;tx1 = 0.1;ty0 = 0;ty1 = 0.2
    sx = [tx0,tx1,tx1,tx0,tx0]
    sy = [ty0,ty0,ty1,ty1,ty0]
    p1.plot(sx,sy,\"purple\")
    p2.axis([0,0.1,0,0.2])
    p2.set_ylabel(\"患者密度(人/10万人)\",fontsize=13)
    p2.set_xlabel(\"人口密度(人/平方千米)\",fontsize=13)
    p2.set_title(\"人口密度—患者密度相关性\",fontsize=13)
    for i,txt in enumerate(n):
        p2.annotate(txt,(rk_gy[i],hz_gy[i]))
    p2.plot(x1, y1, \"blue\",label=\'一次拟合直线\')
    p2.plot(x2, y2,\'g--\',label=\'y=x\')
    p2.legend(loc=\'upper left\',fontsize=13)
    plt.show()
if __name__ == \'__main__\':
    draw_cure(\"F:\\医学大数据课题\\论文终稿修改\\scientific report\\返修\\市区县相关分析 _2231.xls\")

实现效果:

python数据分析之单因素分析线性拟合及地理编码

二、实现地理编码

  • 输入:中文地址信息,例如安徽为县天城镇都督村冲里18号
  • 输出:经纬度坐标,例如107.34799754989581 30.50483335424108
  • 功能:根据中文地址信息获取经纬度坐标

实现代码:

import json
from urllib.request import urlopen,quote
import xlrd
def readXLS(XLS_FILE,sheet0):
    rb= xlrd.open_workbook(XLS_FILE)
    rs= rb.sheets()[sheet0]
    return rs
def getlnglat(adress):
    url = \'http://api.map.baidu.com/geocoding/v3/?address=\'
    output = \'json\'
    ak = \'fdi11GHN3GYVQdzVnUPuLSScYBVxYDFK\'
    add = quote(adress)#使用quote进行编码 为了防止中文乱码
    # add=adress
    url2 = url + add + \'&output=\' + output + \'&ak=\' + ak
    req = urlopen(url2)
    res = req.read().decode()
    temp = json.loads(res)
    return temp
def getlatlon(sd_rs):
    nrows_sd_rs=sd_rs.nrows
    for i in range(4,nrows_sd_rs):
    # for i in range(4, 7):
        row=sd_rs.row_values(i)
        print(i,i/nrows_sd_rs)
        b = (row[11]+row[12]+row[9]).replace(\'#\',\'号\') # 第三列的地址
        print(b)
        try:
            lng = getlnglat(b)[\'result\'][\'location\'][\'lng\']  # 获取经度并写入
            lat = getlnglat(b)[\'result\'][\'location\'][\'lat\']  #获取纬度并写入
        except KeyError as e:
            lng=\'\'
            lat=\'\'
            f_err=open(\'f_err.txt\',\'a\')
            f_err.write(str(i)+\'\\t\')
            f_err.close()
            print(e)
        print(lng,lat)
        f_latlon = open(\'f_latlon.txt\', \'a\')
        f_latlon.write(row[0]+\'\\t\'+b+\'\\t\'+str(lng)+\'\\t\'+str(lat)+\'\\n\')
        f_latlon.close()
if __name__==\'__main__\':
    # sle_xls_file = \'F:\\医学大数据课题\\江苏省SLE数据库(两次随访合并).xlsx\'
    sle_xls_file = \"F:\\医学大数据课题\\数据副本\\江苏省SLE数据库(两次随访合并) - 副本.xlsx\"
    sle_data_rs = readXLS(sle_xls_file, 1)
    getlatlon(sle_data_rs)

结果展示:

python数据分析之单因素分析线性拟合及地理编码

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容