条件约束聚类并显示

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()

该代码的作用是对一组数据进行聚类,并将聚类结果可视化。

  1. 首先导入所需的库:numpy、scipy、pandas和pyecharts。
  2. 定义一个函数show_202d(),用于展示聚类结果。
  3. 在show_202d()函数中创建一个地理图表对象g,并设置图表的大小。
  4. 从文件中读取数据,并将其存储在一个名为data的数据框中。
  5. 将数据框写入Excel文件。
  6. 对数据框进行预处理,添加两列新的数据"motorcade_name"和"xx"、"yy"转换成float型。
  7. 计算任务数量的平均值,并将其转换为整数类型。
  8. 将任务数量的结果存储在数据框的新列"value值"中。
  9. 根据聚类名称对数据框进行分组,并对每个聚类进行操作。
  10. 创建一个空的数据列表data_list和一个变量v_sum。
  11. 遍历每个地理点,为每个地理点的坐标追加点的位置信息。
  12. 将地理点的坐标和任务数量添加到数据列表data_list中,并累加任务数量的总和。
  13. 遍历数据列表data_list,为每个地理点创建一个散点图。
  14. 设置散点图的大小和标签格式。
  15. 设置系列选项,隐藏标签。
  16. 将地理图表对象g保存为html文件。
  17. 定义一个函数init_cluster(),用于读取原始数据。
  18. 从csv文件中读取数据,并且删除缺失的值和重复的行。
  19. 返回处理后的数据框。
  20. 定义一个函数generate_cluster(),用于生成聚类。
  21. 创建一个空的聚类列表g_list。
  22. 计算x和y的值,并计算角度ta。
  23. 计算x_和y_的值。
  24. 根据距离排序数据,并使用KDTree算法进行聚类。
  25. 根据聚类结果将数据分组,并判断每个聚类的任务数量是否小于等于300。
  26. 将小于等于300的聚类添加到聚类列表g_list中,否则将整个聚类添加到列表中。
  27. 删除已经聚类过的数据行。
  28. 为每个聚类分配一个唯一的聚类编号。
  29. 将聚类结果保存为csv文件。
  30. 调用init_cluster函数获取初始聚类数据。
  31. 调用generate_cluster函数生成聚类。
  32. 最后调用show_202d函数展示聚类结果。
相关推荐
weixin_4640780731 分钟前
Python学习小结
python·学习
ubax2 小时前
day 51 python打卡
开发语言·python
laocooon5238578862 小时前
基于Python的TCP应用案例,包含**服务器端**和**客户端**的完整代码
网络·python·tcp/ip
哆啦A梦的口袋呀2 小时前
设计模式汇总
python·设计模式
救救孩子把2 小时前
如何在n8n中突破Python库限制,实现持久化虚拟环境自由调用
开发语言·python·n8n
测试19983 小时前
2025软件测试面试题汇总(接口测试篇)
自动化测试·软件测试·python·测试工具·面试·职场和发展·接口测试
抽风的雨6104 小时前
【python深度学习】Day53 对抗生成网络
python·深度学习
程序小武4 小时前
Python 面向对象编程基础-类的创建与__init__实例化
python
Qyee164 小时前
【算法】基于中位数和MAD鲁棒平均值计算算法
python·算法
Ai财富密码5 小时前
【Python教程】CentOS系统下Miniconda3安装与Python项目后台运行全攻略
开发语言·python·numpy