TrustGeo代码理解(七)preprocess.py

代码链接:https://github.com/ICDM-UESTC/TrustGeo

一、导入各种模块和数据库

# Load data and IP clustering

import math
import random
import pandas as pd
import numpy as np
import argparse
from sklearn import preprocessing
from lib.utils import MaxMinScaler

加载数据和IP聚类,这些导入语句是为了引入在后续代码中可能会使用到的数学、随机数、数据处理等工具和库。

1、import math:导入 Python 的 math 模块,该模块提供了数学运算的函数。

2、import random:导入 Python 的 random 模块,该模块提供了生成伪随机数的函数。

3、import pandas as pd:导入 pandas 库,并将其简写为 pd,用于处理和分析数据。

4、import numpy as np:导入 numpy 库,并将其简写为 np,用于支持大量的维度数组和矩阵运算。

5、import argparse:导入 argparse 模块,用于解析命令行参数。

6、from sklearn import preprocessingsklearn 库导入数据预处理模块 preprocessing,用于数据预处理。

7、from lib.utils import MaxMinScaler:从自定义的 lib.utils 模块中导入 MaxMinScaler 类。这可能是一个用于最大-最小归一化的工具类。

二、使用argparse库创建了一个命令行解析器

parser = argparse.ArgumentParser()

parser.add_argument('--dataset', type=str, default='New_York', choices=["Shanghai", "New_York", "Los_Angeles"],
                    help='which dataset to use')
parser.add_argument('--train_test_ratio', type=float, default=0.8, help='landmark ratio')
parser.add_argument('--lm_ratio', type=float, default=0.7, help='landmark ratio')
parser.add_argument('--seed', type=int, default=1234)

opt = parser.parse_args()

这部分代码的功能是通过命令行输入来配置脚本的行为。用户可以在运行脚本时通过命令行参数指定数据集名称、训练集测试集比例、地标比例以及随机数生成的种子等参数。解析后,这些参数将在脚本中被引用,从而影响程序的行为。

1、parser = argparse.ArgumentParser():创建一个ArgumentParser对象,用于解析命令行参数。

2、parser.add_argument('--dataset', type=str, default='New_York', choices=["Shanghai", "New_York", "Los_Angeles"],help='which dataset to use'): 添加命令行参数。

3、parser.add_argument('--train_test_ratio', type=float, default=0.8, help='landmark ratio'):用于指定训练集和测试集的比例,默认值是 0.8

4、parser.add_argument('--lm_ratio', type=float, default=0.7, help='landmark ratio'):用于指定地标的比例,默认值是 0.7

5、parser.add_argument('--seed', type=int, default=1234): 用于指定随机数生成的种子,默认值是 1234

6、opt = parser.parse_args():解析命令行参数,并将解析结果存储在 opt 对象中。opt 对象将包含命令行传入的各个参数的值。

三、get_XY()

