过采样建模中遇到的问题

过采样建模中遇到的问题
过采样建模中遇到的问题
一、问题概述:
由于过采样建模中使用了SMOTE算法,因此需要计算距离,如果说原始数据中存在空值时,此时计算距离将报错,所以需要将原始数据的空值进行处理,这样才能保证SMOTE算法运行成功。
二、问题解决:
使用sklearn中的
from sklearn.preprocessing import Imputer
模块儿,可以快速对空值数据进行处理,此模块儿使用方式如下:
class sklearn.preprocessing.Imputer(missing_values=’NaN’, strategy=’mean’, axis=0, verbose=0, copy=True)
各个参数含义:
1.missing_values: integer or “NaN”, optional (default=”NaN”)
2.strategy : string, optional (default=”mean”)
     The imputation strategy.
     If “mean”, then replace missing values using the mean along the axis. 使用平均值代替
     If “median”, then replace missing values using the median along the axis.使用中值代替
     If “most_frequent”, then replace missing using the most frequent value along the axis.使用众数代替,也就是出现次数*多的数
      axis: 默认为 axis=0
      axis = 0, 按列处理
      aixs =1 , 按行处理
三、使用示例
#部分数据可能有空值,因此使用Imputer进行处理
from sklearn.preprocessing import Imputer
#必须初始化一个Imputer,参数可以修改
imp =Imputer(missing_values=”NaN”, strategy=”most_frequent”,axis=0 )
#将数据框df按照上述规则进行处理,处理后结果为df_train_tsf
df_train_tsf = imp.fit_transform(df)
注意点:Imputer只接受一个DF数据结构。

park.createDataFrame()报错

park.createDataFrame()报错
具体情况:将pandas中的DF转化为spark中的DF时报错,报错内容如下:
spark_df = spark.createDataFrame(target_users)
报错->>Can not merge type <class ‘pyspark.sql.types.DoubleType’> and <class ‘pyspark.sql.types.StringType’>
根本原因:并非数据类型不匹配,而是数据中存在空值,将空值进行填充后成功创建。

IOS 自动化测试

IOS 自动化测试

​一、测试背景概述
随着移动互联网时代的发展,移动终端的自动化测试日益活跃,总体来看在Android平台上的自动化工具和实践比较多,IOS的UI自动化测试由于系统封闭的原因,一直不太成熟。本着不侵入工程和拥抱原生的原则实现一套自动化测试方案。自动化测试节省时间节省真机的成本,而且更高效的覆盖所有的iOS机型测试,避免每次上线前重复的人工回归测试,保证每次上线的版本稳定运行。

 

二、iOS Appium 原理

经过调研使用Appium进行自动化测试,Appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web 应用和混合应用。

 

“移动原生应用”是指那些用 iOS 或者 Android SDK 写的应用。

 

“移动 web 应用”是指使用移动浏览器访问的应用(Appium 支持 iOS 上的 Safari 和 Android 上的 Chrome)。

 

“混合应用”是指原生代码封装网页视图——原生代码和 web 内容交互。比如,我们在微信里可以查看网页,可以通过网页应用买电影票等。

重要的是,Appium 是一个跨平台的工具:它允许测试人员在不同的平台(iOS,Android)使用同一套API来写自动化测试脚本,这样大大增加了 iOS 和 Android 测试套件间代码的复用性。

Appium优点

开源

跨架构:Native App、Hybird App、Web App

跨设备:Android、iOS、Firefox OS

不依赖源码

使用任何 WebDriver 兼容的语言来编写测试用例。比如 Java, Objective-C, JavaScript with Node.js (in both callback and yield-based flavours), PHP, Python, Ruby, C#, Clojure, 或者 Perl.

不需要重新编译APP

支持IOS手机录制视频

Appium理念

你无需为了自动化,而重新编译或者修改你的应用。

你不必局限于某种语言或者框架来写和运行测试脚本。

一个移动自动化的框架不应该在接口上重复造轮子。(移动自动化的接口应该统一)

无论是精神上,还是名义上,都必须开源。

1. iOS 9.3 系统之前自动化测试

架构图:

%title插图%num

​运行流程:

%title插图%num

1-1. Native 自动化

这是iOS 9.3 系统之前自动化测试的架构模式。通过 Android Appium 原理的学习 ,我们很容易理解 iOS Appium 原理:

