安徽省人口数据分析 可视化呈现

安徽省人口数据分析 可视化呈现

代码仓库:https://github.com/SKPrimin/PythonCrawler/tree/master/population

需求分析

近年来有关人口生育率的问题一直是社会的焦点问题,而安徽在人口问题上更是全国的舆论焦点。。。。

数据获取

数据形式分析

本次我们从安徽统计局获取人口数据,进行数据可视化呈现,我们访问安徽统计局查询数据,刚好安徽统计局已经对数据进行了集中展示,并编写了统计年鉴,我们查询安徽统计年鉴—2020中人口部分。

image-20211127083320242

开始F12浏览器调试,刷新页面并监听,发现是通过局部刷新来加载页面,并且标明了请求网址,即数据保存的页面。同时还通过网址比对发现个链接中只有cn3-1,cn3-2部分不同且恰好对应表格编号

  • image-20211127083645843

进入数据实际所在页面,对元素进行解析

  • 发现tr中height="29"属性对应的是表格名称

    • image-20211127083955188
  • tr中height="29"属性对应的是各数据代表含义以及数据项

    • image-20211127084434193

由此发现可以使用request进行数据请求,使用Xpath进行数据提取,再使用openpyxl进行数据保存

这里顺便说明一点,如果提取时使用utf-8编码格式会出现乱码,使用常见的gbk也会出现乱码,后来查看页面源代码才发现使用的竟然是我国上世纪八十年代设计的gb2312。

数据下载程序设计

from lxml import etree
from openpyxl import Workbook
import requests


def getdownload(url):
    # UA伪装
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36 Edg/96.0.1054.29"
    }
    # 发起请求,带3参数
    r = requests.get(url=url, headers=header)
    # 将编码格式调成gb2312
    r.encoding = "gb2312"
    # 转成文本文件
    htm_text = r.text
    # 将文件本地保存下来,同时类型修改为html,编码格式改为utf-8 本文件仅做临时保存用,数据会储存在csv文件中
    with open("tmp.html", 'w', encoding='utf-8') as f:
        f.write(htm_text)


def getdata(id):
    # 转成标准的xml
    parser = etree.HTMLParser(encoding="utf-8")
    tree = etree.parse('tmp.html', parser=parser)
    # 解析出标题 大部分是 x166属性
    title = tree.xpath('/html/body/table/tr/td[@class="xl66"]/text()')
    # 小部分是x165属性
    if len(title) == 0:
        # 只有一个14号表格是x165属性
        classattribute = 'xl65' if id != 14 else 'xl67'
        title = tree.xpath(f'/html/body/table/tr/td[@class="{classattribute}"]/text()')
    # 返回的title是一个列表,转成一个str格式
    title = ''.join(title)
    print(title)
    # 获取表格中有效数据部分共有多少行
    elementnum = len(tree.xpath('/html/body/table/tr[@height="19"]'))
    ws = wb.create_sheet(title=f'{title}')  # 新建sheel插入到最后
    # 对所有行有效元素进行一一提取
    for i in range(1, elementnum + 1):
        tdele = tree.xpath(f'/html/body/table/tr[@height="19"][{i}]/td/text()')
        print(tdele)
        # 逐行添加数据
        ws.append(tdele)


if __name__ == '__main__':
    # 实例化表格
    wb = Workbook()
    for id in range(1, 27):
        url = f'http://tjj.ah.gov.cn/oldfiles/tjj/tjjweb/tjnj/2020/cn/3/cn3-{id}.files/sheet001.htm'
        getdownload(url)
        getdata(id)

    wb.save('ahpopulation.xlsx')

至此,得到了一个有26个sheel的xlsx表格,共有如下数据:

表格id 表格名 表格id 表格名
3-1 主要年份人口指标 3-14 各市按性别分的15岁及以上文盲人口 (2019年)
3-2 主要年份人口系数 3-15 各市每十万人口拥有受教育程度人口(2019年)
3-3 六次全省人口普查基本情况 3-16 各市2019―2020学年小学初中入学率状况
3-4 各市主要年份人口城镇化率 3-17 各市婚姻人口构成(2019年)
3-5 各市常住人口出生率、死亡率(2019年) 3-18 全省育龄妇女分年龄孩次的生育率(2019年)
3-6 各市主要人口指标(2019年) 3-19 各市按行业分的在业人口比例(2019年)
3-7 各市户数、人口数和性别比(2019年) 3-20 各市外出半年以上人口比重、性别比及流向(2019年)
3-8 各市主要年份总人口文盲率 3-21 各市流向省外半年以上的流动人口构成(2019年)
3-9 各市人均受教育年限 3-22 各市省内跨市外出半年以上的流动人口构成(2019年)
3-10 按年龄和性别分人口数(2019年) 3-23 全省外出半年以上人口分年龄构成(2019年)
3-11 各市常住人口基本情况(2019年) 3-24 各市按外出时间分的外出人口比例(2019年)
3-12 各市按家庭户规模分的户数构成(2019年) 3-25 历 年 全 省 总 人 口、总 户 数
3-13 各市人口年龄结构(2019年) 3-26 各市、县、区户数、人口数(2019年)

