前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3.69GB全国POI数据可视化分析

3.69GB全国POI数据可视化分析

作者头像
陈南GISer
发布2023-09-20 08:43:14
5500
发布2023-09-20 08:43:14
举报
文章被收录于专栏:点点GIS

数据预处理之合并

全国poi数据分散在不同省的文件夹中分别以市为单位进行分文件存储,现需要对所有文件进行合并

文件内结构如下

合并全国poi

代码语言:javascript
复制
import os  
import pandas as pd  
  
# 指定包含CSV文件的文件夹路径  
folder_path = 'C:\\Users\\zheyu\\Desktop\\csv'  
  
# 获取文件夹中的所有文件名  
file_names = os.listdir(folder_path)  
  
# 创建一个空的DataFrame用于存储所有CSV文件的内容  
all_data = pd.DataFrame()  
  
# 循环读取每个CSV文件并将其添加到all_data DataFrame中  
for file_name in file_names:  
    if file_name.endswith('.csv'):  
        file_path = os.path.join(folder_path, file_name)  
        data = pd.read_csv(file_path)  
        all_data = all_data.append(data, ignore_index=True)  
  
# 将合并后的数据帧写入新的CSV文件  
output_file_path = 'F:\\BaiduNetdiskDownload\\2022年3月全国POI数据\\安徽省POI数据\\china_poi.csv'  
all_data.to_csv(output_file_path, index=False)  
  
print('CSV files merged good')

数据量太大了,四千多万条

这种类型的数据excel直接崩溃了,根本打不开

数据分析以及可视化都不难,但是在处理庞大的数据时,我们常用的excel,python基本都无法使用。

常用的方法只能是通过用流计算或者是批计算,把原始数据再进行一次或者多次的过滤、汇聚和计算,把数据过滤汇总计算之后得到量级的下降,再进行数据分析以及可视化。

数据筛选

大数据集筛选方式

针对这种大数据集,使用python来进行处理是不太现实的,每执行一个操作都很耗费时间。

为了提高效率,我选择使用云数据处理平台下秒数据Nexadata处理大数据集,在云上进行数据筛选,清洗(当然poi)也不用怎么清洗。

平台链接:http://nexadata.cn/mobileSetMessage

筛选出所需要的数据后导入本地再使用python进行可视化

最近在用的这个下秒数据机器人,近4gb csv数据预处理仅需一分钟左右,然后就可以在网页上流畅筛选数据

平台链接:http://nexadata.cn/mobileSetMessage

可以在数据导入的时候加入一下数据看板功能

这样执行流程完毕的时候可以顺便简单预览一下数据

内置常用POI数据

当然你也可以选择使用平台内置的POI库(2021,2022,2023)

在数据视图界面中新建视图,选择poi库即可

导出数据

可以选择通过api调用筛选的数据集或者在web端下载筛选好的csv文件

API调用示例

代码语言:javascript
复制
import requests
import pandas as pd
headers = { "x-token": "tk922e9f478820401fb38579066ef3ce75" }

# 导入数据,使用下秒机器人存储数据,通过API调用 

response = requests.get("http://app.chafer.nexadata.cn/openapi/v1/sheet/sht21Y9sdM9CVM/records?size=13278&page=1", headers = headers)


print(response.json())

可以看到筛选出的数据共有69088条

csv下载读取示例

选择数据视图

导出为csv文件

python读取文件

代码语言:javascript
复制
import pandas as pd  
  
# 你的文件路径  
file_path = 'C:\\Users\\zheyu\\Desktop\\全国poi.csv'  
  
# 使用pandas的read_csv函数读取csv文件  
df = pd.read_csv(file_path)  
  
df

image.png

数据可视化

统计每个地区的保险公司数量

代码语言:javascript
复制
from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode

# 按城市分组计数
temp = df.groupby('省份')['大类'].count().reset_index()
temp.columns = ['省份','计数']
data_pair = [(row['省份'], row['计数']) for _, row in temp.iterrows()]
# 排序之后取top20
top_city = sorted(data_pair, key=lambda x: x[1], reverse=True)[:20][::-1]
print(top_city)