Appium Client 端执行代码发送到 Appium Server端(Server 集成了苹果官方的 Instruments);Server 端将一行行代码翻译成一条条指令,同时在手机上注入 bootstrap.jar ;Server 与该 jar 包通信将指令传给 bootstrap.jar,jar 包调用手机里的自动化测试框架(UIAutomation),UIAutomation框架执行指令。

1-2. Hybrid(WebView)自动化

通过 Android Appium 原理的学习,Android 4.4 系统之后,Appium 支持使用 ChromeDriver 进行对 Hybrid 页面的自动化测试。那么 iOS 上是怎么做的呢?iOS 上早期苹果官方就一直提供 iOS webkit debug proxy(这是苹果官方自己开发的私有的通信协议),Appium 集成了该框架,通过它传递指令。

 

 

2. iOS 9.3 系统之后自动化测试

Appium 在 iOS 下工具的变革:

 

iOS 9 之前一直以 instruments 下的 UIAutomation为驱动底层技术(弊端由于 instruments 的限制,单台 mac 只能对应单台设备);

iOS 9.3 时代推出 XCUITest 工具,用以替代 UIAutomation;

iOS 10 时代苹果直接废弃了 UIAutomation、Facebook 推出 WebDriverAgent(实现的 server 能够支持单台 mac 对应多个设备);

Appium 在iOS 9.3 后全面采用 WebDriverAgent 的方案。

 

2-1. 关于 WebDriverAgent

 

FaceBook 出品:

实现了一个 server,通过 server 可以远程控制 iOS 设备:启动应用、关闭应用、点击、滚动等操作;

通过连接 XCTest.framework 调用苹果的 API 执行动作;

支持多个设备同时进行自动化;

Appium、Macaca 已经集成。

但是 WebDriverAgent 仅仅只提供了一个 server(和 inspect 进行元素定位),并没有像 Appium 一样提供 java 或 python 的 Client 端去写脚本,脚本执行的时候发送指令给 server,然后去运行。WebDriverAgent 要求你自己去实现 Client 端,即拿 Java/ Python 的 WebDriver 库进行封装,然后发送指令。所以 WebDriverAgent 其实就类似于 Appium server,就只是一个 server。

 

2-2. 关于 iOS 9.3 之后的 Appium 自动化架构模式
Appium 很粗暴的把整个 WebDriverAgent 直接集成到自己的项目里,然后通信机制就走 WebDriverAgent,Appium 其实就提供了一个 Client 端的作用。所以 iOS 9.3 系统之后自动化测试核心是 WebDriverAgent,Appium 就提供了一个 Client 端来写脚本和发送指令。

 

 

通过前面的学习,我们知道 Appium 自动化架构模式可以用一个抽象的架构表示,就是下面这样的:

%title插图%num

 

iOS 9.3以及之后的 Appium 自动化架构模式如下图所示:

%title插图%num

从图中可以看出:

 

Client 端是 Appium 之前本身提供的;

Server 端是:WebDriverAgent 和 Instruments;( Appium 直接把 WebDriverAgent 整个集成进来,Instruments 是为了支持 iOS 9.3 之前的系统)

*右边是一个手机

之前 Server 是和 bootstrap.jar 通信,这里 WebDriverAgent 提供了 WebDriverAgentRunner (类似 bootstrap.jar 的功能),WebDriverAgent与之通信;

WebDriverAgentRunner 是一个应用,Client 和 server 运行了之后,WebDriverAgentRunner 会被装到手机上,这个应用会接收来自 Server 的指令,并连接底层的 XCTest.framwork,并告诉 XCTest.framwork 操作手机进行自动化。

 

2-3. 必装的软件
Xcode、
command line tool、
libimobiledevice、
ios-deploy、
carthage、
WebDriverAgent、
Appium。
libimobiledevice / ideviceinstaller 库,相当于 android 的 adb,是 Appium 底层用到的工具之一,用于获取 iOS 设备信息。

​其常用命令如下:

查看当前所连接的设备

idevice_id -l # 显示当前所连接设备的 udid
instruments -s devices # 列出所有设备,包括真机、模拟器、mac
安装应用

ideviceinstaller -u [udid] -i [xxx.ipa] # xxx.ipa 为应用在本地的路径
卸载应用