def get_XY(dataset):
    data_path = "./datasets/{}/data.csv".format(dataset)
    ip_path = './datasets/{}/ip.csv'.format(dataset)
    trace_path = './datasets/{}/last_traceroute.csv'.format(dataset)

    data_origin = pd.read_csv(data_path, encoding='gbk', low_memory=False)
    ip_origin = pd.read_csv(ip_path, encoding='gbk', low_memory=False)
    trace_origin = pd.read_csv(trace_path, encoding='gbk', low_memory=False)

    data = pd.concat([data_origin, ip_origin, trace_origin], axis=1)
    data.fillna({"isp": '0'}, inplace=True)

    # labels
    Y = data[['longitude', 'latitude']]
    Y = np.array(Y)

    # features
    if dataset == "Shanghai":  # Shanghai
        # classification features
        X_class = data[['orgname', 'asname', 'address', 'isp']]
        scaler = preprocessing.OneHotEncoder(sparse=False)
        X_class = scaler.fit_transform(X_class)

        X_class1 = data['isp']
        X_class1 = preprocessing.LabelEncoder().fit_transform(X_class1)
        X_class1 = preprocessing.MinMaxScaler().fit_transform(np.array(X_class1).reshape((-1, 1)))

        X_2 = data[['ip_split1', 'ip_split2', 'ip_split3', 'ip_split4']]
        X_2 = preprocessing.MinMaxScaler().fit_transform(np.array(X_2))

        X_3 = data[['aiwen_ping_delay_time', 'vp806_ping_delay_time', 'vp808_ping_delay_time', 'vp813_ping_delay_time']]
        delay_scaler = MaxMinScaler()
        delay_scaler.fit(X_3)
        X_3 = delay_scaler.transform(X_3)

        X_4 = data[['aiwen_tr_steps', 'vp806_tr_steps', 'vp808_tr_steps', 'vp813_tr_steps']]
        step_scaler = MaxMinScaler()
        step_scaler.fit(X_4)
        X_4 = step_scaler.transform(X_4)

        X_5 = data['asnumber']
        X_5 = preprocessing.LabelEncoder().fit_transform(X_5)
        X_5 = preprocessing.MinMaxScaler().fit_transform(np.array(X_5).reshape(-1, 1))

        X_6 = data[
            ['aiwen_last1_delay', 'aiwen_last2_delay_total', 'aiwen_last3_delay_total', 'aiwen_last4_delay_total',
             'vp806_last1_delay', 'vp806_last2_delay_total', 'vp806_last3_delay_total', 'vp806_last4_delay_total',
             'vp808_last1_delay', 'vp808_last2_delay_total', 'vp808_last3_delay_total', 'vp808_last4_delay_total',
             'vp813_last1_delay', 'vp813_last2_delay_total', 'vp813_last3_delay_total', 'vp813_last4_delay_total']]
        X_6 = np.array(X_6)
        X_6[X_6 <= 0] = 0
        X_6 = preprocessing.MinMaxScaler().fit_transform(X_6)

        X = np.concatenate([X_class1, X_class, X_2, X_3, X_4, X_5, X_6], axis=1) # dimension =51

    elif dataset == "New_York" or "Los_Angeles":  # New_York or Los_Angeles
        X_class = data['isp']
        X_class = preprocessing.LabelEncoder().fit_transform(X_class)
        X_class = preprocessing.MinMaxScaler().fit_transform(np.array(X_class).reshape((-1, 1)))

        X_2 = data[['ip_split1', 'ip_split2', 'ip_split3', 'ip_split4']]
        X_2 = preprocessing.MinMaxScaler().fit_transform(np.array(X_2))

        X_3 = data['as_mult_info']
        X_3 = preprocessing.LabelEncoder().fit_transform(X_3)
        X_3 = preprocessing.MinMaxScaler().fit_transform(np.array(X_3).reshape(-1, 1))

        X_4 = data[['vp900_ping_delay_time', 'vp901_ping_delay_time', 'vp902_ping_delay_time', 'vp903_ping_delay_time']]
        delay_scaler = MaxMinScaler()
        delay_scaler.fit(X_4)
        X_4 = delay_scaler.transform(X_4)

        X_5 = data[['vp900_tr_steps', 'vp901_tr_steps', 'vp902_tr_steps', 'vp903_tr_steps']]
        step_scaler = MaxMinScaler()
        step_scaler.fit(X_5)
        X_5 = step_scaler.transform(X_5)

        X_6 = data[
            ['vp900_last1_delay', 'vp900_last2_delay_total', 'vp900_last3_delay_total', 'vp900_last4_delay_total',
             'vp901_last1_delay', 'vp901_last2_delay_total', 'vp901_last3_delay_total', 'vp901_last4_delay_total',
             'vp902_last1_delay', 'vp902_last2_delay_total', 'vp902_last3_delay_total', 'vp902_last4_delay_total',
             'vp903_last1_delay', 'vp903_last2_delay_total', 'vp903_last3_delay_total', 'vp903_last4_delay_total']]
        X_6 = np.array(X_6)
        X_6[X_6 <= 0] = 0
        X_6 = preprocessing.MinMaxScaler().fit_transform(X_6)

        X = np.concatenate([X_2, X_class, X_3, X_4, X_5, X_6], axis=1) # dimension =30

    return X, Y, np.array(trace_origin)

这个函数用于从指定数据集加载并预处理数据,返回用于训练的特征 (X)、标签 (Y) 以及原始的跟踪数据 (trace_origin)。

分为几个部分展开描述:

(一)加载数据并处理

data_path = "./datasets/{}/data.csv".format(dataset)
ip_path = './datasets/{}/ip.csv'.format(dataset)
trace_path = './datasets/{}/last_traceroute.csv'.format(dataset)

data_origin = pd.read_csv(data_path, encoding='gbk', low_memory=False)
ip_origin = pd.read_csv(ip_path, encoding='gbk', low_memory=False)
trace_origin = pd.read_csv(trace_path, encoding='gbk', low_memory=False)

data = pd.concat([data_origin, ip_origin, trace_origin], axis=1)
data.fillna({"isp": '0'}, inplace=True)

这部分代码主要是从三个文件(data.csvip.csvlast_traceroute.csv)中加载数据,进行合并和预处理。

1、data_path = "./datasets/{}/data.csv".format(dataset):构建包含数据文件路径的字符串,其中 {} 是一个占位符,将被 format(dataset) 中的 dataset 变量替代。

