基于Python的北京天气数据可视化分析

项目用到库

import numpy as np
import pandas as pd
import datetime
from pyecharts.charts import Line
from pyecharts.charts import Boxplot
from pyecharts.charts import Pie,Grid
from pyecharts import options as opts
from pyecharts.charts import Calendar

1.2018 年北京AQI全年走势图

代码如下:

# 读取数据
df = pd.read_csv('beijing_AQI_2018.csv')
attr = df['Date'].tolist()  # 将 Date 转换为列表
v1 = df['AQI'].tolist()  # 将 AQI 转换为列表

# 创建折线图
line = (
    Line()
    .add_xaxis(attr)
    .add_yaxis("AQI值:", v1, is_smooth=True, 
               areastyle_opts=opts.AreaStyleOpts(opacity=0.3, color="#000"), 
               markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]),
               markpoint_opts=opts.MarkPointOpts(data=[
                   opts.MarkPointItem(type_="max", name="最大值"),
                   opts.MarkPointItem(type_="min", name="最小值")
               ]))
    .set_global_opts(title_opts=opts.TitleOpts(title="2018年北京AQI全年走势图", 
                                               pos_top='5%', 
                                               pos_left='center'),
                     xaxis_opts=opts.AxisOpts(type_="category"),
                     yaxis_opts=opts.AxisOpts(type_="value"))
)

# 将图表渲染到 HTML 文件
line.render("./2018年北京AQI全年走势图.html")

结果如下: 

2.2018 年北京PM2.5全年走势图

代码如下:

# 读取数据
df = pd.read_csv('beijing_AQI_2018.csv')
attr = df['Date'].tolist()  # 将 Date 转换为列表
v1 = df['PM'].tolist()  # 将 PM 转换为列表

# 创建折线图
line = (
    Line()
    .add_xaxis(attr)
    .add_yaxis("PM2.5值:", v1, is_smooth=True, 
               areastyle_opts=opts.AreaStyleOpts(opacity=0.3, color="#000"), 
               markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]),
               markpoint_opts=opts.MarkPointOpts(data=[
                   opts.MarkPointItem(type_="max", name="最大值"),
                   opts.MarkPointItem(type_="min", name="最小值")
               ]))
    .set_global_opts(title_opts=opts.TitleOpts(title="2018年北京PM2.5全年走势图", 
                                               pos_top='5%', 
                                               pos_left='center'),
                     xaxis_opts=opts.AxisOpts(type_="category"),
                     yaxis_opts=opts.AxisOpts(type_="value"))
)

# 将图表渲染到 HTML 文件
line.render("./2018年北京PM2.5全年走势图.html")

结果如下:

3.2018 年北京月均AQI走势图

代码如下:

# 读取数据
df = pd.read_csv('beijing_AQI_2018.csv')

# 提取 Date 和 AQI 的值
dom = df[['Date', 'AQI']]

# 提取月份
df['month'] = df['Date'].apply(lambda x: x.split('/')[1])

# 根据月份分组并计算每月的 AQI 平均值
month_com = df.groupby('month')['AQI'].mean().reset_index()

# 排序月份
month_com = month_com.sort_values(by='month')

# 构造月份标签
attr = ["{}月".format(i) for i in range(1, 13)]

# 获取每月的 AQI 平均值
v1 = month_com['AQI'].tolist()
v1 = ["{}".format(int(i)) for i in v1]

# 创建折线图
line = (
    Line()
    .add_xaxis(attr)
    .add_yaxis("AQI月均值", v1, 
               markpoint_opts=opts.MarkPointOpts(data=[
                   opts.MarkPointItem(type_="max", name="最大值"),
                   opts.MarkPointItem(type_="min", name="最小值")
               ]))
    .set_global_opts(title_opts=opts.TitleOpts(title="2018年北京月均AQI走势图", 
                                               pos_top='5%', 
                                               pos_left='center'),
                     xaxis_opts=opts.AxisOpts(type_="category"),
                     yaxis_opts=opts.AxisOpts(type_="value"))
)

# 渲染图表到 HTML 文件
line.render("./2018年北京月均AQI走势图.html")