ideviceinstaller -u [udid] -U [bundleId]
查看设备已安装的应用

ideviceinstaller -u [udid] -l # 查看设备安装的第三方应用
ideviceinstaller -u [udid] -l -o list_user # 同上,查看设备安装的第三方应用
ideviceinstaller -u [udid] -l -o list_system # 查看设备安装的系统应用
ideviceinstaller -u [udid] -l -o list_all # 查看设备安装的所有应用
获取设备信息

ideviceinfo -u [udid] # 获取设备信息
ideviceinfo -u [udid] -k DeviceName # 获取设备名称 同命令
idevicenameidevicename # 同上
ideviceinfo -u [udid] -k ProductVersion # 获取设备版本 10.3.3
ideviceinfo -u [udid] -k ProductType # 获取设备类型 iPhone 8,1
ideviceinfo -u [udid] -k ProductName # 获取设备系统名称
查看手机实时日志

idevicesyslog #屏幕上即可看见手机上所有的日志
idevicesyslog >> iphone.log & #重定向日志到文件中
获取手机端崩溃报告

 

idevicecrashreport # 参数可设置具体文件存放位置
截屏

idevicescreenshot #获取当前截屏,效率比appium截屏高10倍
其他系统文件信息

ideviceinfo # 获取设备所有信息
idevicesyslog # 获取设备日志
idevicecrashreport -e test # 获取设备
crashlog,test 是文件夹需新建
idevicediagnostics # 管理设备状态 – 重启、关机、睡眠等
ios-deploy 常用命令

ios-deploy -c # 查看当前链接的设备
ios-deploy –[xxx.app] # 安装APP
ios-deploy –id [udid] –uninstall_only –bundle_id [bundleId] # 卸载应用
ios-deploy –id [udid] –list_bundle_id # 查看所有应用
ios-deploy –id [udid] –exists –bundle_id # 查看应用是否安装
carthage,项目依赖管理,主要是 WebDriverAgent 使用,WebDriverAgent 是用它做项目依赖的

公司 iOS 项目也使用 carthage,类似于 java 的 maven;
ios-deploy、ideviceinstaller 类似 android 的 adb;

authroize-ios,iOS 授权工具,主要用于模拟器中一些权限的授权;

npm install -g authroze-iossudo authroze-ios

2-4. 安装 WebDriverAgent
1.从 FB 的 GitHub 上下载WebDriverAgent

http://github.com/facebook/WebDriverAgen
2.初始化项目

 

在 WebDriverAgent 目录下执行:./Scripts/bootstrap.sh
3.编译 WebDriverAgent

open WebDriverAgent.xcodeproj(会使用默认打开工具Xcode打开项目)。

修改 WebDriverAgent.lib 以及 WebDriverAgentRunner 这两个 target 下的 General 和 Build Settings列表(前者是在 mac 上运行的,后者是在手机上运行的)。

General 列表需要修改:签名 Signing 和 BundleId:签名 Signing:可以用个人免费开发者证书,用任意 AppleId 可申请;BundleId:之前 BundleId 是绑定了 FB team 的证书的,不能使用,所以要改一个新的。Build Settings列表需要修改 BundleId 和 上一步一样。

WebDriverAgentRunner 是在手机上运行的,要想在手机上安装,需要和上一步一样修改 General 和 Build Settings 列表。

手机上设置 – 通用 – 描述文件 里信任一下该证书。

Xcode – Product – Test,会安装 WebDriverAgentRunner 并启动 WebDriverAgent 这个 server。

 

4.替换 Appium 下的 WebDriverAgent:删除原 WebDriverAgent 文件夹,把编译好的 WebDriverAgent 放进去即可

 

如果用 npm 安装的目录在:cd /usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/;
如果用 desktop 安装的目录在:/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/)
WebDriverAgent配置示例:

%title插图%num

开发者账号类型:

%title插图%num

2-5. 开始跑脚本 Sample-Code
2-5-1. 准备 APP

 

这里我们需要将TestApp重新编译才能使用。

 

进入APP 其 xxx.xcodeproj 对应的目录,open WebDriverAgent.xcodeproj 打开项目。

修改该项目里 target 的 General 和 Build Settings列表(和上面一样);

通过 Xcode 编译运行。

或者通过 xcodebuild 命令通过命令行编译运行 xcodebuild -project TestApp.xcodeproj -target TestApp -sdk iphoneos10.3 -configurationdevelopment
2-5-2. 准备脚本

 