格式转换

在数据分析中我们一般使用csv文件,而且得到的数据中表头也需要修改,以及个别表格中“总计”二字出现各占一格情况,也需手动修改。此次也是用了try except 进行异常捕获,整个避免程序因某个表格出错而中断,在此次格式转换中采取读取时后立刻以行为单位写入csv。

import csv
from openpyxl import load_workbook


def getSheet(sheetName,header,before,after):
    '''表格转换函数,四参数:sheet名称,首行名称,前索引,后索引'''
    try:
        # 获取指定的表单
        ws = wb[sheetName]
        # 创建对应的.csv文件,从3或4开始切片,追加模式,utf-8编码,新建""一行
        with open(f'{sheetName[4:]}.csv', mode="a", encoding='utf-8', newline="") as f:
            # 创建filepencil,用来在问价上写入数据
            fp = csv.writer(f)
            # 写入表头
            fp.writerow(header)
            for index in range(before,after+1):
                rowitems = []
                for index,item in enumerate(ws[index]):
                    rowitem = item.value if index != 0 else item.value.replace(' ', '')
                    rowitems.append(rowitem)
                fp.writerow(rowitems)
    except Exception as e:
        print(e)


if __name__ == '__main__':
    # 加载表格文件
    wb = load_workbook('ahpopulation.xlsx')
    # # 主要年份人口指标
    # header31 = ['年份', '户籍人口总数(万人)', '城镇人口比重%', '常住人口总数(万人)', '城镇人口比重%',
    #  '出生率‰', '死亡率‰', '自然增长率‰', '流向省外半年以上的人数(万人)']
    # getSheet(sheetName='3―1主要年份人口指标', header=header31, before=5, after=15)

    # # 主要年份人口系数
    # header32 = ['年份', '少年儿童系数',', ''老年系数',', ''老少比',', ''少年儿童抚养系数',
    #             '老年抚养系数', '总抚养系数', '年龄中位数(岁)']
    # getSheet(sheetName='3―2主要年份人口系数', header=header32, before=3, after=13)

    # # 各市主要年份人口城镇化率
    # header32 = ['地区', '2010', '2015', '2017', '2018', '2019']
    # getSheet(sheetName='3―4各市主要年份人口城镇化率', header=header32, before=1, after=17)

    # # 3―5各市常住人口出生率、死亡率(2019年)
    # header35 = ['地区', '出生率(‰)', '死亡率(‰)', '自然增长率(‰)']
    # getSheet(sheetName='3―5各市常住人口出生率、死亡率(2019年)', header=header35, before=1, after=17)

    # # 3―7各市户数、人口数和性别比(2019年)
    # header37 = ['地区(万户)', '户数(万户)', '人口数', '男', '性别比(女=100)']
    # getSheet(sheetName='3―7各市户数、人口数和性别比(2019年)', header=header37, before=1, after=17)

    # # 3―10按年龄和性别分人口数(2019年)
    # header310 = ['年龄', '人口总数(人)', '男性总数', '女性总数', '占总人口比重(%)', '男性比重', '女性比重', '性别比(女=100)']
    # getSheet(sheetName='3―10按年龄和性别分人口数(2019年)', header=header310, before=1, after=15)

    # # 3―12各市按家庭户规模分的户数构成(2019年)
    # header312 = ['地区', '家庭户规模(人/户)', '一人户', '二人户', '三人户', '四人户', '五人户', '六人及六人以上户(人/户)']
    # getSheet(sheetName='3―12各市按家庭户规模分的户数构成(2019年)', header=header312, before=2, after=18)

    # # 3―21各市流向省外半年以上的流动人口构成(2019年)
    # header321 = ['地区', '合计', '江苏', '浙江', '上海', '广东', '北京', '福建', '山东', '天津', '河南', '河北', '新疆', '辽宁', '湖北', '陕西', '流向其他省市']
    # getSheet(sheetName='3―21各市流向省外半年以上的流动人口构成(2019年)', header=header321, before=2, after=18)

    # # 3―25历 年 全 省 总 人 口、总 户 数
    # header325 = ['年份','总户数','合计总人口','男性人口','女性人口','性别比(女=100)','城镇人口','乡村人口']
    # getSheet(sheetName='3―25历 年 全 省 总 人 口、总 户 数', header=header325, before=2, after=17)

    # 3―26各市、县、区户数、人口数(2019年)
    header326 = ['地区', '总户数(万人)', '户籍人口(万人)', '男户籍人口', '女户籍人口', '性别比(女=100)', '城镇人口', '常住人口']
    getSheet(sheetName='3―26各市、县、区户数、人口数(2019年)', header=header326, before=1, after=137)

可视化分析

# 导包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
3―1主要年份人口指标
  • image-20211127195253718