结果如下:

4.2018 年北京月均PM2.5走势图

代码如下:

# 读取数据
df = pd.read_csv('beijing_AQI_2018.csv')

# 提取 Date 和 PM 的值
dom = df[['Date', 'PM']]

# 提取月份
df['month'] = df['Date'].apply(lambda x: x.split('/')[1])

# 根据月份分组并计算每月的 PM 平均值
month_com = df.groupby('month')['PM'].mean().reset_index()

# 排序月份
month_com = month_com.sort_values(by='month')

# 构造月份标签
attr = ["{}月".format(i) for i in range(1, 13)]

# 获取每月的 PM 平均值
v1 = month_com['PM'].tolist()
v1 = ["{}".format(int(i)) for i in v1]

# 创建折线图
line = (
    Line()
    .add_xaxis(attr)
    .add_yaxis("PM2.5月均值", v1, 
               markpoint_opts=opts.MarkPointOpts(data=[
                   opts.MarkPointItem(type_="max", name="最大值"),
                   opts.MarkPointItem(type_="min", name="最小值")
               ]))
    .set_global_opts(title_opts=opts.TitleOpts(title="2018年北京月均PM2.5走势图", 
                                               pos_top='5%', 
                                               pos_left='center'),
                     xaxis_opts=opts.AxisOpts(type_="category"),
                     yaxis_opts=opts.AxisOpts(type_="value"))
)

# 渲染图表到 HTML 文件
line.render("./2018年北京月均PM2.5走势图.html")

结果如下:

5.2018年北京季度AQI箱形图

代码如下:

# 读取数据
df = pd.read_csv('beijing_AQI_2018.csv')

# 提取 Date 和 AQI 的值
dom = df[['Date', 'AQI']]
data = [[], [], [], []]
dom1, dom2, dom3, dom4 = data

# 根据季度提取 AQI 值
for date, aqi in zip(dom['Date'], dom['AQI']):
    month = int(date.split('/')[1])
    if month in [1, 2, 3]:
        dom1.append(aqi)
    elif month in [4, 5, 6]:
        dom2.append(aqi)
    elif month in [7, 8, 9]:
        dom3.append(aqi)
    else:
        dom4.append(aqi)

# 创建箱形图
boxplot = Boxplot()

# 设置 x 轴和 y 轴数据
x_axis = ['第一季度', '第二季度', '第三季度', '第四季度']
y_axis = [dom1, dom2, dom3, dom4]
y_axis = boxplot.prepare_data(y_axis)

# 添加数据到箱形图
boxplot.add_xaxis(x_axis)
boxplot.add_yaxis("AQI", y_axis)

# 设置图表全局选项
boxplot.set_global_opts(title_opts=opts.TitleOpts(title="2018年北京季度AQI箱形图", pos_left='center', pos_top='6%'))

# 渲染图表到 HTML 文件
boxplot.render("./2018年北京季度AQI箱形图.html")

结果如下:

6.2018年北京季度PM2.5箱形图

代码如下:

# 读取数据
df = pd.read_csv('beijing_AQI_2018.csv')

# 提取 Date 和 PM 的值
dom = df[['Date', 'PM']]
data = [[], [], [], []]
dom1, dom2, dom3, dom4 = data

# 根据季度提取 PM 值
for date, pm in zip(dom['Date'], dom['PM']):
    month = int(date.split('/')[1])
    if month in [1, 2, 3]:
        dom1.append(pm)
    elif month in [4, 5, 6]:
        dom2.append(pm)
    elif month in [7, 8, 9]:
        dom3.append(pm)
    else:
        dom4.append(pm)

# 创建箱形图
boxplot = Boxplot()

# 设置 x 轴和 y 轴数据
x_axis = ['第一季度', '第二季度', '第三季度', '第四季度']
y_axis = [dom1, dom2, dom3, dom4]
y_axis = boxplot.prepare_data(y_axis)

# 添加数据到箱形图
boxplot.add_xaxis(x_axis)
boxplot.add_yaxis("PM2.5", y_axis)