iOS 项目的 Desired_cap

Desired_caps:
{’platformName’:’iOS’,
‘platformVersion’:’10.3.3’,
‘devideName’:’iPhone 7 Plus’,
‘udid’:’’, #如果是真机的话必须提供‘app’:’~/appPath/app.app’, #app路径,如果只填bundleId,那就是通过id启动已有的App
}
iOS 的元素定位

Appium Desktop – Inspect (推荐)

Appium Desktop示例:

%title插图%num

WebDriverAgent – Inspector

 

app-Inspector示例:

 

%title插图%num

这里说说 Appium Desktop – Inspect 是怎么使用的。

 

打开并启动 Appium Desktop,点击软件右上角*个按钮 “ start inspector session”;

会出现弹窗,弹窗里配置好 Desired_caps。

定位方式推荐:AccessbilityId

注意:

webdriver.py 里只延展定义了针对移动端的 API,is_displayed()、.is_enabled()() 等这些 API 可以去看Appium的客户端库 WebDriver 即 Slenium 2 本身的。

WebDriver 本身的 API 详见:

http://selenium-python.readthedocs.io/api.html
Appium客户端库详见:

语言/框架 库地址
Ruby https://github.com/appium/ruby_lib
Python https://github.com/appium/python-client
Java https://github.com/appium/java-client
JavaScript(Nodejs) https://github.com/admc/wd
Objective C https://github.com/appium/selenium-objective-c
PHP https://github.com/appium/php-client
C#(.NET) https://github.com/appium/appium-dotnet-driver
RobotFramework https://github.com/jollychang/robotframework-appi

Scrapy框架——CrawlSpider介绍

Scrapy框架——CrawlSpider介绍
一、什么是CrawlSpider?
Scrapy框架中分两类爬虫:1.Spider类  2.CrawlSpider类
crawlspider是Spider的派生类(一个子类),CrawlSpider类定义了一些规则(rule)来提供跟进link(链接)的方便的机制,从爬取的网页中获取link并继续爬取的工作更适合。
二、为什么使用CrawlSpider?
1.针对有跟进机制的网页爬取非常方便
2.编写容易,只需要定义爬取url规则
三、如何使用CrawlSpider?
1.创建爬虫项目
scrapy startproject pcxm
2.编写主程序的.py文件
scrapy genspider -t crawl pcxm 域名
四、关键方法
1.LinkExtractors链接提取器:
使用LinkExtractors可以不用程序员自己提取想要的url,然后发送请求。这些工作都可以交给LinkExtractors,他会在所有爬的页面中找到满足规则的url,实现自动的爬取。
class scrapy.linkextractors.LinkExtractor(
    allow = (),
    deny = (),
    allow_domains = (),
    deny_domains = (),
    deny_extensions = None,
    restrict_xpaths = (),
    tags = (‘a’,’area’),
    attrs = (‘href’),
    canonicalize = True,
    unique = True,
    process_value = None
)
allow:允许的url。所有满足这个正则表达式的url都会被提取。【编写正则表达式】【重要】
deny:禁止的url。所有满足这个正则表达式的url都不会被提取。【编写正则表达式】
allow_domains:允许的域名。只有在这个里面指定的域名的url才会被提取。
deny_domains:禁止的域名。所有在这个里面指定的域名的url都不会被提取。
2.Rule规则类:
class scrapy.spiders.Rule(
    link_extractor,
    callback = None,
    cb_kwargs = None,
    follow = None,
    process_links = None,
    process_request = None
)
link_extractor:一个LinkExtractor对象,用于定义爬取规则。【重要】
callback:满足这个规则的url,应该要执行哪个回调函数。【重要】
follow:指定根据该规则从response中提取的链接是否需要跟进。【重要】
process_links:从link_extractor中获取到链接后会传递给这个函数,用来过滤不需要爬取的链接。

FTP协议是一种用于什么的协议

FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。复FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。

其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。在开发网站的时候,通常利用FTP协议把网页或程序传制到Web服务器上。此外,由于FTP传输效率非常高,在网络上传输大的文件时,一般也采用该协议。
%title插图%num

