[金融]决策科学-(一)编程工具

P粉084495128
发布: 2025-08-01 09:40:46
原创
268人浏览过
智能金融之决策科学篇,第一章 编程工具,涵盖金融数据科学常用SQL、SAS、Python、Linux、Excel、Julia、PaddlePaddle,助力全面打通数据>分析>模型>算法。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

[金融]决策科学-(一)编程工具 - php中文网

1.1 SQL

  • 1.1.1 SQL简介
  • 1.1.2 SQL 能做什么
  • 1.1.3 SQL 语法
    • 1.1.3.1 数据库表
    • 1.1.3.2 SQL大小写
    • 1.1.3.3 SQL语句分号
    • 1.1.3.4 SQL拆解
  • 1.1.4 SQL 快速参考
  • 1.1.5 SQL书籍
  • 1.1.6 SQL语句规范

1.1.1 SQL简介

SQL 是用于访问和处理数据库的标准的计算机语言。

  • SQL,指结构化查询语言,全称是 Structured Query Language。
  • SQL 让您可以访问和处理数据库。
  • SQL 是一种 ANSI(American National Standards Institute 美国国家标准化组织)标准的计算机语言。

1.1.2 SQL 能做什么

  • SQL 面向数据库执行查询
  • SQL 可从数据库取回数据
  • SQL 可在数据库中插入新的记录
  • SQL 可更新数据库中的数据
  • SQL 可从数据库删除记录
  • SQL 可创建新数据库
  • SQL 可在数据库中创建新表
  • SQL 可在数据库中创建存储过程
  • SQL 可在数据库中创建视图
  • SQL 可以设置表、存储过程和视图的权限

1.1.3 SQL 语法

1.1.3.1 数据库表

一个数据库通常包含一个或多个表。每个表有一个名字标识(例如:"Websites"),表包含带有数据的记录(行)。 在本教程中,我们在 MySQL 的 RUNOOB 数据库中创建了 Websites 表,用于存储网站记录。 我们可以通过以下命令查看 "Websites" 表的数据:

mysql> use RUNOOB;
Database changed

mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM Websites;
+----+--------------+---------------------------+-------+---------+
| id | name         | url                       | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1  | Google       | https://www.google.cm/    | 1     | USA     |
| 2  | 淘宝          | https://www.taobao.com/   | 13    | CN      |
| 3  | 菜鸟教程      | http://www.runoob.com/    | 4689  | CN      |
| 4  | 微博          | http://weibo.com/         | 20    | CN      |
| 5  | Facebook     | https://www.facebook.com/ | 3     | USA     |
+----+--------------+---------------------------+-------+---------+5 rows in set (0.01 sec)
登录后复制
  • use RUNOOB; 命令用于选择数据库;
  • set names utf8; 命令用于设置使用的字符集;
  • SELECT * FROM Websites; 读取数据表的信息;
  • 上面的表包含五条记录(每一条对应一个网站信息)和5个列(id、name、url、alexa 和country);

1.1.3.2 SQL大小写

SQL 对大小写不敏感:SELECT 与 select 是相同的;

1.1.3.3 SQL语句分号

某些数据库系统要求在每条 SQL 语句的末端使用分号。分号是在数据库系统中分隔每条 SQL 语句的标准方法,这样就可以在对服务器的相同请求中执行一条以上的 SQL 语句。

立即进入豆包AI人工智官网入口”;

立即学习豆包AI人工智能在线问答入口”;

1.1.3.4 SQL拆解

结构化查询语言SQL包含6个部分:

(1)数据查询语言(DQL:Data Query Language) 其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其它类型的SQL语句一起使用。

(2)数据操作语言(DML:Data Manipulation Language) 其语句包括动词INSERT、UPDATE和DELETE。它们分别用于添加、修改和删除,

(3)事务控制语言(TCL) 它的语句能确保被DML语句影响的表的所有行及时得以更新。包括COMMIT(提交)命令、SAVEPOINT(保存点)命令、ROLLBACK(回滚)命令。

(4)数据控制语言(DCL) 它的语句通过GRANT或REVOKE实现权限控制,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问,

(5)数据定义语言(DDL) 其语句包括动词CREATE,ALTER和DROP。在数据库中创建新表或修改、删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。

(6)指针控制语言(CCL) 它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作。

最主要的, SQL (结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。 查询和更新指令构成了 SQL 的 DML 部分:

  • SELECT - 从数据库表中获取数据
  • UPDATE - 更新数据库表中的数据
  • DELETE - 从数据库表中删除数据
  • INSERT INTO - 向数据库表中插入数据

SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。 SQL 中最重要的 DDL 语句:

  • CREATE DATABASE - 创建新数据库
  • ALTER DATABASE - 修改数据库
  • CREATE TABLE - 创建新表
  • ALTER TABLE - 变更(改变)数据库表
  • DROP TABLE - 删除表
  • CREATE INDEX - 创建索引(搜索键)
  • DROP INDEX - 删除索引

1.1.4 SQL 快速参考

SQL 语句 语法
AND / OR SELECT column_name(s) FROM table_name WHERE condition AND/OR condition
ALTER TABLE ALTER TABLE table_name  ADD column_name datatypeorALTER TABLE table_name  DROP COLUMN column_name
AS (alias) SELECT column_name AS column_alias FROM table_nameorSELECT column_name FROM table_name AS table_alias
BETWEEN SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2
CREATE DATABASE CREATE DATABASE database_name
CREATE TABLE CREATE TABLE table_name ( column_name1 data_type, column_name2 data_type, column_name2 data_type, ... )
CREATE INDEX CREATE INDEX index_name ON table_name (column_name)orCREATE UNIQUE INDEX index_name ON table_name (column_name)
CREATE VIEW CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition
DELETE DELETE FROM table_name WHERE some_column=some_valueorDELETE FROM table_name  (**Note:** Deletes the entire table!!)DELETE * FROM table_name  (**Note:** Deletes the entire table!!)
DROP DATABASE DROP DATABASE database_name
DROP INDEX DROP INDEX table_name.index_name (SQL Server) DROP INDEX index_name ON table_name (MS Access) DROP INDEX index_name (DB2/Oracle) ALTER TABLE table_name DROP INDEX index_name (MySQL)
DROP TABLE DROP TABLE table_name
GROUP BY SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name
HAVING SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name HAVING aggregate_function(column_name) operator value
IN SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,..)
INSERT INTO INSERT INTO table_name VALUES (value1, value2, value3,....)_or_INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,....)
INNER JOIN SELECT column_name(s) FROM table_name1 INNER JOIN table_name2  ON table_name1.column_name=table_name2.column_name
LEFT JOIN SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2  ON table_name1.column_name=table_name2.column_name
RIGHT JOIN SELECT column_name(s) FROM table_name1 RIGHT JOIN table_name2  ON table_name1.column_name=table_name2.column_name
FULL JOIN SELECT column_name(s) FROM table_name1 FULL JOIN table_name2  ON table_name1.column_name=table_name2.column_name
LIKE SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern
ORDER BY SELECT column_name(s) FROM table_name ORDER BY column_name [ASC/DESC]
SELECT SELECT column_name(s) FROM table_name
SELECT * SELECT * FROM table_name
SELECT DISTINCT SELECT DISTINCT column_name(s) FROM table_name
SELECT INTO SELECT _ INTO new_table_name [IN externaldatabase] FROM old_table_name_or*SELECT column_name(s) INTO new_table_name [IN externaldatabase] FROM old_table_name
SELECT TOP SELECT TOP number|percent column_name(s) FROM table_name
TRUNCATE TABLE TRUNCATE TABLE table_name
UNION SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2
UNION ALL SELECT column_name(s) FROM table_name1 UNION ALL SELECT column_name(s) FROM table_name2
UPDATE UPDATE table_name SET column1=value, column2=value,... WHERE some_column=some_value
WHERE SELECT column_name(s) FROM table_name WHERE column_name operator value

1.1.5 SQL书籍

  • 《数据库系统概论(第四版)王珊等》

1.1.6 SQL语句规范

参考《Java开发手册(阿里巴巴)-MySQL数据库- SQL语句》

(1)【强制】不要使用 count(列名)或 count(常量)来替代 count(),count()是 SQL92 定义的标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。说明:count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行。

(2)【强制】count(distinct col) 计算该列除 NULL 之外的不重复行数,注意 count(distinct col1, col2) 如果其中一列全为 NULL,那么即使另一列有不同的值,也返回为 0。

(3)【强制】当某一列的值全是 NULL 时,count(col)的返回结果为 0,但 sum(col)的返回结果为NULL,因此使用 sum()时需注意 NPE 问题。 正例:可以使用如下方式来避免 sum 的 NPE 问题:SELECT IFNULL(SUM(column), 0) FROM table;

(4)【强制】使用 ISNULL()来判断是否为 NULL 值。 说明:NULL 与任何值的直接比较都为 NULL。 1) NULL<>NULL 的返回结果是 NULL,而不是 false。 2) NULL=NULL 的返回结果是 NULL,而不是 true。 3) NULL<>1 的返回结果是 NULL,而不是 true。 反例:在 SQL 语句中,如果在 null 前换行,影响可读性。select * from table where column1 is null and column3 is not null; 而ISNULL(column)是一个整体,简洁易懂。从性能数据上分析,ISNULL(column)执行效率更快一些。

(5)【强制】代码中写分页查询逻辑时,若 count 为 0 应直接返回,避免执行后面的分页语句。

(6)【强制】不得使用外键与级联,一切外键概念必须在应用层解决。 说明:(概念解释)学生表中的 student_id 是主键,那么成绩表中的 student_id 则为外键。如果更新学生表中的 student_id,同时触发成绩表中的 student_id 更新,即为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。

(7)【强制】禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。

(8)【强制】数据订正(特别是删除或修改记录操作)时,要先 select,避免出现误删除,确认无误才能执行更新语句。

(9)【强制】对于数据库中表记录的查询和变更,只要涉及多个表,都需要在列名前加表的别名(或表名)进行限定。 说明:对多表进行查询记录、更新记录、删除记录时,如果对操作列没有限定表的别名(或表名),并且操作列在多个表中存在时,就会抛异常。 正例:select t1.name from table_first as t1 , table_second as t2 where t1.id=t2.id; 反例:在某业务中,由于多表关联查询语句没有加表的别名(或表名)的限制,正常运行两年后,最近在某个表中增加一个同名字段,在预发布环境做数据库变更后,线上查询语句出现出 1052 异常:Column 'name' in field list is ambiguous。

(10)【推荐】SQL 语句中表的别名前加 as,并且以 t1、t2、t3、...的顺序依次命名。 说明:1)别名可以是表的简称,或者是根据表出现的顺序,以 t1、t2、t3 的方式命名。2)别名前加 as 使别名更容易识别。 正例:select t1.name from table_first as t1, table_second as t2 where t1.id=t2.id;

(11)【推荐】in 操作能避免则避免,若实在避免不了,需要仔细评估 in 后边的集合元素数量,控制在 1000 个之内。

(12)【参考】因国际化需要,所有的字符存储与表示,均采用 utf8 字符集,那么字符计数方法需要注意。 说明: SELECT LENGTH("轻松工作"); 返回为 12 SELECT CHARACTER_LENGTH("轻松工作"); 返回为 4 如果需要存储表情,那么选择 utf8mb4 来进行存储,注意它与 utf8 编码的区别。

(13)【参考】TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少,但 TRUNCATE无事务且不触发 trigger,有可能造成事故,故不建议在开发代码中使用此语句。 说明:TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同。

全文目录


1.2 SAS

  • 1.2.1 SAS之禅
  • 1.2.2 SAS教程
    • 1.2.2.1 SAS基础
    • 1.2.2.2 SAS拼表
    • 1.2.2.3 SQL应用
    • 1.2.2.4 PROC步
    • 1.2.2.5 SAS进阶
    • 1.2.2.6 SAS宏
  • 1.2.3 SAS书籍
  • 1.2.4 SAS Help使⽤
    • 1.2.4.1 通篇阅读
    • 1.2.4.2 关键字搜索
    • 1.2.4.3 归纳体系
    • 1.2.4.4 总结
  • 1.2.5 SAS IDE
    • 1.2.5.1 SAS-BASE
    • 1.2.5.2 SAS-EG
    • 1.2.5.3 SAS-EM
    • 1.2.5.4 SAS-University
  • 1.2.6 SAS代码规范
  • 1.2.7 SAS⽚段
    • ~逻辑库链接(仅作示例)
    • ~格式刷
    • ~程序休眠
    • ~条件构建宏
    • ~FTP下载/上传文件
    • ~月度循环
    • ~DO OVER
    • ~格式化加强理解
    • ~PROC SUMMARY
    • ~哈希表HASH连接
    • ~排列组合
    • ~Lift提升度
    • ~PROC SQL
    • ~SAS绘图
    • ~自制数据集
    • ~宏变量工厂
    • ~判断表是否存在
    • ~KS计算
    • ~批量SQL(宏)
  • 1.2.8 SAS编译

1.2.1 SAS之禅

简于理解,精于效率。

1.2.2 SAS教程

  • 第1课 SAS基础入门
  • 第2课 SAS拼表
  • 第3课 SQL应用
  • 第4课 PROC步
  • 第5课 SAS进阶
  • 第6课 SAS数据清洗
  • 第7课 SAS宏 教程为2019.03课程原稿,相对入门,可用以温故知新。

以下摘要之:

1.2.2.1 SAS基础