# 设置图表全局选项
boxplot.set_global_opts(title_opts=opts.TitleOpts(title="2018年北京季度PM2.5箱形图", pos_left='center', pos_top='6%'))

# 渲染图表到 HTML 文件
boxplot.render("./2018年北京季度PM2.5箱形图.html")

结果如下:

7.2018年北京全年空气质量情况

代码如下:

# 读取数据
df = pd.read_csv('beijing_AQI_2018.csv')

# 根据 Quality_grade 分组
rank_message = df.groupby(['Quality_grade'])

# 计算每个 Quality_grade 的频数
rank_com = rank_message['Quality_grade'].agg(['count'])
rank_com.reset_index(inplace=True)  # 重置索引
rank_com_last = rank_com.sort_values('count', ascending=False)  # 从大到小排序

# 提取 Quality_grade 和对应的频数
attr = rank_com_last['Quality_grade'].tolist()
v1 = rank_com_last['count'].tolist()

# 创建饼图
pie = (
    Pie()
    .add("", [list(z) for z in zip(attr, v1)], radius=["40%", "75%"], 
         label_opts=opts.LabelOpts(is_show=True, formatter="{b}: {d}%"))
    .set_global_opts(title_opts=opts.TitleOpts(title="2018年北京全年空气质量情况", pos_left='center', pos_top='0'),
                     legend_opts=opts.LegendOpts(is_show=True, orient="vertical", pos_left="left", pos_top="10%"))
)

# 渲染图表到 HTML 文件
pie.render('./2018年北京全年空气质量情况.html')

结果如下:

8.2018年北京PM2.5指数日历图

代码如下:

# Read data from 'beijing_AQI_2018.csv'
df = pd.read_csv('beijing_AQI_2018.csv')

# Extract 'Date' and 'PM' columns
dom = df[['Date', 'PM']]

list1 = []

# Compress the date and PM values into a list of lists
for i, j in zip(dom['Date'], dom['PM']):
    time_list = i.split('/')
    time = datetime.date(int(time_list[0]), int(time_list[1]), int(time_list[2]))
    PM = int(j)
    list1.append([str(time), PM])

# Create a calendar chart
calendar = (
    Calendar(init_opts=opts.InitOpts(width="800px", height="400px"))
    .add(
        series_name="2018年北京PM2.5指数日历图",
        yaxis_data=list1,
        calendar_opts=opts.CalendarOpts(range_="2018"),
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="2018年北京PM2.5指数日历图", pos_left="center",pos_top='50%'),
        visualmap_opts=opts.VisualMapOpts(
            max_=300, min_=0, orient="horizontal", is_piecewise=True,
            pos_top='60%',  # 将视觉映射放置在图表的顶部
            pos_left='center'  # 将视觉映射放置在图表的水平居中位置
        ),
    )
)

# Render the chart to an HTML file
calendar.render('./2018年北京PM2.5指数日历图.html')

结果如下:

9.2018 年北上广深AQI全年走势图

代码如下:


citys = ['beijing', 'shanghai', 'guangzhou', 'shenzhen']
cityes_AQI = []

# 遍历四个城市的数据
for city in citys:
    filename = city + '_AQI' + '_2018.csv'
    aqi_data = pd.read_csv(filename)

    # 提取日期和AQI指数两列内容
    get_data = aqi_data[['Date', 'AQI']]

    # 获取每行数据的月份
    month_for_data = [j.split('/')[1] for j in get_data['Date']]
    aqi_data['Month'] = month_for_data

    # 求每个月AQI平均值
    month_AQI = aqi_data.groupby(['Month'])['AQI'].mean().reset_index()

    # 获取每个城市月均AQI的数据,转化为int数据类型
    city_AQI_data_int = month_AQI['AQI'].astype(int).tolist()
    cityes_AQI.append(city_AQI_data_int)

months = [str(i) + '月' for i in range(1, 13)]