可视化

代码语言:javascript
复制
# 新建一个Bar
chart = Bar()

# 添加x轴数据
chart.add_xaxis([x[0] for x in top_city])
# 添加y轴数据
chart.add_yaxis(
    "",
    [x[1] for x in top_city],
    itemstyle_opts={  
    },
    # 标签设置
    label_opts=opts.LabelOpts(
        is_show=True,   # 显示标签
        position='insideRight',   # 显示位置
        formatter='{c}'   # 显示内容 {c}显示数值
        )
        )

chart.set_global_opts(
    title_opts=opts.TitleOpts(   # 标题设置
        title="全国保险公司最多的地区",
        subtitle='点点GIS制作'),
    xaxis_opts=opts.AxisOpts(position='top'),  # x轴位置显示在上方
    visualmap_opts=opts.VisualMapOpts(  # 视觉组件
        is_show=False,
    )
    )
# xy轴翻转
chart.reversal_axis()
chart.render_notebook()

image.png

做个热力图吧

对数据进行可视化操作

代码语言:javascript
复制
# 导入pyecharts库的所有图表类型  
from pyecharts.charts import *  
# 导入pyecharts的options模块,并重命名为opts  
from pyecharts import options as opts  
# 从pyecharts.commons.utils模块导入JsCode类  
from pyecharts.commons.utils import JsCode  
  
# 创建一个Geo类的实例,该实例将用于构建地理热力图  
geo = Geo(  
    init_opts=opts.InitOpts(  
        # 设置主题为'walden'  
        theme='walden',  
        # 设置图表宽度为1000px  
        width='1000px',  
        # 设置图表高度为800px  
        height='800px'  
    )  
)  
  
# 为geo对象添加一个地图类型为'china'的schema  
geo.add_schema(  
    maptype="china",  
    zoom=1,  # 初始缩放级别为1   
    emphasis_label_opts=opts.LabelOpts(is_show=False),  # 设置高亮标签的显示状态为不显示  
    # 该行代码被注释掉了,itemstyle_opts是用来设置地图上点的样式的  
    #itemstyle_opts=opts.ItemStyleOpts(border_color="#1E90FF", border_width=1.2),  
)  
  
# 创建一个空的列表,用于存储名称和经度信息  
data = []  
# 通过iterrows()方法遍历DataFrame的每一行,idx是行索引,row是该行的数据  
for idx, row in df.iterrows():  
    # 为geo对象添加每个数据点的经度和纬度信息  
    geo.add_coordinate(row['名称'], row['经度'], row['纬度'])  
    # 将名称添加到data列表中,并附带一个值为1的标签  
    data.append([row['名称'], 1])  
  
# 为geo对象添加热力图,使用之前准备的数据,设置热力图的类型、是否为大图、模糊大小、点的大小等参数  
geo.add(  
    '',  
    data,  
    type_='heatmap',  
    symbol_size=1,  # 设置标记的大小为1  
    is_large=True,  # 设置是否为大图模式  
    blur_size=10,  # 设置模糊大小为10  
    point_size=3,  # 设置点的大小为3  
    itemstyle_opts={  
        'color': '#00BFFF',  # 设置点的颜色为青色  
        'opacity':0.5,  # 设置点的透明度为0.5  
        'shadowBlur': 1,  # 设置阴影大小为1  
        'shadowColor': 'rgba(0,0,0,0.5)'  # 设置阴影颜色为半透明黑色  
    },  
    label_opts=opts.LabelOpts(is_show=False),  # 设置标签的显示状态为不显示  
    tooltip_opts=opts.TooltipOpts(is_show=False),  # 设置提示框的显示状态为不显示  
)  
  