# 3―1主要年份人口指标
# 设定index_col=False 保证pandas用第一列作为行索引
df = pd.read_csv('主要年份人口指标.csv',index_col=False )
df.columns = ['年份', '户籍人口总数(万人)', '城镇人口比重%', '常住人口总数(万人)', '城镇人口比重%', '出生率‰', '死亡率‰', '自然增长率‰', '流向省外半年以上的人数(万人)']
df
年份 户籍人口总数(万人) 城镇人口比重% 常住人口总数(万人) 城镇人口比重% 出生率‰ 死亡率‰ 自然增长率‰ 流向省外半年以上的人数(万人)
0 2005 6516 20.99 6120.0 35.50 12.43 6.23 6.20 842
1 2010 6827 22.71 5957.0 43.20 12.70 5.95 6.75 1038
2 2011 6876 22.93 5968.0 44.80 12.23 5.91 6.32 1199
3 2012 6902 22.89 5988.0 46.50 13.00 6.14 6.86 1157
4 2013 6929 22.92 6030.0 47.86 12.88 6.06 6.82 1130
5 2014 6936 22.69 6083.0 49.15 12.86 5.89 6.97 1053
6 2015 6949 27.58 6144.0 50.50 12.92 5.94 6.98 1045
7 2016 7027 29.52 6196.0 51.99 13.02 5.96 7.06 1052
8 2017 7059 31.07 6255.0 53.49 14.07 5.90 8.17 1058
9 2018 7083 32.65 6323.6 54.69 12.41 5.96 6.45 1048
10 2019 7119 34.65 6365.9 55.81 12.03 6.04 5.99 1061
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
x = df['年份']

y1 = df['户籍人口总数(万人)']
y2 = df['常住人口总数(万人)']
y3 = df['流向省外半年以上的人数(万人)']

fig, ax = plt.subplots()  # Create a figure and an axes.

ax.plot(x, y1, 'y*-', label='户籍人口总数')
ax.plot(x, y2, 'c*--', label='常住人口总数')
ax.plot(x, y3, 'mo:', label='流向省外半年以上的人数')
ax.set_xlabel('年份')  # Add an x-label to the axes.
ax.set_ylabel('人数(万人)')  # Add a y-label to the axes.
ax.set_title("主要年份人口数量")  # Add a title to the axes.
ax.legend()  # Add a legend.
plt.show()
![png](README.assets/output_2_1.png)
3―2主要年份人口系数
  • image-20211127180654148
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
x = df['年份']
y1 = df['出生率‰']
y2 = df['死亡率‰']
y3 = df['自然增长率‰']
fig, ax = plt.subplots()  # Create a figure and an axes.
ax.plot(x, y1, 'y*-', label='出生率')  # Plot some data on the axes.
ax.plot(x, y2, 'c*--', label='死亡率')  # Plot more data on the axes...
ax.plot(x, y3, 'mo:', label='自然增长率')  # ... and some more.
ax.set_xlabel('年份')  # Add an x-label to the axes.
ax.set_ylabel('‰')  # Add a y-label to the axes.
ax.set_title("主要年份人口增长率")  # Add a title to the axes.
ax.legend()  # Add a legend.

png

#3―2主要年份人口系数
# 设定index_col=False 保证pandas用第一列作为行索引
df = pd.read_csv('主要年份人口系数.csv',index_col=False )
df.columns = ['年份', '少年儿童系数', '老年系数', '老少比', '少年儿童抚养系数', '老年抚养系数', '总抚养系数', '年龄中位数(岁)']
df
年份 少年儿童系数 老年系数 老少比 少年儿童抚养系数 老年抚养系数 总抚养系数 年龄中位数(岁)
0 2005 23.07 10.08 43.69 34.51 15.08 49.59 34.32
1 2010 17.77 10.23 57.57 24.68 14.21 38.89 36.36
2 2011 18.59 11.41 61.36 26.56 16.30 42.86 38.83
3 2012 18.35 12.08 65.83 26.37 17.36 43.73 39.79
4 2013 18.51 12.24 66.15 26.72 17.68 44.40 40.12
5 2014 18.68 11.71 62.72 26.83 16.83 43.66 39.42
6 2015 18.21 11.73 64.41 25.99 16.74 42.73 39.68
7 2016 18.31 12.00 65.54 26.27 17.22 43.49 38.63
8 2017 18.60 12.38 66.56 26.95 17.94 44.89 39.62
9 2018 18.85 12.97 68.81 27.65 19.02 46.67 40.08
10 2019 18.91 13.93 73.66 28.16 20.74 48.90 41.91
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
x = df['年份']
y1 = df['少年儿童系数']
y2 = df['老年系数']
y3 = df['老少比']
y4 = df['年龄中位数(岁)']
fig, ax = plt.subplots()  # Create a figure and an axes.
ax.plot(x, y1, 'ys:', label='少年儿童系数')  # Plot some data on the axes.
ax.plot(x, y2, 'c^--', label='老年系数')  # Plot more data on the axes...
ax.plot(x, y3, 'm*-', label='老少比')  # ... and some more.
ax.plot(x, y4, 'r.-', label='年龄中位数(岁)')  # Plot some data on the axes.
ax.set_xlabel('年份')  # Add an x-label to the axes.
ax.set_ylabel('')  # Add a y-label to the axes.
ax.set_title("老少情况")  # Add a title to the axes.
ax.legend()  # Add a legend.

