2022年全国各省地级市GDP均值(除港澳台及直辖市)数据可视化实战

本文介绍了如何在Linux环境中配置Java和MySQL,通过Python爬取并处理来自https://www.hongheiku.com的数据,包括数据获取、清洗、聚合、上传至Hive,以及使用PyHive和Pyecharts进行数据可视化的过程。
摘要由CSDN通过智能技术生成

一、环境配置

linux环境

java -version
# java version "1.8.0_391"
# Java(TM) SE Runtime Environment (build 1.8.0_391-b13)
# Java HotSpot(TM) 64-Bit Server VM (build 25.391-b13, mixed mode)
mysql --version
# mysql  Ver 8.0.35 for Linux on x86_64 (MySQL Community Server - GPL)
ls -l /opt
# 总用量 8
# drwxr-xr-x  28 root  root 4096 1月  27 00:48 anaconda3
# drwxr-xr-x  11 root  root  227 1月  26 19:23 hadoop-3.3.6
# drwxr-xr-x   5 root  root  114 2月  12 12:35 hadoop-snappy-master
# drwxr-xr-x  10 root  root  205 2月  12 18:53 hive-3.1.3
# drwxr-xr-x   6 root  root   99 2月  12 12:23 maven-3.9.6
# drwxr-xr-x   6 60692 5000 4096 2月  12 12:21 snappy-1.1.1
# drwxrwxrwx  15 root  root  235 2月   7 20:40 spark-3.5.0
# drwxrwxrwx.  4 root  root   32 2月  11 22:19 tmp
hdfs dfs -ls /
# Found 3 items
# drwxrwxrwx   - root supergroup          0 2024-02-21 13:48 /sparklog
# drwxrwxrwx   - root supergroup          0 2024-02-17 01:28 /tmp
# drwxrwxrwx   - root supergroup          0 2024-02-17 01:04 /user

conda创建并激活虚拟环境

conda create -n pyspark python=3.*.*
conda activate pyspark

python导包

import re
import time
import requests
import pandas as pd
from tqdm import tqdm
from lxml import etree
from pyhive import hive
from pyspark.sql import SparkSession
from pyecharts import charts
from pyecharts import options as opts
二、获取数据

确定目标网址:https://www.hongheiku.com/category/gdjsgdp
获取伪装参数:‘user-agent’:‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36’
通过requests构造get请求获取单页html数据。
使用xpath解析式解析html标签数据获得省份、GDP列表数据和总页数整数数据。
通过pandas将列表数据转为数据帧dataframe。

# 获取单页数据
def get_page_data(page):
    urls = {
        'page=1':'https://www.hongheiku.com/category/gdjsgdp',
        'page>1':'https://www.hongheiku.com/category/gdjsgdp/page/{}'.format(page)}
    headers = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'}
    url = urls['page=1'] if page==1 else urls['page>1']
    response = requests.get(url=url,headers=headers)
    if response.status_code != 200:
        return response.status_code
    if response.status_code == 200:
        text = response.text
    # with open('data.html','w',encoding='utf-8') as file:
    #     file.write(text)
    # with open('data.html','r',encoding='utf-8') as file:
    #     text = file.read()
    element = etree.HTML(text)
    id = element.xpath('//tr[@class="even"]/td[@class="column-1"]//center//text()')
    pro = element.xpath('//tr[@class="even"]/td[@class="column-2"]//center//text()')
    gdp = element.xpath('//tr[@class="even"]/td[@class="column-3"]//center//text()')
    year = element.xpath('//tr[@class="even"]/td[@class="column-4"]//center//text()')
    df = pd.DataFrame({
        'id':id,
        'pro':pro,
        'gdp':gdp,
        'year':year})
    pages = ''.join(element.xpath('//div[@class="pagination pagination-multi"]//span/text()'))
    pages = int(''.join(re.findall('共 ([0-9]) 页',pages)))
    time.sleep(1)
    return df,pages

循环调用get_page_data函数获取所有页数据。

# 获取全部数据
def get_data():
    df,pages = get_page_data(1)
    for i in tqdm(range(2,pages+1,1)):
        dfi,pages = get_page_data(i)
        df = pd.concat([df,dfi])
    df.to_csv('data.csv',encoding='utf-8',index=None)
三、清洗数据

筛选出年份为2022年的数据。
去除GDP列自带的单位字符“亿”。
标准化省份数据,打通地区数据接口。

