作者: seo

  • wps office 的官方的下载的地址在哪

      背景: 以某大型电商平台的用户行为数据为数据集,使用大数据处理技术分析海量数据下的用户行为特征,并通过建立逻辑回归模型、随机森林对用户行为做出预测;

      案例思路:

      使用大数据处理技术读取海量数据

      海量数据预处理

      抽取部分数据调试模型

      使用海量数据搭建模型

      技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

      文中源码、资料分享、数据、技术交流提升,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

      方式①、添加微信号:pythoner666,备注:来自CSDN

      方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

      数据字典:

      U_Id:the serialized ID that represents a user

      T_Id:the serialized ID that represents an item

      C_Id:the serialized ID that represents the category which the corresponding item belongs to Ts:the timestamp of the behavior

      Be_type:enum-type from (‘pv’, ‘buy’, ‘cart’, ‘fav’)

      pv: Page view of an item’s detail page, equivalent to an item click

      _buy: Purchase an itemWPS office的电脑版的下载地址在哪里

      _

      cart: Add an item to shopping cart

      fav: Favor an item

      这里关键是使用dask库来处理海量数据,它的大多数操作的运行速度比常规pandas等库快十倍左右。

      pandas在分析结构化数据方面非常的流行和强大,但是它最大的限制就在于设计时没有考虑到可伸缩性。pandas特别适合处理小型结构化数据,并且经过高度优化,可以对存储在内存中的数据执行快速高 效的操作。然而随着数据量的大幅度增加,单机肯定会读取不下的,通过集群的方式来处理是最好的选 择。这就是Dask DataFrame API发挥作用的地方:通过为pandas提供一个包装器,可以智能的将巨大的DataFrame分隔成更小的片段,并将它们分散到多个worker(帧)中,并存储在磁盘中而不是RAM中。

      Dask DataFrame会被分割成多个部门,每个部分称之为一个分区,每个分区都是一个相对较小的 DataFrame,可以分配给任意的worker,并在需要复制时维护其完整数据。具体操作就是对每个分区并 行或单独操作(多个机器的话也可以并行),然后再将结果合并,其实从直观上也能推出Dask肯定是这么做的。

      面对海量数据,跑完一个模块的代码就可以加一行gc.collect()来做内存碎片回收,Dask Dataframes与Pandas Dataframes具有相同的API

      

      Dask DataFrame Structure :

      

      Dask Name: read-csv, 58 tasks

      与pandas不同,这里我们仅获取数据框的结构,而不是实际数据框。Dask已将数据帧分为几块加载,这些块存在 于磁盘上,而不存在于RAM中。如果必须输出数据帧,则首先需要将所有数据帧都放入RAM,将它们缝合在一 起,然后展示最终的数据帧。使用.compute()强迫它这样做,否则它不.compute() 。其实dask使用了一种延迟数 据加载机制,这种延迟机制类似于python的迭代器组件,只有当需要使用数据的时候才会去真正加载数据。

      

      数据压缩

      缺失值

      Dask DataFrame Structure :

      wps 的官网的下载网址

      

      

      这里我们使用pyecharts库。pyecharts是一款将python与百度开源的echarts结合的数据可视化工具。新版的1.X和旧版的0.5.X版本代码规则大 不相同,新版详见官方文档_https://gallery.pyecharts.org/#/README_

      饼图

      

      

      漏斗图

      

      

      

      时间戳转换

      dask对于时间戳的支持非常不友好
    wps官网下载的入口在哪里(wps office下载了怎么找不到)
      

      抽取一部分数据来调试代码
    wps的电脑版的下载的地方在哪里
      

      用户流量和购买时间情况分析

      用户行为统计表

       WPS office的官网最新下载地址怎么找

      

      总访问量成交量时间变化分析(天)

      

      

      由总访问量、成交量时间变化分析知,从17年11月25日至17年12月1日访问量和成交量存在小幅波动,2017年12 月2日访问量和成交量均出现大幅上升,2日、3日两天保持高访问量和高成交量。此现象原因之一为12月2日和3 日为周末,同时考虑2日3日可能存在某些促销活动,可结合实际业务情况进行具体分析。(图中周五访问量有上 升,但成交量出现下降,推测此现象可能与周末活动导致周五推迟成交有关。)

      总访问量成交量时间变化分析(小时)

      

      思路:不考虑时间窗口,只以用户的点击和收藏等行为来预测是否购买 流程:以用户ID(U_Id)为分组键,将每位用户的点击、收藏、加购物车的行为统计出来,分别为

      是否点击,点击次数;是否收藏,收藏次数;是否加购物车,加购物车次数

      以此来预测最终是否购买

      

      行为类型

      

      最后创建一个DataFrame用来存储等下计算出的用户行为。

      点击次数

      

      加购次数

      

      

      收藏次数

      

      

      相关分析

      

      是否加购与加购次数、是否收藏与收藏次数之间存在一定相关性,但经验证剔除其中之一与纳入全部变量效果基本一致,故之后使用全部变量建模。

      数据标签

      

      

      

      划分数据集

      

      逻辑回归

      模型建立

      模型评估

      

      随机森林

      模型建立

      模型评估

      

  • wps office免费版的下载的方法是什么

      在这里插入图片描述

       实验用到的类库说明

      8.1.1 数据集

      8.1.1.1 训练集
    wps office免费版的下载的网址是多少
      0-126 垃圾邮件

      127-150 正常邮件

       WPS office官网的下载的地方在哪里在这里插入图片描述

      8.1.1.2 测试集

      151-155 测试邮件

      在这里插入图片描述

      8.1.2 提取邮件文本有效词汇

      目标如下:

      在这里插入图片描述

       提取有效词汇代码wps的官网最新下载网址是什么

      8.1.3 获取全部邮件文本中出现次数最多的前N个词汇

      目标如下:

      在这里插入图片描述

      8.1.4 使用朴素贝叶斯模型进行邮件分类

      首先,获取特征向量

      然后,为每个邮件贴上标签,朴素贝叶斯为有监督学习,标签必须已知

      创建模型,根据训练集进行训练

      编写预测分类方法

      对测试集进行测试

      在这里插入图片描述

       实验用到的类库说明

      8.2.1 数据集

      使用画图程序创建的宽度 * 长度为 30 * 60 的图片

      部分数据集展示

      在这里插入图片描述

      在这里插入图片描述

      在这里插入图片描述

      在这里插入图片描述

      另外,还有一个 digits.txt 文件,记录了数据集每一张图片中的真实数字,在这只显示部分内容

      在这里插入图片描述

      8.2.2 图像数据读取

      加载数据代码

      8.2.3 交叉验证与网格搜索

      8.2.3.1 交叉验证

       创建模型wps的官网最新的下载网址在哪

      8.2.3.1.1 K 折叠

      8.2.3.1.2 随机拆分

      8.2.3.1.3 逐个测试

      8.2.3.2 网格搜索

       创建模型

       设置待测试参数

       网格搜索

      8.3.1 关于 KNN 算法

       KNN 算法的简称是 K-Nearest Neighbor,叫做近邻算法,有监督学习,既可以用于分类,也可以用于回归,在这,只讨论分类

      8.3.2 基本思路

       在样本空间内查找 K 个最相似或者距离最近的样本,然后根据 K 个最相似的样本对未知样本进行分类

      8.3.3 基本步骤

      对数据进行预处理,提取特征向量,对原始数据进行重新表达

      确定距离计算公式,并计算已知样本空间中所有样本与未知样本的距离

      确定距离计算公式(欧几里得的直线距离/曼哈顿的城市距离),在这里使用欧式距离对所有距离按升序排序确定并选取与未知样本距离最小的 K 个样本

      K 的参数值对分类结果有影响

      在这里插入图片描述统计选取的 K 个样本中每个样本所属类别的出现频率把出现频率最高的类别作为预测结果,认为未知样本属于这个类别

      8.3.4 sklearn 实现

       实验用到的类库说明

      模拟数据集

      标签

      创建模型,训练后进行预测

      改变 K 值,重新预测

      查看属于不同分类的概率

      在这里插入图片描述

       分层聚类又称或

      8.4.1 基本思路

       首先把所有样本看作各自一类(如果有 X 个样本,初始状态就有 X 类),定义类间距离计算公式(欧式距离、曼哈顿距离或其他距离),选择距离最小的一对元素合并成一个新的类,重新计算各类之间的距离并重复上述步骤,直至将所有原始元素划分为指定数量的类(每执行一次,减少一个类)

      8.4.2 缺点

       该算法的计算复杂度非常高,不适合大数据聚类问题

      8.4.3 sklearn 实现

       实验用到的类库说明

       定义可视化需要用到的散点颜色和符号

       创建聚类和可视化函数

       生成随机数据

       实验结果

     wps官网最新的下载网站怎么找 在这里插入图片描述

      8.5.1 DBSCAN 算法原理

      全称 Density-Based Spatial Clustering of Applications with Noise

      8.5.1.1 简介

       DBSCAN 属于聚类算法,把类定义为密度相连对象的最大集合,通过在样本空间中不断搜索高密度的核心样本并进行扩展得到最大集合完成聚类,能够在带有噪点的样本空间中发现任意形状的聚类,同时排除噪点

      8.5.1.2 基本概念

      核心样本

       如果给定样本的邻域(最大距离为 eps)内样本数量超过阈值 min_samples,则成为核心样本边界样本wps office免费版下载的入口在哪里

       在邻域内样本的数量小于阈值,但是落在核心样本的邻域内的样本噪声样本

       既不是核心样本也不是边界样本的样本直接密度可达

       如果样本 q 在核心样本 p 的邻域内,则称 p 是可以到达 q 的,换言之,q 从 p 出发是直接密度可达的

      密度可达

       集合中的样本链 p1、p2、p3、…、pn,如果每个样本 pi + 1 从 pi 出发都是直接密度可达的(pi + 1 在 核心样本 pi 的邻域内),则称 pn 从 p1 出发是密度可达的(pn 在 核心样本 p1 的邻域内)密度相连

       集合中如果存在样本 o 使得样本 p 和 q 从 o 出发都是密度可达的(p 和 q 都在 核心样本 o 的邻域内),则称样本 p 和 q 是互相密度相连的

      8.5.1.3 工作过程

      定义邻域半径(eps)和样本数量阈值(min_samples)

      如果 eps 设置过大,min_samples 设置过小,会导致核心样本数量过多

      如果 eps 设置过小,min_samples 设置过大,会导致核心样本数量过少从样本空间中抽取一个尚未访问过的样本 p如果 p 是核心样本,进入步骤 4;否则,根据实际情况将其标记为噪声样本或某个类的边界样本,进入步骤 2找出样本 p 出发的所有密度相连样本,构成一个聚类 Cp(该聚类的边界样本都是非核心样本),并标记这些样本为已访问如果全部样本都已访问,算法结束;否则,返回步骤 2

      8.5.2 DBSCAN 算法应用

       实验用到的类库说明

       核心方法

       生成测试数据并进行聚类

      在这里插入图片描述

       修改参数,重新聚类

      在这里插入图片描述

      Python 数据分析与数据可视化(一)Python 开发环境搭建与编码规范

      Python 数据分析与数据可视化(二)数据类型、运算符与内置函数

      Python 数据分析与数据可视化(三)列表、元组、字典、集合与字符串

      Python 数据分析与数据可视化(四)文件操作

      Python 数据分析与数据可视化(五)线性代数基本知识

      Python 数据分析与数据可视化(六)numpy 数组和矩阵运算

      Python 数据分析与数据可视化(七)pandas数据分析实战

      Python 数据分析与数据可视化(八)sklearn机器学习实战

      Python 数据分析与数据可视化(工具篇)课程所需扩展库安装

      Python 数据分析与数据可视化(实践篇)泰坦尼克号旅客生存预测

  • wps的的官网最新下载的网址在哪

      Python 数据分析day_1:认识Notebook,及NumPy , Pandas 和 Matplotlib基本使用方法

      python 数据分析 day2 数组的运算及矩阵

      python 数据分析 day3 矩阵及利用线性回归处理boston数据集

      python 数据分析 day4 pandas 之 Series

      python 数据分析day4 Pandas 之 DataFrame

      1. 二维数组创建

      2. 字典创建

      3. JSON创建

      4. 读取Excel或CSV文件创建

      读取CSV文件

      读取Excel文件

      在这里插入图片描述

      5. 读数据库(MySQL)创建

      形状

      维度

      行索引(标签)

      列索引(标签)

      所有的值—> 二维数组

      元素的个数

      3.1汇总方法

      info()方法

      head() / tail()方法

      describe()方法

      3.2处理索引

      set_index() / reset_index()方法:设置索引/重置索引,两个相当于是逆操作。

      设置索引(用指定的列充当索引)

      在这里插入图片描述

      多级索引

      在这里插入图片描述

      重置索引 (相当于是set_index方法的逆操作)

      在这里插入图片描述

      reindex()方法:调整索引的顺序。

      调整列索引

      在这里插入图片描述

      调整行索引

       wps的的官网下载网站(wps下载电脑版旧版本安装教程)在这里插入图片描述

      rename()方法:修改索引的名字。

      给列索引(标签)改名字

      在这里插入图片描述

      给行索(标签)引改名字

      在这里插入图片描述

      在这里插入图片描述

      1.索引和切片

      获取指定的列

      或者

      获取多个列(通过花式索引)

      在这里插入图片描述

      获取行

      获取多个行(通过花式索引)

      在这里插入图片描述

      切片操作

      在这里插入图片描述

      在这里插入图片描述

      获取指定单元格的值

      修改单元格的值

      2.数据筛选

      布尔索引

      数据集:

      & – 与 – 而且

      | – 或 – 或者

      非 – 变反

      query()方法

      使用query方法通过指定的表达式筛选数据

      filter()方法

      数据准备

      筛选指定的列,类似于花式索引

      筛选以字母e结尾的列

      筛选以字母e结尾的行

      筛选行索引中有bbi的行

      补充:添加一列/行

      添加列

      添加一行:两种方式(列表,字典)

      随机抽样

      随机抽样(指定样本数量)

      随机抽样(指定样本的比例)

      练习:科比投篮数据分析

      数据准备

      科比使用得最多的投篮动作(action_type + combined_shot_type)是什么?

      科比职业生涯交手最多的队伍是哪支球队?

      科比职业生涯总得分(不包括罚篮)是多少?

      三. 重塑数据

      1.merge函数 (详细请看此网站)

      merge函数的参数

      left – 左表

      right – 右表

      how – 连接方式(inner / outer / left / right)

      on – 连表字段(left_on / right_on)

      获取数据:

      将学生表和学院表合并:

      练习1:查询学生的姓名、课程的名称和考试成绩。

      查询学生表

      查询记录表wps office 的官方的下载的网站怎么找

      查询课程表

      合表:

      选课记录表和学生表合并成临时表

      临时表和课程表合并

      提取结果:

      方法一:花式索引直接提取

      方法二:通过reindex调整索引获得需要的列

      output:

      练习2:查询每个学生的姓名和选课的数量。(连接时需要外连接,需要使用pd.groupby())

      先合表(student_df,record_df)外连接(因为有人没选课,使用内连接会导致改数据缺失),空值用0 填充 (否则计算课程数量时会导致数据缺失)

      分组求课程数量和

      2.concat函数

      用concat函数拼接多个DataFrame的数据

      ignore_index=True表示忽略原来的索引

      axis参数的默认值是0,表示在0轴上进行拼接

      数据准备:三个表

      小宝剑大药房(高新店)2018年销售数据

      表格 1购药时间社保卡号商品编码商品名称销售数量应收金额实收金额2018-03-05 星期六0010077400828236701清热解毒口服液12824.642018-03-07 星期一0010077400828236701清热解毒口服液51401122018-03-09 星期三0010079843728236701清热解毒口服液61681402018-03-15 星期二0010031328528236701清热解毒口服液25649.282018-03-15 星期二00100703428236701清热解毒口服液25649.282018-03-15 星期二0010712328236701清热解毒口服液51401122018-03-20 星期日0011668828236701清热解毒口服液61681402018-03-22 星期二0010066351928236701清热解毒口服液12828 小宝剑大药房(犀浦店)2018年销售数据

      表格 1购药时间社保卡号商品编码商品名称销售数量应收金额实收金额2018-04-07 星期四0011652628236701清热解毒口服液61681402018-04-13 星期三0011005128236701清热解毒口服液256562018-04-22 星期五0010344628236701清热解毒口服液61681402018-05-01 星期日0010070313828236701清热解毒口服液61681402018-05-05 星期四0010031328528236701清热解毒口服液51401122018-05-05 星期四0010070343428236701清热解毒口服液25649.282018-05-05 星期四0010073660228236701清热解毒口服液12824.64 小宝剑大药房(新津店)2018年销售数据

      表格 1购药时间社保卡号商品编码商品名称销售数量应收金额实收金额2018-01-01 星期五001616528236701强力VC银翘片682.8692018-01-02 星期六001616528236701清热解毒口服液12824.642018-01-06 星期三0012602828236701感康216.8152018-01-11 星期一0010070343428236701三九感冒灵128282018-01-15 星期五00101554328236701三九感冒灵82242082018-01-20 星期三0013389528236701三九感冒灵128282018-01-31 星期日00101464928236701三九感冒灵256562018-02-17 星期三0011177328236701三九感冒灵5149131.122018-02-22 星期一0010065687828236701三九感冒灵129.826.22 读取三个表中数据

      使用concat 将三个表的数据汇总为一个表

      方法一:

      购药时间社保卡号商品编码商品名称销售数量应收金额实收金额02018-03-05 星期六10077400828236701清热解毒口服液128.024.6412018-03-07 星期一10077400828236701清热解毒口服液5140.0112.0022018-03-09 星期三10079843728236701清热解毒口服液6168.0140.0032018-03-15 星期二10031328528236701清热解毒口服液256.049.2842018-03-15 星期二100703428236701清热解毒口服液256.049.2852018-03-15 星期二10712328236701清热解毒口服液5140.0112.0062018-03-20 星期日11668828236701清热解毒口服液6168.0140.0072018-03-22 星期二10066351928236701清热解毒口服液128.028.0082018-04-07 星期四11652628236701清热解毒口服液6168.0140.0092018-04-13 星期三11005128236701清热解毒口服液256.056.00102018-04-22 星期五10344628236701清热解毒口服液6168.0140.00112018-05-01 星期日10070313828236701清热解毒口服液6168.0140.00122018-05-05 星期四10031328528236701清热解毒口服液5140.0112.00132018-05-05 星期四10070343428236701清热解毒口服液256.049.28142018-05-05 星期四10073660228236701清热解毒口服液128.024.64152018-01-01 星期五1616528236701强力VC银翘片682.869.00162018-01-02 星期六1616528236701清热解毒口服液128.024.64172018-01-06 星期三12602828236701感康216.815.00182018-01-11 星期一10070343428236701三九感冒灵128.028.00192018-01-15 星期五101554328236701三九感冒灵8224.0208.00202018-01-20 星期三13389528236701三九感冒灵128.028.00212018-01-31 星期日101464928236701三九感冒灵256.056.00222018-02-17 星期三11177328236701三九感冒灵5149.0131.12232018-02-22 星期一10065687828236701三九感冒灵129.826.22

      方法二:这种方法更好(需要掌握)

      1.数据清洗

      数据准备

      df

      缺失值处理 —> dropna() / fillna()

      dropna() : 删除有缺失值的数据

      axis=0 —> 默认 —> 遇到空值就删除对应的行

      axis=1 —> 遇到空值就删除对应的列

      把DataFrame中所有的空值都处理成0

      只处理某一列的空值

      重复值处理 —> duplicated() / drop_duplicates()

      duplicated()方法会返回一系列的布尔值表示是否重复,True:无重复;False:有重复

      drop_duplicates可以删除重复值,默认保留第一项

      练习:找主管不包括老板(先获取mgr的索引(无重复),然后根据索引找到主管)

      1.获取mgr的索引

      方法一:unique()方法 先去掉空值,转成int类型,再去重

      方法二:drop_duplicates() 方法 先取mgr字段的值,再去重

      使用’keep’参数,重复值的选择行为

      可以改变。值’first’保留每一个的第一次出现

      重复条目的集合。keep的默认值是’first’

      方法三:先根据mgr字段对DataFrame做去重,然后再获取mgr字段的值

      方法四:(方法三的分解动作)

      先找到重复的元素,获取它们的索引

      根据重复元素的索引删除这些行,再获取不重复的数据

      2.用花式索引的方式找出主管

      异常值处理(用指定的值替换掉原来的值 replace())

      练习:

      读取2018年北京积分落户数据

      查看公司名字有“华为”的公司

      通过replace方法指定正则表达式将“北京华为技术研究所”和“华为技术北京研究所”统一替换为“华为”

      2.wps的的官网最新的下载的地方是多少数据删除

      使用drop方法删除指定的行或列

      index指定行索引,columns指定列索引

      删除行

      数据:

      方法一:根据index这一索引列来删除行(注意drop()中的inde是参数列索引 )

      方法二:根据eno删除列

      删除列

      用Python中删除字典键值对的方式删除列(注意删除后就真的删除了)

      或者:pop() 能达到同样的效果(注意删除后就真的删除了)

      或者:使用drop方法删除指定的行或列(注意删除后就真的删除了)

      output:

      在这里插入图片描述

      误删除后想要恢复index列

      reset_index()恢复列

      或者:直接添加一列,再通过reindex()调整列的顺序

      在这里插入图片描述

      3.数据转换

      apply() / transform() / applymap()方法

      关于apply()和applymap()方法的区别请看这里

      每个员工的工资增加1000元:(使用apply())

      数据准备:

      用开方乘以10的方法处理考试成绩:使用applymap()

      使用transform方法将多个函数作用到数据上

      字符串向量

      核心操作:拆分 / 合并 / 匹配 / 替换 / 抽取

      方法:大小写 / 转类型 / 格式化

      数据准备

      将数据序列中的字符串变成大写:

      通常方法:apply()

      字符串向量法:用字符串向量,再用字符串的相关方法解决

      output:

      0 APPLE

      1 PITAYA

      2 LITCHE

      3 DURIAN

      4 WAXBERRY

      5 BLUEBERRY

      dtype: object

      其他练习:

      补充:UUID方式产生数据ID的字段

      在很多商业项目中,数据库表的主键不能够使用自增长编号,因为在有并发insert操作时,自增长编号的方式会影响性能。所以,很多产品中会选择使用UUID(Universal Unique IDentifier)的方式来产生数据的ID字段。

      生成分布式环境(多机环境)下全局唯一标识符的算法比较多,现在的项目中用的比较多的Snowflake算法(雪花算法那)。

      练习:读取拉勾网上招聘数据,找出数据分析岗位的平均工资是多少?

      获取数据及查看信息:

      取前三个数据用来观察

      判断下_id列有无重复

      方法一,获取不重复的数据,再获取数据量的大小

      方法二:直接获取不重复的数据的数量

      第一列没有用,设置’_id’为索引

      筛选出数据分析的岗位:

      从工资中抽取出工资的下限值和上限值

      转成整数后,取上限值和下限值的平均值(axis=0),之后再取平均(axis=1)

      时间日期向量

      date, time, year, month, day, hour, minute, second, microsecond, nanosecond, dayofweek, dayofyear, weekofyear, daysinmonth, quarteris_xxxround() / ceil() / floor()

      数据准备:

      使用to_datetime()函数将字符串处理成时间日期

      通过时间日期向量获取年份和月份

      0 – 星期一, 1 – 星期二,……,6 – 星期日

      python datetime模块的datetime库

      将生日换算成年龄

      1.获取描述性统计信息

      练习1:计算每个城市的数据分析岗位平均薪资

      知识点:groupby()方法

      找到岗位名称的字符串向量中的包含‘数据分析’项的表

      在这里插入图片描述

      处理salary列,利用salary的str向量中的extract方法,通过正则表达式提取工资范围,求取均值作为新的salary列

      在这里插入图片描述

      根据城市分组,获取工资求均值

      画图:

      在这里插入图片描述

      plt.text() 常用参数说明:

      练习2:

      知识点:分组聚合操作(# SAC —> Split – Aggregate – Combine)

      数据准备:

      在这里插入图片描述

      数据替换(*处理数据常用方法,重要):

      统计男女学生的人数(用性别分组再使用count聚合)

      统计每个学院男女学生的人数(多级索引)

      此时该数据序列的索引为:

      使用agg()方法一次性执行多个聚合函数

      数据准备:

      enoenamejobmgrsalcommdno01359胡 一刀销售员3344.01800200.03012056乔 峰分析师7800.050001500.02023088李莫愁设计师2056.03500800.02033211张无忌程序员2056.032000.02043233丘 处机程序员2056.034000.02053244欧阳锋程序员3088.032000.02063251张翠山程序员2056.040000.02073344黄蓉销售主管7800.03000800.03083577杨过会计5566.022000.01093588朱九真会计5566.025000.010104466苗人凤销售员3344.025000.030115234郭靖出纳5566.020000.010125566宋远桥会计师7800.040001000.010137800张三丰总裁NaN90001200.020

      maxminmeanptpdno10400020002675.000000200020900032004471.428571580030300018002433.3333331200

      2.排序(sort_values() )和Top-N( nlargest() 和 nsmallest() )

      排序算法看这里

      排序:sort_values()

      enoenamejobmgrsalcommdno137800张三丰总裁NaN90001200.02012056乔 峰分析师7800.050001500.02063251张翠山程序员2056.040000.020125566宋远桥会计师7800.040001000.01023088李莫愁设计师2056.03500800.02043233丘 处机程序员2056.034000.02033211张无忌程序员2056.032000.02053244欧阳锋程序员3088.032000.02073344黄蓉销售主管7800.03000800.03093588朱九真会计5566.025000.010104466苗人凤销售员3344.025000.03083577杨过会计5566.022000.010115234郭靖出纳5566.020000.01001359胡 一刀销售员3344.01800200.030

      根据工资降序排列员工表获取前3名数据(这里使用 sort_values() )

      Top-N:nlargest()和nsmallest()

      透视表和交叉表

      透视表:(根据A统计B)它根据一个或多个键对数据进行聚合,并根据行和列上的分组键将数据分配到各个矩形区域中

      数据准备:

      类别品牌等级A组B组0手机华为A类121手机华为B类242手机华为A类253手机小米B类354手机小米C类365电脑华为A类466电脑华为B类587电脑小米C类698电脑小米A类79

      分组查看数据:

      在这里插入图片描述

      使用透视表查看数据:

      A组B组类别手机1122电脑2232

      透视表的另一种写法:

      在这里插入图片描述

      交叉表:是一种用于计算分组频率的特殊透视图,对数据进行汇总

      数据准备:wps 的官网最新的下载入口是多少

      类别产地名称数量价格0水果美国苹果55.81水果中国梨55.22水果中国草莓910.83蔬菜中国番茄33.54蔬菜新西兰黄瓜23.05肉类新西兰羊肉1013.16肉类美国牛肉820.5

      使用交叉表对数据进行汇总

      产地中国新西兰美国总计类别水果2013肉类0112蔬菜1102总计3227

      指定统计的值使用交叉表进行汇总

      产地中国新西兰美国总计类别水果140519肉类010818蔬菜3205总计17121342

      练习1:视频网站运营数据分析。

      找出点赞数在100000次以上的视频ID、标题和赞数

      数据准备:

      对上面的结果进行进行去重,并找出点赞数排前10名的视频信息

      首先判断重复数量:

      找到点赞数的前10名(nlargest() 或者 sort_values() + head():

      nlargest() 方法:

      sort_values() + head()方法:

      注意这里要先排序,否则可能会把数量大的排除

      video_idtitlelikes382737C2z4GqqS5EBTS (방탄소년단) ‘FAKE LOVE’ Official MV561382738547VYOjWnS4cMYChildish Gambino – This Is America (Official V…502345034708ffxKSjUwKdUAriana Grande – No Tears Left To Cry30940216181FlsCjmMhFmwYouTube Rewind: The Shape of 2017 | #YouTubeRe…30935443581kTlv5_Bs8awBTS (방탄소년단) ‘MIC Drop (Steve Aoki Remix)’ Offi…272929235080p8npDG2ulKQBTS (방탄소년단) LOVE YOURSELF 轉 Tear ‘Singularity’…270080022040OK3GJ0WIQ8sj-hope ‘Daydream (백일몽)’ MV267243149976ZfuNTqbHE8Marvel Studios’ Avengers: Infinity War Officia…262566139814aJOTlE1K90kMaroon 5 – Girls Like You ft. Cardi B24885652587TyHvyGVs42ULuis Fonsi, Demi Lovato – Échame La Culpa2376636

      根据频道对数据分组,统计出每个频道播放数、赞数、踩数和评论数各自的总和

      viewslikesdislikescomment_countchannel_title12 News856431704501MILLION Dance Studio1733477122066127685271theK (원더케이)703566670292084354977720th Century Fox48572239120401921395783372CELLOS20586911198120446……………ワーナー ブラザース 公式チャンネル755014156865581768圧倒的不審者の極み!29441973103782780杰威爾音樂 JVR Music9161284048510424746郭韋辰125944814영국남자 Korean Englishman5888201831725422142198 rows × 4 columns

      方法二:利用透视表做

      viewslikesdislikescomment_countchannel_title12 News856431704501MILLION Dance Studio1733477122066127685271theK (원더케이)703566670292084354977720th Century Fox48572239120401921395783372CELLOS20586911198120446……………ワーナー ブラザース 公式チャンネル755014156865581768圧倒的不審者の極み!29441973103782780杰威爾音樂 JVR Music9161284048510424746郭韋辰125944814영국남자 Korean Englishman5888201831725422142198 rows × 4 columns

      根据上面的结果找出热门频道(“播放数+赞数+评论数”总和最高的前10名)

      方法一:sort_values()

      方法二:

      结果:

      [‘ibighit’,

      ‘Dude Perfect’,

      ‘jypentertainment’,

      ‘Marvel Entertainment’,

      ‘TheEllenShow’,

      ‘Jimmy Kimmel Live’,

      ‘WWE’,

      ‘MalumaVEVO’,

      ‘Ed Sheeran’,

      ‘The Tonight Show Starring Jimmy Fallon’]

      练习2*:宽表和窄表的装换

      数据准备:

      useridusername01张三12李四23王五34赵大45孙二

      useridusernamemonthuseridye0一月份11一月份22一月份33二月份24二月份45三月份36三月份5

      useridusernamemonthye01张三一月份12李四一月份22李四二月份33王五一月份43王五三月份54赵大二月份65孙二三月份

      窄表变宽表

      month一月份三月份二月份username孙二060张三1000李四1008王五580赵大009

      调整列索引:

      month一月份二月份三月份username张三1000李四1080王五508赵大090孙二006

      monthusername一月份二月份三月份0张三10001李四10802王五5083赵大0904孙二006

      宽表变窄表

      usernamemonthye0张三一月份101李四一月份102王五一月份53李四二月份84赵大二月份95王五三月份86孙二三月份6

      数据分箱:将连续的数据分组到不同的箱子中(连续值的离散化)。

      数据准备:

      身高1001183.01002174.81003161.01004165.71005178.1……1496174.61497183.41498173.51499174.81500178.8500 rows × 1 columns

      身高[140, 145)0[145, 150)4[150, 155)10[155, 160)29[160, 165)79[165, 170)132[170, 175)111[175, 180)94[180, 185)28[185, 190)10[190, 195)2[195, 200)1Name: 身高, dtype: int64

      绘制直方图:

      在这里插入图片描述

      练习:2018年北京积分落户数据分析。

      1.按照公司对数据进行分组,统计每个组的人数并按照人数的降序排列

      2.按照落户积分将人员分组,统计每个组有多少人并绘制柱状图

      3.将出生日期转化成年龄,统计不同年龄段有多少人并绘制柱状图

      company

      北京华为数字技术有限公司 137

      中央电视台 73

      北京首钢建设集团有限公司 57

      百度在线网络技术(北京)有限公司 55

      联想(北京)有限公司 48

      中国民生银行股份有限公司 40

      北京外企人力资源服务有限公司 39

      国际商业机器(中国)投资有限公司 39

      中国国际技术智力合作有限公司 29

      华为技术有限公司北京研究所 27

      Name: name, dtype: int64

      北京华为数字技术有限公司 137

      中央电视台 73

      北京首钢建设集团有限公司 57

      百度在线网络技术(北京)有限公司 55

      联想(北京)有限公司 48

      …

      北京顶秀科技有限公司 1

      北京车客家园网络科技发展有限公司 1

      泛美(北京)生物制品有限公司 1

      北京携程国际旅行社有限公司 1

      北京中科物安科技有限公司 1

      Name: company, Length: 3430, dtype: int64

      在这里插入图片描述

      (32, 60)

      在这里插入图片描述

  • wps的电脑版下载的网站怎么找

      目录

      Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 之 [ 数据探索 ] [ 可视化 ] [数据清洗] | 2/3(含分析过程)

      一、简单介绍

      二、机器学习

      1、为什么使用机器学习?

      2、机器学习系统的类型,及其对应的学习算法

      3、机器学习可利用的开源数据

      三、从房价数据集中,进行数据探索、可视化发现规律

      1、地理数据可视化

      2、查找关联

      3、属性组合试验

      四、为机器学习算法准备数据

      1、数据清洗

      2、处理文本和类别属性
    wps的的官网下载网站
      3、自定义转换器

      4、特征缩放

      5、转换流水线

      附录:

      一、一些知识点

      1、Scikit-Learn 设计

      二、源码工程

    wps的官网最新的下载网址怎么找(金山wps官网最新人工电话)
      三、该案例的环境 package 信息如下

      Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。

      Python 机器学习是利用 Python 编程语言中的各种工具和库来实现机器学习算法和技术的过程。Python 是一种功能强大且易于学习和使用的编程语言,因此成为了机器学习领域的首选语言之一。Python 提供了丰富的机器学习库,如Scikit-learn、TensorFlow、Keras、PyTorch等,这些库包含了许多常用的机器学习算法和深度学习框架,使得开发者能够快速实现、测试和部署各种机器学习模型。

      通过 Python 进行机器学习,开发者可以利用其丰富的工具和库来处理数据、构建模型、评估模型性能,并将模型部署到实际应用中。Python 的易用性和庞大的社区支持使得机器学习在各个领域都得到了广泛的应用和发展。

      机器学习(Machine Learning)是人工智能(AI)的一个分支领域,其核心思想是通过计算机系统的学习和自动化推理,使计算机能够从数据中获取知识和经验,并利用这些知识和经验进行模式识别、预测和决策。机器学习算法能够自动地从数据中学习并改进自己的性能,而无需明确地编程。这一过程涉及对大量输入数据的分析和解释,以识别数据中的模式和趋势,并生成可以应用于新数据的预测模型。

      1、为什么使用机器学习?

      使用机器学习的原因主要包括以下几点:

      高效性和准确性:机器学习算法能够处理大规模数据集,并从中提取有价值的信息,其预测和决策的准确性往往高于传统方法。自动化和智能化:机器学习能够自动学习和改进,减少了对人工干预的依赖,提高了工作效率和智能化水平。广泛应用性:机器学习在各个领域中都有广泛的应用,如图像识别、语音识别、自然语言处理、推荐系统、金融预测等,为许多实际问题的解决提供了有效的方法和工具。未来趋势:随着人工智能技术的不断发展,机器学习已成为未来的趋势,掌握机器学习技能将有助于提高职业竞争力和创造力。

      2、机器学习系统的类型,及其对应的学习算法

      机器学习系统可以根据不同的学习方式和目标进行分类,主要包括以下几种类型及其对应的学习算法:

      监督学习(Supervised Learning)

      定义:使用带有标签的训练数据来训练模型,以预测新数据的标签或目标值。常见算法:

      线性回归(Linear Regression):用于预测连续值。逻辑回归(Logistic Regression):用于分类问题,尤其是二分类问题。支持向量机(SVM, Support Vector Machines):用于分类和回归问题,通过寻找最优的超平面来分割数据。决策树(Decision Trees)和随机森林(Random Forests):通过构建决策树或决策树集合来进行分类或回归。神经网络(Neural Networks):模仿人脑神经元的工作方式,通过多层节点之间的连接和权重调整来进行学习和预测。

      无监督学习(Unsupervised Learning)

      定义:在没有标签的情况下,从数据中发现隐藏的结构和模式。常见算法:

      聚类算法(Clustering Algorithms):如K均值(K-Means)、层次聚类分析(HCA)等,用于将数据分组为具有相似特征的簇。降维算法(Dimensionality Reduction Algorithms):如主成分分析(PCA)、t-分布邻域嵌入算法(t-SNE)等,用于减少数据的维度以便于分析和可视化。异常检测(Anomaly Detection):用于识别数据中的异常点或离群点。

      强化学习(Reinforcement Learning)

      定义:通过与环境的交互学习,以最大化累积奖励为目标。特点:强化学习不需要明确的标签或监督信号,而是根据环境给出的奖励或惩罚来指导学习过程。应用场景:游戏AI、机器人控制、自动驾驶等领域。

      半监督学习(Semi-Supervised Learning)

      定义:处理部分带标签的训练数据,通常是大量不带标签数据加上小部分带标签数据。特点:结合了监督学习和无监督学习的特点,旨在利用未标记数据来提高模型的泛化能力。常见算法:多数半监督学习算法是非监督和监督算法的结合,如自训练(Self-Training)、协同训练(Co-Training)等。

      3、机器学习可利用的开源数据

      开源数据集可以根据需要进行选择,涵盖多个领域。以下是一些可以查找的数据的地方,供参考:

      流行的开源数据仓库:

      UC Irvine Machine Learning RepositoryKaggle datasetsAmazon's AWS datasets准入口(提供开源数据列表)

      - Data Portalshttp://opendatamonitor.eu/Financial, Economic and Alternative Data | Nasdaq Data Link其它列出流行开源数据仓库的网页:

      Wikipedia's list of Machine Learning datasetsQuora.com questionDatasets subreddit

      (注意:代码执行的时候,可能需要科学上网)

      目前为止,你只是快速查看了数据,对要处理的数据有了整体了解。现在的目标是更深的探索数据。

      首先,保证你将测试集放在了一旁,只是研究训练集。另外,如果训练集非常大,你可能需要再采样一个探索集,保证操作方便快速。在我们的案例中,数据集很小,所以可以在全集上直接工作。创建一个副本,以免损伤训练集:

    wps官网的下载的地址在哪里(wps office免费版本下载)  1、地理数据可视化

      因为存在地理信息(纬度和经度),创建一个所有街区的散点图来数据可视化是一个不错的主意(图 3-1):

      运行结果:

      

      图 3-1 数据的地理信息散点图

      这张图看起来很像加州,但是看不出什么特别的规律。将设为 0.1,可以更容易看出数据点的密度(图 3-2):

      运行结果:

      

      图 3-2 显示高密度区域的散点图

      现在看起来好多了:可以非常清楚地看到高密度区域,湾区、洛杉矶和圣迭戈,以及中央谷,特别是从萨克拉门托和弗雷斯诺。

      通常来讲,人类的大脑非常善于发现图片中的规律,但是需要调整可视化参数使规律显现出来。

      现在来看房价(图 3-3)。每个圈的半径表示街区的人口(选项),颜色代表价格(选项)。我们用预先定义的名为的颜色图(选项),它的范围是从蓝色(低价)到红色(高价):

      运行结果:

      

      图 3-3 加州房价

      为了更加形象的展示效果,我们接下来加载地图进入图中:

      下载加州地图

      运行结果:

      Downloading california.png

      添加下载的加州地图一并显示,效果见图 3-4

      运行结果:
    WPS office的官网最新的下载网址的方法
      

      图 3-4 带地图的加州房价图

      这张图说明房价和位置(比如,靠海)和人口密度联系密切,这点你可能早就知道。可以使用聚类算法来检测主要的聚集,用一个新的特征值测量聚集中心的距离。尽管北加州海岸区域的房价不是非常高,但离大海距离属性也可能很有用,所以这不是用一个简单的规则就可以定义的问题。

      2、查找关联

      因为数据集并不是非常大,你可以很容易地使用方法计算出每对属性间的标准相关系数(standard correlation coefficient,也称作皮尔逊相关系数):

      现在来看下每个属性和房价中位数的关联度:

      运行结果:

      median_house_value 1.000000

      median_income 0.687151

      total_rooms 0.135140

      housing_median_age 0.114146

      households 0.064590

      total_bedrooms 0.047781

      population -0.026882

      longitude -0.047466

      latitude -0.142673

      Name: median_house_value, dtype: float64

      相关系数的范围是 -1 到 1。当接近 1 时,意味强正相关;例如,当收入中位数增加时,房价中位数也会增加。当相关系数接近 -1 时,意味强负相关;你可以看到,纬度和房价中位数有轻微的负相关性(即,越往北,房价越可能降低)。最后,相关系数接近 0,意味没有线性相关性。图 3-5 展示了相关系数在横轴和纵轴之间的不同图形。

      

      图 3-5 不同数据集的标准相关系数

      注意:相关系数只测量线性关系(如果上升,则上升或下降)。相关系数可能会完全忽略非线性关系(例如,如果接近 0,则值会变高)。在上面图片的最后一行中,他们的相关系数都接近于 0,尽管它们的轴并不独立:这些就是非线性关系的例子。另外,第二行的相关系数等于 1 或 -1;这和斜率没有任何关系。例如,你的身高(单位是英寸)与身高(单位是英尺或纳米)的相关系数就是 1。

      另一种检测属性间相关系数的方法是使用 Pandas 的函数,它能画出每个数值属性对每个其它数值属性的图。因为现在共有 11 个数值属性,你可以得到张图,在一页上画不下,所以只关注几个和房价中位数最有可能相关的属性(图 3-6):

      运行结果:

      

      图 3-6 散点矩阵

      如果 pandas 将每个变量对自己作图,主对角线(左上到右下)都会是直线图。所以 Pandas 展示的是每个属性的柱状图(也可以是其它的,请参考 Pandas 文档)。

      最有希望用来预测房价中位数的属性是收入中位数,因此将这张图放大(图 3-7):

      运行结果:

      

      图 3-7 收入中位数 vs 房价中位数

      这张图说明了几点。首先,相关性非常高;可以清晰地看到向上的趋势,并且数据点不是非常分散。第二,我们之前看到的最高价,清晰地呈现为一条位于 500000 美元的水平线。这张图也呈现了一些不是那么明显的直线:一条位于 450000 美元的直线,一条位于 350000 美元的直线,一条在 280000 美元的线,和一些更靠下的线。你可能希望去除对应的街区,以防止算法重复这些巧合。

      3、属性组合试验

      希望前面的一节能教给你一些探索数据、发现规律的方法。你发现了一些数据的巧合,需要在给算法提供数据之前,将其去除。你还发现了一些属性间有趣的关联,特别是目标属性。你还注意到一些属性具有长尾分布,因此你可能要将其进行转换(例如,计算其对数)。当然,不同项目的处理方法各不相同,但大体思路是相似的。

      给算法准备数据之前,你需要做的最后一件事是尝试多种属性组合。例如,如果你不知道某个街区有多少户,该街区的总房间数就没什么用。你真正需要的是每户有几个房间。相似的,总卧室数也不重要:你可能需要将其与房间数进行比较。每户的人口数也是一个有趣的属性组合。让我们来创建这些新的属性:

      现在,再来看相关矩阵:

      运行结果:

      median_house_value 1.000000

      median_income 0.687151

      rooms_per_household 0.146255

      total_rooms 0.135140

      housing_median_age 0.114146

      households 0.064590

      total_bedrooms 0.047781

      population_per_household -0.021991

      population -0.026882

      longitude -0.047466

      latitude -0.142673

      bedrooms_per_room -0.259952

      Name: median_house_value, dtype: float64

      看起来不错!与总房间数或卧室数相比,新的属性与房价中位数的关联更强。显然,卧室数/总房间数的比例越低,房价就越高。每户的房间数也比街区的总房间数的更有信息,很明显,房屋越大,房价就越高。

      我们用来预测房价中位数的属性是房间数,因此将这张图放大(图 3-8):

      运行结果:

      

      图 3-8 房间数 vs 房价中位数

      方法展示了数值属性的概括,见图 3-9

      运行结果:

      

      图 3-9 每个数值属性的概括

      这一步的数据探索不必非常完备,此处的目的是有一个正确的开始,快速发现规律,以得到一个合理的原型。但是这是一个交互过程:一旦你得到了一个原型,并运行起来,你就可以分析它的输出,进而发现更多的规律,然后再回到数据探索这步。

      现在来为机器学习算法准备数据。不要手工来做,你需要写一些函数,理由如下:

      函数可以让你在任何数据集上(比如,你下一次获取的是一个新的数据集)方便地进行重复数据转换。

      你能慢慢建立一个转换函数库,可以在未来的项目中复用。

      在将数据传给算法之前,你可以在实时系统中使用这些函数。

      这可以让你方便地尝试多种数据转换,查看哪些转换方法结合起来效果最好。

      但是,还是先回到干净的训练集(通过再次复制),将预测量和标签分开,因为我们不想对预测量和目标值应用相同的转换(注意创建了一份数据的备份,而不影响):

      1、数据清洗

      大多机器学习算法不能处理缺失的特征,因此先创建一些函数来处理特征缺失的问题。前面,你应该注意到了属性有一些缺失值。有三个解决选项:

      去掉对应的街区;

      去掉整个属性;

      进行赋值(0、平均值、中位数等等)。

      运行结果:

      

      图3-10

      用的,,和方法,可以方便地实现:

      运行结果:

      

      图3-11

      运行结果:

      

      图3-12

      运行结果:

      

      图3-13

      如果选择选项 3,你需要计算训练集的中位数,用中位数填充训练集的缺失值,不要忘记保存该中位数。后面用测试集评估系统时,需要替换测试集中的缺失值,也可以用来实时替换新数据中的缺失值。

      Scikit-Learn 提供了一个方便的类来处理缺失值:。下面是其使用方法:首先,需要创建一个实例,指定用某属性的中位数来替换该属性所有的缺失值:

      因为只有数值属性才能算出中位数,我们需要创建一份不包括文本属性的数据副本:

      现在,就可以用方法将实例拟合到训练数据:

      计算出了每个属性的中位数,并将结果保存在了实例变量中。虽然此时只有属性存在缺失值,但我们不能确定在以后的新的数据中会不会有其他属性也存在缺失值,所以安全的做法是将应用到每个数值:

      运行结果:

      [-118.51 34.26 29. 2119. 433. 1164.

      408. 3.54155]

      运行结果:

      [-118.51 34.26 29. 2119. 433. 1164.

      408. 3.54155]

      现在,你就可以使用这个“训练过的”来对训练集进行转换,将缺失值替换为中位数:

      结果是一个包含转换后特征的普通的 Numpy 数组。如果你想将其放回到 Pandas中,也很简单:

      运行结果:

      

      顺便看看 ocean_proximity

      运行结果:

      

      2、处理文本和类别属性

      前面,我们丢弃了类别属性,因为它是一个文本属性,不能计算出中位数。大多数机器学习算法更喜欢和数字打交道,所以让我们把这些文本标签转换为数字。

      Scikit-Learn 为这个任务提供了一个转换器OrdinalEncoder:

      Warning: earlier versions of the book used the  class or Pandas'  method to encode string categorical attributes as integers. However, the  class that was introduced in Scikit-Learn 0.20 (see PR #10521) is preferable since it is designed for input features ( instead of labels ) and it plays well with pipelines (introduced later in this notebook). If you are using an older version of Scikit-Learn (<0.20), then you can import it from  instead.

      运行结果:

      array([[1.],

      [4.],

      [1.],

      [4.],

      [0.],

      [3.],

      [0.],

      [0.],

      [0.],

      [0.]])

      好了一些,现在就可以在任何 ML 算法里用这个数值数据了。你可以查看映射表,编码器是通过属性 categories_ 来学习的(被映射为 0,被映射为 1,等等):

      运行结果:

      [array(['<1H OCEAN', 'INLAND', 'ISLAND', 'NEAR BAY', 'NEAR OCEAN'],

      dtype=object)]

      这种做法的问题是,ML 算法会认为两个临近的值比两个疏远的值要更相似。显然这样不对(比如,分类 0 和分类 4 就比分类 0 和分类 1 更相似)。要解决这个问题,一个常见的方法是给每个分类创建一个二元属性:当分类是,该属性为 1(否则为 0),当分类是,另一个属性等于 1(否则为 0),以此类推。这称作独热编码(One-Hot Encoding),因为只有一个属性会等于 1(热),其余会是 0(冷)。

      Scikit-Learn 提供了一个编码器,用于将整数分类值转变为独热向量。注意用于 2D 数组,而是一个 1D 数组,所以需要将其变形:

      运行结果:

      <Compressed Sparse Row sparse matrix of dtype 'float64'

      with 16512 stored elements and shape (16512, 5)>

      注意输出结果是一个 SciPy 稀疏矩阵,而不是 NumPy 数组。当类别属性有数千个分类时,这样非常有用。经过独热编码,我们得到了一个有数千列的矩阵,这个矩阵每行只有一个 1,其余都是 0。使用大量内存来存储这些 0 非常浪费,所以稀疏矩阵只存储非零元素的位置。你可以像一个 2D 数据那样进行使用,但是如果你真的想将其转变成一个(密集的)NumPy 数组,只需调用方法:

      运行结果:

      array([[0., 1., 0., 0., 0.],

      [0., 0., 0., 0., 1.],

      [0., 1., 0., 0., 0.],

      …,

      [1., 0., 0., 0., 0.],

      [1., 0., 0., 0., 0.],

      [0., 1., 0., 0., 0.]])

      3、自定义转换器

      尽管 Scikit-Learn 提供了许多有用的转换器,你还是需要自己动手写转换器执行任务,比如自定义的清理操作,或属性组合。你需要让自制的转换器与 Scikit-Learn 组件(比如流水线)无缝衔接工作,因为 Scikit-Learn 是依赖鸭子类型的(而不是继承),你所需要做的是创建一个类并执行三个方法:(返回),,和。通过添加作为基类,可以很容易地得到最后一个。另外,如果你添加作为基类(且构造器中避免使用和),你就能得到两个额外的方法(和),二者可以方便地进行超参数自动微调。例如,一个小转换器类添加了上面讨论的属性:

      在这个例子中,转换器有一个超参数,默认设为(提供一个合理的默认值很有帮助)。这个超参数可以让你方便地发现添加了这个属性是否对机器学习算法有帮助。更一般wps的的官网下载的地方地,你可以为每个不能完全确保的数据准备步骤添加一个超参数。数据准备步骤越自动化,可以自动化的操作组合就越多,越容易发现更好用的组合(并能节省大量时间)。

      或者,你可以使用Scikit-Learn的FunctionTransformer类,它让你可以轻松地基于转换函数创建一个转换器(感谢Hanmin Qin建议了这段代码)。请注意,我们需要设置validate=False,因为数据包含非浮点值(在Scikit-Learn 0.22中,validate默认为False)。

      运行结果:

      

      4、特征缩放

      数据要做的最重要的转换之一是特征缩放。除了个别情况,当输入的数值属性量度不同时,机器学习算法的性能都不会好。这个规律也适用于房产数据:总房间数分布范围是 6 到 39320,而收入中位数只分布在 0 到 15。注意通常情况下我们不需要对目标值进行缩放。

      有两种常见的方法可以让所有的属性有相同的量度:线性函数归一化(Min-Max scaling)和标准化(standardization)。

      线性函数归一化(许多人称其为归一化(normalization))很简单:值被转变、重新缩放,直到范围变成 0 到 1。我们通过减去最小值,然后再除以最大值与最小值的差值,来进行归一化。Scikit-Learn 提供了一个转换器来实现这个功能。它有一个超参数,可以让你改变范围,如果不希望范围是 0 到 1。

      标准化就很不同:首先减去平均值(所以标准化值的平均值总是 0),然后除以方差,使得到的分布具有单位方差。与归一化不同,标准化不会限定值到某个特定的范围,这对某些算法可能构成问题(比如,神经网络常需要输入值得范围是 0 到 1)。但是,标准化受到异常值的影响很小。例如,假设一个街区的收入中位数由于某种错误变成了 100,归一化会将其它范围是 0 到 15 的值变为 0-0.15,但是标准化不会受什么影响。Scikit-Learn 提供了一个转换器来进行标准化。

      5、转换流水线

      你已经看到,存在许多数据转换步骤,需要按一定的顺序执行。幸运的是,Scikit-Learn 提供了类,来进行这一系列的转换。下面是一个数值属性的小流水线:

      运行结果:

      array([[-0.94135046, 1.34743822, 0.02756357, …, 0.01739526,

      0.00622264, -0.12112176],

      [ 1.17178212, -1.19243966, -1.72201763, …, 0.56925554,

      -0.04081077, -0.81086696],

      [ 0.26758118, -0.1259716 , 1.22045984, …, -0.01802432,

      -0.07537122, -0.33827252],

      …,

      [-1.5707942 , 1.31001828, 1.53856552, …, -0.5092404 ,

      -0.03743619, 0.32286937],

      [-1.56080303, 1.2492109 , -1.1653327 , …, 0.32814891,

      -0.05915604, -0.45702273],

      [-1.28105026, 2.02567448, -0.13148926, …, 0.01407228,

      0.00657083, -0.12169672]])

      构造器需要一个定义步骤顺序的名字/估计器对的列表。除了最后一个估计器,其余都要是转换器(即,它们都要有方法)。名字可以随意起。

      当你调用流水线的方法,就会对所有转换器顺序调用方法,将每次调用的输出作为参数传递给下一个调用,一直到最后一个估计器,它只执行方法。

      流水线暴露相同的方法作为最终的估计器。在这个例子中,最后的估计器是一个,它是一个转换器,因此这个流水线有一个方法,可以顺序对数据做所有转换(它还有一个方法可以使用,就不必先调用再进行)。

      如果不需要手动将 Pandas中的数值列转成 Numpy 数组的格式,而可以直接将输入 pipeline 中进行处理就好了。Scikit-Learn 没有工具来处理 Pandas,因此我们需要写一个简单的自定义转换器来做这项工作:

      每个子流水线都以一个选择转换器开始:通过选择对应的属性(数值或分类)、丢弃其它的,来转换数据,并将输出转变成一个 NumPy 数组。这样,你就可以很简单的写出一个以 Pandas 为输入并且可以处理数值的流水线: 该流水线从开始获取数值属性,前面讨论过的其他数据处理步骤紧随其后。 并且你也可以通过使用选择类别属性并为其写另一个流水线然后应用.

      你现在就有了一个对数值的流水线,你还需要对分类值应用:如何将这些转换写成一个流水线呢?Scikit-Learn 提供了一个类实现这个功能。你给它一列转换器(可以是所有的转换器),当调用它的方法,每个转换器的会被并行执行,等待输出,然后将输出合并起来,并返回结果(当然,调用它的方法就会调用每个转换器的)。一个完整的处理数值和类别属性的流水线如下所示:

      你可以很简单地运行整个流水线:

      运行结果:

      (16512, 16)

      作为参考,以下是基于DataFrameSelector转换器的旧解决方案(仅选择Pandas DataFrame列的一个子集)和FeatureUnion:

      现在,让我们将所有这些组件连接到一个大型管道中,它将预处理数值型和类别型特征(同样,如果愿意,我们可以使用CombinedAttributesAdder()而不是FunctionTransformer(…)):

      运行代码,查看结果

      运行结果:

      <Compressed Sparse Row sparse matrix of dtype 'float64'

      with 198144 stored elements and shape (16512, 16)>

      结果与ColumnTransformer相同:

      运行结果:

      True

      1、Scikit-Learn 设计

      Scikit-Learn 设计的 API 设计的非常好。它的主要设计原则是:

      一致性:所有对象的接口一致且简单:

      估计器(estimator)。任何可以基于数据集对一些参数进行估计的对象都被称为估计器(比如,就是个估计器)。估计本身是通过方法,只需要一个数据集作为参数(对于监督学习算法,需要两个数据集;第二个数据集包含标签)。任何其它用来指导估计过程的参数都被当做超参数(比如的),并且超参数要被设置成实例变量(通常通过构造器参数设置)。转换器(transformer)。一些估计器(比如)也可以转换数据集,这些估计器被称为转换器。API 也是相当简单:转换是通过方法,被转换的数据集作为参数。返回的是经过转换的数据集。转换过程依赖学习到的参数,比如的例子。所有的转换都有一个便捷的方法,等同于调用再(但有时经过优化,运行的更快)。预测器(predictor)。最后,一些估计器可以根据给出的数据集做预测,这些估计器称为预测器。例如,上一章的模型就是一个预测器:它根据一个国家的人均 GDP 预测生活满意度。预测器有一个方法,可以用新实例的数据集做出相应的预测。预测器还有一个方法,可用于评估测试集(如果是监督学习算法的话,还要给出相应的标签)的预测质量。

      可检验。所有估计器的超参数都可以通过实例的公共变量直接访问(比如,),并且所有估计器学习到的参数也可以通过在实例变量名后加下划线来访问(比如,)。

      类不可扩散。数据集被表示成 NumPy 数组或 SciPy 稀疏矩阵,而不是自制的类。超参数只是普通的 Python 字符串或数字。

      可组合。尽可能使用现存的模块。例如,用任意的转换器序列加上一个估计器,就可以做成一个流水线,后面会看到例子。

      合理的默认值。Scikit-Learn 给大多数参数提供了合理的默认值,很容易就能创建一个系统。

      https://github.com/XANkui/PythonMachineLearnIntermediateLevel

      Package                   Version

      ————————- ————–

      anyio                     4.4.0

      argon2-cffi               23.1.0

      argon2-cffi-bindings      21.2.0

      arrow                     1.3.0

      asttokens                 2.4.1

      async-lru                 2.0.4

      attrs                     23.2.0wps 的官网最新下载地址是什么

      Babel                     2.15.0

      beautifulsoup4            4.12.3

      bleach                    6.1.0

      certifi                   2024.7.4

      cffi                      1.16.0

      charset-normalizer        3.3.2

      colorama                  0.4.6

      comm                      0.2.2

      contourpy                 1.2.1

      cycler                    0.12.1

      debugpy                   1.8.2

      decorator                 5.1.1

      defusedxml                0.7.1

      executing                 2.0.1

      fastjsonschema            2.20.0

      fonttools                 4.53.1

      fqdn                      1.5.1

      h11                       0.14.0

      httpcore                  1.0.5

      httpx                     0.27.0

      idna                      3.7

      ipykernel                 6.29.5

      ipython                   8.26.0

      ipywidgets                8.1.3

      isoduration               20.11.0

      jedi                      0.19.1

      Jinja2                    3.1.4

      joblib                    1.4.2

      json5                     0.9.25

      jsonpointer               3.0.0

      jsonschema                4.23.0

      jsonschema-specifications 2023.12.1

      jupyter                   1.0.0

      jupyter_client            8.6.2

      jupyter-console           6.6.3

      jupyter_core              5.7.2

      jupyter-events            0.10.0

      jupyter-lsp               2.2.5

      jupyter_server            2.14.2

      jupyter_server_terminals  0.5.3

      jupyterlab                4.2.4

      jupyterlab_pygments       0.3.0

      jupyterlab_server         2.27.3

      jupyterlab_widgets        3.0.11

      kiwisolver                1.4.5

      MarkupSafe                2.1.5

      matplotlib                3.9.1

      matplotlib-inline         0.1.7

      mistune                   3.0.2

      nbclient                  0.10.0

      nbconvert                 7.16.4

      nbformat                  5.10.4

      nest-asyncio              1.6.0

      notebook                  7.2.1

      notebook_shim             0.2.4

      numpy                     2.0.1

      overrides                 7.7.0

      packaging                 24.1

      pandas                    2.2.2

      pandocfilters             1.5.1

      parso                     0.8.4

      pillow                    10.4.0

      pip                       24.1.2

      platformdirs              4.2.2

      prometheus_client         0.20.0

      prompt_toolkit            3.0.47

      psutil                    6.0.0

      pure_eval                 0.2.3

      pycparser                 2.22

      Pygments                  2.18.0

      pyparsing                 3.1.2

      python-dateutil           2.9.0.post0

      python-json-logger        2.0.7

      pytz                      2024.1

      pywin32                wps office 的官方下载网站是多少(wps官网最新下载电脑版官方下载免费版)   306

      pywinpty                  2.0.13

      PyYAML                    6.0.1

      pyzmq                     26.0.3

      qtconsole                 5.5.2

      QtPy                      2.4.1

      referencing               0.35.1

      requests                  2.32.3

      rfc3339-validator         0.1.4

      rfc3986-validator         0.1.1

      rpds-py                   0.19.1

      scikit-learn              1.5.1

      scipy                     1.14.0

      Send2Trash                1.8.3

      setuptools                70.1.1

      six                       1.16.0

      sniffio                   1.3.1

      soupsieve                 2.5

      stack-data                0.6.3

      terminado                 0.18.1

      threadpoolctl             3.5.0

      tinycss2                  1.3.0

      tornado                   6.4.1

      traitlets                 5.14.3

      types-python-dateutil     2.9.0.20240316

      typing_extensions         4.12.2

      tzdata                    2024.1

      uri-template              1.3.0

      urllib3                   2.2.2

      wcwidth                   0.2.13

      webcolors                 24.6.0

      webencodings              0.5.1

      websocket-client          1.8.0

      wheel                     0.43.0

      widgetsnbextension        4.0.11

  • wps的官网最新下载地方在哪里

      学过一遍的吧.csv读成.xlsx,就花了1h,纯纯的笑话捏

      matplotlib与latex联用wps官网下载的网址在哪,需要downloadWPS office的电脑版的下载地址在哪里 mixtex+ghostscriptPython中单引号和双引号的区别 – 知乎 (zhihu.com)reshape(-1,1)=automatically calculate row’s amountcombination——hstack([h,w]); vstack([h,w])read_excel(‘xxx.xlsx’,header=None)

      1) key value is sole; 2) a={a:1,b:2}; a[0:3]

      every element is sole

      这些容器可以按索引或标签取元素+赋值修改(apart from tuple)

      try.except for

      不因为可能出现的错误而中止程序
    wps的免费版的下载地方是什么
      image-20230205160028323

      with:

      这样就可以连续展示多张图片啦wps电脑版的下载的网站怎么找

      image-20230205155644320

      can asscociate with list/tuple/dict operations

      r:去转义,b:转为bytes对象(网络编程),u:中文字符前避免存储格式问题print(f"{name} done in {time.time() – t0:.2f} s.")format({:.2f})https://blog.51cto.com/u_15127632/2739868
    WPS office官网的下载地方在哪里
      list([]) convert content/iterators in brackets into list

      tuple producer similars to list producer

      从文件(txt,xsl,)IO

      normal r/w

      image-20230116112947244
    wps office免费版下载的入口
      txt

      file_management

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lFaZe1mA-1678630994144)(C:/Users/c1826/AppData/Roaming/Typora/typora-user-images/image-20230116121513686.png)]
    wps的的官网最新下载网站在哪
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VDd2PzcQ-167 wps 的官网最新下载入口怎么找(wps下载电脑版官网最新下载)8630994380)(null)]686.png]

      txt](https://img-blog.csdnimg.cn/img_convert/b38530a283b5d6944869835571931446.png)

      file_management

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存失败,源站可能有防盗链机制,建议将图片保存下来直接上传下上传(iIMfHYB8FPnt-1628991101)(C:/Users/c1826/AppData/Roaming/Typora/typora-user-images/image-20278630974349)(C:/Users/c1826/AppData/Roaming/Typora/typora-user-images/image-20230116121513686.png)]

  • wps office 官方的下载地方在哪

      点击上方“大鱼机器人”,选择“置顶/星标公众号”

      福利干货,第一时间送达!

      b0e710220623ae570ff1b380fe7ec2bb.gif

      整理:李肖遥

      说到指针,估计还是有很多小伙伴都还是云里雾里的,有点“知其然,而不知其所以然”。但是,不得不说,学了指针,C语言才能算是入门了。指针是C语言的「精华」,可以说,对对指针的掌握程度,「直接决定」了你C语言的编程能力。

      在讲指针之前,我们先来了解下变量在「内存」中是如何存放的。

      在程序中定义一个变量,那么在程序编译的过程中,系统会根据你定义变量的类型来分配「相应尺寸」的内存空间。那么如果要使用这个变量,只需要用变量名去访问即可。

      通过变量名来访问变量,是一种「相对安全」的方式。因为只有你定义了它,你才能够访问相应的变量。这就是对内存的基本认知。但是,如果光知道这一点的话,其实你还是不知道内存是如何存放变量的,因为底层是如何工作的,你依旧不清楚。

      那么如果要继续深究的话,你就需要把变量在内存中真正的样子是什么搞清楚。内存的最小索引单元是,那么你其实可以把内存比作一个超级大的「字符型数组」。在上一节我们讲过,数组是有下标的,我们是通过数组名和下标来访问数组中的元素。那么内存也是一样,只不过我们给它起了个新名字:。每个地址可以存放「1字节」的数据,所以如果我们需要定义一个整型变量,就需要占据4个内存单元。

      那么,看到这里你可能就明白了:其实在程序运行的过程中,完全不需要变量名的参与。变量名只是方便我们进行代码的编写和阅读,只有程序员和编译器知道这个东西的存在。而编译器还知道具体的变量名对应的「内存地址」,这个是我们不知道的,因此编译器就像一个桥梁。当读取某一个变量的时候,编译器就会找到变量名所对应的地址,读取对应的值。

      那么我们现在就来切入正题,指针是个什么东西呢?

      所谓指针,就是内存地址(下文简称地址)。C语言中设立了专门的「指针变量」来存储指针,和「普通变量」不一样的是,指针变量存储的是「地址」。

      定义指针

      指针变量也有类型,实际上取决于地址指向的值的类型。那么如何定义指针变量呢:

      很简单:

      注意,指针变量一定要和指向的变量的类型一样,不然类型不同可能在内存中所占的位置不同,如果定义错了就可能导致出错。

      取地址运算符和取值运算符

      获取某个变量的地址,使用取地址运算符,如:

      如果反过来,你要访问指针变量指向的数据,那么你就要使用取值运算符,如:

      这里你可能发现,定义指针的时候也使用了,这里属于符号的「重用」,也就是说这种符号在不同的地方就有不同的用意:在定义的时候表示「定义一个指针变量」,在其他的时候则用来「获取指针变量指向的变量的值」。

      直接通过变量名来访问变量的值称之为,通过指针这样的形式访问称之为,因此取值运算符有时候也成为「间接运算符」。

      比如:

      程序实现如下:

      避免访问未初始化的指针

      像这样的代码是十分危险的。因为指针a到底指向哪里,我们不知道。就和访问未初始化的普通变量一样,会返回一个「随机值」。但是如果是在指针里面,那么就有可能覆盖到「其他的内存区域」,甚至可能是系统正在使用的「关键区域」,十分危险。不过这种情况,系统一般会驳回程序的运行,此时程序会被「中止」并「报错」。要是万一中奖的话,覆盖到一个合法的地址,那么接下来的赋值 WPS office电脑版的下载网址的方法就会导致一些有用的数据被「莫名其妙地修改」,这样的bug是十分不好排查的,因此使用指针的时候一定要注意初始化。

      有些读者可能会有些奇怪,指针和数组又有什么关系?这俩货明明八竿子打不着井水不犯河水。别着急,接着往下看,你的观点有可能会改变。

      数组的地址

      我们刚刚说了,指针实际上就是变量在「内存中的地址」,那么如果有细心的小伙伴就可能会想到,像数组这样的一大摞变量的集合,它的地址是啥呢?

      我们知道,从标准输入流中读取一个值到变量中,用的是函数,一般貌似在后面都要加上,这个其实就是我们刚刚说的「取地址运算符」。如果你存储的位置是指针变量的话,那就不需要。

      程序运行如下:

      在普通变量读取的时候,程序需要知道这个变量在内存中的地址,因此需要来取地址完成这个任务。而对于指针变量来说,本身就是「另外一个」普通变量的「地址信息」,因此直接给出指针的值就可以了。

      试想一下,我们在使用函数的时候,是不是也有不需要使用的时候?就是在读取「字符串」的时候:

      程序执行如下:

      因此很好推理:数组名其实就是一个「地址信息」,实际上就是数组「第一个元素的地址」。咱们试试把第一个元素的地址和数组的地址做个对比就知道了:

      程序运行结果为:

      这么看,应该是实锤了。那么数组后面的元素也就是依次往后放置,有兴趣的也可以自己写代码尝试把它们输出看看。

      指向数组的指针

      刚刚我们验证了数组的地址就是数组第一个元素的地址。那么指向数组的指针自然也就有两种定义的方法:

      指针的运算

      当指针指向数组元素的时候,可以对指针变量进行「加减」运算,表示指向p指针所指向的元素的「下n个元素」,表示指向p指针所指向的元素的「上n个元素」。并不是将地址加1。

      如:

      执行结果如下:

      有的小伙伴可能会想,编译器是怎么知道访问下一个元素而不是地址直接加1呢?

      其实就在我们定义指针变量的时候,就已经告诉编译器了。如果我们定义的是整型数组的指针,那么指针加1,实际上就是加上一个的距离。相对于标准的下标访问,使用指针来间接访问数组元素的方法叫做。

      其实使用指针法来访问数组的元素,不一定需要定义一个指向数组的单独的指针变量,因为数组名自身就是指向数组「第一个元素」的指针,因此指针法可以直接作用于数组名:

      执行结果如下:

      现在你是不是感觉,数组和指针有点像了呢?不过笔者先提醒,数组和指针虽然非常像,但是绝对「不是」一种东西。

      甚至你还可以直接用指针来定义字符串,然后用下标法来读取每一个元素:

      程序运行如下:

      在刚刚的代码里面,我们定义了一个「字符指针」变量,并且初始化成指向一个字符串。后来的操作,不仅在它身上可以使用「字符串处理函数」,还可以用「下标法」访问字符串中的每一个字符。

      当然,循环部分这样写也是没毛病的:

      这就相当于利用了指针法来读取。

      指针和数组的区别

      刚刚说了许多指针和数组相互替换的例子,可能有的小伙伴又开始说:“这俩货不就是一个东西吗?”

      随着你对指针和数组越来越了解,你会发现,C语言的创始人不会这么无聊去创建两种一样的东西,还叫上不同的名字。指针和数组终究是「不一样」的。
    wps 的官网最新下载入口在哪(wps office免费版下载)
      比如笔者之前看过的一个例子:

      当编译器报错的时候,你可能会开始怀疑你学了假的C语言语法:

      我们知道,是一个复合表达式,那么就要遵循「运算符优先级」来看。具体可以回顾《C语言运算符优先级及ASCII对照表》。

      比的优先级「更高」,但是自增运算符要在「下一条语句」的时候才能生效。所以这个语句的理解就是,先取出所指向的值,判断是否为,若是,则跳出循环,然后指向下一个字符的位置。

      看上去貌似没啥毛病,但是,看看编译器告诉我们的东西:

      的操作对象是,那么到底是不是「左值」呢?

      如果是左值的话,那么就必须满足左值的条件。

      ❝
    wps官网下载的地址怎么找(wps官网网站)
      拥有用于识别和定位一个存储位置的标识符存储值可修改

      ❞

      第一点,数组名是可以满足的,因为数组名实际上就是定位数组第一个元素的位置。但是第二点就不满足了,数组名实际上是一个地址,地址是「不可以」修改的,它是一个常量。如果非要利用上面的思路来实现的话,可以将代码改成这样:

      这样就可以正常执行了:

      这样我们就可以得出:数组名只是一个「地址」,而指针是一个「左值」。

      指针数组?数组指针?

      看下面的例子,你能分辨出哪个是指针数组,哪个是数组指针吗?

      单个的我们都可以判断,但是组合起来就有些难度了。

      答案:

      我们挨个来分析。

      指针数组

      数组下标的优先级是最高的,因此是一个有5个元素的「数组」。那么这个数组的类型是什么呢?答案就是,是「指向整型变量的指针」。因此这是一个「指针数组」。
    wps office的免费版下载的地方怎么找(wps office下载)
      那么这样的数组应该怎么样去初始化呢?

      你可以定义5个变量,然后挨个取地址来初始化。

      不过这样太繁琐了,但是,并不是说指针数组就没什么用。

      比如:

      结果如下:

      这样是不是比二维数组来的更加直接更加通俗呢?

      数组指针

      和在优先级里面属于「同级」,那么就按照「先后顺序」进行。

      将定义为「指针」, 后面跟随着一个5个元素的「数组」,就指向这个数组。因此,数组指针是一个「指针」,它指向的是一个数组。

      但是,如果想对数组指针初始化的时候,千万要小心,比如:

      Visual Studio 2019报出以下的错误:

      这其实是一个非常典型的错误使用指针的案例,编译器提示说这里有一个「整数」赋值给「指针变量」的问题,因为归根结底还是指针,所以应该给它传递一个「地址」才行,更改一下:

      可是怎么还是有问题呢?

      我们回顾一下,指针是如何指向数组的。

      我们原本以为,指针是指向数组的指针,但是实际上「并不是」。仔细想想就会发现,这个指针实际上是指向的数组的「第一个元素」,而不是指向数组。因为数组里面的元素在内存中都是挨着个儿存放的,因此只需要知道第一个元素的地址,就可以访问到后面的所有元素。

      但是,这么来看的话,指针指向的就是一个「整型变量」的指针,并不是指向「数组」的指针。而刚刚我们用的数组指针,才是指向数组的指针。因此,应该将「数组的地址」传递给数组指针,而不是将第一个元素的地址传入,尽管它们值相同,但是「含义」确实不一样:

      程序运行如下:

      指针和二维数组

      在上一节《C语言之数组》我们讲过「二维数组」的概念&#xffwps office的免费版的下载地方的方法0c;并且我们也知道,C语言的二维数组其实在内存中也是「线性存放」的。

      假设我们定义了:
    wps office的免费版的下载的入口怎么找
      array

      array作为数组的名称,显然应该表示的是数组的「首地址」。由于二维数组实际上就是一维数组的「线性拓展」,因此array应该就是指的。

      如果你用去测试和的话,就可以测试出来这样的结论。

      *(array+1)

      首先从刚刚的问题我们可以得出,同样也是指的,因此就是相当于,而这刚好相当于的数组名。因此就是指第二行子数组的第一个元素的地址。

      *(*(array+1)+2)

      有了刚刚的结论,我们就不难推理出,这个实际上就是。是不是感觉非常简单呢?

      总结一下,就是下面的这些结论,记住就好,理解那当然更好:

      数组指针和二维数组

      我们在上一节里面讲过,在初始化二维数组的时候是可以偷懒的:

      刚刚我们又说过,定义一个数组指针是这样的:

      那么组合起来是什么意思呢?

      通过刚刚的说明,我们可以知道,是指向一个3个元素的数组的「指针」,所以这里完全可以将的值赋值给。

      其实C语言的指针非常灵活,同样的代码用不同的角度去解读,就可以有不同的应用。

      那么如何使用指针来访问二维数组呢?没错,就是使用「数组指针」:

      运行结果:

      实际上是的意思。如果你尝试用它来定义一个变量,编译器肯定会「报错」,因为不同类型所占用的内存有可能「不一样」。但是如果定义的是一个指针,那就没问题。类型中指针可以指向「任何一个类型」的数据,也就是说,任何类型的指针都可以赋值给指针。

      将任何类型的指针转换为是没有问题的。但是如果你要反过来,那就需要「强制类型转换」。此外,不要对指针「直接解引用」,因为编译器其实并不知道指针会存放什么样的类型。

      这样会报错:

      如果一定要这么做,那么可以用「强制类型转换」:

      当然,使用void指针一定要小心,由于void指针几乎可以「通吃」所有类型,所以间接使得不同类型的指针转换变得合法,如果代码中存在不合理的转换,编译器也不会报错。

      因此,void指针能不用则不用,后面讲函数的时候,还可以解锁更多新的玩法。

      在C语言中,如果一个指针不指向任何数据,那么就称之为「空指针」,用「NULL」来表示。NULL其实是一个宏定义:

      在大部分的操作系统中,地址0通常是一个「不被使用」的地址,所以如果一个指针指向NULL,就意味着不指向任何东西。为什么一个指针要指向NULL呢?

      其实这反而是一种比较指的推荐的「编程风格」——当你暂时还不知道该指向哪儿的时候,就让它指向NULL,以后不会有太多的麻烦,比如:

      第一个指针未被初始化。在有的编译器里面,这样未初始化的变量就会被赋予「随机值」。这样指针被称为「迷途指针」,「野指针」或者「悬空指针」。如果后面的代码对这类指针解引用,而这个地址又刚好是合法的话,那么就会产生莫名其妙的结果,甚至导致程序的崩溃。因此养成良好的习惯,在暂时不清楚的情况下使用NULL,可以节省大量的后期调试的时间。

      开始套娃了。其实只要你理解了指针的概念,也就没什么大不了的。

      程序结果如下:

      当然你也可以无限地套娃,一直指下去。不过这样会让代码可读性变得「很差」,过段时间可能你自己都看不懂你写的代码了。

      那么,指向指针的指针有什么用呢?

      它可不是为了去创造混乱代码,在一个经典的实例里面,就可以体会到它的用处:

      然后我们需要将这些书进行分类。我们发现,其中有一本是写Python的,其他都是C语言的。这时候指向指针的指针就派上用场了。首先,我们刚刚定义了一个指针数组,也就是说,里面的所有元素的类型「都是指针」,而数组名却又可以用指针的形式来「访问」,因此就可以使用「指向指针的指针」来指向指针数组:

      因为字符串的取地址值实际上就是其「首地址」,也就是一个「指向字符指针的指针」,所以可以这样赋值。

      这样,我们就利用指向指针的指针完成了对书籍的分类,这样既避免了浪费多余的内存,而且当其中的书名要修改,只需要改一次即可,代码的灵活性和安全性都得到了提升。wps的电脑版的下载地址在哪里

      常量,在我们目前的认知里面,应该是这样的:

      或者是这样的:

      常量和变量最大的区别,就是前者「不能够被修改」,后者可以。那么在C语言中,可以将变量变成像具有常量一样的特性,利用即可。

      在关键字的作用下,变量就会「失去」本来具有的可修改的特性,变成“只读”的属性。

      强大的指针当然也是可以指向被修饰过的变量,但这就意味着「不能通过」指针来修改它所引用的值。总结一下,就是以下4点:

      ❝

      指针可以修改为指向不同的变量指针可以修改为指向不同的常量可以通过解引用来读取指针指向的数据不可以通过解引用来修改指针指向的数据

      ❞

      指向非常量的常量指针

      指针本身作为一种「变量」,也是可以修改的。因此,指针也是可以被修饰的,只不过位置稍稍「发生了点变化」:

      这样的指针有如下的特性:

      ❝

      指针自身不能够被修改指针指向的值可以被修改

      ❞

      指向常量的常量指针

      在定义普通变量的时候也用修饰,就得到了这样的指针。不过由于限制太多,一般很少用到:

      http://www.techzone.ltd/post/CPointer/

      -END-

      | 整理文章为传播相关技术,版权归原作者所有 |

      | 如有侵权,请联系删除 |

      往期好文合集

      C语言高效编程与代码优化

      经常遇到的10大C语言基础算法(珍藏版源码)

      C语言常用标准库解读

      若觉得文章不错,转发分享,也是我们继续更新的动力。

      5T资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、单片机、等等!

      在公众号内回复「更多资源」,即可免费获取,期待你的关注~

      wps office免费版的下载网站怎么找(如何登录wps官网)16d958764fc22fcd0bf0d3f0c787125a.png

      89532b932264d853e7dcf5cdf8b651fc.gif

  • wps电脑版下载网站怎么找

      说起P网,大家可能并不熟悉,P网全称Poloniex,是美国的一家老牌的wps的官网最新的下载的地方在哪里交易所。成立初期,该交易所主要是通过其平台的山寨币服务打响了知名度,尤其是在2017年年初,山寨币泡沫让Poloniex交易所开始快速成长,但其后美国市场监管严格起来,该平台的很多山寨币都被强制下架,这对Poloniex交易所来说是致命一击,后来Poloniex还是靠着其平台币USDE慢慢好转起来WPS office的官网下载的方法的方法。对于很多国内的用户而言,他们想尝试在Poloniex交易,却不知道国内如何下载安装Poloniex,下面小编W小编就为大家带来Poloniex交易所官网APP下载教程。
    wps office 的官方下载网站怎么找
      方法一:

      直接点击下面小编W整理好的链接,点击即可下载安装使用

      方法二:

      1.进入小编W官网,在搜索框搜索Poloniex,在下拉框中点击Poloniex。

      wps官网的下载的网址在哪里

      2. 进入小编W的P网页面,可以看到官方网址,以及苹果和安卓的下载链接,根据你的手机型号,点击下载就可以了。

      

    wps的官网最新下载地址是多少(wps官网最新免费下载电脑版)  poloniex交易所还是很靠谱的。Poloniex成立于2014年,俗称P网,是世界领先的加密货币交易所之一,虽然近年来越来越没存在感,交易额也是逐渐走低,但是在2018年2月份被美国公司CIRCIE收购之后,在美国市场需要迎合监管,所以下架了许多的山寨币种,同时推出了其平台的稳定币USDE,发展更上了一层楼。

      poloniex交易所成立至今安全运行没有发生过盗币事件,资产安全方面也做的不错。同时在行业也有较高的知名度。交易所目前仍没有开通法币交易,但是用户的体验非常不错,曾经是毕全军第一大交易所,只是因为股权的纷争所以逐渐没落wps office的免费版的下载的入口。

      该交易所是世界领先的加密货币国际站之一,提供多种山寨币的交易,其界面简洁,手机端和电脑端非常友好,是一个较为纯粹的区块链wps的官网最新的下载的地方在哪里交易所,业内的口碑较好。

      据消息披露在19年的10月,P网要从CIRCIE公司分拆独立,专注于全球市场,而CIRCIE公司内部人员说,独立出来的P网被一家财团收购,而这家财团背后控制人是波场的孙宇晨。

      该交易所是美国市场有较大影响力的交易所,同时也是美国最大的wps的官网最新的下载的地方在哪里交易所之一,用户众多,而且国际化程度颇高。目前交易币种50,交易对94 ,平台自由资金8.1亿元,24小时成交额2亿,目前全球排名第20位,有所下滑。

      虽然该交易所没有跟上时代被后来的很多交易所给超越了,但是体量在那里,而且有非常庞大的用户群体,但他自身存在的诸多问题,也已经是历史历史问题了。寄希望这次独立出来,被孙老板够控股之后是不是会重新焕发生机,我们就拭目以待了wps 的官网下载地方是多少。

      以上就是Poloniex交易所怎么下载安装?Poloniex交易所APP下载方法分享的详细内容,更多关于Poloniex交易所下载的资料请关注脚本之家其它相关文章!

      声明:文章内容不代表本站观点及立场,不构成本平台任何投资建议。本文内容仅供参考,风险自担!

      Tag:Poloniex   交易所  

  • WPS office的电脑版下载的地方

      立即领取价值高达60,000元wps的官网最新的下载的地方在哪里盲盒  pig币appapp一款非常知名的全新手机交易货币软件平台每一位用户都可以在这里轻松愉快的进行自己的wps的官网最新的下载的地方在哪里交易,你还能轻松了解到更多区块链的相关信息,用户根据自己的情况选择合适的方式进行投资,这里所包含的wps的官网最新的下载的地方在哪里种类十分丰富,让你做决定更加方便。

      

      抹茶最新官网入口>>

      wps电脑版的下载的地址怎么找

      点击下载/注册领数字币盲盒    pig币app特色

          1、币价预警:可设置价格警戒线,实时监控市场价格,自动触发报警

          2、实时到账:使用绑定的银行卡转账汇款,实时到账,方便快捷

          3、首页频道:捕捉全球资讯,快人一步,尽知币行事;

          4、社区广场:每日热门看点,交流学习,知晓更多币圈知识;

          pig币app亮点

          1.为用户提供最有价值的互动交流,线上能够为您提供大量金融业内幕信息;

          2.用户并对在这儿的投资及管理资产更有信心,仅需手机打开并且在需要时参加实际操作就可以;

          3.每日网上时,你将得到十分可观的收益和最新关键市场新闻的引言,便于您有动力继续上网以进行WPS office的电脑版的下载网站怎么找市场中的财务管理。

          pig币app优势

          提供最全面的加密市场资讯、大型金融衍生品等待投资、超低交易费用。

          高度专业的团队,使用专业的安全多重防御系统,为用户在线保驾护航。

          专家团队的深入分析确保用户始终了解最新的货币信息。

          我们有一个基于平台的风险管理团队,可以帮助您更清楚地识别许多代币交易的问题。
    wps的的官网最新的下载入口
          方便快捷的管理各种数字资产货币及衍生品交易服务,数字资产投资。

          pig币app功能

          1.LTC/BTC、BCH/BTC、ETH/BTC等/BTC的价格波动以及比特币、莱特币、以太坊等合约的价格波动。

          2.C2C交易、币对币交易、合约交易。

          3.K线图查看:提供多种专业趋势图。

          pig币app说明

          1.自动更新全世界1,600多种多样货币的价格调整,包含100好几个交易所。

          2.大家可以为有兴趣的贷币加上一个全自动选择界面,也支持拖拽排列。

          3.提供数据专业k线图变化趋势,也支持全屏幕拖拽和放缩主视图。

          虚拟币相关内容推荐:

          fil币交易所排行2023:http://www.benmuji.cn/news/20230144893.html

          BMB币买卖交易教程:http://www.benmuji.cn/news/20230145691.html

          比特币交易流程步骤教程:http://www.benmuji.cn/news/20230144208.html

          抹茶OKEx官方注册教程(双端):http://www.benmuji.cn/news/20230144830.html

          下边小编推荐几家比较不错的交易平台,希望能够帮到大家

          OKEX

          OKEX资产3535.06万美元,共有523个交易对,24小时成交额78.92亿美元。

          OKEX是全球著名的数字资产国际站之一,主要面向全球用户提供比特币、莱特币、以太币等数字资产的现货和衍生品交易服务,隶属于OKEX Technology Company Limited。 OKEX创立时,获得了世界顶级投资人Tim Draper参与设立的创业工场百万美金的天使投资,Tim Draper先生同时也是Hotmail、百度、特斯拉等世界顶级企业的投资人。

          BitMEX

          BitMEX 是一个P2P交易平台,为HDR Global Trading Limited所有。它由一群拥有超过 40年金融经验的专业人士创建,该平台只处理比特币,即使买卖的是其他wps的官网最新的下载的地方在哪里的合约,其盈利和亏损也只能以比特币计算,它旨在让投资者仅使用比特币就可进入全球金融市场。BitMEX不接受法定货币(政府发行的货币),但允许使用高杠杆交易wps office 官方的下载的网站是多少。

          Gate.io(芝麻开门)

          Gate.io提供1000+币种的数字资产交易,注册的新用户完成任务可领取$100美元点卡、参与交易可领取$5500美元体验金。自2013年以来,稳定可靠您可信赖的、公开、透明的平台。

          抹茶交易所

          抹茶交易所app是全球领先的一款数字资产交易软件,它可以为你提供专业安全的交易环境,让你随意购买各种货币,还能实时查看到各种相关信息,从而即可更好的帮助你利用虚拟币赚钱。软件中的投资币种非常丰富,其中包括比特币 (BTC)、莱特币 (LTC)、以太坊 (ETH)、柚子 (EOS)等,并为你提供实时行情走势,并且在抹茶交易所中还有各种资讯,就算你是新手小白在这里也能学到许多有用的知识。在安全性上,抹茶交易所组建了业界顶尖的技术团队,同时与成都链安、慢雾科技、道创宇等多家业内顶尖安全机构展开深度合作,保障用户资产安全。

          抹茶APP下载和新手注册操作教程

          一、下载

          (一)Android版本

          抹茶抹茶x官网 for Android v6.1.23 安卓版类型:银行金融大小:249.09MB语言:简体中文时间:2022-01-13

          打开抹茶官网,点击下载图标,用手机扫描出现的二维码(建议用浏览器进行扫码,微信扫码可能会出现网页停止访问的情况),点击【本地下载】,然后根据提示完成下载、安装。

          注:如果不是用浏览器扫码,则可能需要点击右上角图标,选择【在浏览器打开】,再点击【本地下载】—【普通下载】,按要求完成下载、安装。

          (二)iOS版本

          注册海外Apple ID并使用海外ID下载抹茶APP

          1、浏览器搜索链接 https://appleid.apple.com/ 完成海外Apple ID注册。

          2、进入AppStore,登录注册账户,在App Store里搜索“OKX”,即可进行下载。

          二、注册

          1、打开抹茶APP,点击“注册/登陆”,点击“立即注册”;注册分为手机号注册和邮箱注册两种方式,您可以选择注册类型,然后按照要求填写完整相应信息。

          注:邮箱注册需绑定手机号才可以进行买卖币等操作,建议您使用手机号注册。

          2、完成图片验证后,输入收到邮箱或者手机验证码、并设置相关密码,即可完成注册。

      

          注册成功后,完成KYC认证,即可购入数字资产,并开启您的数字资产交易之旅~

          以上内容就是小编给您分享资讯。如果您觉得还不错,请关注本站哦

      抹茶安卓下载:立即前往

      抹茶IOS下载:立即前往

      注册领取新手礼包!交易手续费返现WPS office的官网的下载的网站:20%! 

  • wps的电脑版的下载网站在哪里

      PIG is a high-yield frictionless farming token. There is a wps的免费版下载的网站怎么找5% tax on every transaction: 3% is locked in liquidity 2% is distributed to PIG holders proportional to the amount of PIG held.wps官网下载的地方
    wps的免费版的下载的入口是什么
      Enjoy easy farming without the complications of pairing assets for liquidity and risks of impermanent losses.

      PIGwps免费版下载的地方怎么找 has been stealth launched. 100% of PIG supply was seeded as liquidity. That means no presale and no allocation to team members. Liquidity is locked in Pancakeswap and the ownership of the contract has been transferred to the burn addresswps官网最新下载入口是什么. No team allocation at launch means that PIG is 100% community led.50% of the supply has been sent to the Black Hole at launch . Because it is so massive, it will absorb a significant amount of the 2% tax distribution, resulting in exponential hyperdeflation.

  • wps office 官方下载网站是什么(wps office下载windows平板)

      PE文件是指32位可执行文件,也称PE32;64位的可执行文件称为PE+或PE32+,是PE文件的一种扩展形式

      种类主扩展名可执行系列EXE 或 SCR驱动程序系列SYS 或 VXD库系列DLL 或 OCX 或 CPL 或 DRV对象文件系列OBJ

      1、从DOS头(DOS header)到节区头(Section header)是PE头部分,其下的节区合称PE体,文件中使用偏移(offset),内存中使用VA(Virtual Address 虚拟地址)来表示位置。

      2、PE头与各节区的尾部都存在一个区域,称为NULL填充(NULL padding)。

      在这里插入图片描述

      1、VA指的是进程虚拟内存的绝对地址,RVA(Relative Virtual Address 相对虚拟地址)指从某个基准位置(ImageBase)开始的相对地址。其中VA与RVA满足:RVA + ImageBase = VA

      2、PE头内部信息大都以RVA形式存在。

      1、PE文件加载到内存时,每个节区都要准确完成内存地址与文件偏移间的映射,一般称为RVA to RAW,方法如下:

      (1)查找RVA所在节区,即节区头的虚拟地址VirtualAddress

      (2)使用简单的公式计算文件偏移(RAW)

      2、根据IMAGE_SECTION_HEADER结构体,换算公式:

      RAW – PointerToRawData = RVA – VirtualAddress,其中PointerToRawData是磁盘上的PE文件节区偏移地址,VirtualAddress是内存上的PE文件节区相对基准位置ImageBase偏移地址wps 的官网的下载的地方。

      在这里插入图片描述

      案例:

      若RVA = 5000时,则RAW = 5000(RVA) – 1000(VirtualAddress) + 400(PointerToRawData)

      IMAGE_DOS_HEADER结构体大小为64(0x3CH)字节,其中e_magic指示DOS签名,e_lfanew指示NT头的偏移。
    wps的的官网最新下载的网址是多少
      DOS存根(stub)在DOS头下方,是个可选项,且大小不固定,由代码与数据混合而成,灵活使用该特性可以在一个可执行文件中创建另一个文件,在DOS与Windows中都能运行(在DOS环境中运行16位DOS代码,在Windows环境中运行32Windows代码)。

      IMAGE_NT_HEADERS32结构体由3个成员组成,第一个成员为签名Signature,值位50450000H,另外两个成员分别为文件头(File Header)与可选头(Option Header)结构体。

      IMAGE_FILE_HEADER FileHeader文件头

      IMAGE_OPTIONAL_HEADER32 OptionalHeader 可选头

      1、VirtualAddress与PointerToRawData可以不带任何值,分别由(IMAGE_OPTIONAL_HEADER32)中的SectionAlignment与File Alignment确定。

      2、Name成员不一定需要以NULL结束,也不一定是ASCII值

      1、加载DLL的方式有两种:一种是“显式链接”(Explicit Linking),程序使用DLL是加载,使用完毕后释放内存;另一种是“隐式加载”(Implicit Linking),程序开始时一同加载DLL,程序终止时再释放占用内存。IAT提供的机制与隐式链接有关。

      2、

      1、IAT保存的内容与Windows操作系统的核心进程、内存、DLL结构有关。

      2、程序编译时,并不知道该程序要运行在那种Windows(7、XP),哪种语言(ENG、JPN),哪种服务包(ServicePack)下,因此,内核重要的DLL(如kernel32.dll)的版本不一样,对应的DLL中API函数地址也不相同;为了确保在所有环境中都能正常调用DLL中的API函数,编译器要预先保存API函数实际地址的位置,并记下CALL DWORD PTR DS:[Address]指令形式,其中Address是IAT数组中的某一项地址,执行文件时,PE装载器将对应的API函数地址写到Address位置上。

      3、DLL加载时,无法保证被加载到PE头指定的ImageBase地址处,需要DLL重定位(Windows系统的DLL文件拥有自身固定的ImageBase)。

      4、EXE文件拥有独立的虚拟空间地址,因此能够准确加载到自身的ImageBase中。

      5、微软制作服务包过程中重建相关系统文件,此时会硬编入准确地址(普通的DLL实际地址不会被硬编码到IAT中,通常带有与INT相同的值)。

      在这里插入图片描述

      图中,INT与IAT的各元素指向相同地址,但是实际很多情况下它们指向的地址不一致的。

      IAT每个元素对应一个被导入的符号,元素的值在不同情况有不同的含义,在动态链接器刚完成映射还没有开始重定位和符号解析时,IAT中的元素值表示相对应的导入符号的序号或者符号名,当动态链接器完成该模块的链接时,元素值被动态链接器改写成该符号的真正地址。如若元素值最高位为1,则低31位值就是导入符号的序号值,如若没有,那么元素的值指向IMAGE_IMPORT__BY_NAME结构体的RVA

      PE装载器把导入函数输入至IAT的顺序

      读取IMAGE_IMPORT_DESCRIPTOR结构体的Name成员,获取库名称字符串(如"kernel32.dll")装载相应库–>LoadLibrary(“kernel32.dll”)读取IMAGE_IMPORT_DESCRIPTOR结构体的OriginalFirstThunk成员,获取INT地址逐一读取INT数组的值,获取相应IMAGE_IMPORT_BY_NAME地址(RVA)使用IMAGE_IMPORT_BY_NAME的Hint(Ordinal)或Name成员,获取相应函数的起始地址–>GetProcAddress(“GetCurrentThreadld”)从EAT中获取实际地址读取IMAGE_IMPORT_DESCRIPTOR结构体的FirstThunk(IAT)成员,获取IAT数组地址将第5步获得的函数地址输入相应IAT数组中重复步骤4~7,直到INT结束(遇到NULL)

      1、只有通过EAT才能准确求得从相应库中导出函数的起始地址。

      2、PE文件内的特定结构体(IMAGE_EXPORT_DIRECTORY)保存着导出信息,且PE文件中仅有一个用来说明EAT导出地址表的IMAGE_EXPORT_DIRECTORY结构体。

      3、用来说明IAT导入地址表的IMAGE_EXPORT_DIRECTORY结构体以数组形式存在,且拥有多个成员。

      4、从库中获取函数地址的API为GetProcAddress()函数,该API引用EAT来获取指定API的地址。

      在这里插入图片描述

      GetProcAddress()操作原理

      9. 利用AddressOfNames成员转到“函数名称数组”

      10. “函数名称数组”中存储着字符串地址,通过比较(strcmp)字符串,查找指定的函数名称(此时数组的索引称为name_index)

      11. wps的免费版下载的网址是什么 利用AddressOfNameOrdinals成员,转到ordinal数组

      12. 在ordinal数组中通过name_index查找相应的ordinal值

      13. 利用addressOfFunctions成员转到“函数地址数组(EAT)

      14. 在“函数地址数组”中将刚刚获得的ordinal用作数组索引,获得指定函数的起始地址

      15. 指定函数的实际地址 = DLL的实际加载基址 +DLL指定函数的起始地址

      **提示:**对于没有函数名称的导出函数,可以通过Ordinal查找到它们的地址。从Ordinal值重减去IMAGE_EXPORT_DIRECTORY.Base成员后得到一个值,使用该值作为“函数地址数组”的索引,即可查找到相应的函数地址。

      1、TLS回调函数的运行要先于EP代码的执行,常用于反调试;

      2、TLS是各线程的独立的数据存储空间;

      3、TLS回调函数,每当创建/终止进程的线程时会自动调用执行的函数,创建/终止进程的主线程也会自动调用回调函数,且其调用执行先于EP代码;

      1、TEB指线程环境块,包含进程中运行线程的各种信息,进程中的每个进程都对应一个TEB结构体;

      2、在不同Window OS下,TEB结构体的成员不一样;

      3、offset 0x00 是NtTib成员结构体,意为“线程信息块”

      4、offset 0x30 是ProcessEnvironmentBlock成员,指向PEB(Process Environment Block进程环境块),每个进程对应一个PEB结构体。

      SDT索引TEB结构体

      在这里插入图片描述

      1、PEB是存放进程信息的结构体,尺寸非常大;

      2、在不同Window OS下,PEB结构体的成员不一样;

      3、offset 0x02 BeingDebugged:Uchar 指示该进程是否正在调试状态

      4、offset 0x08 ImageBaseAddress:Ptr32 Void 进程被加载的ImageBase

      5、offset 0x0C Ldr:Ptr32 _PEB_LDR_DATA 指向_PEB_LDR_DATA结构体指针,当模块DLL加载到进程后,通过PEB.Ldr成员可以直接获取该模块的加载地址

      6、offset 0x18 ProcessHeap:Ptr32 Void 应用于反调试技术

      7、offset 0x68 NtGlobalFlag:Uint4B 应用于反调试技术

      1、进程正常运行时,若发生异常,OS会委托进程处理,若进程代码中存在具体的异常处理(SEH异常处理)代码,则能顺利处理相关异常,程序继续运行,但如果进程内部没有实现SEH,那么相关异常就无法处理,OS就会启动默认的异常处理机制,终止进程运行。

      2、进程调试运行时,若被调试进程内部发生异常,OS会首先把异常抛给调试进程处理,调试器几乎拥有被调试者的所有权限,不仅可以运行、终止被调试者,还拥有被调试进程的虚拟内存、寄存器的读写权限(也就是说被调试者内部发生的所有异常都由调试器处理),所以调试过程中发生的所wps官网最新下载入口在哪里有异常都要先交给调试器管理(被调试者的SEH依据优先顺序推给调试器)。被调试者发生异常时,调试器会暂停运行,必须处理异常,完成后继续调试,可以通过直接修改异常代码、寄存器、内存等。

      3、将异常抛给被调试者处理:如果被调试者内部存在SEH(异常处理函数)能够处理异常,那么异常通知会发送给被调试者,由被调试者自行处理,与正常运行时的异常处理方式一样。

      4、OS默认的异常处理机制:若调试器与被调试者都无法处理或故意不处理当前发生的异常,则OS的默认异常处理机制会处理它,终止被调试进程,同时结束调试。

      5、SEH大量应用于压缩器、保护器、恶意程序(Malware),用来反调试。

      在这里插入图片描述

      异常发生时,执行异常代码的线程就会中断运行,转而运行SEH(异常处理器/异常处理函数),此时OS会把线程的CONTEXT结构体的指针传递给异常处理函数的相应参数,在CONTEXTwps office的免费版下载的地址在哪结构体的Eip成员(偏移量:B8),将会被设置为其他地址,然后返回异常处理函数,这样,被暂停的线程就会执行新设置的EIP地址处的代码。异常处理器处理异常后返回ExceptionContinueExecution(0),从发生异常的代码处继续运行,若当前异常处理器无法处理异常,则返回ExceptionContinueSearch(1),将异常派送到SEH链的下一个异常处理器。

      在这里插入图片描述

      PE重定位的基本操作原理

      在应用程序中查找硬编码的地址位置,可以通过基址重定位表查找读取值后,减去ImageBase(VA –> RVA)加上实际加载地址(RVA –> VA)

      PE加载器通过对一个IMAGE_BASE_RELOCATION结构体(位于节区.reloc)所有的TypeOffset重复上述处理,根据实际加载的内存地址修正后,将得到的值覆盖到同一位置。

      基址重定位表地址位于PE头的DataDirectory数组的第六个元素(数组索引为5):IMAGE_OPTIONAL_HEADER32.DataDirectory[5].VirtualAddress的值就是IMAGE_BASE_RELOCATION结构体数组的起始地址

      在这里插入图片描述

      1、根据重定位表,查找程序中需要重定位的位置RVA = VirtualAddress + (TypeOffset & 0x0FFF)

      2、读取硬编码地址的值后,减去ImageBase值(VR –> RVA)

      3、加上实际加载地址(RVA –> VA)

      4、将得到的值覆盖到重定位的位置上

      5、对一个IMAGE_BASE_RELOCATION结构体的所有TypeOffset重复步骤1~4,直至TypeOffset的值为0

      6、对PE文件中的所有IMAGE_BASE_RELOCATION结构体(衔接上一个结构体的TypeOffset的后面),重复步骤1~5,直至结构体为NULL(即最后一个结构体的TypeOffset为0时,后面连续有8个字节为0)

      在这里插入图片描述

      PEView.exe是一个分析PE文件的应用程序

      Upack(Ultimate PE压缩器)是一款PE文件的运行时压缩器

      Stud_PE是一款分析PE文件的应用软件:http://www.cgsoftlabs.ro

      可以用来捕获并显示系统中运行的进程输出的所有调试字符串:https://technet.microsoft.com/en-us

      一款功能强大的PE文件编辑工具,具有进程内存转储、PE文件头编辑、PE重建等功能,并wps的电脑版下载网址怎么找(wps下载电脑版怎么安装到桌面上)且支持插件,带有插件编写示例:http://petools.org

      提供多样化的功能,并且支持PE32+文件格式:https://ntcore.com,还提供PE编辑器、PE重建、RVA<–>RAW转换器、反汇编等综合功能。