OPTIONS COMPRESS = YES;/*	libname ana "";*/DATA A;SET SASHELP.CARS;RUN;DATA A;SET SASHELP.CARS;
MSRP1 = MSRP + 1;RUN;DATA A;KEEP MSRP1;SET SASHELP.CARS;
MSRP1 = MSRP + 1;RUN;DATA B;FORMAT MSRP2 $20.;SET A;/* IF MSRP1 > 30000 THEN MSRP2 = "DAYU3W"; *//* ELSE MSRP2 = "XIAOYU1000"; */IF MSRP1 > 30000 THEN MSRP2 = "DAYU3W";ELSE IF MSRP1 > 1000 THEN MSRP2 = "DAYU3W<1000";ELSE IF MSRP1 > 200 THEN MSRP2 = "DAYU3W<200";ELSE MSRP2 = "XIAOYU1000";RUN;DATA A;KEEP MSRP1;SET SASHELP.CARS;
MSRP1 = MSRP + 1;IF MSRP1 > 50000; 
RUN;DATA A;KEEP MSRP1;SET SASHELP.CARS;
MSRP1 = MSRP + 1;WHERE MSRP1 > 50000; 
RUN;DATA C;KEEP MSRP1 MSRP2;SET SASHELP.CARS;
MSRP1 = MSRP + 1;IF MSRP1 > 50000; 
IF MSRP1 > 60000 THEN MSRP2 = ">";ELSE MSRP2 = "<";RUN;/* IF SUBSTR(A,1,1) = "1" *//* IF SUBSTR(A,1,1) = "1" OR SUBSTR(A,1,1) = "2" *//* IF SUBSTR(A,1,1) = "1" AND MSRP1 > 60000 *//* IF SUBSTR(A,1,1) IN ("1", "2") *//* IF SUBSTR(A,1,1) NOT IN ("1", "2") *//* "1" *//* "2" *//* "3" */DATA D;SET C C;RUN;PROC SORT DATA = D;BY MSRP2 MSRP1;RUN;PROC FREQ DATA = D;TABLE MSRP2 * MSRP1;RUN;
登录后复制

1.2.2.2 SAS拼表

OPTIONS COMPRESS = YES;DATA TEST_X1;INPUT NAME $ PRODUCT $ TYPE $;CARDS;
A CAR 40
B CAR 42
C BUS 44
D MOTO 9
E BUS 10
;RUN;DATA TEST_X2;INPUT NAME $ PRODUCT $ TYPE $;CARDS;
A CAR 40
C CAR 42
B BUS 44
H MOTO 9
J BUS 10
;RUN;DATA TEST_Y;INPUT NAME $ NPRODUCT $ NTYPE $;CARDS;
A APPLE 38
B BANANA 42
C CAT 44
D DOG 9
E EGG 10
;RUN;DATA TEST_Z;INPUT NAME $ NPRODUCT $ NTYPE $;CARDS;
A APPLE 38
A BANANA 42
B CAT 44
B DOG 9
B EGG 10
;RUN;DATA A1_1;SET TEST_X1 TEST_X2;RUN;DATA A1_2;SET TEST_X1 TEST_Y;RUN;DATA A1_3;SET TEST_X1 TEST_Y(RENAME=(NPRODUCT=PRODUCT NTYPE=TYPE));RUN;/* DATA t3; *//* MERGE t1(IN=A) t2(IN=B); *//* BY n1; *//* IF A; *//* IF B; *//* RUN; */PROC SORT DATA = TEST_X2;BY NAME;RUN;PROC SORT DATA = TEST_Y;BY NAME;RUN;PROC SORT DATA = TEST_Z;BY NAME;RUN;DATA A2;MERGE TEST_X2(IN=A) TEST_Y(IN=B);BY NAME;IF A;RUN;DATA A2_1;MERGE TEST_X2(IN=A) TEST_Y(IN=B);BY NAME;IF NOT A;RUN;DATA A3;MERGE TEST_X2(IN=A) TEST_Y(IN=B);BY NAME;IF B;RUN;DATA A4;MERGE TEST_X2(IN=A) TEST_Y(IN=B);BY NAME;IF A AND B;RUN;DATA A5;MERGE TEST_X2(IN=A) TEST_Y(IN=B);BY NAME;RUN;DATA A51;MERGE TEST_X2(IN=A) TEST_Y(IN=B);BY NAME;IF A OR B;RUN;DATA A6;MERGE TEST_X2(IN=A) TEST_Y(IN=B);BY NAME;IF A;RUN;DATA A7;MERGE TEST_X2(IN=A) TEST_Z(IN=B);BY NAME;IF A;RUN;
登录后复制

1.2.2.3 SQL应用

OPTIONS COMPRESS = YES;/* CREATE */PROC SQL;CREATE TABLE TCUSTR(
    CUSTR_NBR VARCHAR(18),
    SEX INT
);QUIT;/* INSERT */PROC SQL;INSERT INTO TCUSTR(CUSTR_NBR, SEX)
    VALUES("440101200109090011", 1)
    VALUES("360101199901010012", 0);QUIT;/* DELETE */PROC SQL;DELETE FROM TCUSTR WHERE CUSTR_NBR = "440101200109090011";QUIT;/* UPDATE */PROC SQL;UPDATE TCUSTR SET SEX = 1 WHERE CUSTR_NBR = "360101199901010012";QUIT;/* SELECT */PROC SQL;SELECT * 
FROM SASHELP.CARS;QUIT;PROC SQL;SELECT * 
FROM SASHELP.CARS 
WHERE MAKE = "Acura";QUIT;PROC SQL;SELECT MAKE, MSRPFROM SASHELP.CARS 
WHERE MAKE = "Acura";QUIT;/* SQL FUNC */PROC SQL;SELECT 
    COUNT(MSRP),    SUM(MSRP),    MAX(MSRP),    MIN(MSRP),
    AVG(MSRP)FROM SASHELP.CARS 
WHERE MAKE = "Acura";QUIT;PROC SQL;SELECT 
    COUNT(MSRP) AS CNT_MSRP,    SUM(MSRP) AS SUM_MSRP,    MAX(MSRP) AS MAX_MSRP,    MIN(MSRP) AS MIN_MSRP,
    AVG(MSRP) AS AVG_MSRPFROM SASHELP.CARS 
WHERE MAKE = "Acura";QUIT;/* GROUP BY */PROC SQL;SELECT 
    MAKE,
    COUNT(MSRP) AS CNT_MSRP,    SUM(MSRP) AS SUM_MSRP,    MAX(MSRP) AS MAX_MSRP,    MIN(MSRP) AS MIN_MSRP,
    AVG(MSRP) AS AVG_MSRPFROM SASHELP.CARSGROUP BY MAKE;QUIT;/* ORDER BY */PROC SQL;SELECT 
    MAKE,
    COUNT(MSRP) AS CNT_MSRP,    SUM(MSRP) AS SUM_MSRP,    MAX(MSRP) AS MAX_MSRP,    MIN(MSRP) AS MIN_MSRP,
    AVG(MSRP) AS AVG_MSRP 
FROM SASHELP.CARSGROUP BY MAKEORDER BY CNT_MSRP;QUIT;/* WHERE */PROC SQL;SELECT 
    MAKE,
    COUNT(MSRP) AS CNT_MSRP,    SUM(MSRP) AS SUM_MSRP,    MAX(MSRP) AS MAX_MSRP,    MIN(MSRP) AS MIN_MSRP,
    AVG(MSRP) AS AVG_MSRPFROM SASHELP.CARSWHERE MAKE ^= "Acura"GROUP BY MAKEORDER BY CNT_MSRP;QUIT;/* HAVING */PROC SQL;SELECT 
    MAKE,
    COUNT(MSRP) AS CNT_MSRP,    SUM(MSRP) AS SUM_MSRP,    MAX(MSRP) AS MAX_MSRP,    MIN(MSRP) AS MIN_MSRP,
    AVG(MSRP) AS AVG_MSRPFROM SASHELP.CARS 
WHERE MAKE ^= "Acura"GROUP BY MAKEHAVING CNT_MSRP > 5ORDER BY CNT_MSRP;QUIT;/* CREATE TABLE */PROC SQL;CREATE TABLE CARS_GROUP AS SELECT 
    MAKE,
    COUNT(MSRP) AS CNT_MSRP,    SUM(MSRP) AS SUM_MSRP,    MAX(MSRP) AS MAX_MSRP,    MIN(MSRP) AS MIN_MSRP,
    AVG(MSRP) AS AVG_MSRPFROM SASHELP.CARS 
WHERE MAKE ^= "Acura"GROUP BY MAKEHAVING CNT_MSRP > 5ORDER BY CNT_MSRP;QUIT;/* CASE WHEN */PROC SQL;CREATE TABLE CARS_GROUP AS SELECT 
    MAKE,    SUM(CASE WHEN ENGINESIZE > 3 THEN MSRP ELSE 0 END) AS SUM_MSRPFROM SASHELP.CARS 
GROUP BY MAKE;QUIT;
登录后复制

1.2.2.4 PROC步

OPTIONS COMPRESS = YES;DATA CARS;SET SASHELP.CARS;RUN;/* PROC SORT */PROC SORT DATA = SASHELP.CARS;BY MSRP;RUN;PROC SORT DATA = SASHELP.CARS OUT = CARS_MSRP;BY DESCENDING MSRP;RUN;PROC SORT DATA = SASHELP.CARS OUT = CARS_MAKE;BY MAKE;RUN;DATA CARS_DUP;KEEP TYPE ORIGIN DRIVETRAIN;SET SASHELP.CARS;RUN;PROC SORT DATA = CARS_DUP OUT = CARS_NDK NODUPKEY;BY TYPE ORIGIN;RUN;PROC SORT DATA = CARS_DUP OUT = CARS_NQK NOUNIQUEKEY;BY TYPE ORIGIN;RUN;PROC SORT DATA = CARS_DUP OUT = CARS_ND NODUP;BY TYPE ORIGIN;RUN;/* PROC FREQ */PROC FREQ DATA = CARS NOPRINT;TABLE DRIVETRAIN/OUT=CARS_FREQ;RUN;PROC FREQ DATA = CARS;TABLE DRIVETRAIN * ORIGIN/NOCOL NOROW NOPERCENT MISSING;RUN;PROC FREQ DATA = CARS;TABLE ORIGIN * DRIVETRAIN/NOCOL NOROW NOPERCENT MISSING;RUN;PROC FREQ DATA = CARS;TABLE DRIVETRAIN * ORIGIN;WHERE TYPE = "SUV";RUN;PROC FREQ DATA = CARS;TABLE TYPE * DRIVETRAIN * ORIGIN;RUN;PROC FREQ DATA = CARS;TABLE (TYPE DRIVETRAIN) * ORIGIN;/*	TABLE TYPE * ORIGIN;*//*	TABLE DRIVETRAIN * ORIGIN;*/RUN;/*	PROC SORT DATA = ;*//*	BY ;*//*	RUN;*//*	PROC FREQ DATA = ;*//*	TABLE ;*//*	RUN;*//*	PROC UNIVARIATE DATA = ;*//*	VAR ;*//*	RUN;*//* PROC UNIVARIATE */PROC UNIVARIATE DATA = CARS;
VAR MSRP;RUN;PROC UNIVARIATE DATA = CARS;
VAR MAKE;RUN;PROC UNIVARIATE DATA = CARS;
VAR MSRP;
CLASS MAKE;RUN;/* PROC TRANSPOSE */DATA CARS_MAMS;KEEP MAKE TYPE MSRP;SET SASHELP.CARS;RUN;PROC SORT DATA = CARS_MAMS OUT = CARS_MAMSD NODUPKEY;BY MAKE TYPE;RUN;PROC TRANSPOSE DATA = CARS_MAMSD;
VAR MSRP;BY MAKE;RUN;PROC TRANSPOSE DATA = CARS_MAMSD OUT=CARS_M PREFIX=ID_;
VAR MSRP;BY MAKE;
ID TYPE;RUN;/* PROC SURVEYSELECT */PROC SURVEYSELECT 
    DATA=CARS_MAMS METHOD=SRS N=3 
    OUT=CARS_SRS_N3;RUN;PROC SURVEYSELECT 
    DATA=CARS_MAMS METHOD=SRS SAMPRATE=0.1 
    OUT=CARS_SRS_P1;RUN;PROC SURVEYSELECT 
    DATA=CARS_MAMS METHOD=SRS SAMPRATE=0.1 
    OUT=CARS_SRS_N1;
STRATA MAKE;RUN;
登录后复制

1.2.2.5 SAS进阶