# 清洗数据
def clean_data(file_path):
    df = pd.read_csv(file_path,encoding='utf-8',dtype=str)
    df = df[df['year'] == '2022']
    df['gdp'] = list(map(lambda x:float(str(x).rstrip('亿')),df['gdp']))
    dict0 = {
        '重庆':'重庆市','北京':'北京市','天津':'天津市','上海':'上海市',
        '香港':'香港特别行政区','澳门':'澳门特别行政区',
        '内蒙古':'内蒙古自治区','西藏':'西藏自治区',
        '新疆':'新疆维吾尔自治区','宁夏':'宁夏回族自治区','广西':'广西壮族自治区'}
    df['pro'] = list(map(
        lambda x:str(x).lstrip('[').partition(']')[0],df['pro']))
    df['pro'] = list(map(
        lambda x:dict0[x] if x in dict0.keys() else x +'省',df['pro']))
    return df
四、聚合数据

按照省份对GDP进行求平均聚合。
对省平均GDP统一保留两位小数。

# 聚合数据
def work_data(df:pd.DataFrame):
    df = df.groupby(['pro']).mean('gdp').reset_index().sort_values('gdp',ascending=False)
    df.index = range(df.shape[0])
    df['gdp'] = list(map(lambda x:round(x,2),df['gdp']))
    return df
五、上传数据

启动伪分布式集群代码。

start-all.sh
mr-jobhistory-daemon.sh start historyserver
/opt/spark-3.5.0/sbin/start-all.sh
/opt/spark-3.5.0/sbin/start-history-server.sh
nohup hive --service metastore &

检测metastore(hive)端口是否启动成功。

netstat -anp|grep 9083
# tcp6    0    0 :::9083     :::*    LISTEN    9919/java

hive编写sql创建数据库。

create database myproject;

pyspark上传数据到metastore。

# 上传数据
def upload_data(df:pd.DataFrame):
    global spark
    spark = SparkSession.Builder(
    ).appName('test').master('local[*]')\
        .config('spark.sql.shuffle.partitions','2')\
        .config('spark.sql.warehouse.dir','hdfs://ml:9000/user/hive/warehouse')\
        .config('hive.metastore.uris','thrift://ml:9083'
        ).enableHiveSupport().getOrCreate()
    df = spark.createDataFrame(df)
    spark.sql('drop table if exists myproject.data;')
    df.write.mode('overwrite').saveAsTable('myproject.data','parquet')
    df.show()

编写标准入口函数。

# 入口函数
def main():
    try:
        get_data()
    except:
        print(get_data())
    df = clean_data('data.csv')
    df = work_data(df)
    upload_data(df)
if __name__ == '__main__':
    main()

上传代码到linux系统。

scp data.py root@ml:/root/ml/data.py

linux运行python代码。

cd /root/ml
/opt/anaconda3/envs/pyspark/bin/python /root/ml/data.py

此时hdfs文件系统/user/hive/warehouse/myproject.db/data路径下会产生一个snappy压缩格式列式存储的parquet文件part-00000-*.snappy.parquet。

六、数据端口

开启thrift数据端口。

/opt/spark-3.5.0/sbin/start-thriftserver.sh \
    --hiveconf hiveserver2.thrift.port=10000 \
    --hiveconf hiveserver2.thrift.bind.host=ml \
    --master local[*]

检测数据端口状态

netstat -anp|grep 10000
tcp6    0    0 :::10000    :::*    LISTEN    10555/java
七、下载数据

通过pyhive编写标准jdbc代码连接metastore(hive)获取数据引擎。
通过pandas读取sparksql查询语句获取数据。

def download_data():
    engine = hive.Connection(
        host='ml',port=10000,database='myproject',
        username='root',password='ml123456',auth="LDAP")
    df = pd.read_sql_query(
        'select * from myproject.data;',con=engine)
    df = df.astype({'pro':str,'gdp':float})
    return df
df = download_data()
df
八、数据可视化

通过pyecharts的Map对象对数据进行可视化输出

def get_chart(df:pd.DataFrame):
    pro = list(df['pro'])
    gdp = list(df['gdp'])
    # 构建包含省份和GDP的列表
    List = [i for i in zip(pro, gdp)]
    # 使用pyecharts创建地图
    myMap = charts.Map()
    myMap.add(
        "2022年全国各省地级市GDP均值(除港澳台及直辖市)", List, maptype='china', is_map_symbol_show=False)
    # 全局配置
    myMap.set_global_opts(
        title_opts=opts.TitleOpts(is_show=True,title='2022年全国各省GDP均值(单位:亿)'),
        visualmap_opts=opts.VisualMapOpts(
            is_show=True,min_=0,max_=max(gdp),split_number=4,is_piecewise=True),
        toolbox_opts=opts.ToolboxOpts(is_show=True))
    # 系列配置
    myMap.set_series_opts(
        textstyle_opts=opts.TextStyleOpts(font_size=20),
        label_opts=opts.LabelOpts(font_size=7))
    # # 生成地图HTML文件
    # myMap.render('data.html')
    return myMap
myMap = get_chart(df)
# jupyter-notebook展示
myMap.render_notebook()
  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值