# 为geo对象设置全局配置项,包括标题、图例、视觉映射等参数  
geo.set_global_opts(  
    title_opts=opts.TitleOpts(  
        title="中国保险行业分布热力图",  # 设置标题为"中国保险行业分布热力图"  
        pos_top='3%',  # 设置标题顶部距离为3%  
        pos_left='center',  # 设置标题左侧距离为居中  
        title_textstyle_opts=opts.TextStyleOpts(color='#00BFFF', font_size=20)  # 设置标题文字的颜色和大小  
        ),  
    legend_opts=opts.LegendOpts(is_show=True, pos_left='center', pos_top='4%'),  # 设置图例的显示状态和位置  
    visualmap_opts=opts.VisualMapOpts(  
        is_show=False,  # 设置视觉映射的显示状态为不显示  
        max_=2,  # 设置视觉映射的最大值为2  
        series_index=0,  # 设置视觉映射对应的系列索引为0  
        range_color=['blue', 'blue', 'green', 'yellow', 'red']  # 设置视觉映射的颜色范围为蓝色到红色  
        ),  
)  
  

prov_count = list(dict(df['省份'].value_counts()).items())
prov_count=[(x, int(y)) for x, y in prov_count]
map_chart = Map()
map_chart.add('',
              data_pair=prov_count,
              maptype='china',
              # 关闭symbol的显示
              is_map_symbol_show=False,
              is_roam=False,
              label_opts=opts.LabelOpts(is_show=False),
              tooltip_opts=opts.TooltipOpts(is_show=True, formatter='{b}: {c}所'),
              itemstyle_opts={'opacity':0}
              )

grid = Grid(init_opts=opts.InitOpts(theme='walden', width='980px', height='800px'))

grid.add(geo, is_control_axis_index=False, grid_opts=opts.GridOpts())
grid.add(map_chart, is_control_axis_index=False, grid_opts=opts.GridOpts())

grid.render_notebook()
# 将pandas DataFrame的省份列的值进行计数,得到每个省份的数量,然后将结果转化为列表  
prov_count = list(dict(df['省份'].value_counts()).items())  
  
# 对上面的列表进行处理,将每个元素转化为(省份名, 数量)的形式,方便后续使用  
prov_count=[(x, int(y)) for x, y in prov_count]  
  
# 创建一个地图对象  
map_chart = Map()  
  
# 添加数据到地图对象,数据对为prov_count,地图类型为中国,关闭symbol的显示,不进行漫游,关闭标签,设置tooltip格式,设置地图样式为不透明  
map_chart.add('',  
              data_pair=prov_count,  
              maptype='china',  
              # 关闭symbol的显示  
              is_map_symbol_show=False,  
              is_roam=False,  
              label_opts=opts.LabelOpts(is_show=False),  
              tooltip_opts=opts.TooltipOpts(is_show=True, formatter='{b}: {c}所'),  
              itemstyle_opts={'opacity':0}  
              )  
  
# 创建一个网格对象,初始化参数设置主题为'walden',宽为'980px',高为'800px'  
grid = Grid(init_opts=opts.InitOpts(theme='walden', width='980px', height='800px'))  
  
# 在网格中添加geo对象(可能是一个地理信息对象),不作为控制轴索引,设置网格参数  
grid.add(geo, is_control_axis_index=False, grid_opts=opts.GridOpts())  
  
# 在网格中添加刚刚创建的地图对象,不作为控制轴索引,设置网格参数  
grid.add(map_chart, is_control_axis_index=False, grid_opts=opts.GridOpts())  
  
# 在Jupyter notebook中渲染网格,可能将地图和geo对象在网格中呈现出来  
grid.render_notebook()

结果如下

可以放大数据图表

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-14 11:00,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 点点GIS 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据预处理之合并
  • 合并全国poi
  • 数据筛选
    • 大数据集筛选方式
      • 内置常用POI数据
        • 导出数据
          • API调用示例
            • csv下载读取示例
            • 数据可视化
              • 统计每个地区的保险公司数量
                • 做个热力图吧
                相关产品与服务
                大数据
                全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档