png

3―4各市主要年份人口城镇化率
#3―4各市主要年份人口城镇化率
# 设定index_col=False 保证pandas用第一列作为行索引
df = pd.read_csv('各市主要年份人口城镇化率.csv',index_col=False )
df.columns =  ['地区', '2010', '2015', '2017', '2018', '2019']
df
地区 2010 2015 2017 2018 2019
0 总计 43.2 50.50 53.49 54.69 55.81
1 合肥市 63.0 70.40 73.75 74.97 76.33
2 淮北市 54.5 60.76 63.61 65.11 65.88
3 亳州市 29.1 36.96 39.77 41.01 42.22
4 宿州市 31.4 38.73 41.56 42.74 43.96
5 蚌埠市 45.0 52.22 55.31 57.22 58.58
6 阜阳市 31.9 38.81 41.75 43.29 44.62
7 淮南市 62.9 60.67 63.46 64.11 65.04
8 滁州市 41.6 49.02 51.89 53.42 54.54
9 六安市 35.9 42.81 45.41 46.08 47.09
10 马鞍山市 58.0 65.15 67.89 68.25 69.12
11 芜湖市 54.6 61.96 65.05 65.54 66.41
12 宣城市 43.3 50.64 53.69 55.21 56.33
13 铜陵市 73.5 52.73 55.79 55.99 57.16
14 池州市 44.5 51.11 53.67 54.10 54.92
15 安庆市 36.8 45.87 48.57 49.22 49.98
16 黄山市 41.1 48.28 50.90 51.46 52.49
```python

labels = ['总计', '合肥市', '淮北市', '亳州市', '宿州市', '蚌埠市', '阜阳市', '淮南市', '滁州市', '六安市', '马鞍山市', '芜湖市', '宣城市', '铜陵市', '池州市', '安庆市', '黄山市']
width = 0.35 # the width of the bars

x = np.arange(len(labels)) # the label locations

fig, ax = plt.subplots(figsize=(18, 9))
rects1 = ax.bar(x-width ,df['2010'] , width/2, label='2010',color='cyan')
rects2 = ax.bar(x-width/2, df['2015'], width/2, label='2015',color='tomato')
rects3 = ax.bar(x, df['2017'], width/2, label='2017',color='lightblue')
rects4 = ax.bar(x+width/2, df['2018'], width/2, label='2018',color='gold')
rects5 = ax.bar(x+width, df['2019'], width/2, label='2019',color='plum')

Add some text for labels, title and custom x-axis tick labels, etc.

ax.set_xlabel('城市')
ax.set_ylabel('城镇化率')
ax.set_title('各市主要年份人口城镇化率')
plt.xticks(x, labels)
ax.legend()

fig.tight_layout()

plt.show()




![png](https://img2022.cnblogs.com/blog/2661728/202202/2661728-20220228095346422-161037746.png)



##### 3―5各市常住人口出生率、死亡率(2019年)

- <img src="https://img2022.cnblogs.com/blog/2661728/202202/2661728-20220228095346684-332643632.png" alt="image-20211127185047492" style="zoom: 80%;" />
```python
# 3―5各市常住人口出生率、死亡率(2019年)
# 设定index_col=False 保证pandas用第一列作为行索引
df = pd.read_csv('各市常住人口出生率、死亡率(2019年).csv',index_col=False )
df.columns =  ['地区', '出生率(‰)', '死亡率(‰)', '自然增长率(‰)']
df
地区 出生率(‰) 死亡率(‰) 自然增长率(‰)
0 总计 12.03 6.04 5.99
1 合肥市 12.65 4.38 8.27
2 淮北市 11.69 4.47 7.22
3 亳州市 13.60 5.70 7.90
4 宿州市 13.23 6.62 6.61
5 蚌埠市 13.22 6.48 6.74
6 阜阳市 14.63 5.96 8.67
7 淮南市 11.47 7.05 4.42
8 滁州市 11.90 6.20 5.70
9 六安市 12.28 6.23 6.05
10 马鞍山市 11.38 5.98 5.40
11 芜湖市 10.84 5.33 5.51
12 宣城市 11.07 7.96 3.11
13 铜陵市 8.61 5.46 3.15
14 池州市 9.16 5.86 3.30
15 安庆市 11.54 5.30 6.24
16 黄山市 11.03 6.29 4.74

# make data
np.random.seed(1)
x = np.arange(len(labels))  # the label locations


# plot
fig, ax = plt.subplots(figsize=(18, 9))