line = (
    Line(init_opts=opts.InitOpts(width="800px", height="400px"))
    .add_xaxis(months)
    .add_yaxis("北京", cityes_AQI[0], color='red', label_opts=opts.LabelOpts(is_show=False))
    .add_yaxis("上海", cityes_AQI[1], color='purple', label_opts=opts.LabelOpts(is_show=False))
    .add_yaxis("广州", cityes_AQI[2], color='blue', label_opts=opts.LabelOpts(is_show=False))
    .add_yaxis("深圳", cityes_AQI[3], color='orange', label_opts=opts.LabelOpts(is_show=False))
    .set_global_opts(
        title_opts=opts.TitleOpts(title="2018年北上广深AQI全年走势图", pos_left='center', pos_top='0'),
        legend_opts=opts.LegendOpts(orient="horizontal", pos_top="8%"),
    )
)

line.render('./2018年北上广深AQI全年走势图.html')  # 生成HTML文件,保存在当前目录下

结果如下:

10.2018 年北上广深PM2.5全年走势图

代码如下:

import numpy as np
import pandas as pd
from pyecharts.charts import Line
from pyecharts import options as opts

citys = ['beijing', 'shanghai', 'guangzhou', 'shenzhen']
cityes_AQI = []

# 遍历四个城市的数据
for city in citys:
    filename = city + '_AQI' + '_2018.csv'
    aqi_data = pd.read_csv(filename)

    # 提取日期和PM2.5指数两列内容
    get_data = aqi_data[['Date', 'PM']]

    # 获取每行数据的月份
    month_for_data = [j.split('/')[1] for j in get_data['Date']]
    aqi_data['Month'] = month_for_data

    # 求每个月PM2.5平均值
    month_AQI = aqi_data.groupby(['Month'])['PM'].mean().reset_index()

    # 获取每个城市月均PM2.5的数据,转化为int数据类型
    city_AQI_data_int = month_AQI['PM'].astype(int).tolist()
    cityes_AQI.append(city_AQI_data_int)

months = [str(i) + '月' for i in range(1, 13)]

line = (
    Line(init_opts=opts.InitOpts(width="800px", height="400px"))
    .add_xaxis(months)
    .add_yaxis("北京", cityes_AQI[0], color='red', label_opts=opts.LabelOpts(is_show=False))
    .add_yaxis("上海", cityes_AQI[1], color='purple', label_opts=opts.LabelOpts(is_show=False))
    .add_yaxis("广州", cityes_AQI[2], color='blue', label_opts=opts.LabelOpts(is_show=False))
    .add_yaxis("深圳", cityes_AQI[3], color='orange', label_opts=opts.LabelOpts(is_show=False))
    .set_global_opts(
        title_opts=opts.TitleOpts(title="2018年北上广深PM2.5全年走势图", pos_left='center', pos_top='0'),
        legend_opts=opts.LegendOpts(orient="horizontal", pos_top="8%"),
    )
)

line.render('./2018年北上广深PM2.5全年走势图.html')  # 生成HTML文件,保存在当前目录下

结果如下:

11.2018 年北上广深全年空气质量情况

代码如下:

citys = ['beijing', 'shanghai', 'guangzhou', 'shenzhen']
v = []
attrs = []
for i in range(4):
    filename =  citys[i] + '_AQI' + '_2018.csv'
    df = pd.read_csv(filename)
    
    # 根据 Quality_grade 分组
    Quality_grade_message = df.groupby(['Quality_grade'])
    # 每组的频数
    Quality_grade_com = Quality_grade_message['Quality_grade'].agg(['count'])
    Quality_grade_com.reset_index(inplace=True)
    Quality_grade_com_last = Quality_grade_com.sort_values('count', ascending=False)
    # 取 Quality_grade 的值
    Quality_grade_array = Quality_grade_com_last['Quality_grade'].values.tolist()
    attrs.append(Quality_grade_array)
    Quality_grade_count = Quality_grade_com_last['count'].values.tolist()
    v.append(Quality_grade_count)


# 创建饼图并设置属性
pie1 = (
    Pie()
    .add("北京", [list(z) for z in zip(attrs[0], v[0])], radius=["20%", "40%"], center=["30%", "27%"],)
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
    .set_global_opts(title_opts=opts.TitleOpts(title="北京", pos_left='27%', pos_top='25%'),
                     legend_opts=opts.LegendOpts(orient="vertical", pos_right="5%", pos_top="35%"))
)