OPTIONS COMPRESS = YES;DATA CARS;KEEP MAKE MSRP; 
SET SASHELP.CARS;RUN;PROC SORT DATA = CARS OUT = CARS_MSRP;BY DESCENDING MSRP;RUN;PROC FREQ DATA = CARS_MSRP NOPRINT;TABLE MAKE/OUT = CARS_FMAKE;RUN;/* SAS FORMAT */DATA DEMOY;INPUT NAME $11. BIRTH HEIGHT;INFORMAT BIRTH YYMMDD10. HEIGHT 5.1;CARDS;
LIXIAO      1959/10/21 170.5 
WANGMING    1992/02/21 177.8
;RUN;/*1960/01/01*//*1991/10/21 11616 *//*1991/10/23 11618 */DATA DEMON;INPUT NAME $11. BIRTH $11. HEIGHT;CARDS;
LIXIAO      1991/10/21 170.5
WANGMING    1992/02/21 177.8
;RUN;DATA DDATE;
SDATE = "01JAN2018"D;
F1DATE = SDATE;
F2DATE = SDATE;
F3DATE = SDATE;RUN;DATA DDATE;
SDATE = "01JAN2018"D;FORMAT F1DATE YYMMDD10. F2DATE YYMMDD8. F3DATE YYMMDD6.;
F1DATE = SDATE;
F2DATE = SDATE;
F3DATE = SDATE;RUN;/* SAS DATE */DATA SASDATE;
SDATE = "21DEC2018"D;
STIME = "09:39:00"T;
SDATETIME = "21DEC2018 09:39:00"DT;RUN;DATA SASDATE_TR;
SDATE = "21DEC2018"D;
STIME = "09:39:00"T;
SDATETIME = "21DEC2018 09:39:00"DT;FORMAT F1DATE YYMMDD10. F2DATE YYMMDD8. FTIME TIME10. FDATETIME DATETIME20.;
F1DATE = SDATE;
F2DATE = SDATE;
FTIME = STIME;
FDATETIME = SDATETIME;RUN;/* INTNX */DATA DINTNX;
SDATE = "01JAN2018"D;FORMAT FDATE SDATED SDATEM SDATEY YYMMDD10.;
FDATE = SDATE;
SDATED = INTNX("DAY", SDATE, 1);
SDATEM = INTNX("MONTH", SDATE, 1); 
SDATEY = INTNX("YEAR", SDATE, 1);RUN;DATA DINTNXN;
SDATE = "02JAN2018"D;FORMAT FDATE SDATEMB SDATEMM SDATEME SDATEMS YYMMDD10.;
FDATE = SDATE;
SDATEMB = INTNX("MONTH", SDATE, 1, "B");
SDATEMM = INTNX("MONTH", SDATE, 1, "M"); 
SDATEME = INTNX("MONTH", SDATE, 1, "E");
SDATEMS = INTNX("MONTH", SDATE, 1, "S");RUN;DATA DINTNXN;
SDATE = "02JAN2018"D;FORMAT FDATE SDATEMB SDATEMM SDATEME SDATEMS YYMMDD10.;
FDATE = SDATE;
SDATEMB = INTNX("YEAR", SDATE, 1, "B");
SDATEMM = INTNX("YEAR", SDATE, 1, "M"); 
SDATEME = INTNX("YEAR", SDATE, 1, "E");
SDATEMS = INTNX("YEAR", SDATE, 1, "S");RUN;/* INTCK */DATA DINTCK;
SDATE_M11 = "01DEC2018"D;
SDATE_M12 = "05NOV2018"D;
GAP_DAYS = INTCK("DAY", SDATE_M12, SDATE_M11);
GAP_MONS = INTCK("MONTH", SDATE_M12, SDATE_M11);RUN;/* PUT INPUT */DATA DPUT;
DATE18 = 20181221;
DATEP18 = PUT(DATE18, $8.);RUN;DATA DPUT;
DATE18 = 20181221;
DATEP18 = PUT(DATE18, $8.);
DATEI18 = INPUT(DATEP18, YYMMDD8.);/*	DATEI18 = INPUT(PUT(DATE18, $8.), YYMMDD8.);*/DATEPN18 = PUT(DATEI18, YYMMDDN8.);
DATEIN18 = INPUT(DATEPN18, 8.);RUN;
登录后复制

1.2.2.6 SAS宏

OPTIONS COMPRESS = YES;DATA CARS;KEEP MAKE MODEL MSRP;SET SASHELP.CARS;RUN;DATA DVAR01;SET CARS;WHERE MAKE = "BMW";RUN;DATA DVAR02;SET CARS;WHERE MAKE = "BMW";RUN;DATA DVAR03;SET CARS;WHERE MAKE = "BMW";RUN;%LET VAR1 = BMW;DATA DVAR01;SET CARS;WHERE MAKE = "&VAR1.";RUN;DATA DVAR02;SET CARS;WHERE MAKE = "&VAR1.";RUN;DATA DVAR03;SET CARS;WHERE MAKE = "&VAR1.";RUN;/* ... */%PUT &VAR1.;/* Acura *//* BMW */%LET VAR1 = BMW;DATA DVAR01;SET CARS;WHERE MAKE = "&VAR1.";RUN;/* 1 */%LET VAR1 = Acura;/*	%PUT &VAR1.;*/DATA DVAR1;SET CARS;WHERE MAKE = "&VAR1.";RUN;/* 2 */DATA _NULL_;CALL SYMPUT("VAR2", "Acura");RUN;/* %PUT &VAR2.; */DATA DVAR2;SET CARS;WHERE MAKE = "&VAR2.";RUN;/* 3 *//*	PROC SQL NOPRINT;*//*	SELECT MAKE INTO: VAR3 *//*	FROM CARS;*//*	QUIT;*//*	PROC SQL NOPRINT;*//*	SELECT MAX(MAKE) INTO :VAR3 *//*	FROM CARS;*//*	QUIT;*/PROC SQL NOPRINT;SELECT MAX(MAKE),MIN(MSRP) INTO :VAR3, :VAR4 
FROM CARS;QUIT;%PUT &VAR3. &VAR4.;DATA DVAR3;SET CARS;WHERE MAKE = "&VAR3.";RUN;%MACRO T1;    DATA A;    RUN;
    %MEND T1;%T1;%MACRO T2(V=,);    %PUT &V.;
    DATA DVAR_&V.;    SET CARS;    WHERE MAKE = "&V.";    /* 100H */    RUN;%MEND T2;%T2(V=BMW);/*	%PUT &V.;*/%T2(V=Acura);/*	%PUT &V.;*/%LET M = BMW;%MACRO T3(V=,);    %PUT &V.;    %IF &V.= &M. %THEN %DO;        DATA DVAR_&V.;        SET CARS;        WHERE MAKE = "&V.";        /* 100H */        RUN;
        /*			...*/
    %END;    %ELSE %DO;        DATA DVAR_&V.;        SET CARS;        WHERE MAKE = "&V." AND MSRP > 50000;        /* 100H */        RUN;
        /*			...*/
    %END;%MEND T3;%T3(V=BMW);%T3(V=Acura);/*	DATA A1;*//*	SET A;*//*	IF MSRP > 100 THEN A1 = 1;*//**//*	IF MSRP > 100 THEN DO;*//*		A1 = 1;*//*		A2 = 1;*//*	END;*//*	RUN;*/DATA A;DO I = 1 TO 10;
T = I + 2;OUTPUT;END;RUN;%MACRO T4(V=,);    %PUT &V.;    %DO I = 0 %TO &V.;        DATA A_&I.;        /*			SET ACCT;*/
        /*			WHERE MONTH = &I.; */        RUN;
    %END;%MEND T4;%T4(V=10);%T4(V=2);%MACRO T5(V=,);    %PUT &V.;
    DATA MSRP;    SET CARS;    %DO I = 0 %TO &V.;    	IF MSRP > &I.*10000 THEN A&I. = 1;ELSE A&I. = 0;    %END;    RUN;%MEND T5;%T5(V=10);/*EVAL*/%LET S = 1;%LET I = 10;%PUT &S. &I.;%LET S = &S. + &I.;%PUT &S. &I.;%LET S = 1;%LET I = 10;%LET S = %EVAL(&S. + &I.);%PUT &S. &I.;
登录后复制

1.2.3 SAS书籍

《Learning SAS by Example: A Programmer's Guide》

《SAS编程技术教程(朱世武)》

《SAS编程与数据挖掘商业案例》

《SAS语言抛砖引玉》

《The Little SAS Book》

SAS Help and Documentation

1.2.4 SAS Help使⽤

[金融]决策科学-(一)编程工具 - php中文网

如上SAS书籍,专门强调了SAS Help and Documentation的重要性。 使用方法也有很多:

1.2.4.1 通篇阅读

相信这个跟全文背诵一样恐怖,但跟着官方文档走,可更全面感受SAS产品设计。 如Contents就提供这样的阅读目录,可一览SAS Products.

[金融]决策科学-(一)编程工具 - php中文网

1.2.4.2 关键字搜索

相信是最常用的方法,搜索框输入关键字,快速搜索。 如输入substr

[金融]决策科学-(一)编程工具 - php中文网

当然,也有缺点,尤其个别奇奇怪怪的关键字,如输入index

[金融]决策科学-(一)编程工具 - php中文网

搜索结果令人无所适从。

1.2.4.3 归纳体系

关键字搜索非常有用,但当你忘记关键字拼写、拼错关键字甚至想要某某功能关键字时,归纳体系更加便捷。

(1)Category

以计算函数为例,搜索Function Categories

Functions can be categorized by the types of values that they operate on. Each DS2 function belongs to one of the following categories:

  • Array operates on a named aggregate collection of homogenous data
  • Bitwise Logical Operations operates on one or more bit patterns or binary numbers at the level of their individual bits
  • Character operates on character data and SQL expressions
  • Date and Time operates on date and time values
  • Descriptive Statistics operates on values that measure central tendency, variation among values, and the shape of distribution values
  • Distance returns the geodetic distance
  • Financial calculates financial values such as interest, periodic payments, depreciation, and prices for European options on stocks.
  • Hyperbolic performs hyperbolic calculations such as sine, cosine, and tangent
  • Mathematical operates on values to perform general mathematical calculations
  • Numeric operates on numeric values
  • Probability returns probability calculations.
  • Quantile returns a quantile from specific distributions
  • Random Number returns random variates from specific distributions
  • Special operates on null values and SAS missing values, suspends execution of a program, specifies numeric informats at run time, and executes a FedSQL statement.
  • Trigonometric operates on values to perform trigonometric calculations
  • Truncation operates on values to limit the number of digits
  • Variable Information operates on variables and returns names, types, lengths, informats, labels, and other variable information

Array为例,共计如下4个函数,

[金融]决策科学-(一)编程工具 - php中文网

点进DIM函数,也能发现所在Category。

[金融]决策科学-(一)编程工具 - php中文网

(2)See Also 一般地,查看某函数时,文末都有一段See Also,带出类似函数。 以DIM函数为例,就把该Category下的其他类似函数链接出来。

[金融]决策科学-(一)编程工具 - php中文网

1.2.4.4 总结

整体来说,SAS Help and Documentation的编写还是有一定水平的,始终是最主要的SAS学习文档。需要使用者在应用过程中,不断学习总结,相信SAS水平会有更加长足的进步。此外,除了SAS Help外,剩余资源主要聚焦在人大经济论坛部分早期文档。这里可以看到,SAS整体开发社区还是比较小,后续笔者将再做整理,欢迎持续关注。 如有更新,可能会在 https://github.com/IvanaXu/DataSAS

1.2.5 SAS IDE

1.2.5.1 SAS-BASE

Win + R,输入sas即可调出SAS BASE,页面如下:

[金融]决策科学-(一)编程工具 - php中文网

  • 逻辑库-浏览创建SAS库管理、浏览SAS库文件(移动、复制、更名和删除)、建立非SAS文件的快捷方式;
  • 输出结果-以树形结构展示提交SAS程序输出的各项结果,查看、存储、打印或删除各项结果的内容;
  • 编辑器-对SAS程序语法检查、程序段的收缩和展开、可记录宏、自定快捷键;
  • 日志页面-基本窗口,缺省地打开,依次记录SAS进程中各程序运行的信息,可用命令清空;

这里指出,SAS BASE相比SAS EG,语法要求更严谨、没有代码提示、需手动查看日志、不支持中文变量,对代码要求更高,在非远程连接模式下,一般我们建议使用SAS BASE。

1.2.5.2 SAS-EG

SAS Enterprise Guide基本使用教程,特指远程连接模式:

(1)桌面双击打开或开始菜单中打开SAS Enterprise Guide 7.1(64-bit);

(2)用户登录

(2.1)若提示情况如下:

[金融]决策科学-(一)编程工具 - php中文网

输入用户名、密码,点击“确认”即可。

(2.2)若提示情况如下:

[金融]决策科学-(一)编程工具 - php中文网

点击“是”,进入连接属性,如下。

[金融]决策科学-(一)编程工具 - php中文网

(2.3)若无配置文件列表,则点击“添加”。

[金融]决策科学-(一)编程工具 - php中文网

(2.4)在设置中填写名称(可自定义),远程连接服务器的地址、端口、登录的用户名、密码等。填写完毕后点击“保存”,后续步骤与已有配置文件的步骤(2.5)一致。

(2.5)若已有配置文件,则选择给定的特定文件,点击“设为活动”,将弹出用户登录界面。

[金融]决策科学-(一)编程工具 - php中文网

输入给定的用户名和密码,点击“确定”。

[金融]决策科学-(一)编程工具 - php中文网

点击关闭后即可。 (3)程序编写 (3.1)点击左上角文件,新建,程序。

[金融]决策科学-(一)编程工具 - php中文网

(3.2)在右侧增强型编辑器区域编写代码,如下。

[金融]决策科学-(一)编程工具 - php中文网

(3.3)代码编写完毕后,点击“运行”,或通过键盘快捷键F3或F8,运行程序。 (3.4)若需执行部分代码,选中要执行部分的代码,点击“运行”,或通过键盘快捷键F3或F8,运行程序。

1.2.5.3 SAS-EM

此部分教程选自《SAS EM使用介绍——刘洋洋》 远程连接模式下, (1)基本操作

[金融]决策科学-(一)编程工具 - php中文网

(2)新建项目 登录后界面如下图,如果已经建立过项目则选择“打开项目”,新建项目则选择“新建项目”,注意:新建项目请放置在个人目录下。

[金融]决策科学-(一)编程工具 - php中文网

(3)新建逻辑库 类似sas base中的“libname”功能,加载了逻辑库,才能够提取数据。 加载逻辑库的两种方式如下图。其中逻辑库路径即分析数据的目录。

[金融]决策科学-(一)编程工具 - php中文网

[金融]决策科学-(一)编程工具 - php中文网

(4)创建流程图、创建数据源 创建方式如下图,新创建的流程图是空白的。 创建数据源后才可以对数据进行分析。

[金融]决策科学-(一)编程工具 - php中文网

[金融]决策科学-(一)编程工具 - php中文网

(5)代码编写窗口 SAS EM中有类似base的代码编写功能,在这里可以做一些数据查看和处理。

[金融]决策科学-(一)编程工具 - php中文网

(6)建模功能

详见 模型策略部分。

1.2.5.4 SAS-University

https://www.sas.com/en_us/software/university-edition/download-software.html

SAS大学生版本,通过VirtualBox的轻量级(2G)SAS版本,支持Windows、MacOS、Linux,安装后启动,可在浏览器通过SAS Studio/JupyterLab编写、运行代码,非常适用于SAS学习、示例代码开发。 安装步骤:

[金融]决策科学-(一)编程工具 - php中文网

开启页面: 输入浏览器上输入http://0.0.0.0:10080/

[金融]决策科学-(一)编程工具 - php中文网

JupyterLab: 与python-Jupyter一致,易保存易共享,本文后续SAS代码大部分经此工具校验调试。

[金融]决策科学-(一)编程工具 - php中文网

未来可期!

特别的,由于依托Linux环境,SAS路径一般在 /opt/sasinside/SASHome/SASFoundation/9.4/sas,且SAS版本为9.4_M6:

9.4_M6的特殊性在于调整SAS中文编码字符数由2至3,因SUBSTR("堂",1,1) = SUBSTR("商",2,1) 这种偶然性而影响SAS中文判断的bug将大幅减少!

请多关注SAS版本修订。

[金融]决策科学-(一)编程工具 - php中文网

1.2.6 SAS代码规范

  • SAS命名规范(试行)

(1)命名由数字、英文字母、下划线组成,且由英文字母开头,不区分大小写,不使用中文命名;

(2)命名总长度不超过32个字符长度,若过长可调整部分缩写,如CRED_LIMIT转换CREDL;

(3)命名不使用常见代码关键词,如SQL、RUN、DATA等;

(4)计算逻辑,如A/B表示为A_PCT_B;

(5)特定前缀命名,如判断是否IS、统计函数类:SUM、MAX、MIN、AVG等、列表LIST、时间类:DT(具体时间)、DAY(天数)等、金额类AMT、数量类CNT、占比类PCT;

(6)特定后缀命名,如时间类(默认为账单月):前一个月L01(LAST)、后一个月N01(NEXT),如产品类,分期产品ZDFQ、LHFQ等;

(7)特定意义命名,如银联命名习惯(CUSTR-客户)、分期MP、账龄MOB等;

(8)尽量使用英文命名,减少使用中文拼音全拼,避免使用中文拼音缩写;

PS:部分SAS版本也是支持中文命名的,很方便也很好理解,但会无限制使命名过长;

1.2.7 SAS⽚段

以下摘录部分常用SAS代码片段。

~逻辑库链接(仅作示例)

%MACRO CONNECT_LIBNAME();LIBNAME ODS greenplm dsn="Greenplum Wire Protocol" user="readuser" pass=readuser schema=sdm;LIBNAME MD greenplm dsn="Greenplum Wire Protocol" user="readuser" pass=readuser schema=adm;LIBNAME RPT greenplm dsn="Greenplum Wire Protocol" user="readuser" pass=readuser schema=rpt;LIBNAME BSD "/data2/userhome/DEV-HOME/SAS-DEV-OUTBOUND-01/Data"%MEND CONNECT_LIBNAME;%CONNECT_LIBNAME();
登录后复制

~格式刷

%MACRO FMT(TB=, KEY=, DESC=, FMT_NAME=);PROC SORT DATA = &TB. NODUPKEY OUT = INDATA;BY &KEY. &DESC.;QUIT;PROC CONTENTS DATA = INDATA OUT = CONT NOPRINT;RUN;PROC SQL NOPRINT;SELECT TYPE INTO: KEY_TYPE FROM CONTWHERE UPCASE(NAME) = UPCASE("&KEY.");QUIT;%PUT &KEY_TYPE.;DATA &FMT_NAME.;LENGTH LABEL $200.;SET INDATA END = LAST;
START = COMPRESS(&KEY.);LABEL = COMPRESS(&DESC.);RETAIN FMTNAME "&FMT_NAME.";%IF &KEY_TYPE. = 2 %THEN TYPE = "C";%ELSE TYPE = "N";
;OUTPUT;IF LAST THEN DO;
START = "**OTHER**";LABEL = "UNKNOWN";
HLO = "O";OUTPUT;END;RUN;PROC FORMAT CNTLIN = &FMT_NAME.;RUN;%MEND FMT;%FMT(TB=SASHELP.CARS, KEY=MODEL, DESC=MAKE, FMT_NAME=FMT_MODEL);
登录后复制

~程序休眠

/* 程序将休眠1h */%MACRO CALL_SLEEP(HOURS=1);    DATA _NULL_;    CALL SLEEP(&HOURS., 3600);    RUN;%MEND;%CALL_SLEEP();
登录后复制

~条件构建宏

根据筛选条件构建如MSRP IN(90520)的宏变量,用于where语句。

%MACRO COND_CRE(SRC_LIB=, SRC_TB=, TARGET_VAR=, INCOND=, OUTCOND=, MAXSIZE=1000);%GLOBAL &OUTCOND.;PROC SORT     DATA = &SRC_LIB..&SRC_TB.(WHERE = (&INCOND.))    OUT = TEMP(KEEP = &TARGET_VAR.) NODUPKEY;BY &TARGET_VAR.;RUN;PROC TRANSPOSE DATA = TEMP OUT = T_TEMP PREFIX = A;
VAR &TARGET_VAR.;RUN;DATA T2_TEMP;SET T_TEMP;ARRAY ARR1(*) A:;LENGTH COND $&MAXSIZE..;
COND = "";DO I = 1 TO DIM(ARR1);
    COND = COMPRESS(COND)||COMPRESS(ARR1[I])||',';END;
COND = COMPRESS(COND);
COND = SUBSTR(COND,1,LENGTH(COND)-1);
COND = "&TARGET_VAR. IN("||COMPRESS(COND)||")";KEEP COND;RUN;PROC SQL NOPRINT;SELECT MAX(COND) INTO: &OUTCOND. FROM T2_TEMP;QUIT;%MEND COND_CRE;%COND_CRE(
    SRC_LIB=SASHELP, SRC_TB=CARS, 
    TARGET_VAR=MSRP, INCOND=MSRP>90000, 
    OUTCOND=_T, MAXSIZE=1000
);PROC PRINT DATA = SASHELP.CARS;WHERE &_T.;RUN;%PUT &_T.;/* MSRP IN(90520,94820,121770,126670,128420,192465) */
登录后复制

~FTP下载/上传文件

/* RF */%MACRO RF(FILENAME=,OUTFILE=);	FILENAME &OUTFILE. FTP "&FILENAME." CD="/test/"
	USER="ip1" PASS="xuyifan" HOST="127.0.0.1" PROMPT;%MEND RF;%RF(FILENAME=run_all.csv,OUTFILE=RM);	

/* RF, 数据读取 */DATA TA;%LET _EFIERR = 0;INFILE RMDELIMITER = "," MISSOVER DSD LRECL=32767 FIRSTOBS=1 ENCODING="UTF-8" TERMSTR=LF;FORMAT A B $20.;INPUT A $
B $
;RUN;/* WF */%MACRO WF(FILENAME=,OUTFILE=);	FILENAME &OUTFILE. FTP "&FILENAME." CD="/test/result/"
	USER="ip1" PASS="xuyifan" HOST="127.0.0.1" PROMPT;%MEND WF;%WF(FILENAME=TA.csv,OUTFILE=WM);/* WF, 数据写入 */DATA _NULL_;SET TA;FILE WM LRECL=32767 DLM="@" ENCODING="UTF-8";PUT A
B
;RUN;
登录后复制

~月度循环

%MACRO RCYC(ST=, ED=,);    DATA _NULL_;    CALL SYMPUT("DEV", INTCK("MONTH", INPUT("&ST.01", YYMMDD8.), INPUT("&ED.01", YYMMDD8.)));    RUN;
    %PUT &DEV.;    %DO I=0 %TO &DEV.;        DATA _NULL_;        CALL SYMPUT("LMON", PUT(INTNX("MONTH", INPUT("&ST.01", YYMMDD8.), &I.-1),YYMMN6.));        CALL SYMPUT("NMON", PUT(INTNX("MONTH", INPUT("&ST.01", YYMMDD8.), &I.+0),YYMMN6.));        CALL SYMPUT("TMON", PUT(INTNX("MONTH", INPUT("&ST.01", YYMMDD8.), &I.+1),YYMMN6.));        RUN;
        %PUT &I. &LMON. &NMON. &TMON.;    %END;%MEND;%RCYC(ST=201810, ED=201812);/*
2
0 201809 201810 201811
1 201810 201811 201812
2 201811 201812 201901
*/
登录后复制

~DO OVER

DATA A;INPUT X Y $ Z $ M;CARDS;
. . . 1
1 A B 4
;RUN;DATA B;SET A;ARRAY CHAR _CHARACTER_;ARRAY NUM _NUMERIC_;DO OVER CHAR;    IF CHAR EQ " " THEN CHAR = "/";END;DO OVER NUM;    IF NUM EQ . THEN NUM = 0;END;RUN;PROC PRINT DATA = B;RUN;/*
Obs	X	Y	Z	M
1	0	/	/	1
2	1	A	B	4
*/
登录后复制

~格式化加强理解

/* 简单 */PROC FORMAT;
    VALUE RR
        LOW-50 = "(LOW,50]"
        50<-60 = "(50,60]"
        60<-HIGH = "(60,HIGH)"
    ;RUN;PROC FORMAT;
    VALUE $RRR        "男" = "1"
        "女" = "2"
    ;RUN;PROC FREQ DATA = SASHELP.CLASS;    TABLE HEIGHT SEX;    FORMAT HEIGHT RR. SEX $RRR.;RUN;/* 复杂 */%MACRO FMT(TABLE=, VAR=);    PROC SUMMARY DATA = &TABLE. NWAY MISSING;
        CLASS RK_&VAR.;
        VAR &VAR.;        OUTPUT OUT = SUMM(DROP = _TYPE_ _PREQ_) MIN = VAR_MIN MAX = VAR_MAX;    RUN;    PROC SORT DATA = SUMM;BY RK_&VAR.;RUN;    DATA SUMM;        SET SUMM;        BY RK_&VAR.;
        RK_&VAR. = _N_;    RUN;
    PROC SORT DATA = SUMM;BY DESCENDING RK_&VAR.;RUN;    DATA FMT;        SET SUMM END = LAST;        RETAIN EEXCL "Y" SEXCL "N";
        START = PUT(VAR_MIN, 8.2);        END = PUT(LAG(VAR_MIN), 8.2);        IF _N_ EQ 1 THEN END = "HIGH";        IF LAST THEN START = "LOW";
        FMTNAME = "&VAR.";        LABEL = CATS(PUT(RK_&VAR., Z2.), "(", START, "-", END, ")");    RUN;    PROC FORMAT CNTLIN = FMT;RUN;%MEND;PROC RANK DATA = SASHELP.CLASS GROUPS = 4 OUT = RK;
    VAR HEIGHT;
    RANKS RK_HEIGHT;RUN;%FMT(TABLE=RK, VAR=HEIGHT);PROC FREQ DATA = SASHELP.CLASS;    TABLE HEIGHT;    FORMAT HEIGHT HEIGHT.;RUN;
登录后复制

[金融]决策科学-(一)编程工具 - php中文网

~PROC SUMMARY

PROC SUMMARY DATA=SASHELP.CLASS NWAY MISSING;
    CLASS AGE;
    VAR HEIGHT;OUTPUT OUT = Q N= MEAN= SUM=/AUTONAME;RUN;PROC PRINT DATA = Q;RUN;/* PROC SUMMARY DATA = RES2018M3 NWAY MISSING;
    CLASS KDT IA TA MA
    ;
    VAR COM03 COM06 COM12 RCRED_LMT;
    OUTPUT OUT = SUN2018M3(DROP = _TYPE_ RENAME = (_FREQ_ = NUM)) SUM=;
RUN; */
登录后复制

[金融]决策科学-(一)编程工具 - php中文网

~哈希表HASH连接

DATA TMP;    SET SASHELP.CLASS(OBS=2);
    LIFT = _N_;    KEEP AGE LIFT;RUN;DATA H_LIFT;    SET SASHELP.CLASS;    * 进行初始化;
    IF _N_ EQ 0 THEN SET TMP;    IF _N_ EQ 1 THEN
        DO;
            DECLARE HASH H(DATASET: "TMP");
            H.DEFINEKEY("AGE");
            H.DEFINEDATA("LIFT");
            H.DEFINEDONE();        END;    * IF H.FIND() EQ 0 THEN OUTPUT;
    IF H.FIND() EQ 0 THEN H_LIFT=LIFT;    ELSE CALL MISSING(H_A);    * ELSE H_LIFT=0;
    DROP LIFT;RUN;
登录后复制

~排列组合

%LET N = 3; 
PROC SQL NOPRINT;    SELECT QUOTE(STRIP(NAME)) INTO :NAMES SEPARATED BY " "
    FROM SASHELP.CLASS(OBS = &N.);QUIT;%PUT &NAMES.;%MACRO ALL_COMB;    PROC DATASETS LIB = WORK NOLIST NODETAILS;        DELETE APP_ALL_COMB;    RUN;
    
    %DO I = 1 %TO &N.;        DATA ALL_COMB;            LENGTH VARS $488.;            ARRAY ARR(&N.) $32 (&NAMES.);
            NCOMB = COMB(DIM(ARR), &I.);            DO I = 1 TO NCOMB;                CALL ALLCOMB(I, &I., OF ARR(*));

                VARS = CATX(" ",OF ARR1-ARR&I.);                KEEP VARS;                OUTPUT;            END;        RUN;        PROC APPEND 
            BASE = APP_ALL_COMB 
            DATA = ALL_COMB;        RUN;
    %END;%MEND;%ALL_COMB;PROC PRINT DATA = APP_ALL_COMB;RUN;
登录后复制

[金融]决策科学-(一)编程工具 - php中文网

~Lift提升度