ax.fill_between(x, df['出生率(‰)'], df['死亡率(‰)'], alpha=.5, linewidth=0)
ax.plot(x, df['自然增长率(‰)'], linewidth=2,label='自然增长率')
plt.ylabel('‰')
plt.xticks(x, df['地区'])
plt.yticks(np.arange(15))
plt.title("各市常住人口出生率、死亡率(2019年)")
plt.show()

png

3―7各市户数、人口数和性别比(2019年)
  • image-20211127191242925
#各市户数、人口数和性别比(2019年)
# 设定index_col=False 保证pandas用第一列作为行索引
df = pd.read_csv('各市户数、人口数和性别比(2019年).csv',index_col=False )
df.columns = ['地区(万户)', '户数(万户)', '人口数', '男', '性别比(女=100)']
df
地区(万户) 户数(万户) 人口数 性别比(女=100)
0 总计 2176.29 7119.37 3694.33 107.86
1 合肥市 255.33 770.44 395.24 105.34
2 淮北市 73.04 218.72 112.25 105.43
3 亳州市 179.68 662.99 347.91 110.42
4 宿州市 197.85 658.27 342.28 108.32
5 蚌埠市 113.40 386.30 200.09 107.45
6 阜阳市 285.36 1077.28 561.09 108.70
7 淮南市 124.39 390.82 204.89 110.20
8 滁州市 140.69 455.35 236.31 107.88
9 六安市 189.85 591.07 311.86 111.69
10 马鞍山市 74.60 229.14 117.85 105.90
11 芜湖市 130.94 389.84 200.87 106.29
12 宣城市 98.95 278.77 143.70 106.38
13 铜陵市 54.13 170.58 87.54 105.41
14 池州市 51.79 162.29 82.94 104.53
15 安庆市 155.39 528.58 273.36 107.11
16 黄山市 50.91 148.92 76.16 104.66
##### 3―10按年龄和性别分人口数(2019年)
  • image-20211127191311656
from pyecharts.charts import Map
from pyecharts import options as opts
import pandas as pd


# print(df) 可以检验一下数据是否导入正确
area = df['地区(万户)']
value = df['人口数']
k = list(df['地区(万户)'])[1:]

v = list(df['人口数'])[1:]

data_pair = [(k[i], v[i]) for i in range(len(k))]
print(data_pair)

map = Map(init_opts=opts.InitOpts(width="600px", height="860px"))  # 创建地图,其中括号内可以调整大小,也可以修改主题颜色。
map.add("安徽人口", data_pair, maptype="安徽")  # 添加安徽地图
map.set_global_opts(  # 设置全局配置项#
    title_opts=opts.TitleOpts(title="安徽人口"),  # 添加标题
    visualmap_opts=opts.VisualMapOpts(max_=1200, is_piecewise=True),  # 最大数据范围 并且使用分段
    legend_opts=opts.LegendOpts(is_show=False),  # 是否显示图例
)
map.render('安徽人口.html')   # map.render_notebook()直接在notebook中显示# map.render('map1.html') 将地图以html形式保存在工作目录下

[('合肥市', 770.44), ('淮北市', 218.72), ('亳州市', 662.99), ('宿州市', 658.27), ('蚌埠市', 386.3), ('阜阳市', 1077.28), ('淮南市', 390.82), ('滁州市', 455.35), ('六安市', 591.07), ('马鞍山市', 229.14), ('芜湖市', 389.84), ('宣城市', 278.77), ('铜陵市', 170.58), ('池州市', 162.29), ('安庆市', 528.58), ('黄山市', 148.92)]

  • image-20211128140742921

安徽人口.html

3―12各市按家庭户规模分的户数构成(2019年)
  • image-20211127194838806