pie2 = (
    Pie()
    .add("上海", [list(z) for z in zip(attrs[1], v[1])], radius=["20%", "40%"], center=["70%", "27%"],)
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
    .set_global_opts(title_opts=opts.TitleOpts(title="上海", pos_left='67%', pos_top='25%'),
                     legend_opts=opts.LegendOpts(is_show=False))
)

pie3 = (
    Pie()
    .add("广州", [list(z) for z in zip(attrs[2], v[2])], radius=["20%", "40%"], center=["30%", "77%"],)
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
    .set_global_opts(title_opts=opts.TitleOpts(title="广州", pos_left='27%', pos_top='75%'),
                     legend_opts=opts.LegendOpts(is_show=False))
)

pie4 = (
    Pie()
    .add("深圳", [list(z) for z in zip(attrs[3], v[3])], radius=["20%", "40%"], center=["70%", "77%"],)
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
    .set_global_opts(title_opts=opts.TitleOpts(title="深圳", pos_left='67%', pos_top='75%'),
                     legend_opts=opts.LegendOpts(is_show=False))
)



# 创建 Grid 并添加饼图
grid = (
    Grid()
    .add(pie1, grid_opts=opts.GridOpts(pos_left="5%", pos_right="50%", pos_top="10%"))
    .add(pie2, grid_opts=opts.GridOpts(pos_left="55%", pos_right="5%", pos_top="10%"))
    .add(pie3, grid_opts=opts.GridOpts(pos_left="5%", pos_right="50%", pos_top="50%"))
    .add(pie4, grid_opts=opts.GridOpts(pos_left="55%", pos_right="5%", pos_top="50%"))
)

grid.render('./2018年北上广深全年空气质量情况.html')

结果如下:

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

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

相关文章

【Vue】——组件的注册与引用

💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux&#xf…

大泽动力30KW静音汽油发电机

安全操作: 在使用前,确保发电机放置在通风良好、干燥、无易燃物品的地方。 避免在发电机运行时触摸其热表面或运转部件,以免烫伤或受伤。 遵循发电机的启动和停机程序,不要随意操作。 燃油管理: 使用高质量的汽油&…

【C/C++】IO流

目录 前言: 一,C语言的I/O流 二,C的I/O流 2-1,C标准IO流 2-2,IO流的连续输入 前言: “流”即是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且具有方向性的数据…

地面站Mission planner

官方教程; Mission Planner地面站介绍 | Autopilot (gitbook.io) Mission Planner 功能/屏幕 — Mission Planner 文档 (ardupilot.org) 安卓或者windows软件下载地址: 地面站连接及使用 plane (cuav.net) 在完全装机后再进行各干器件的校准,没有组…

【十大排序算法】插入排序

插入排序,如一位细心的整理者, 她从序列的左端开始, 挨个将元素归位。 每当她遇到一个无序的元素, 便将它插入已经有序的部分, 直至所有元素有序排列。 她不张扬,却有效率, 用自己的方式&…

如何恢复已删除的文件(简单5 分钟方法)

本文介绍如何使用文件恢复程序恢复已删除的文件。其中包括与恢复已删除文件相关的提示。 如何恢复已删除的文件 从硬盘中恢复已删除的文件并不是一件疯狂的事情,但一旦意识到文件已被删除,尝试恢复会有所帮助。被删除的文件通常直到被其他文件覆盖后才真…

如何在Python中向Word文档添加段落

如何在Python中向Word文档添加段落 添加段落代码解析添加前与添加后 在这篇博客文章中,我们使用Python向Word文档添加段落。 添加段落 from docx import Document# 打开一个现有的Word文档 doc Document(rC:\Users\Administrator\Desktop\Word文档\example.docx)…

02Linux文件,目录,过滤,管道常用命令

Linux基础概述 Linux基础目录 Linux没有盘符这个概念, 只有一个顶级根目录 /, 所有文件都在它下面 在Windows系统中路径之间的层级关系使用/来表示在Linux系统中路径之间的层级关系使用/来表示,出现在开头的/表示根目录, /home/a.txt表示根目录下的home文件夹内有a.txt文件 …