PROC SQL NOPRINT;    SELECT MEAN(HEIGHT) INTO :MEAN FROM SASHELP.CLASS;QUIT;%PUT &MEAN.;/* 62.33684 */PROC SQL;
    CREATE TABLE LIFT AS
    SELECT 
        AGE,        MEAN(HEIGHT) AS MEAN,        MEAN(HEIGHT)/&MEAN. AS LIFT    FROM SASHELP.CLASS    GROUP BY 1    ORDER BY 2 DESC;QUIT;
登录后复制

~PROC SQL

PROC SQL;
    CREATE TABLE TMP1 AS
    SELECT 
        AGE,
        COUNT(*)/19 AS PCT
    FROM SASHELP.CLASS
    GROUP BY 1
    ORDER BY 2 DESC;QUIT;PROC SQL;
    CREATE TABLE TMP2 AS
    SELECT 
        AGE,
        COUNT(*)/19 AS PCT
    FROM SASHELP.CLASS
    GROUP BY AGE
    ORDER BY PCT DESC;QUIT;PROC SQL;
    CREATE TABLE TMP3 AS
    SELECT 
        AGE,
        COUNT(*)/19 AS PCT FORMAT PERCENT10.2
    FROM SASHELP.CLASS
    GROUP BY AGE
    ORDER BY PCT DESC;QUIT;
登录后复制

~SAS绘图

PROC RANK DATA = SASHELP.CLASS GROUPS = 4 OUT = RK;
    VAR HEIGHT;
    RANKS RK_HEIGHT;RUN;* 修改系统默认MAXOBS
ODS GRAPHICS ON/MAXOBS=10000000; PROC SGPLOT DATA = RK;
    VBAR 
        RK_HEIGHT/RESPONSE = RK_HEIGHT 
        STAT = FREQ DATALABEL;
    VLINE 
        RK_HEIGHT/RESPONSE = HEIGHT 
        STAT = MEAN Y2AXIS DATALABEL DATALABELPOS = BOTTOM;RUN;ODS GRAPHICS OFF;* VBAR 柱状图;* VLINE 折线图;* STAT 统计量;* DATALABEL 标签;* DATALABELPOS 标签位置;* Y2AXIS 次坐标;
登录后复制

[金融]决策科学-(一)编程工具 - php中文网

~自制数据集

DATA VARL;    FORMAT VARS $40. VART $40. VARC $100.;    INFILE DATALINES DELIMITER = "|";    INPUT VARS $ VART $ VARC $;DATALINES;
ACTIVE_MOB|BASE|POINTS=21/41
AGENCY_VISE_SUM|MEAN_6M|POINTS=O,INC=1
;PROC PRINT DATA = VARL;RUN;
登录后复制

[金融]决策科学-(一)编程工具 - php中文网

~宏变量工厂

DATA CARS;SET SASHELP.CARS(OBS=3);RUN;%MACRO M();    DATA _NULL_;        SET CARS NOBS = N;        CALL SYMPUT(COMPRESS("VARS_"||_N_), COMPRESS(MSRP));        CALL SYMPUT("NAL", N);    RUN;
    %DO I = 1 %TO &NAL.;        %PUT &&VARS_&I..;    %END;%MEND M;%M();/*
    36945
    23820
    26990
*/
登录后复制

~判断表是否存在

%MACRO M();    %IF %SYSFUNC(EXIST(SASHELP.CARS))            %THEN %PUT SASHELP.CARS EXIST;    %ELSE %PUT SASHELP.CARS NOT EXIST;%MEND M;%M();/* SASHELP.CARS EXIST */
登录后复制

~KS计算

DATA TA;SET SASHELP.CARS;IF CYLINDERS IN (4,6) THEN K = 0;ELSE K = 1;KEEP MSRP K;RUN;PROC SORT DATA = TA;BY MSRP;RUN;PROC RANK DATA = TA OUT = TB GROUPS = 5;
VAR MSRP;
RANKS GMSRP;RUN;PROC FREQ DATA = TB NOPRINT;TABLE GMSRP * K/OUT = TC;RUN;PROC NPAR1WAY DATA = TC KS NOPRINT;
CLASS K;
VAR GMSRP;
FREQ COUNT;OUTPUT OUT = TD;RUN;PROC PRINT DATA = TD(KEEP = _D_);RUN;/* 0.59527 */
登录后复制

~批量SQL(宏)

%MACRO PSQL(PARA1=, PARA2=,);    SUM(CASE WHEN UPCASE(TYPE) = "&PARA1." THEN 1 ELSE 0 END) AS CNT_&PARA1.,    SUM(CASE WHEN UPCASE(TYPE) = "&PARA1." THEN &PARA2. ELSE 0 END) AS SUM_&PARA1._&PARA2.,    MAX(CASE WHEN UPCASE(TYPE) = "&PARA1." THEN &PARA2. ELSE 0 END) AS MAX_&PARA1._&PARA2.,%MEND PSQL;PROC SQL;CREATE TABLE TEMP(DROP = _T) AS SELECT
    MAKE,    %PSQL(PARA1=SUV, PARA2=MSRP)    %PSQL(PARA1=SUV, PARA2=INVOICE)    %PSQL(PARA1=SPORTS, PARA2=MSRP)    %PSQL(PARA1=SPORTS, PARA2=INVOICE)
    1 AS _TFROM SASHELP.CARS(OBS=100)GROUP BY MAKE;QUIT;PROC PRINT DATA = TEMP;RUN;
登录后复制

1.2.8 SAS编译

经典问题(简化自《SAS培训_PDV精华》):

交易流水表EVENT月切表,数据字段:账户号XACCOUNT、交易时间INP_DAY、交易金额BILL_AMT,已根据XACCOUNT、INP_DAY排序。 限一个SAS DATA步,求每个账户首次达到消费金额1288的时间以及当月累计消费金额。 数据集示例:

DATA EVENT;    FORMAT XACCOUNT $8. INP_DAY BILL_AMT;    INFILE DATALINES DELIMITER = "|";    INPUT XACCOUNT $ INP_DAY BILL_AMT;DATALINES;
00000001|20200101|1200
00000001|20200102|120
00000001|20200108|302
00000002|20200101|323
00000002|20200102|423
00000002|20200110|135
00000003|20200101|3232
00000003|20200101|544
00000003|20200107|423
00000003|20200109|135
;/* 已排序 */PROC SORT DATA = EVENT;BY XACCOUNT INP_DAY;RUN;
登录后复制

求解过程:

DATA RESULT1(KEEP = XACCOUNT RAMT1 RDAT1) RESULT2;SET EVENT(IN = E);BY XACCOUNT;PUT "S0:" _ALL_;IF FIRST.XACCOUNT THEN DO;
    RAMT1 = 0;
    RAMT2 = 0;
    RAMT3 = 0;
    RDAT1 = 99999999;
    RDAT2 = 99999999;END;

RAMT1 + BILL_AMT;RETAIN RAMT2;
RAMT2 = SUM(RAMT2, BILL_AMT);

RAMT3 = SUM(RAMT3, BILL_AMT);RETAIN RDAT1;IF RAMT1 >= 1288 THEN RDAT1 = MIN(INP_DAY, RDAT1);IF RAMT1 >= 1288 THEN RDAT2 = MIN(INP_DAY, RDAT2);PUT "S1:" _ALL_;IF LAST.XACCOUNT    THEN OUTPUT RESULT1;OUTPUT RESULT2;RUN;
登录后复制

输出结果:

S0:E=1 XACCOUNT=00000001 INP_DAY=20200101 BILL_AMT=1200 FIRST.XACCOUNT=1 LAST.XACCOUNT=0 RAMT1=0 RAMT2=. RAMT3=. RDAT1=. RDAT2=.
_ERROR_=0 _N_=1

S1:E=1 XACCOUNT=00000001 INP_DAY=20200101 BILL_AMT=1200 FIRST.XACCOUNT=1 LAST.XACCOUNT=0 RAMT1=1200 RAMT2=1200 RAMT3=1200
RDAT1=99999999 RDAT2=99999999 _ERROR_=0 _N_=1

S0:E=1 XACCOUNT=00000001 INP_DAY=20200102 BILL_AMT=120 FIRST.XACCOUNT=0 LAST.XACCOUNT=0 RAMT1=1200 RAMT2=1200 RAMT3=. RDAT1=99999999
RDAT2=. _ERROR_=0 _N_=2

S1:E=1 XACCOUNT=00000001 INP_DAY=20200102 BILL_AMT=120 FIRST.XACCOUNT=0 LAST.XACCOUNT=0 RAMT1=1320 RAMT2=1320 RAMT3=120
RDAT1=20200102 RDAT2=20200102 _ERROR_=0 _N_=2

S0:E=1 XACCOUNT=00000001 INP_DAY=20200108 BILL_AMT=302 FIRST.XACCOUNT=0 LAST.XACCOUNT=1 RAMT1=1320 RAMT2=1320 RAMT3=. RDAT1=20200102
RDAT2=. _ERROR_=0 _N_=3

S1:E=1 XACCOUNT=00000001 INP_DAY=20200108 BILL_AMT=302 FIRST.XACCOUNT=0 LAST.XACCOUNT=1 RAMT1=1622 RAMT2=1622 RAMT3=302
RDAT1=20200102 RDAT2=20200108 _ERROR_=0 _N_=3
登录后复制

[金融]决策科学-(一)编程工具 - php中文网

显然,我们在RAMT1、RDAT1上把要求逻辑实现了一遍,且PUT出来了DATA执行前后_ALL_的变化。 这些输出意味着什么呢?在回答此问题之前,需要先了解SAS数据步的编译。

数据步的编译和执行过程: 编译过程: 在这个阶段,系统扫描每个语句检查它是否有语法错误。大部分语法错误导致系统无法对数据步作进一步的处理,在编译阶段将建立要创建的数据集的描述部分。

执行阶段: 若数据步编译成功,就要开始执行阶段。在这个阶段对源数据文件的每一条记录都执行一次数据步,除非在程序中指明其他处理方式。在这个阶段建立数据集的数据部分。

具体来说, (1)数据步的编译阶段:

  • 即对程序进行词语和语法编译梦,检查它是否有语法错误;

如,漏掉或错拼的关键词、无效的变量名、遗漏或错误的符号、无效的选择项;

  • 将程序转换为机器码,供执行阶段使用;
  • 建立工作部件输入缓冲器(Input Buffer);
  • 建立工作部件PDV(程序数据列,Program Data Vector);

用于建立SAS系统数据集,一次只处理一个观测,PDV一般格式为[_N_|_ERROR_], 其中_N_记录DATA步执行的次数,_ERROR_指示出错信息,0为无错误,1为有错误;

  • 建立数据集中每个变量的三个必须的属性:Name、Type、Length;
  • 建立新建数据集的描述部分;

即数据集名、观测数和变量个数、变量名及其属性;

(2)数据步的执行阶段: 即创建数据集的数据部分,执行顺序:

  • PDV中外部变量初始化为缺省值;
  • 输入每条记录至输入缓冲器,按INPUT语句读至PDV(如有);
  • 按数据步的其他语句处理后,存入PDV;
  • 在数据步结束时缺省地将PDV内容作为一条新观测写入新的数据集;
  • 回到数据步的开始,使PDV中外部变量初始化为缺省值;
  • 对源文件中每条记录都按上述步骤执行一次;
  • 当对源文件最后一条记录执行结束后,数据步执行完成;

上述步骤中,在数据步迭代开始时外部变量初始化为缺省值,但以下几种情况不受限制:

  • RETAIN语句;
  • SUM语句(A + 1);
  • 数组_TEMPORARY_;
  • FILE、INFILE语句;
  • 自动生成变量,如_ERROR_、_N_等;

PS:上述变量自然不包含宏变量,宏变量声明后记录在SASHELP.VMACRO中。 如果还是觉得PDV太过抽象,可以这么理解:

个人认为可以把PDV想象成一排用于存放变量值的盒子。 每个盒子代表一个变量,提交一个DATA步后,SAS会对这个DATA步进行编译,然后执行。 首先,PDV是在DATA步的编译阶段生成的。(编译会进行语法检查并创建一排整齐摆放的”盒子”;)然后,在DATA步的执行阶段,根据不同语句对PDV中变量的值进行清空或更改。(将盒子清空或换上新的物品;) 最后,在RUN语句或者OUTPUT语句将PDV中变量的当前值输出到目标数据集中。KEEP、DROP语句或KEEP=、DROP=数据集选项会影响输出到目标数据集中变量的个数。(如果没有KEEP、DROP,将新建变量和数据集变量对应的盒子搬出到目标数据集;如果只有KEEP,则只搬KEEP指定的盒子;如果只有DROP,则不搬DROP指定的盒子;如果KEEP/DROP同时存在,则只搬KEEP-DROP后剩下的盒子) ——选自网络文章《SAS中关于PDV的总结》

所以,上例在我们通过PUT _ALL_查看PDV中所有变量后,发现:RAMT1、RAMT2实现了累加,而未RETAIN的RAMT3、RDAT2在S0时总是先被初始化,而S1每次仅计算当前所在行数据结果。至此,问题解决,有兴趣的同学可以进一步拓展SAS PROC步、宏编译。

在此感谢上述代码贡献者、搬运工们。

全文目录


1.3 Python

  • 1.3.1 Python之禅
  • 1.3.2 Python教程
    • 1.3.2.1 小节摘要
    • 1.3.2.2 四大任务
  • 1.3.3 Python书籍
  • 1.3.4 Python Help使用
  • 1.3.5 Python包
    • 1.3.5.1 Python包缺失
    • 1.3.5.2 Python包安装
    • 1.3.5.3 Python包验证
  • 1.3.6 Python IDE
    • 1.3.6.1 Jupyter
    • 1.3.6.2 Pycharm
  • 1.3.7 Python代码规范
    • 1.3.7.1 PEP 8
    • 1.3.7.2 YAPF
  • 1.3.8 Python片段
  • 1.3.9 Python编译

1.3.1 Python之禅