#各市按家庭户规模分的户数构成(2019年)
# 设定index_col=False 保证pandas用第一列作为行索引
df = pd.read_csv('各市按家庭户规模分的户数构成(2019年).csv',index_col=False )
df.columns = ['地区', '家庭户规模(人/户)', '一人户', '二人户', '三人户', '四人户', '五人户', '六人及六人以上户(人/户)']
df
地区 家庭户规模(人/户) 一人户 二人户 三人户 四人户 五人户 六人及六人以上户(人/户)
0 总计 3.04 14.45 29.26 24.49 16.66 8.63 6.50
1 合肥市 2.86 15.74 29.74 27.11 16.35 6.69 4.38
2 淮北市 3.05 12.62 29.99 25.95 17.50 7.70 6.27
3 亳州市 3.53 12.23 24.71 17.80 22.07 11.55 11.64
4 宿州市 3.12 14.40 30.03 20.63 19.40 8.46 7.08
5 蚌埠市 3.09 14.21 29.20 23.70 17.32 8.47 7.11
6 阜阳市 3.44 12.67 24.64 19.53 21.60 10.70 10.86
7 淮南市 2.90 16.97 32.23 23.02 15.42 6.74 5.61
8 滁州市 3.17 12.43 28.28 24.50 16.80 10.16 7.82
9 六安市 3.22 13.61 26.88 22.22 18.18 10.58 8.53
10 马鞍山市 2.81 16.45 33.79 25.55 12.27 7.30 4.65
11 芜湖市 2.92 15.01 29.03 28.00 14.93 8.41 4.63
12 宣城市 2.69 18.68 35.71 23.15 11.76 7.15 3.55
13 铜陵市 2.77 14.35 31.84 31.31 14.10 5.65 2.74
14 池州市 2.89 15.23 31.65 25.58 14.80 8.05 4.70
15 安庆市 3.32 11.17 23.99 25.68 19.12 11.40 8.63
16 黄山市 2.81 16.29 31.77 27.34 12.53 7.72 4.36
data=pd.DataFrame(df)
header = [ '一人户', '二人户', '三人户', '四人户', '五人户', '六人及六人以上户(人/户)']
data.loc[0].values[1:-1] # 只选用第一行全省数据
# Pie chart, where the slices will be ordered and plotted counter-clockwise:
labels = header
sizes = data.loc[0].values[1:-1]
explode = (0, 0.1, 0, 0,0,0)  # only "explode" the 2nd slice (i.e. 'Hogs')
colors = ['cyan','lime','gold','deepskyblue','tomato','yellow']
fig1, ax1 = plt.subplots(figsize=(9, 9))
ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
        shadow=True, startangle=90,colors=colors)
ax1.axis('equal')  # Equal aspect ratio ensures that pie is drawn as a circle.

plt.show()

png

3―21各市流向省外半年以上的流动人口构成(2019年)
  • image-20211127194939629
#各市流向省外半年以上的流动人口构成(2019年)
# 设定index_col=False 保证pandas用第一列作为行索引
df = pd.read_csv('各市流向省外半年以上的流动人口构成(2019年).csv',index_col=False )
df.columns = ['地区', '合计', '江苏', '浙江', '上海', '广东', '北京', '福建', '山东', '天津', '河南', '河北', '新疆', '辽宁', '湖北', '陕西', '流向其他省市']
df
地区 合计 江苏 浙江 上海 广东 北京 福建 山东 天津 河南 河北 新疆 辽宁 湖北 陕西 流向其他省市
0 总计 95400 30.02 25.72 21.79 4.35 3.31 2.12 1.66 1.28 0.98 1.08 0.62 0.69 0.87 0.89 4.62
1 合肥市 3062 33.36 14.78 24.99 2.68 7.38 1.96 1.15 2.15 0.93 1.03 2.33 0.53 0.53 1.12 5.10
2 淮北市 1703 31.53 25.33 15.74 4.63 4.58 1.28 3.52 1.00 2.46 0.56 0.56 0.28 0.73 1.12 6.75
3 亳州市 7452 34.03 28.79 12.46 5.35 1.26 2.09 2.88 1.43 1.11 2.24 0.97 0.87 0.33 0.61 5.61
4 宿州市 8511 40.16 25.81 10.74 2.39 2.93 2.18 1.54 1.63 1.15 1.07 0.83 0.25 0.56 4.84 3.96
5 蚌埠市 7390 29.50 31.90 22.53 4.58 2.05 3.05 0.72 0.86 0.41 0.45 0.19 0.17 0.51 0.28 2.83
6 阜阳市 14878 17.06 38.21 16.88 6.51 3.16 1.84 2.30 2.04 1.90 2.14 1.57 1.17 1.36 0.47 3.41
7 淮南市 8287 26.05 12.94 47.46 3.51 1.25 2.56 0.52 0.42 0.68 0.31 0.25 0.19 0.49 0.56 2.83
8 滁州市 6113 52.75 17.69 20.09 2.17 1.27 0.89 0.95 0.28 0.33 0.68 0.11 0.39 0.26 0.16 2.00
9 六安市 7411 47.31 18.49 23.25 2.89 1.78 0.59 0.74 0.41 0.76 0.38 0.23 0.10 0.65 0.17 2.25
10 马鞍山市 4429 45.81 8.75 12.35 3.29 10.08 1.27 2.02 0.62 1.14 2.00 0.71 0.64 1.68 0.95 8.75
11 芜湖市 4825 28.35 8.05 30.78 5.60 10.04 1.42 1.82 2.90 0.57 1.18 0.20 0.43 1.24 0.91 6.53
12 宣城市 5577 19.48 29.23 38.07 2.79 1.57 1.19 1.24 0.48 0.44 0.27 0.07 0.15 0.89 0.44 3.73
13 铜陵市 2819 41.77 20.92 14.41 4.93 3.74 0.88 0.54 0.57 0.51 0.71 0.13 0.47 1.28 0.67 8.43
14 池州市 3343 22.02 32.97 22.22 4.01 2.33 2.05 1.76 0.88 0.83 0.63 0.23 1.11 0.68 0.71 7.60
15 安庆市 6658 13.67 26.01 16.47 7.54 5.23 6.67 3.29 3.10 1.31 1.27 0.41 3.14 1.81 0.47 9.61
16 黄山市 3783 12.28 56.32 16.68 3.42 1.53 2.16 1.76 0.30 0.25 0.13 0.05 0.20 0.75 0.20 4.02
data=pd.DataFrame(df)
header =['地区', '合计', '江苏', '浙江', '上海', '广东', '北京', '福建', '山东', '天津', '河南', '河北', '新疆', '辽宁', '湖北', '陕西', '流向其他省市']
data.loc[0].values[2:-1] # 只选用第一行全省数据
# print(df) 可以检验一下数据是否导入正确
area = header[2:-1]
value = data.loc[0].values[2:-1]


