条件约束聚类并显示

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函数展示聚类结果。
相关推荐
喂完待续5 小时前
【Tech Arch】Spark为何成为大数据引擎之王
大数据·hadoop·python·数据分析·spark·apache·mapreduce
王者鳜錸7 小时前
PYTHON让繁琐的工作自动化-猜数字游戏
python·游戏·自动化
若天明7 小时前
深度学习-计算机视觉-微调 Fine-tune
人工智能·python·深度学习·机器学习·计算机视觉·ai·cnn
倔强青铜三8 小时前
苦练Python第39天:海象操作符 := 的入门、实战与避坑指南
人工智能·python·面试
数据超市8 小时前
香港数据合集:建筑物、手机基站、POI、职住数据、用地类型
大数据·人工智能·智能手机·数据挖掘·数据分析
一百天成为python专家9 小时前
Python循环语句 从入门到精通
开发语言·人工智能·python·opencv·支持向量机·计算机视觉
Sunhen_Qiletian9 小时前
朝花夕拾(五)--------Python 中函数、库及接口的详解
开发语言·python
三年呀10 小时前
标题:移动端安全加固:发散创新,筑牢安全防线引言:随着移动互联网
网络·python·安全
关山11 小时前
MCP实战
python·ai编程·mcp
一个专注api接口开发的小白11 小时前
Python + 淘宝 API 开发:自动化采集商品数据的完整流程
前端·数据挖掘·api