美文网首页每天写1000字python人工智能计算机技术
Python数据处理,使用Pandas与Folium处理数据并图

Python数据处理,使用Pandas与Folium处理数据并图

作者: afbbcde7fa3e | 来源:发表于2019-02-04 17:12 被阅读4次

    首先当然要引入必要的库。本例中,我们要用到Pandas,matplotlib中的pyplot,numpy以及folium,按照管理,使用pd,plt和np作为几个库的别名(在自己写程序命名变量时最好避开这些约定俗成的变量。示例使用Ipython,请安装jupyter notebook及下列库文件以运行程序。

    import pandas as pd #import pandas
    import matplotlib.pyplot as plt
    import numpy as np
    import folium
    

    1. 数据科学,柱状图绘图示例

    使用一个简单的Excel 表格作为示例(下载地址 ),如果表格不好下载,也可以直接复制下方内容并另存为csv文件。

    svdata=pd.read_csv("Topic_Survey_Assignment.csv",index_col=0) #read downloaded csv file with the first col as index
    svdata.head(6) 
    

    Very interested Somewhat interested Not interested
    Big Data (Spark / Hadoop) 1332 729 127
    Data Analysis / Statistics 1688 444 60
    Data Journalism 429 1081 610
    Data Visualization 1340 734 102
    Deep Learning 1263 770 136
    Machine Learning 1629 477 74

    总数据量为2233,计算比例并进行排序。

    totalsample=2233
    svdatasorted=svdata.sort_values(by="Very interested",ascending =False)
    svdatarate=(svdatasorted/totalsample).round(2)
    svdatarate.head(6)
    

    以下程序对数据进行绘图显示。绘图时采用了以下技巧。

    • 使用了柱状图 barchart
    • 图例等字体大小设置为14,标题字体16
    • 柱状图宽图设置为0.8
    • 按照Very Interested 降序排列
    • 指定不同柱状图颜色
    • 去掉上方及左右边框但保留底部边框
    barwidth=0.8
    xs=[round(x*3.2,2) for x in range(0, 6)]
    xs2=[x+0.8 for x in xs]
    xs3=[x+1.6 for x in xs]
    font1 = {'family': 'Arial', 'weight': 'normal', 'size': 14}
    
    plt.figure(figsize=(20,8)) 
    
    l1=plt.bar(xs, svdatarate.iloc[:,0], barwidth, color='#5cb85c')
    l2=plt.bar(xs2, svdatarate.iloc[:,1], barwidth, color='#5bc0de')
    l3=plt.bar(xs3, svdatarate.iloc[:,2], barwidth, color='#d9534f')
    plt.legend(handles=[l1, l2, l3], labels=['Very interested', \
                                             'Somewhat interested','Not interested'],  loc='best',prop=font1)
    plt.title('Percentage of Respondents’ Interest in Data Science Areas',fontsize=16)
    plt.xticks(xs2, svdatarate.index,fontsize=14)
    plt.yticks(np.arange(0, 1.1, 0.1),fontsize=14)
    
    for a,b in zip(xs,svdatarate.iloc[:,0]):
        plt.text(a, b+0.02, '%.0f%%' % (b*100), ha='center', va= 'bottom',fontsize=14)
    for a,b in zip(xs2,svdatarate.iloc[:,1]):
        plt.text(a, b+0.02, '%.0f%%' % (b*100), ha='center', va= 'bottom',fontsize=14)
    for a,b in zip(xs3,svdatarate.iloc[:,2]):
        plt.text(a, b+0.02, '%.0f%%' % (b*100), ha='center', va= 'bottom',fontsize=14)
     
    for spine in plt.gca().spines.values():
        spine.set_visible(False)
    plt.gca().spines['bottom'].set_visible(True)
    
    plt.tick_params(top=False, bottom=True, left=False, right=False, labelleft=False, labelbottom=True)
    
    plt.show()
    

    绘图效果如下


    屏幕快照 2019-02-04 17.00.12.png

    2. Python与地理信息系统结合绘图

    以旧金山地区犯罪率为例,将旧金山各个区的犯罪率通过地理信息系统显示出来,本例需要历史犯罪数据的excel格式文档(下载地址)以及旧金山地区的地理信息数据geojson文件(下载地址),如果暂时无法下载文件请访问本文作者个人网站搜索相应文章并进行下载即可。

    crimecsv=pd.read_csv("Police_Department_Incidents_-_Previous_Year__2016_.csv",index_col=0)
    crimecsv.head(6) 
    

    以下代码对读取到的犯罪文件按照区域进行归类技术,并修改了列名称。处理之后的数据示例如下。

    crimedata=crimecsv['Category'].groupby(crimecsv['PdDistrict']).count().to_frame()
    #crimegroupsum.columns=['Neighborhood','Count']
    crimedata['ls']=range(len(crimedata))
    crimedata['Neighborhood'] = crimedata.index
    crimedata.rename(columns={"Category":"Count"},inplace=True)
    crimedata.set_index(['ls'],inplace=True)
    crimedata=crimedata.reindex(columns=list(('Neighborhood','Count')))
    del crimedata.index.name
    crimedata
    
    Neighborhood    Count
    

    0 BAYVIEW 14303
    1 CENTRAL 17666
    2 INGLESIDE 11594
    3 MISSION 19503
    4 NORTHERN 20100
    5 PARK 8699
    6 RICHMOND 8922
    7 SOUTHERN 28445
    8 TARAVAL 11325
    9 TENDERLOIN 9942

    最后,结合folium地理信息库进行绘图,本示例就绘图进行了如下演示说明:

    • 采用了folium图形库中的choropleth图形,用于将不同等级标示为不同图形
    • 缩放从12级开始,图形中心是旧金山市
    • 读取数据级geojson文件,并将两者对应(选择数据文件中Neighborhood,Count列并与geojson文件中feature.properties.DISTRICT 对应)
    • 指定绘图颜色YlOrRd
    • 指定填充密度0.7,线密度0.2
    sf_map = folium.Map(location=[37.77,-122.42], zoom_start=12)
    sf_geo = r'san-francisco.geojson'
    sf_map.choropleth(
        geo_data=sf_geo,
        data=crimedata,
        columns=['Neighborhood', 'Count'],
        key_on='feature.properties.DISTRICT',
        fill_color='YlOrRd', 
        fill_opacity=0.7, 
        line_opacity=0.2,
        legend_name='Crime Rate in San Francisco'
    )
    sf_map
    

    最终绘图效果示意如下


    屏幕快照 2019-02-04 16.16.35.png

    相关文章

      网友评论

        本文标题:Python数据处理,使用Pandas与Folium处理数据并图

        本文链接:https://www.haomeiwen.com/subject/kzwpsqtx.html