data_pair = [(area[i], value[i]) for i in range(len(area))]
print(data_pair)

map = Map(init_opts=opts.InitOpts(width="1720px", height="920px"))  # 创建地图,其中括号内可以调整大小,也可以修改主题颜色。
map.add("安徽人口", data_pair, maptype="china")  # 添加安徽地图
map.set_global_opts(  # 设置全局配置项#
    title_opts=opts.TitleOpts(title="来此的安徽人安徽"),  # 添加标题
    visualmap_opts=opts.VisualMapOpts(max_=31, is_piecewise=True,split_number = 20,),  # 最大数据范围 并且使用分段
    legend_opts=opts.LegendOpts(is_show=False),  # 是否显示图例
)
map.render('省外半年以上人口分布.html')  # map.render_notebook()直接在notebook中显示# map.render('map1.html') 将地图以html形式保存在工作目录下

[('江苏', 30.02), ('浙江', 25.72), ('上海', 21.79), ('广东', 4.35), ('北京', 3.31), ('福建', 2.12), ('山东', 1.66), ('天津', 1.28), ('河南', 0.98), ('河北', 1.08), ('新疆', 0.62), ('辽宁', 0.69), ('湖北', 0.87), ('陕西', 0.89)]

  • image-20211128140330633

省外半年以上人口分布.html

import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Geo
from pyecharts.datasets import register_url
from pyecharts.globals import ChartType, SymbolType


#各市流向省外半年以上的流动人口构成(2019年)
# 设定index_col=False 保证pandas用第一列作为行索引
df = pd.read_csv('各市流向省外半年以上的流动人口构成(2019年).csv',index_col=False )
df.columns = ['地区', '合计', '江苏', '浙江', '上海', '广东', '北京', '福建', '山东', '天津', '河南', '河北', '新疆', '辽宁', '湖北', '陕西', '流向其他省市']
data=pd.DataFrame(df)

header =['江苏', '浙江', '上海', '广东', '北京', '福建', '山东', '天津', '河南', '河北', '新疆', '辽宁', '湖北', '陕西']
data = data.loc[0].values[2:-1] # 只选用第一行全省数据

data_pair = [(header[i], data[i]) for i in range(len(header))]

print(data_pair)

location_pair = [("安徽", header[i]) for i in range(len(header))]
print(location_pair)
title = "省外半年以上去向示意图"

c = (
    Geo(init_opts=opts.InitOpts(width="1720px", height="920px"))
    .add_schema(
            maptype='china',    #设置国家名字
            itemstyle_opts = opts.ItemStyleOpts(color = 'skyblue',border_color = '#111'),)  #设置地图颜色和边框色
    .add(
        "目的地",   #第一个add数据的标题
        data_pair, #目的地数据
        type_ = ChartType.EFFECT_SCATTER,  #使用点的样式,并设置点的颜色,点的大小都是一样的!
        symbol_size = 6,  #设置点的大小
        color = 'blue',) #点的颜色
    .add(
        "连线",
        location_pair, #本处,目的地 元组
        type_ = ChartType.LINES,
        effect_opts = opts.EffectOpts(
                symbol = SymbolType.ARROW, symbol_size = 6, color = 'cyan'),  #线上的小箭头的颜色
        linestyle_opts = opts.LineStyleOpts(curve = 0.2))  #设置两点间线缆的弯曲度
    .set_series_opts(label_opts = opts.LabelOpts(is_show = False))  #安徽->** 显示在线上,设为不显示
    .set_global_opts(title_opts=opts.TitleOpts(title=title),
                     toolbox_opts = opts.ToolboxOpts())
    .render(r"省外半年以上去向示意图.html")
)

[('江苏', 30.02), ('浙江', 25.72), ('上海', 21.79), ('广东', 4.35), ('北京', 3.31), ('福建', 2.12), ('山东', 1.66), ('天津', 1.28), ('河南', 0.98), ('河北', 1.08), ('新疆', 0.62), ('辽宁', 0.69), ('湖北', 0.87), ('陕西', 0.89)]
[('安徽', '江苏'), ('安徽', '浙江'), ('安徽', '上海'), ('安徽', '广东'), ('安徽', '北京'), ('安徽', '福建'), ('安徽', '山东'), ('安徽', '天津'), ('安徽', '河南'), ('安徽', '河北'), ('安徽', '新疆'), ('安徽', '辽宁'), ('安徽', '湖北'), ('安徽', '陕西')]

