条件约束聚类并显示

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函数展示聚类结果。
相关推荐
荷蒲37 分钟前
【小白量化Qbuddy】利用AI学习中文Python
人工智能·python·学习
数据狐(Datafox)2 小时前
京东商品列表API技术解析与落地应用(含标准 JSON 示例)
java·大数据·前端·人工智能·python·数据分析·json
量化吞吐机2 小时前
2026年下半年手工交易规则走向量化表达,产品该先接住哪一步
人工智能·python
Metaphor6923 小时前
使用 Python 读取和删除 Excel 文件属性
python·excel
迷迭香yy4 小时前
Python构建转融券多空识别系统从接口到因子的全流程 IG50免费开源股票数据API接口
开发语言·python·开源
月光船幽幽4 小时前
真实即粗糙,光滑是伪造
人工智能·python
一次旅行4 小时前
Attention机制从数学到工程:拆解缩放点积+多头注意力|附可运行PyTorch实现与踩坑指南
人工智能·pytorch·python
泡干脆面就番茄4 小时前
NumPy 科学计算完全指南:从数组创建到广播机制
python·numpy
denggun123454 小时前
信号量(DispatchSemaphore vs AsyncSemaphore)、swift协作式线程池 and python信号量
开发语言·python·swift
起光5 小时前
Python类与对象(一)
python