2、ip_path = './datasets/{}/ip.csv'.format(dataset):构建包含 IP 地址文件路径的字符串。

3、trace_path = './datasets/{}/last_traceroute.csv'.format(dataset):构建包含最后一次路由跟踪文件路径的字符串。

4、data_origin = pd.read_csv(data_path, encoding='gbk', low_memory=False):使用 Pandas 库的 read_csv 函数从 data.csv 文件中读取数据。参数 encoding='gbk' 表示使用 gbk 编码读取文件,low_memory=False 表示禁用内存优化,以确保能够处理大型文件。

5、ip_origin = pd.read_csv(ip_path, encoding='gbk', low_memory=False):从 ip.csv 文件中读取 IP 地址相关的数据。

6、trace_origin = pd.read_csv(trace_path, encoding='gbk', low_memory=False):从 last_traceroute.csv 文件中读取最后一次路由跟踪的数据。

7、data = pd.concat([data_origin, ip_origin, trace_origin], axis=1):将三个数据框按列(axis=1)进行拼接,形成一个包含所有信息的新数据框 data

8、data.fillna({"isp": '0'}, inplace=True):使用字符串 '0' 填充数据框中的缺失值,特别是 isp 列的缺失值。inplace=True 表示在原地修改数据框而不返回新的数据框。这个步骤主要是为了处理缺失值,将缺失的 isp 列中的值替换为 '0'。

(二)处理数据中的标签(labels)

# labels
Y = data[['longitude', 'latitude']]
Y = np.array(Y)

这部分代码的整体功能是从数据中提取经度和纬度两列,将它们存储在 NumPy 数组 Y 中,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/250191.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

列表优先于数组

在Java中&#xff0c;列表&#xff08;List&#xff09;通常优于数组&#xff0c;因为列表提供了更灵活的操作和动态调整大小的能力。下面是一个例子&#xff0c;展示了为什么在某些情况下使用列表比数组更好&#xff1a; import java.util.ArrayList; import java.util.List;…

AtCoder ABC周赛2023 12/10 (Sun) D题题解

目录 原题截图&#xff1a; 题目大意&#xff1a; 主要思路&#xff1a; 注&#xff1a; 代码&#xff1a; 原题截图&#xff1a; 题目大意&#xff1a; 给定两个 的矩阵 和 。 你每次可以交换矩阵 的相邻两行中的所有元素或是交换两列中的所有元素。 请问要使 变换至…

python封装执行cmd命令的方法

一、前置说明 在自动化时&#xff0c;经常需要使用命令行工具与系统进行交互&#xff0c;因此可以使用python封装一个执行cmd命令的方法。 二、代码实现 import subprocess import timefrom common.exception import RunCMDError from common.logger import loggerclass Cmd…

使用Matlab实现声音信号处理

利用Matlab软件对声音信号进行读取、放音、存储 先去下载一个声音文件&#xff1b;使用这个代码即可 clear; clc; [y, Fs] audioread(xxx.wav); plot(y); y y(:, 1); spectrogram(y); sound(y, Fs); % player audioplayer(y, Fs);y1 diff(y(:, 1)); subplot(2, 1, 1); pl…

【Spark精讲】Spark五种JOIN策略

目录 三种通用JOIN策略原理 Hash Join 散列连接 原理详解 Sort Merge Join 排序合并连接 Nested Loop 嵌套循环连接 影响JOIN操作的因素 数据集的大小 JOIN的条件 JOIN的类型 Spark中JOIN执行的5种策略 Shuffle Hash Join Broadcast Hash Join Sort Merge Join C…

关于MySQL的bigint问题

MySQL的bigint(8)能存多大数值&#xff1f; MySQL的BIGINT(8)可以存储的数值范围是从-9,223,372,036,854,775,808到9,223,372,036,854,775,807。这是因为BIGINT数据类型在MySQL中使用8字节进行存储&#xff0c;每个字节有8位&#xff0c;所以总共可以表示2^64个不同的整数。 …

亚太地区是Aleo下一个重点市场!ZK技术将重塑区块链世界!

4 年&#xff0c;3 亿美元&#xff0c;基于 ZK 的隐私公链&#xff0c;是 Aleo 最直观的三个标签。区块链的致富效应&#xff0c;已经让传统金融蠢蠢欲动&#xff0c;想参与Aleo私募和头矿的朋友请于文末添加微信。 对于Aleo副总裁兼业务发展主管Joanna Zeng来说&#xff0c;近…

[NAND Flash 4.1] Flash(闪存)存储器底层原理 | 闪存存储器重要参数

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< ​全文 5000 字。 从底层物理原理上了解 Nand Flash。 1. 存储器诞生&#xff1a; 现代计算机使用存储器来存储数据&#xff0c;其…