import this"""
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
""""""
•优美胜于丑陋(Python 以编写优美的代码为目标)
•明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)
•简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)
•复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)
•扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)
•间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)
•可读性很重要(优美的代码是可读的)
•即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上)
•不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写 except:pass 风格的代码)
•当存在多种可能,不要尝试去猜测
•而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法)
•虽然这并不容易,因为你不是 Python 之父(这里的 Dutch 是指 Guido )
•做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量)
•如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)
•命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)
"""
登录后复制

1.3.2 Python教程

来自阿里的Python训练营(2020.11),178页,19小节,包含四大任务。12天,每天1小时即可学完。

天池龙珠计划之Python学习电子书_v0.0.2.pdf

1.3.2.1 小节摘要

  • Python介绍
print("Hello Python.")
登录后复制
  • 变量、运算符与数据类型
num = "123"print(int(num) + 123)
登录后复制
  • 位运算
print(~1, 1 & 0, 1 | 0, 1 ^ 0, 100 >> 1, 100 << 1, 1<< 2)
登录后复制
  • 条件语句
num = 123if num > 10:    print("1")elif num > 20:    print("2")else:    print("3")
登录后复制
  • 循环语句
passwdList = [str(i) for i in range(232, 421)]
valid = Falsecount = 3while count > 0:
    password = input('enter password:')    for item in passwdList:        if password == item:
            valid = True
            break
    
    if not valid:        print('invalid input')
        count -= 1
        continue
    else:        break
登录后复制
  • 异常处理
try:    print(1+"1")except Exception as e:    print(e)finally:    print("END")
登录后复制
  • 元组
[1, 2, 3], (1, 2, 3)
登录后复制
  • 字符串
print("%.4f" % int("123,2.3"[:-1].strip(".").split(",")[0][::-1]))
登录后复制
  • 字典
dit = {"name": "X", "age": 20}
登录后复制
  • 集合
basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
登录后复制
  • 序列
t = "ABC"list(t), tuple(t), len(t), max(t), min(t)
登录后复制
  • 函数与lambda表达式
def f(x):
    return x+2f = lambda x: x+2
登录后复制
  • 类与对象
class C(object):
    def __init__(self):
        self.__x = None

    def getx(self):
        return self.__x    def setx(self, value):
        self.__x = value    
    def delx(self):
        del self.__x
登录后复制
  • 魔法方法
def libs(n):
    a = 0
    b = 1
    while True:
        a, b = b, a + b        if a > n:            return 
        yield a    
for each in libs(100):    print(each, end=' ')
登录后复制
  • 模块
import hello
hello.hi()
登录后复制
  • datetime模块
import datetime
dt = datetime.datetime(year=2020, month=6, day=25, hour=11, minute=51, second=49)
s = dt.strftime("%Y/%m/%d %H:%M:%S")print(s)
登录后复制
  • 文件与文件系统
with open("c001.py", "r") as f:    for i in f:        print(i)
登录后复制
  • OS模块
import osfor item in os.listdir():    print(item)
登录后复制
  • 序列化与反序列化
import pickle
data = {"name": "X", "age": 20}with open("dataFile.pkl", "wb") as f:
    pickle.dump(data, f, -1)with open("dataFile.pkl", "rb") as f:    print(pickle.load(f))
登录后复制

1.3.2.2 四大任务

  • Task1

Python基础知识介绍,包含变量、位运算、条件语句和异常处理;

  • Task2

Python中的6大数据结构,包括列表、元组、字符串、字典、集合、序列;

  • Task3

Python中的函数、lambda表达式、类与对象、魔法方法;

  • Task4

数据分析实战项目,从0开始动手;

1.3.3 Python书籍

https://www.runoob.com/python/python-tutorial.html

https://www.runoob.com/python3/python3-tutorial.html

https://www.w3cschool.cn/pythonlearn/

https://www.liaoxuefeng.com/wiki/1016959663602400

《Python学习手册》

《Python语言及其应用》

《像计算机科学家一样思考Python》

1.3.4 Python Help使用

直接调用help()语句,如下:

import thishelp(this)"""
Help on module this:

NAME
    this

MODULE REFERENCE
    https://docs.python.org/3.7/library/this
    
    The following documentation is automatically generated from the Python
    source files.  It may be incomplete, incorrect or include features that
    are considered implementation detail and may vary between Python
    implementations.  When in doubt, consult the module reference at the
    location listed above.

DATA
    c = 97
    d = {'A': 'N', 'B': 'O', 'C': 'P', 'D': 'Q', 'E': 'R', 'F': 'S', 'G': ...
    i = 25
    s = "Gur Mra bs Clguba, ol Gvz Crgref\n\nOrnhgvshy vf o...bar ubaxvat ...

FILE
    /python3/lib/python3.7/this.py
"""
登录后复制

或者

def f(para1, para2):
    """Get the min one."""
    return min(para1, para2)help(f)"""
Help on function f in module __main__:

f(para1, para2)
    Get the min one.
"""
登录后复制

1.3.5 Python包

1.3.5.1 Python包缺失

执行代码时报错如下:

import data"""
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-1090-699327cd1cad> in <module>()
----> 1 import data

ModuleNotFoundError: No module named 'data'
"""
登录后复制

即缺失该data工具包。

1.3.5.2 Python包安装

一般的,可以使用Anaconda进行Python库安装及管理,其中包括Conda、Python以及一大堆安装好的工具包,比如:numpy、pandas等。

https://mirror.tuna.tsinghua.edu.cn/help/anaconda/

对于Anaconda未预装的Python包就需要自行安装,如下:

(1)在线安装

pip install data -i https://pypi.tuna.tsinghua.edu.cn/simple
登录后复制

对于较新版本,推荐使用:

python3 -m pip install data -i https://pypi.tuna.tsinghua.edu.cn/simple
登录后复制

若显示Successfully installed XXX即安装成功。

"""
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting data
  Using cached https://pypi.tuna.tsinghua.edu.cn/packages/ed/e9/623be82fac4250fc614741f5b1ead83d339794f94b19ac8665b6ea12ee05/data-0.4.tar.gz (7.0 kB)
...
Building wheels for collected packages: data
  Building wheel for data (setup.py) ... done
  Created wheel for data: filename=data-0.4-py3-none-any.whl size=7247 sha256=32a13cabc2205de95c0be8d38888b6642b602dca08e2951f4d3c200128c6ff9d
  Stored in directory: /pip/wheels/35/20/c4/885e3ce9b69e4852259f20fe1ee95b5d6eb7dcaafae23f4051
Successfully built data
Installing collected packages: data
Successfully installed data-0.4
"""
登录后复制

(2)离线安装 大部分时候,安装Python包的银行环境属于内网独立网段,我们可以预先download好Python包用于离线安装。

pip download data"""
Collecting data
  Downloading data-0.4.tar.gz (7.0 kB)
Collecting decorator
  Downloading decorator-4.4.2-py2.py3-none-any.whl (9.2 kB)
Collecting funcsigs
  Downloading funcsigs-1.0.2-py2.py3-none-any.whl (17 kB)
Collecting six
  Downloading six-1.15.0-py2.py3-none-any.whl (10 kB)
Saved ./data-0.4.tar.gz
Saved ./decorator-4.4.2-py2.py3-none-any.whl
Saved ./funcsigs-1.0.2-py2.py3-none-any.whl
Saved ./six-1.15.0-py2.py3-none-any.whl
Successfully downloaded data decorator funcsigs six
"""
登录后复制

可以看到连带依赖包也下载好,可以打包带走,带到另一个地方进行离线安装。

cd packages
pip install six-1.15.0-py2.py3-none-any.whl
登录后复制

(3)源码安装 这里注意到data下载后是压缩包data-0.4.tar.gz,此时需要源码安装。

豆包AI编程
豆包AI编程

豆包推出的AI编程助手