扩展资料
FTP协议的任务从一台计算机将文件传送到另一台计算机,它与这两台计算机所处的位置、联接的方式、甚至是是否使用相同的操作系统无关。假设两台计算机通过ftp协议对话,并且能访问Internet,

可以用ftp命令来传输文件。每种操作系统使用上有某一些细微差zd别,但是每种协议基本的命令结构是相同的。

 

FTP协议服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。在开发网站的时候,通常利用FTP协议把网页或程序传到Web服务器上。此外,由于FTP传输效率非常高,在网络上传输大的文件时,一般也采用该协议。

默认情况下FTP协议使用TCP端口中的 20和21这两个端口,其中20用于传输数据,21用于传输控制信息。

但是,是否使用20作为传输数据的端口与FTP使用的传输模式有关,如果采用主动模式,那么数据传输端口就是20;如果采用被动模式,则具体*终使用哪个端口要服务器端和客户端协商决定。

%title插图%num

扩展资料

工作方式

FTP支持两种模式,一种方式叫做Standard (也就是 PORT方式,主动方式),一种是 Passive(也就是PASV,被动方式)。 Standard模式 FTP的客户端发送 PORT 命令到FTP服务器。Passive模式FTP的客户端发送 PASV命令到 FTP Server。

下面介绍一个这两种方式的工作原理:

 

Port

FTP 客户端首先和FTP服务器的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。

在传送数据的时候,服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。

 

Passive

在建立控制通道的时候和Standard模式类似,但建立连接后发送的不是Port命令,而是e68a84e8a2ade799bee5baa6e997aee7ad9431333431336133Pasv命令。FTP服务器收到Pasv命令后,随机打开一个高端端口(端口号大于1024)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口;

然后FTP服务器将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接

FTP与SFTP的区别

在实际项目开发中*常使用的文件传输的方式有ftp和sftp两种,但是这两个传输方式各有什么特点呢?本文接下来将讨论SFTP、FTP的区别。

一、FTP协议

FTP是TCP/IP协议组中的协议之一,TP协议由两个部分组成:

FTP服务器(用来存储文件)
FTP客户端(用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源)

默认情况下FTP协议使用TCP端口中的20和21这两个端口。21端口用于传输控制信息,而是否使用20作为传输数据的端口与FTP使用的传输模式有关,如果采用被动模式则具体使用哪个端口要服务器端和客户端协商决定。FTP传输模式分为以下两种:

主动模式(Port)
被动模式(Passive)

1. 主动模式

1

FTP客户端首先和FTP服务器的TCP21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。

2. 被动模式

2

在建立控制通道与主动模式相似,但建立连接后是Pasv命令。FTP服务器收到Pasv命令后便随机打开一个高端端口(端口号大于1024)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,通过三次握手建立通道,然后FTP服务器将通过这个端口进行数据的传送。

注意:很多防火墙在设置的时候都是不允许接受外部发起的连接的,所以许多位于防火墙后或内网的FTP服务器不支持PASV模式,因为客户端无法穿过防火墙打开FTP服务器的高端端口;而许多内网的客户端不能用PORT模式登陆FTP服务器,因为从服务器的TCP 20无法和内部网络的客户端建立一个新的连接,造成无法工作。

二、SFTP协议

SFTP是SSH File Transfer Protocol的缩写,安全文件传送协议。SFTP与FTP有着几乎一样的语法和功能。SFTP为SSH的其中一部分,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP的安全文件信息传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接和答复操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。

三、两者的主要区别

FTP与SFTP两者有什么区别

链接方式:FTP使用TCP端口21上的控制连接建立连接。而,SFTP是在客户端和服务器之间通过SSH协议(TCP端口22)建立的安全连接来传输文件。
安全性:SFTP使用加密传输认证信息和传输的数据,所以使用SFTP相对于FTP是非常安全。
效率:SFTP这种传输方式使用了加密解密技术,所以传输效率比普通的FTP要低得多。

SFTP的概念

sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的其中一部分,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件信息传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接和答复操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。
这里我们用sftp来对远程服务器和本地电脑上文件进行上传,下载操作。

用法:

连接远程服务器:

sftp username@ip
  • 1

回车之后输入服务器密码即可连接成功。

将文件上传到服务器上:

put [本地文件的地址] [服务器上文件存储的位置]
  • 1

将服务器上的文件下载到本地:

get [服务器上文件存储的位置] [本地要存储的位置]