Python中__面向对象__学习 (上)

目录 一、类和对象 1.类的定义 2.根据对象创建类 二、构造和析构 1.构造方法 (1)不带参数的构造方法 (2)带参数的构造方法 2.析构方法 三、重载 1.定制对象的字符串形式 (1)只重载__str__方法 …

STM32 HAL库开发——入门篇(3):OLED、LCD

源自正点原子视频教程: 【正点原子】手把手教你学STM32 HAL库开发全集【真人出镜】STM32入门教学视频教程 单片机 嵌入式_哔哩哔哩_bilibili 一、OLED 二、内存保护(MPU)实验 2.1 内存保护单元 三、LCD 3.1 显示屏分类 3.2 LCD简介 3.3 LCD…

【JAVASE】日期与时间类(上)

一:概述 从JAVA SE 8开始提供了java.time包,该包中有专门处理日期和时间的类。 LocalDate LocalDateTime 和LocalTime 类的对象封装和日期、时间有关的数据,这三个类都是final类,而且不提供修改数据的方法,即这…

ai辅助教育孩子

孩子经常躺在床上看手机是一个需要关注的问题,因为这不仅可能影响他们的视力健康,还可能影响睡眠质量和身体健康。以下是一些建议,帮助应对这一问题: 设定明确的规定: 与孩子一起制定使用手机的规则,如每天…

前端多人项目开发中,如何保证CSS样式不冲突?

在前端项目开发中,例如突然来了一个大项目,很可能就需要多人一起开发,领导说了,要快,要快,要快,你们给我快。然后下面大伙就一拥而上,干着干着发现,一更新代码&#xff0…

LiDAR360MLS 7.2.0 雷达点云数据处理软件功能介绍

新增模块和功能: 支持手持、背包数据的解算 SLAM解算成功率提升 SLAM解算效率提升 采集端与后处理端保持一致 赋色优化 新增平面图模块 新增平面图全自动矢量化功能 新增平面图矢量一键导出DXF功能 新增平面图正射影像一键导出功能 支持交叉、垂直绘制 支…

添加west扩展命令

使用west工具的帮助命令,west -h,不仅可以列出west工具的内置命令,也可以列举当前工程中实现的扩展命令,如build,flash等。 本文将介绍如何添加扩展命令。 west扩展命令的位置通过以下方式查找: 1. 首先找…

python-自幂数判断

[题目描述]: 自幂数是指,一个N 位数,满足各位数字N 次方之和是本身。例如,153153 是 33 位数,其每位数的 33 次方之和,135333153135333153,因此 153153 是自幂数;16341634 是 44 位数…

react的自定义组件

// 自定义组件(首字母必须大写) function Button() {return <button>click me</button>; } const Button1()>{return <button>click me1</button>; }// 使用组件 function App() {return (<div className"App">{/* // 自闭和引用自…

Springboot 通过SSE 实现实时消息返回

网上搜了好多都是用 SseEmitter 实现的,自己搭的demo确实也可以了,但是我项目里有一个过滤器,死活配置都不行,终于用google搜了一下,第一篇帖子便解决了这个问题,代码和大佬链接如下: https://github.com/CodingChaozhang/spring_boot_practice_demo/blob/master/springboot_s…

基于电荷的EPFL HEMT模型

来源&#xff1a;Charge-Based EPFL HEMT Model&#xff08;TED 19年&#xff09; 摘要 本文介绍了一种面向设计的、基于电荷的模型&#xff0c;用于直流操作下的AlGaAs/GaAs和AlGaN/GaN高迁移率场效应晶体管。该固有模型基于物理原理&#xff0c;不引入任何经验参数。核心概…

vuInhub靶场实战系列--prime:2

免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置1.1 靶场信息1.2 靶场配置 二、信息收集2.1 主机发现2.1.1 netdiscover2.1.2 nmap主机扫描2.1.3 arp-scan主机扫描 2.2 端口扫描…