全国poi数据分散在不同省的文件夹中分别以市为单位进行分文件存储,现需要对所有文件进行合并
文件内结构如下
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库(2021,2022,2023)
在数据视图界面中新建视图,选择poi库即可
可以选择通过api调用筛选的数据集或者在web端下载筛选好的csv文件
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文件
python读取文件
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
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)
可视化
# 新建一个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
对数据进行可视化操作
# 导入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()
结果如下
可以放大数据图表