豆包AI编程483
查看详情 豆包AI编程
# 解压,手动解压也一样tar -zxvf data-0.4.tar.gz 
"""
data-0.4/
data-0.4/setup.cfg
data-0.4/PKG-INFO
data-0.4/setup.py
data-0.4/README.rst
data-0.4/data.egg-info/
data-0.4/data.egg-info/top_level.txt
data-0.4/data.egg-info/requires.txt
data-0.4/data.egg-info/dependency_links.txt
data-0.4/data.egg-info/SOURCES.txt
data-0.4/data.egg-info/PKG-INFO
data-0.4/data/
data-0.4/data/decorators.py
data-0.4/data/__init__.py
"""# 去到该路径cd data-0.4# Buildpython setup.py build"""
running build
running build_py
creating build
creating build/lib
creating build/lib/data
copying data/__init__.py -> build/lib/data
copying data/decorators.py -> build/lib/data
"""# Installpython setup.py install"""
running install
running bdist_egg
running egg_info
writing data.egg-info/PKG-INFO
writing dependency_links to data.egg-info/dependency_links.txt
writing requirements to data.egg-info/requires.txt
writing top-level names to data.egg-info/top_level.txt
reading manifest file 'data.egg-info/SOURCES.txt'
writing manifest file 'data.egg-info/SOURCES.txt'
installing library code to build/bdist.linux-x86_64/egg
running install_lib
running build_py
...
Using /usr/local/lib/python3.6/dist-packages
Finished processing dependencies for data==0.4
"""
登录后复制

(4)卸载管理

pip uninstall data   
"""
Found existing installation: data 0.4
Uninstalling data-0.4:
  Would remove:
    /python3/lib/python3.7/site-packages/data-0.4.dist-info/*
    /python3/lib/python3.7/site-packages/data/*
Proceed (y/n)? y
  Successfully uninstalled data-0.4
"""
登录后复制

1.3.5.3 Python包验证

如上,我们已经安装data包,验证之。

python -c "import data"
登录后复制

若无输出即安装无误。

  • PS:在Windows环境下,上述命令需先通过win+R,输入cmd调出命令提示符操作。 除切换路径时改用cd /d D:\Python包,其余一致

1.3.6 Python IDE

1.3.6.1 Jupyter

  • Jupyter魔法函数

所谓魔法函数,实际上是IPython预先定义好的具备特定功能的函数被收到Jupyter中使用。

%lsmagic"""
Available line magics:
%alias  
%alias_magic  
%autocall  
%automagic  
%autosave  
%bookmark  
%cat  
%cd  
%clear  
%colors  
%config  
%connect_info  
%cp  
%debug  
%dhist  
%dirs  
%doctest_mode  
%ed  
%edit  
%env  
%gui  
%hist  
%history  
%killbgscripts  
%ldir  
%less  
%lf  
%lk  
%ll  
%load  
%load_ext  
%loadpy  
%logoff  
%logon  
%logstart  
%logstate  
%logstop  
%ls  
%lsmagic  
%lx  
%macro  
%magic  
%man  
%matplotlib  
%mkdir  
%more  
%mv  
%notebook  
%page  
%pastebin  
%pdb  
%pdef  
%pdoc  
%pfile  
%pinfo  
%pinfo2  
%popd  
%pprint  
%precision  
%profile  
%prun  
%psearch  
%psource  
%pushd  
%pwd  
%pycat  
%pylab  
%qtconsole  
%quickref  
%recall  
%rehashx  
%reload_ext  
%rep  
%rerun  
%reset  
%reset_selective  
%rm  
%rmdir  
%run  
%save  
%sc  
%set_env  
%store  
%sx  
%system  
%tb  
%time  
%timeit  
%unalias  
%unload_ext  
%who  
%who_ls  
%whos  
%xdel  
%xmode

Available cell magics:
%%!  
%%HTML  
%%SVG  
%%bash  
%%capture  
%%debug  
%%file  
%%html  
%%javascript  
%%js  
%%latex  
%%markdown  
%%perl  
%%prun  
%%pypy  
%%python  
%%python2  
%%python3  
%%ruby  
%%script  
%%sh  
%%svg  
%%sx  
%%system  
%%time  
%%timeit  
%%writefile

Automagic is ON, % prefix IS NOT needed for line magics.
"""
登录后复制

常用的%time、%timeit,能为代码提供执行计时服务,区别在于%time返回单次结果,%timeit返回循环N轮次后统计结果。这很适合性能比拼,以下测试sum、np.sum在实现一样的求和功能时,代码耗时情况:

import numpy as np
L = np.linspace(0, 100, 1000000)
f1 = lambda l: sum(l)
f2 = lambda l: np.sum(l)

%time f1(L)
%time f2(L)

%timeit f1(L)
%timeit f2(L)"""
CPU times: user 132 ms, sys: 548 µs, total: 132 ms
Wall time: 133 ms
CPU times: user 810 µs, sys: 479 µs, total: 1.29 ms
Wall time: 1.16 ms

140 ms ± 3.3 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
367 µs ± 39.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
"""
登录后复制

显然,此测试中np.sum完胜!

1.3.6.2 Pycharm

虽然,Pycharm也集成了Jupyter的功能,相对而言,Pycharm比较适合开发工程型项目。

1.3.7 Python代码规范

一般来说,我们使用PEP8作为Python代码规范。

1.3.7.1 PEP 8

https://www.python.org/dev/peps/pep-0008/ https://github.com/python/peps/blob/master/pep-0008.txt

要求如:

  • Use 4 spaces per indentation level.
  • Limit all lines to a maximum of 79 characters.
  • ...

1.3.7.2 YAPF

可以使用Google开发的格式工具YAPF。

https://github.com/google/yapf https://pypi.org/project/yapf/

(1)安装

pip install yapf
登录后复制

(2)说明

yapf --help"""
usage: yapf [-h] [-v] [-d | -i] [-r | -l START-END] [-e PATTERN]
            [--style STYLE] [--style-help] [--no-local-style] [-p]
            [-vv]
            [files [files ...]]

Formatter for Python code.

positional arguments:
  files

optional arguments:
  -h, --help            show this help message and exit
  -v, --version         show version number and exit
  -d, --diff            print the diff for the fixed source
  -i, --in-place        make changes to files in place
  -r, --recursive       run recursively over directories
  -l START-END, --lines START-END
                        range of lines to reformat, one-based
  -e PATTERN, --exclude PATTERN
                        patterns for files to exclude from formatting
  --style STYLE         specify formatting style: either a style name (for
                        example "pep8" or "google"), or the name of a file
                        with style settings. The default is pep8 unless a
                        .style.yapf or setup.cfg file located in the same
                        directory as the source or one of its parent
                        directories (for stdin, the current directory is
                        used).
  --style-help          show style settings and exit; this output can be saved
                        to .style.yapf to make your settings permanent
  --no-local-style      don't search for local style definition
  -p, --parallel        Run yapf in parallel when formatting multiple files.
                        Requires concurrent.futures in Python 2.X
  -vv, --verbose        Print out file names while processing
 """
登录后复制
  • 应用1
yapf -i run.py
登录后复制
  • 应用2
#from yapf.yapflib.yapf_api import FormatCode
code = """
x = {  'a':37,'b':42,

'c':927}

y = 'hello ''world'
z = 'hello '+'world'
a = 'hello {}'.format('world')
class foo  (     object  ):
  def f    (self   ):
    return       37*-+2
  def g(self, x,y=42):
      return y
def f  (   a ) :
  return      37+-+a[42-x :  y**3]
"""print(FormatCode(code))"""
("x = {'a': 37, 'b': 42, 'c': 927}\n\ny = 'hello ' 'world'\nz = 'hello ' + 'world'\na = 'hello {}'.format('world')\n\n\nclass foo(object):\n    def f(self):\n        return 37 * -+2\n\n    def g(self, x, y=42):\n        return y\n\n\ndef f(a):\n    return 37 + -+a[42 - x:y**3]\n", True)
"""
登录后复制

(3)示例 以下例举官方例子。

修改前:

x = {  'a':37,'b':42,'c':927}

y = 'hello ''world'z = 'hello '+'world'a = 'hello {}'.format('world')class foo  (     object  ):
  def f    (self   ):
    return       37*-+2
  def g(self, x,y=42):
      return ydef f  (   a ) :
  return      37+-+a[42-x :  y**3]
登录后复制

修改后:

x = {'a': 37, 'b': 42, 'c': 927}

y = 'hello ' 'world'z = 'hello ' + 'world'a = 'hello {}'.format('world')class foo(object):
    def f(self):
        return 37 * -+2

    def g(self, x, y=42):
        return ydef f(a):
    return 37 + -+a[42 - x:y**3]
登录后复制

1.3.8 Python片段

详见:

https://github.com/IvanaXu/PyTools

示例,009.Test_multiprocessing_run, multiprocessing多线程

[金融]决策科学-(一)编程工具 - php中文网

1.3.9 Python编译

由于Python编译对大部分开发者是无感的,一般来说,我们不需要像SAS那样进一步延伸编译层的PDV概念,进而能编写出更加优质(但也更加难懂)的代码。故而以下只点出三个概念:

  • 其一,基本编译

Python每次运行都要进行转换成字节码,然后再有虚拟机把字节码转换成机器语言,最后才能在硬件上运行。与编译性语言相比,每次多出了编译和链接的过程,性能肯定会受到影响;而python并不是每次都需要转换字节码,解释器在转换之前会判断代码文件的修改时间是否与上一次转换后的字节码pyc文件的修改时间一致,若不一致才会重新转换。

  • 其二,code object

我们可以通过内置函数compile,将源文件编译成code object,如下:

cmd = """
print(1)
"""code_object = compile(cmd, "", "exec")print(code_object)eval(code_object)"""
<code object <module> at 0x7f859d1b79c0, file "", line 2>
1
"""
登录后复制

还可以通过dis进行反编译:

import dis
dis.dis(code_object)"""
2             0 LOAD_NAME                0 (print)
              2 LOAD_CONST               0 (1)
              4 CALL_FUNCTION            1
              6 POP_TOP
              8 LOAD_CONST               1 (None)
             10 RETURN_VALUE
"""
登录后复制

可以看到python字节码其实是模仿的x86的汇编,将代码编译成一条一条的指令交给一个虚拟的cpu去执行的。

有兴趣的同学可拓展学习:

https://godbolt.org/一个多语言在线编辑器

Python代码片段-081.Test_eval, eval的安全攻防

  • 其三,Python部署

这里指Python部署时,将Python转换Pyc/Pyo/So文件,避免直接暴露源码。

# 同一系统环境下/python3/bin/cython run.py# /python3/bin/python -m py_compile run.pygcc -c -fPIC run.c

gcc -shared run.o -o run.so
登录后复制

全文目录


1.4 Linux

  • 1.4.1 Linux版本
  • 1.4.2 Linux命令
    • ~查看当前路径
    • ~新建文件夹
    • ~查看当前文件目录
    • ~切换当前目录
    • ~创建文件树
    • ~删除文件夹
    • ~复制文件夹
    • ~移动/重命名文件夹
    • ~返回上层目录
    • ~输出/输出至文件
    • ~全部查看文件
    • ~输出至文件(追加)
    • ~部分查看文件
    • ~查找文件
    • ~查看文件大小
    • ~统计文件行数
    • ~查找文件内容
    • ~查看磁盘
    • ~查看内存使用
    • ~查看进程
    • ~查看时间
    • ~后台进程(python)
    • ~查看/退出后台进程
    • ~编辑脚本文件
    • ~修改文件权限
    • ~运行脚本文件
    • ~FTP操作

1.4.1 Linux版本

常用如下:

版本名称 网址 特点 软件包管理器
Debian Linux www.debian.org 开放的开发模式,且易于进行软件包升级 apt
Fedora Core www.redhat.com 拥有数量庞人的用户,优秀的社区技术支持. 并且有许多创新 up2date(rpm),yum (rpm)
CentOS www.centos.org CentOS 是一种对 RHEL(Red Hat Enterprise Linux)源代码再编译的产物,由于 Linux 是开发源代码的操作系统,并不排斥样基于源代码的再分发,CentOS 就是将商业的 Linux 操作系统 RHEL 进行源代码再编译后分发,并在 RHEL 的基础上修正了不少已知的漏洞 rpm
SUSE Linux www.suse.com 专业的操作系统,易用的 YaST 软件包管理系统 YaST(rpm),第三方 apt (rpm)软件库(repository)
Mandriva www.mandriva.com 操作界面友好,使用图形配置工具,有庞大的社区进行技术支持,支持 NTFS 分区的大小变更 rpm
KNOPPIX www.knoppix.com 可以直接在 CD 上运行,具有优秀的硬件检测和适配能力,可作为系统的急救盘使用 apt
Gentoo Linux www.gentoo.org 高度的可定制性,使用手册完整 portage
Ubuntu www.ubuntu.com 优秀已用的桌面环境,基于 Debian 构建 apt

1.4.2 Linux命令

以下基于空文件夹/root(一般不建议)下实战,一步一步实操:

~查看当前路径

pwd# /root
登录后复制

~新建文件夹

mkdir data
登录后复制

~查看当前文件目录

ls -l# total 4# drwxr-xr-x 2 root root 4096 Nov 26 14:12 data
登录后复制

~切换当前目录

cd data/
pwd# /root/data
登录后复制

~创建文件树

mkdir -p f1/f2/f3 e1 e2
ls -l# total 12# drwxr-xr-x 2 root root 4096 Nov 26 14:22 e1# drwxr-xr-x 2 root root 4096 Nov 26 14:22 e2# drwxr-xr-x 3 root root 4096 Nov 26 14:22 f1
登录后复制

~删除文件夹

rm -rf f1/
ls -l# total 8# drwxr-xr-x 2 root root 4096 Nov 26 14:22 e1# drwxr-xr-x 2 root root 4096 Nov 26 14:22 e2
登录后复制

~复制文件夹

cp -r e1/ e3/
ls -l# total 12# drwxr-xr-x 2 root root 4096 Nov 26 14:22 e1# drwxr-xr-x 3 root root 4096 Nov 26 14:24 e2# drwxr-xr-x 2 root root 4096 Nov 26 14:24 e3
登录后复制

~移动/重命名文件夹

mv e3/ e1_/
ls -l# total 12# drwxr-xr-x 2 root root 4096 Nov 26 14:22 e1# drwxr-xr-x 2 root root 4096 Nov 26 14:24 e1_# drwxr-xr-x 3 root root 4096 Nov 26 14:24 e2
登录后复制

~返回上层目录

cd ../
pwd# /root
登录后复制

~输出/输出至文件

cd data/
echo 123# 123echo 123 > A.csv
ls -l# total 16# -rw-r--r-- 1 root root    4 Nov 26 14:32 A.csv# drwxr-xr-x 2 root root 4096 Nov 26 14:22 e1# drwxr-xr-x 2 root root 4096 Nov 26 14:24 e1_# drwxr-xr-x 3 root root 4096 Nov 26 14:24 e2
登录后复制

~全部查看文件

cat A.csv# 123
登录后复制

~输出至文件(追加)

echo 456 >> A.csv
cat A.csv 
# 123# 456echo 456 >> A.csv
echo 456 >> A.csv
echo 456 >> A.csv
echo 456 >> A.csv
echo 456 >> A.csv
cat A.csv 
# 123# 456# 456# 456# 456# 456# 456
登录后复制

~部分查看文件

# 前head -n 2 A.csv 
# 123# 456# 后tail -n 2 A.csv 
# 456# 456
登录后复制

~查找文件

cat /proc/cpuinfo > B.csv
ls -l|grep .csv# -rw-r--r-- 1 root root   28 Nov 26 14:38 A.csv# -rw-r--r-- 1 root root 2818 Nov 26 14:50 B.csvfind . -name B.csv# ./B.csv
登录后复制

~查看文件大小

ls -l|grep .csv# total 20# -rw-r--r-- 1 root root   28 Nov 26 14:38 A.csv# -rw-r--r-- 1 root root 2818 Nov 26 14:50 B.csvls -l -h|grep .csv# total 20K# -rw-r--r-- 1 root root   28 Nov 26 14:38 A.csv# -rw-r--r-- 1 root root 2.8K Nov 26 14:50 B.csv
登录后复制

~统计文件行数

wc -l A.csv 
# 7 A.csvwc -l B.csv 
# 78 B.csv
登录后复制

~查找文件内容

cat B.csv|grep 'model name' 
# model name	: Intel(R) Core(TM) i7-8850H CPU @ 2.60GHz# model name	: Intel(R) Core(TM) i7-8850H CPU @ 2.60GHz# model name	: Intel(R) Core(TM) i7-8850H CPU @ 2.60GHz
登录后复制

~查看磁盘

df -h# Filesystem      Size  Used Avail Use% Mounted on# overlay          59G   21G   36G  37% /# tmpfs            64M     0   64M   0% /dev# tmpfs           7.9G     0  7.9G   0% /sys/fs/cgroup# shm              64M     0   64M   0% /dev/shm
登录后复制

~查看内存使用

free -h#               total        used        free      shared  buff/cache   available# Mem:            15G        363M         13G        776K        1.5G         15G# Swap:          1.0G          0B        1.0G
登录后复制

~查看进程

top# top - 15:00:30 up 7 days, 55 min,  0 users,  load average: 0.11, 0.11, 0.09# Tasks:   3 total,   1 running,   2 sleeping,   0 stopped,   0 zombie# %Cpu(s):  0.7 us,  3.8 sy,  0.0 ni, 95.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st# KiB Mem : 16398652 total, 14428952 free,   372944 used,  1596756 buff/cache# KiB Swap:  1048572 total,  1048572 free,        0 used. 15734064 avail Mem # #   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND#     1 root      20   0   18504   3272   2912 S   0.0  0.0   0:00.10 bash#    16 root      20   0   18644   3556   3016 S   0.0  0.0   0:00.32 bash#   130 root      20   0   38744   3168   2624 R   0.0  0.0   0:00.01 top
登录后复制

~查看时间

date# Thu Nov 26 15:07:33 UTC 2020
登录后复制

~后台进程(python)

python &# [1] 136# Python 3.6.6 (default, Sep 12 2018, 18:26:19) # [GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux# Type "help", "copyright", "credits" or "license" for more information.# # [1]+  Stopped                 python
登录后复制

~查看/退出后台进程

ps -ef|grep python# root       136    16  0 15:06 pts/1    00:00:00 python# root       144    16  0 15:11 pts/1    00:00:00 grep --color=auto pythonkill -9 136# [1]+  Killed                  pythonps -ef|grep python# root       146    16  0 15:11 pts/1    00:00:00 grep --color=auto python
登录后复制

~编辑脚本文件

[金融]决策科学-(一)编程工具 - php中文网

[金融]决策科学-(一)编程工具 - php中文网

[金融]决策科学-(一)编程工具 - php中文网

[金融]决策科学-(一)编程工具 - php中文网

详见 https://www.runoob.com/linux/linux-vim.html

vi run.sh
cat run.sh# echo 1# echo 2# echo 3
登录后复制

~修改文件权限

[金融]决策科学-(一)编程工具 - php中文网

详见 https://www.runoob.com/linux/linux-comm-chmod.html

ls -l run.sh 
# -rw-r--r-- 1 root root 21 Nov 26 15:22 run.shchmod +x run.sh 
ls -l run.sh 
# -rwxr-xr-x 1 root root 21 Nov 26 15:22 run.shchmod -x run.sh 
ls -l run.sh 
# -rw-r--r-- 1 root root 21 Nov 26 15:22 run.shchmod +x run.sh 
ls -l run.sh 
# -rwxr-xr-x 1 root root 21 Nov 26 15:22 run.sh
登录后复制

~运行脚本文件

sh run.sh# 1# 2# 3
登录后复制

~FTP操作

  • help或?- 列出所有可用的FTP命令;
  • cd - 更改远程计算机上的目录;
  • lcd - 更改本地计算机上的目录;
  • ls - 列出当前远程目录中的文件和目录的名称;
  • mkdir - 在当前远程目录中创建一个新目录;
  • pwd - 打印远程计算机上的当前工作目录;
  • delete - 删除当前远程目录中的文件;
  • rmdir- 删除当前远程目录中的目录;
  • get - 将一个文件从远程复制到本地计算机;
  • mget - 将多个文件从远程复制到本地计算机;
  • put - 将一个文件从本地复制到远程计算机;
  • mput - 将一个文件从本地复制到远程计算机;
ftp 192.168.42.77# 220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------# 220-You are user number 1 of 50 allowed.# 220-Local time is now 21:35\. Server port: 21.# 220-This is a private system - No anonymous login# 220-IPv6 connections are also welcome on this server.# 220 You will be disconnected after 15 minutes of inactivity.# Name (192.168.42.77:localuser): linuxidc# Password:# 230 OK. Current restricted directory is /# Remote system type is UNIX.# Using binary mode to transfer files.# ftp>ftp > cd ~/ftp_downloads# 下载ftp > get backup.zip# 200 PORT command successful# 150-Connecting to port 60609# 150 6516.9 kbytes to download# 226-File successfully transferred# 226 2.356 seconds (measured here), 2.70 Mbytes per second# 6673256 bytes received in 2.55 seconds (2.49 Mbytes/s)# 上传ftp > put image.jpg# 200 PORT command successful# 150 Connecting to port 34583# 226-File successfully transferred# 226 0.849 seconds (measured here), 111.48 Kbytes per second# 96936 bytes sent in 0.421 seconds (225 kbytes/s)
登录后复制

注意:

1、非特殊情况下,建议不使用root;

2、慎用rm命令: 一旦你执行了上述“rm -rf /” 或者“rm -rf /*”命令,会删除Linux根目录下的所有文件,直接导致服务器瘫痪;

全文目录


1.5 Excel

  • 1.5.1 Excel技巧
    • 1.5.1.1 文件操作
    • 1.5.1.2 窗口设置
    • 1.5.1.3 单元格显示
    • 1.5.1.4 单元格选取
    • 1.5.1.5 单元格编辑
    • 1.5.1.6 单元格格式设置
    • 1.5.1.7 图片处理
    • 1.5.1.8 打印设置
  • 1.5.2 Excel 数据透视表
  • 1.5.3 Excel-SAS控件

1.5.1 Excel技巧

1.5.1.1 文件操作

(1)为excel文件添加打开密码

文件 - 信息 - 保护工作簿 - 用密码进行加密。

(2)为文件添加作者信息

在该excel文件图标上右键单击 - 属性 - 摘要 - 在作者栏中输入

(3)让多人通过局域网共用excel文件

审阅 - 共享工作簿 - 在打开的窗口上选中“允许多用户同时编辑...”

(4)同时打开多个excel文件

按ctrl或shift键选取多个要打开的excel文件,右键菜单中点“打开”

(5)同时关闭所有打开的excel文件

按shift键同时点右上角关闭按钮。

(6)设置文件自动保存时间

文件 - 选项 - 保存 - 设置保存间隔

(7)恢复未保护的excel文件

文件 - 最近所用文件 - 点击“恢复未保存的excel文件”

(8)在excel文件中创建日历

文件 - 新建 - 日历

(9)设置新建excel文件的默认字体和字号

文件 - 选项 - 常规 - 新建工作簿时:设置字号和字体

(10)把A.xlsx文件图标显示为图片形式

把A.xlsx 修改为 A.Jpg

(11)一键新建excel文件

Ctrl + N

(12)把工作表另存为excel文件

在工作表标签上右键 - 移动或复制 - 移动到”新工作簿”

1.5.1.2 窗口设置

(1)同时打开对比两个或多个excel文件

视图 - 全部重排 - 选排列的方向

(2)同时查找一个工作簿中的两个工作表

视图 - 新建窗口 - 全部重排 - 选排列方向

(3)隐藏或显示excel最上面的功能区

Ctrl+F1

(4)隐藏excel工作表界面

选取要隐藏的工作表 - 视图 - 隐藏

(5)让标题行始终显示在最上面

视图 - 冻结窗格 - 冻结首行

(6)把窗口拆分成上下两部分,都可以上下翻看

选取要拆分的位置 - 视图 - 拆分

(7)调整excel工作表显示比例

按ctrl+滚轮

(8)快速切换到另一个excel窗口

ctrl + tab键

(9)全屏显示excel界面

视图 - 全屏显示

1.5.1.3 单元格显示

(1)隐藏0值

文件 - 选项 - 高级 - 去掉“在具有零值.....”勾选

(2)隐藏单元格内所有值

ctrl+1打开单元格设置窗口 - 数字 - 自定义 - 右边文框中输入三个分号;;;

(3)隐藏编辑栏、灰色表格线、列标和行号

视图 - 显示 - 去掉 各项的勾选

1.5.1.4 单元格选取

(1)选取当前表格

按ctrl+a全选当前数据区域

(2)选取表格中的值/公式

按ctrl+g打开定位窗口 - 定位条件 - 值/公式

(3)查找值

按ctrl+f打开查找窗口,输入查找的值 - 查找

(4)选取最下/最右边的非空单元格

按ctrl + 向下/向右箭头

(5)快速选取指定大小的区域

在左上的名称栏中输入单元格地址,如a1:a10000,然后按回车

1.5.1.5 单元格编辑

(1)设置单元格按回车键光标跳转方向

文件 - 选项 - 高级 - 最上面“按Enter键后移动所选内容” - 设置方向

(2)设置下拉菜单,显示A,B,C三个选项

数据 - 数据有效性 - 允许 - 序列 - 输入A,B,C

(3)复制表格保存行高列宽不变

整行选取复制 - 粘贴后点粘贴选项中的“保留列宽”

(4)输入到F列时,自动转到下一行的首列

选取A:F列,输入后按回车即可自动跳转

(5)设置三栏表头

插入 - 形状 - 直线 - 拖入文本框中输入的字体并把边框设置为无

(6)同时编辑多个工作表

按ctrl或shift键选取多个工作表,直接编辑当前工作表即可。

(7)输入身份证号或以0开始的数字

把单元格格式设置成文本,然后再输入

(8)快速删除空行

选取表中某列 - ctrl+g定位 - 定位条件 - 空值 - 删除整行

(9)快速插入空行

在表右侧输入序号1,2,3..N,然后再复制该序号到下面空行,最后按序号列排序即可。

(10)快速合并多行数据

插入批注 - 选取多列数据复制 - 粘贴到批注中,然后再从批注中复制粘至单元格区域中即可。

(11)插入特殊符号

插入 - 符号

(12)查找重复值

选取数据列 - 开始 - 条件格式 - 突出显示单元格规则 - 重复值

(13)删除重复值

选取区域 - 数据 - 删除重复项

(14)单元格分区域需要密码才能编辑

审阅 - 允许用户编辑区域

(15)用excel进行汉英互译

审阅 - 翻释

(16)不复制隐藏的行

选取区域 - ctrl+g定位 - 定位条件 - 可见单元格 - 复制 - 粘贴

(17)单元格强制换行

在需要换行字符后按alt+enter键

1.5.1.6 单元格格式设置

(1)万元显示

自定义格式代码:0“,"0,

(2)日期按年年年年-月月-日日显示

自定义格式代码:yyyy-mm-dd

(3)手机号分段显示

自定义格式代码:000 0000 0000

(4)数字1显示成1月

自定义格式代码: 0“月"

1.5.1.7 图片处理

(1)删除工作表中所有图片

ctrl+g定位 - 定位条件 - 对象 - 删除

(2)工作表插入背景图片

页面布局 - 背景 - 选择插入图片

(3)插入可以打印的背景

插入 - 页眉页脚 - 选取页眉后点图片 - 选取图片并拖入

1.5.1.8 打印设置

(1)打印标题行

页面布局 - 打印标题 - 点顶端标题行后的折叠按钮,选取要打印的标题行。

(2)多页强制打印到一页上

页面布局 - 打印标题 - 页面 - 调整为1页宽1页高

(3)按厘米设置行高

视图 - 页面布局,在页面布局下行高单位是厘米

(4)插入分页符

选取要插入的位置 - 页面布局 - 分页符 - 插入分页符

1.5.2 Excel 数据透视表

普及数据透视表概念,配合PROC SUMMARY,简直是数据分析利器,图有指出处。

[金融]决策科学-(一)编程工具 - php中文网[金融]决策科学-(一)编程工具 - php中文网[金融]决策科学-(一)编程工具 - php中文网[金融]决策科学-(一)编程工具 - php中文网[金融]决策科学-(一)编程工具 - php中文网[金融]决策科学-(一)编程工具 - php中文网[金融]决策科学-(一)编程工具 - php中文网[金融]决策科学-(一)编程工具 - php中文网[金融]决策科学-(一)编程工具 - php中文网[金融]决策科学-(一)编程工具 - php中文网[金融]决策科学-(一)编程工具 - php中文网[金融]决策科学-(一)编程工具 - php中文网[金融]决策科学-(一)编程工具 - php中文网[金融]决策科学-(一)编程工具 - php中文网[金融]决策科学-(一)编程工具 - php中文网[金融]决策科学-(一)编程工具 - php中文网[金融]决策科学-(一)编程工具 - php中文网[金融]决策科学-(一)编程工具 - php中文网[金融]决策科学-(一)编程工具 - php中文网[金融]决策科学-(一)编程工具 - php中文网

1.5.3 Excel-SAS控件

最后,随着Excel不断更新,如SAS控件、SMART-BI控件使Excel如虎添翼,以下会举例Excel-SAS控件。但值得注意的是,Power-BI、Tableu、SuperSet、Quick BI 等更强BI工具甚至分析工具的出现,这对Excel仍有不小的挑战,待持续关注吧。

  • Excel-SAS控件

[金融]决策科学-(一)编程工具 - php中文网

对于远程连接SAS模式,Excel直接读取并数据透视之,甚至自动图或快速统计,也都非常方便愉快。

全文目录


1.6 Julia

Julia 中文文档

全文目录


1.7 PaddlePaddle

以下展开一个手写数字识别任务示例:

1.7.1 安装

  • CPU 版的 PaddlePaddle
python3 -m pip install paddlepaddle==3.0.0b1 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/
登录后复制
  • CUDA11.8 的 PaddlePaddle
python3 -m pip install paddlepaddle-gpu==3.0.0b1 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/
登录后复制
  • CUDA12.3 的 PaddlePaddle
python3 -m pip install paddlepaddle-gpu==3.0.0b1 -i https://www.paddlepaddle.org.cn/packages/stable/cu123/
登录后复制

1.7.2 准备

  • 使用 pip 工具安装 matplotlib 和 numpy
python3 -m pip install matplotlib numpy -i https://mirror.baidu.com/pypi/simple
登录后复制

1.7.3 开始

In [1]
import paddleimport numpy as npfrom paddle.vision.transforms import Normalize

transform = Normalize(mean=[127.5], std=[127.5], data_format="CHW")# 下载数据集并初始化 DataSettrain_dataset = paddle.vision.datasets.MNIST(mode="train", transform=transform)
test_dataset = paddle.vision.datasets.MNIST(mode="test", transform=transform)# 模型组网并初始化网络lenet = paddle.vision.models.LeNet(num_classes=10)
model = paddle.Model(lenet)# 模型训练的配置准备,准备损失函数,优化器和评价指标model.prepare(
    paddle.optimizer.Adam(parameters=model.parameters()),
    paddle.nn.CrossEntropyLoss(),
    paddle.metric.Accuracy(),
)# 模型训练model.fit(train_dataset, epochs=5, batch_size=64, verbose=1)# 模型评估model.evaluate(test_dataset, batch_size=64, verbose=1)# 保存模型model.save("./output/mnist")# 加载模型model.load("output/mnist")# 从测试集中取出一张图片img, label = test_dataset[0]# 将图片shape从1*28*28变为1*1*28*28,增加一个batch维度,以匹配模型输入格式要求img_batch = np.expand_dims(img.astype("float32"), axis=0)# 执行推理并打印结果,此处predict_batch返回的是一个list,取出其中数据获得预测结果out = model.predict_batch(img_batch)[0]
pred_label = out.argmax()print("true label: {}, pred label: {}".format(label[0], pred_label))# 可视化图片from matplotlib import pyplot as plt

plt.imshow(img[0])
登录后复制
/opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages/paddle/utils/cpp_extension/extension_utils.py:686: UserWarning: No ccache found. Please be aware that recompiling all source files may be required. You can download and install ccache from: https://github.com/ccache/ccache/blob/master/doc/INSTALL.md
  warnings.warn(warning_message)
登录后复制
The loss value printed in the log is the current step, and the metric is the average value of previous steps.
Epoch 1/5
step 938/938 [==============================] - loss: 0.0279 - acc: 0.9346 - 26ms/step          
Epoch 2/5
step 938/938 [==============================] - loss: 0.0349 - acc: 0.9727 - 27ms/step          
Epoch 3/5
step 938/938 [==============================] - loss: 0.0713 - acc: 0.9781 - 27ms/step          
Epoch 4/5
step 938/938 [==============================] - loss: 0.0098 - acc: 0.9811 - 26ms/step          
Epoch 5/5
step 938/938 [==============================] - loss: 0.0348 - acc: 0.9827 - 27ms/step          
Eval begin...
step 157/157 [==============================] - loss: 0.0056 - acc: 0.9783 - 12ms/step          
Eval samples: 10000
true label: 7, pred label: 7
登录后复制
<matplotlib.image.AxesImage at 0x7fceda27ce50>
登录后复制
<Figure size 640x480 with 1 Axes>
登录后复制

以上就是[金融]决策科学-(一)编程工具的详细内容,更多请关注php中文网其它相关文章!

编程速学教程(入门课程)
编程速学教程(入门课程)

编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号