python
import numpy as np
from scipy.spatial import KDTree
import pandas as pd
from pyecharts.charts import Geo
from pyecharts import options
def show_202d():
g = Geo(init_opts=options.InitOpts(width="1920px", height="1080px")).add_schema(maptype="aaa")
data = pd.read_csv("clustered_data.csv")
data.to_excel("clustered_data.xlsx", index=False)
data["motorcade_name"] = 0
data["xx"] = data["xx"].astype("float")
data["yy"] = data["yy"].astype("float")
task_num = (data["value"].values + data["value"].values.mean()).astype("int16").copy()
data["value值"] = task_num
for name, one_data in data.groupby("cluster"):
data_list = []
v_sum = 0
for i, ii, iii, iv, v, new_name in one_data[
["name", "xx", "yy", "value值", "value", "cluster"]].values:
# 对地理点循环
i = "{}_{}".format(i, v)
g.add_coordinate(i, ii, iii) # 追加点位置
data_list.append([i, iv])
v_sum += v
for i, iv in data_list:
g.add(
str(name) + "({})".format(v_sum),
data_pair=[[i, iv]],
symbol_size=iv,
label_opts=options.LabelOpts(
is_show=True,
formatter="{c}"
))
g.set_series_opts(label_opts=options.LabelOpts(is_show=False))
g.render("xxxxxxxx.html")
def init_cluster():
data = pd.read_csv('202d.csv')
data = data[~pd.isnull(data["xx"])]
data = data[~pd.isnull(data["yy"])]
data = data.drop_duplicates("name")
return data.copy()
def generate_cluster(data):
# 加载数据
g_list = []
# x, y = np.array([data["xx"].min(), data["yy"].max()]) - np.array([data["xx"].max(),
# data["yy"].min()])
# ta = np.arctan(np.abs(y) / np.abs(x))
# ta = 0.015
while len(data) > 0:
# 对角点扫描约束聚类
# data["dis"] = np.sqrt(np.sum(
# (data[["xx", "yy"]].values - np.array(data["xx"].max(), data["yy"].min())) ** 2,
# -1))
# 弧线扫描约束聚类 已知点
# data["dis"] = np.sqrt(np.sum(
# (data[["xx", "yy"]].values - data.sort_values("yy")[["xx","yy"]].values[0]) ** 2,
# -1))
# 对角点角度取点约束值
# ta +=0.1
x, y = np.array([data["xx"].min(), data["yy"].max()]) - np.array([data["xx"].max(),
data["yy"].min()])
ta = np.arctan(np.abs(y) / np.abs(x))
x_ = np.sqrt((x + 3.5) ** 2 + (y + 3) ** 2) * np.sin(ta)
y_ = np.sqrt((x + 1) ** 2 + (y + 1) ** 2) * np.cos(ta)
# print()
data["dis"] = np.sum(
(data[["xx", "yy"]].values - np.array([np.max(data["xx"]) + x_, np.min(data["yy"]) + y_])) ** 2, -1)
data = data.sort_values("dis")
tree = KDTree(data[["xx", "yy"]])
id_list = tree.query(data[["xx", "yy"]], len(data))[1]
g = data.iloc[id_list[0, :][np.cumsum(data.iloc[id_list[0, :]]["value"]) <= 300]].copy()
if g["value"].sum() <= 300:
g_list.append(g)
else:
g_list.append(g)
data = data[~data["name"].isin(pd.concat(g_list)["name"])]
for c, g in enumerate(g_list):
g["cluster"] = c
pd.concat(g_list).copy().to_csv("clustered_data.csv", index=False)
data0 = init_cluster()
data0 = generate_cluster(data0.copy())
show_202d()
该代码的作用是对一组数据进行聚类,并将聚类结果可视化。
- 首先导入所需的库:numpy、scipy、pandas和pyecharts。
- 定义一个函数show_202d(),用于展示聚类结果。
- 在show_202d()函数中创建一个地理图表对象g,并设置图表的大小。
- 从文件中读取数据,并将其存储在一个名为data的数据框中。
- 将数据框写入Excel文件。
- 对数据框进行预处理,添加两列新的数据"motorcade_name"和"xx"、"yy"转换成float型。
- 计算任务数量的平均值,并将其转换为整数类型。
- 将任务数量的结果存储在数据框的新列"value值"中。
- 根据聚类名称对数据框进行分组,并对每个聚类进行操作。
- 创建一个空的数据列表data_list和一个变量v_sum。
- 遍历每个地理点,为每个地理点的坐标追加点的位置信息。
- 将地理点的坐标和任务数量添加到数据列表data_list中,并累加任务数量的总和。
- 遍历数据列表data_list,为每个地理点创建一个散点图。
- 设置散点图的大小和标签格式。
- 设置系列选项,隐藏标签。
- 将地理图表对象g保存为html文件。
- 定义一个函数init_cluster(),用于读取原始数据。
- 从csv文件中读取数据,并且删除缺失的值和重复的行。
- 返回处理后的数据框。
- 定义一个函数generate_cluster(),用于生成聚类。
- 创建一个空的聚类列表g_list。
- 计算x和y的值,并计算角度ta。
- 计算x_和y_的值。
- 根据距离排序数据,并使用KDTree算法进行聚类。
- 根据聚类结果将数据分组,并判断每个聚类的任务数量是否小于等于300。
- 将小于等于300的聚类添加到聚类列表g_list中,否则将整个聚类添加到列表中。
- 删除已经聚类过的数据行。
- 为每个聚类分配一个唯一的聚类编号。
- 将聚类结果保存为csv文件。
- 调用init_cluster函数获取初始聚类数据。
- 调用generate_cluster函数生成聚类。
- 最后调用show_202d函数展示聚类结果。