【FPGA】Verilog:解码器 | 实现 2-4 解码器

实践内容&#xff1a;解释 2 至 4 解码器的结果和仿真过程 (包括真值表创建和 k 映射、AND 门&#xff09;。 0x00 解码器&#xff08;Decoder&#xff09; 解码器是一种根据输入信号从多个输出 bit 中只选择一个的设备。 例如&#xff0c;如果有一个解码器接收一个 2 位二进…

章鱼网络 Community Call #16|逐步过渡到回购和销毁模型

香港时间2023年12月8日12点&#xff0c;章鱼网络举行第16期 Community Call。 自2023年4月份提出 Octopus 2.0 计划以来&#xff0c;我们一直致力于将这一愿景变为现实。感谢核心团队和章鱼社区的共同努力&#xff0c;我们决定于 12月17日正式推出 Octopus 2.0。 Community Ca…

node.js mongoose Aggregate介绍

目录 简述 Aggregate的原型方法 aggregate进行操作 简述 在 Mongoose 中&#xff0c;Aggregate 是用于执行 MongoDB 聚合操作的类。MongoDB 聚合操作是一种强大的数据处理工具&#xff0c;可以用于对集合中的文档进行变换和计算 通过Model.aggregate创建一个aggregate(Agg…

python批量实现labelImg标注的 xml格式数据转换成 txt格式保存

# -*- coding: utf-8 -*- import os import xml.etree.ElementTree as ETdirpath ********** # 原来存放xml文件的目录 newdir ********* # 修改label后形成的txt目录if not os.path.exists(newdir):os.makedirs(newdir)dict_info {sf6: 0, thermometer: 1,…

jmeter 如何循环使用接口返回的多值?

有同学在用jmeter做接口测试的时候&#xff0c;经常会遇到这样一种情况&#xff1a; 就是一个接口请求返回了多个值&#xff0c;然后下一个接口想循环使用前一个接口的返回值。 这种要怎么做呢&#xff1f; 有一定基础的人&#xff0c;可能第一反应就是先提取前一个接口返回…

低代码与工业4.0:数字化转型的完美伴侣

引言 工业4.0代表了制造业的一场革命&#xff0c;它将数字化、智能化和自动化引入了制造流程&#xff0c;重新定义了生产方式和企业运营。在这个数字时代&#xff0c;低代码技术崭露头角&#xff0c;成为工业4.0的强力支持者。本文将探讨低代码技术与工业4.0之间的紧密联系&am…

Linux 进程通信

文章目录 匿名管道匿名管道使用匿名管道原理匿名管道读写 命名管道命名管道使用命名管道特性 共享内存共享内存原理共享内存使用 补充说明 补充说明部分为相关函数和不太重要的概念介绍 匿名管道 匿名管道使用 使用方法一&#xff1a; 使用函数介绍&#xff1a; #include &…

DevEco Studio自定义代码颜色

这里以ArkTS代码颜色举例 进入设置&#xff08;快捷键CtrlAltS&#xff09; 选择Editor > Color Scheme > JavaScript 由于之前用习惯VsCode了&#xff0c;这里以注释颜色举例&#xff0c;变为绿色。 上面说的不是以ArkTS代码颜色举例吗&#xff1f;为什么选择JavaScr…

极坐标下的牛拉法潮流计算14节点MATLAB程序

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 潮流计算&#xff1a; 潮流计算是根据给定的电网结构、参数和发电机、负荷等元件的运行条件&#xff0c;确定电力系统各部分稳态运行状态参数的计算。通常给定的运行条件有系统中各电源和负荷点的功率、枢纽…

产品经理之如何编写需求PRD文档(医疗HIS项目详细案例模板)

目录 前言 一.需求文档的含义 二.需求文档的作用及目的 三.编写前的准备 四.需求大纲 五.案例模板 前言 继上两篇的可行性分析文档和竞品分析报告&#xff0c;本篇将继续介绍如何编写PRD文档&#xff0c;并且会附上以医疗项目为例的模板 一.需求文档的含义 需求文…

设计模式——享元模式(结构型)

引言 享元模式是一种结构型设计模式&#xff0c; 它摒弃了在每个对象中保存所有数据的方式&#xff0c; 通过共享多个对象所共有的相同状态&#xff0c; 让你能在有限的内存容量中载入更多对象。 问题 假如你希望在长时间工作后放松一下&#xff0c; 所以开发了一款简单的游戏…

论文润色机构哪个好 快码论文

大家好&#xff0c;今天来聊聊论文润色机构哪个好&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 标题&#xff1a;论文润色机构哪个好――专业、高效、可靠的学术支持 一…