3―25历 年 全 省 总 人 口、总 户 数
image-20211127195025519
#历 年 全 省 总 人 口、总 户 数
# 设定index_col=False 保证pandas用第一列作为行索引
df = pd.read_csv('历 年 全 省 总 人 口、总 户 数.csv',index_col=False )
df.columns = ['年份','总户数','合计总人口','男性人口','女性人口','性别比(女=100)','城镇人口','乡村人口']
df
年份 总户数 合计总人口 男性人口 女性人口 性别比(女=100) 城镇人口 乡村人口
0 1978 1018 4713 2439 2274 107.27 504 4209
1 1980 1051 4893 2530 2363 107.10 556 4337
2 1985 1174 5156 2683 2473 108.46 724 4432
3 1990 1445 5661 2934 2727 107.57 843 4818
4 1995 1551 6000 3116 2884 108.08 1044 4956
5 2000 1656 6278 3258 3020 107.87 1230 5048
6 2005 1849 6516 3388 3127 108.34 1368 5148
7 2010 2093 6827 3543 3283 107.92 1550 5276
8 2012 2139 6902 3580 3322 107.78 1580 5322
9 2013 2144 6929 3599 3330 108.08 1588 5341
10 2014 2123 6936 3610 3326 108.57 1574 5362
11 2015 2132 6949 3615 3334 108.43 1917 5032
12 2016 2142 7027 3652 3374 108.24 2075 4952
13 2017 2149 7059 3666 3393 108.04 2193 4866
14 2018 2158 7083 3676 3407 107.91 2313 4770
15 2019 2176 7119 3694 3425 107.86 2467 4652
x =list(df['年份'])
y1 = list(df['合计总人口'])
y2 = list(df['男性人口'])
y3 = list(df['女性人口'])

fig, ax = plt.subplots()  # Create a figure and an axes.

ax.plot(x, y1, 'y*-', label='合计总人口')
ax.plot(x, y2, 'c*--', label='男性人口')
ax.plot(x, y3, 'mo:', label='女性人口')
ax.set_xlabel('年份')  # Add an x-label to the axes.
ax.set_ylabel('人数(万人)')  # Add a y-label to the axes.
ax.set_title("历年全省总人口数量")  # Add a title to the axes.
ax.legend()  # Add a legend.

png

3―26各市、县、区户数、人口数(2019年)
  • image-20211127195101067
# 3―26各市、县、区户数、人口数(2019年)
# 设定index_col=False 保证pandas用第一列作为行索引
df = pd.read_csv('各市、县、区户数、人口数(2019年).csv',index_col=False )
df.columns = ['地区', '总户数(万人)', '户籍人口(万人)', '男户籍人口', '女户籍人口', '性别比(女=100)', '城镇人口', '常住人口']
df = df[1:]
df = df.sort_values(by='总户数(万人)')
df
地区 总户数(万人) 户籍人口(万人) 男户籍人口 女户籍人口 性别比(女=100) 城镇人口 常住人口
129 徽州区 3.31 9.58 4.89 4.68 104.42 4.02 9.8
111 石台县 3.37 10.76 5.56 5.20 106.93 3.32 10.0
132 黟县 3.44 9.32 4.78 4.54 105.42 2.93 8.3
101 旌德县 4.63 14.82 7.70 7.12 108.19 4.02 12.5
53 八公山区 5.34 15.13 7.74 7.38 104.91 12.84 17.7
... ... ... ... ... ... ... ... ...
18 亳州市 179.68 662.99 347.91 315.07 110.42 132.97 526.3
67 六安市 189.85 591.07 311.86 279.21 111.69 137.88 487.3
23 宿州市 197.85 658.27 342.28 315.99 108.32 160.01 570.0
1 合肥市 255.33 770.44 395.24 375.21 105.34 404.99 818.9
38 阜阳市 285.36 1077.28 561.09 516.19 108.70 263.88 825.9

133 rows × 8 columns



x = df['地区'][1:80]
y1 = df['总户数(万人)'][1:80]
y2 = df['男户籍人口'][1:80]
y3 = df['户籍人口(万人)'][1:80]
y4 = df['女户籍人口'][1:80]

fig, ax = plt.subplots(figsize=(18, 9))

ax.plot(x, y1,'y^-',label='总户数')

ax.plot(x, y2,'c*--', label='男户籍人口')
ax.plot(x, y3, 'y*-',label='户籍人口')
ax.plot(x, y4,'mo:', label='女户籍人口')
ax.legend()  # Add a legend.

plt.xticks(rotation=270)
plt.show()

png

posted @ 2022-02-28 09:57  SKPrimin  阅读(498)  评论(0编辑  收藏  举报