条件约束聚类并显示

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函数展示聚类结果。
相关推荐
FreakStudio2 小时前
全网最适合入门的面向对象编程教程:56 Python字符串与序列化-正则表达式和re模块应用
python·单片机·嵌入式·面向对象·电子diy
丶21362 小时前
【CUDA】【PyTorch】安装 PyTorch 与 CUDA 11.7 的详细步骤
人工智能·pytorch·python
_.Switch3 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
一个闪现必杀技3 小时前
Python入门--函数
开发语言·python·青少年编程·pycharm
sp_fyf_20243 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02
人工智能·神经网络·算法·计算机视觉·语言模型·自然语言处理·数据挖掘
小鹿( ﹡ˆoˆ﹡ )3 小时前
探索IP协议的神秘面纱:Python中的网络通信
python·tcp/ip·php
卷心菜小温4 小时前
【BUG】P-tuningv2微调ChatGLM2-6B时所踩的坑
python·深度学习·语言模型·nlp·bug
陈苏同学4 小时前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
唐家小妹4 小时前
介绍一款开源的 Modern GUI PySide6 / PyQt6的使用
python·pyqt
羊小猪~~5 小时前
深度学习项目----用LSTM模型预测股价(包含LSTM网络简介,代码数据均可下载)
pytorch·python·rnn·深度学习·机器学习·数据分析·lstm