条件约束聚类并显示

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函数展示聚类结果。
相关推荐
万化冥合29 分钟前
PyBox屏幕键盘如何辅助演示键盘操作?
python·计算机外设
车软学堂35 分钟前
从测试转开发,到底要补什么
网络·人工智能·python·功能测试·单片机·车载系统·自动化
天空依然蔚蓝37 分钟前
分享一个自动检测网站在线状态的python程序
python·运维开发·1024程序员节
岁月宁静1 小时前
一个 AI 项目从本地到上线,要经过哪些步骤?全流程讲清楚
python·docker·agent
codists2 小时前
《crafting interpreters》阅读笔记:p45-p45
python
曲径海盗3 小时前
【Python 学习第 41 天】for 循环
python·学习笔记·编程入门
摇滚侠3 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 11
java·笔记·python
沧海一笑-dj3 小时前
【Python】Python学习笔记-模块与包
python·pip·模块·包·python包·python模块·包与模块
echome8883 小时前
Python 异常处理:try、else、finally 的正确搭配
开发语言·前端·python·异常处理·编程技巧
云和数据.ChenGuang3 小时前
Python 单继承与多继承深度剖析:从 MRO 到实战取舍
开发语言·人工智能·python·langchain