中文核心期刊要目总览(2020版)核心期刊表


中文核心期刊要目总览(2020版)核心期刊表
排序 中文刊名
学科门类:第一编 哲学、社会学、政治、法律类
综合性人文、社会科学 A/K,Z
1 中国社会科学
2 中国人民大学学报
3 学术月刊
4 北京大学学报.哲学社会科学版
5 清华大学学报.哲学社会科学版
6 武汉大学学报.哲学社会科学版
7 北京师范大学学报.社会科学版
8 社会科学
9 南京社会科学
10 复旦学报.社会科学版
11 吉林大学社会科学学报
12 南开学报.哲学社会科学版
13 华中师范大学学报.人文社会科学版
14 南京大学学报.哲学、人文科学、社会科学
15 探索与争鸣
16 文史哲
17 天津社会科学
18 社会科学战线
19 中国农业大学学报.社会科学版
20 浙江大学学报.人文社会科学版
21 学海
中州期刊联盟  从数据中读取温度
22 江海学刊
23 社会科学研究
24 浙江社会科学
25 中山大学学报.社会科学版
26 厦门大学学报.哲学社会科学版
27 学术研究
28 苏州大学学报.哲学社会科学版
29 人文杂志
30 求是学刊
31 西南大学学报.社会科学版
32 学习与探索
33 山东大学学报.哲学社会科学版
34 上海大学学报.社会科学版
35 广东社会科学
36 贵州社会科学
37 中州学刊
38 江苏社会科学
39 江汉论坛
40 中国高校社会科学
41 四川大学学报.哲学社会科学版
42 新疆师范大学学报.哲学社会科学版
43 华东师范大学学报.哲学社会科学版
44 中国地质大学学报.社会科学版
45 河北学刊
46 思想战线
47 东岳论丛
48 西南民族大学学报.人文社会科学版
49 西北师大学报.社会科学版
50 湖南师范大学社会科学学报
51 社会科学辑刊
52 陕西师范大学学报.哲学社会科学版
53 南京师大学报.社会科学版
54 上海交通大学学报.哲学社会科学版
55 东北师大学报.哲学社会科学版
56 学习与实践
57 山东社会科学
中州期刊联盟  从数据中读取温度
58 河南大学学报.社会科学版
59 河南师范大学学报.哲学社会科学版
60 上海师范大学学报.哲学社会科学版
61 浙江学刊
62 江淮论坛
63 江西师范大学学报.哲学社会科学版
64 暨南学报.哲学社会科学版
65 深圳大学学报.人文社会科学版
66 东南学术
67 甘肃社会科学
68 北京社会科学
69 西安交通大学学报.社会科学版
70 中南民族大学学报.人文社会科学版
71 兰州大学学报.社会科学版
72 国外社会科学
73 云南师范大学学报.哲学社会科学版
74 大连理工大学学报.社会科学版
75 湖北大学学报.哲学社会科学版
76 浙江工商大学学报
77 北京理工大学学报.社会科学版
78 中国青年社会科学
79 华中科技大学学报.社会科学版
80 重庆大学学报.社会科学版
81 云南社会科学
82 江西社会科学
83 同济大学学报.社会科学版
84 学术论坛
85 四川师范大学学报.社会科学版
86 河海大学学报.哲学社会科学版
87 中央民族大学学报.哲学社会科学版
88 西北大学学报.哲学社会科学版
89 河南社会科学
90 北京联合大学学报.人文社会科学版
91 湖南科技大学学报.社会科学版
92 福建论坛.人文社会科学版
93 学术界
94 郑州大学学报.哲学社会科学版
95 华南师范大学学报.社会科学版
96 北京交通大学学报.社会科学版
97 首都师范大学学报.社会科学版
98 云南民族大学学报.哲学社会科学版
99 湖北社会科学
100 内蒙古社会科学
中州期刊联盟  从数据中读取温度
101 安徽大学学报.哲学社会科学版
102 东北大学学报.社会科学版
103 华侨大学学报.哲学社会科学版
104 华东理工大学学报.社会科学版
105 山西大学学报.哲学社会科学版
106 河北大学学报.哲学社会科学版
107 中国社会科学院研究生院学报
108 天津师范大学学报.社会科学版
109 湘潭大学学报.哲学社会科学版
110 中南大学学报.社会科学版
111 广西民族大学学报.哲学社会科学版
112 杭州师范大学学报.社会科学版
113 社会科学家
114 北京工业大学学报.社会科学版
115 学术交流
116 山东师范大学学报.人文社会科学版
117 湖南大学学报.社会科学版
118 理论月刊
119 湖湘论坛
120 青海社会科学
121 求索
哲学(除心理学) B(除B9、B84)
1 哲学研究
2 哲学动态
3 世界哲学
4 中国哲学史
5 周易研究
6 道德与文明
7 伦理学研究
8 现代哲学
9 孔子研究
心理学 B84
1 心理学报
2 心理科学进展
3 心理发展与教育
4 心理与行为研究
5 心理学探新
6 心理科学
宗教 B9
1 世界宗教研究
2 宗教学研究
3 世界宗教文化
4 回族研究
5 中国宗教
6 中国道教
统计学 C8
1 统计研究
2 统计与信息论坛
3 统计与决策
4 数理统计与管理
社会学 C91
1 社会学研究
2 社会
3 妇女研究论丛
4 青年研究
5 社会学评论
6 社会保障研究
人口学 C92
1 人口研究
2 中国人口科学
3 人口学刊
4 人口与经济
5 人口与发展
6 西北人口
中州期刊联盟  从数据中读取温度
管理学 C93
1 管理学报
2 管理科学学报
3 中国管理科学
4 管理工程学报
5 领导科学
6 现代管理科学
人才学 C96
1 中国人力资源开发
民族学、人类文化学 C95
1 民族研究
2 广西民族研究
3 黑龙江民族丛刊
4 世界民族
5 西北民族研究
6 青海民族研究
7 北方民族大学学报.哲学社会科学版
8 民族学刊
9 贵州民族研究
10 西北民族大学学报.哲学社会科学版
11 民族论坛
12 青海民族大学学报.社会科学版
13 西藏研究
14 湖北民族学院学报.哲学社会科学版(改名为:湖北民族大学学报.哲学社会科学版)
15 西藏大学学报.社会科学版
中国政治(除公安管理) D0,D2,D4,D6(除D035.3,D631),A
1 政治学研究
2 公共管理学报
3 中国行政管理
4 开放时代
5 行政论坛
6 公共行政评论
7 马克思主义研究
8 社会主义研究
9 中共中央党校(国家行政学院)学报
10 上海行政学院学报
11 探索
12 中国特色社会主义研究
13 马克思主义与现实
14 理论探讨
15 求是
16 教学与研究
17 甘肃行政学院学报
18 电子政务
19 理论与改革
20 北京行政学院学报
21 理论探索
22 人民论坛
23 治理研究
24 江苏行政学院学报
25 求实
26 科学社会主义
27 中共党史研究
28 毛泽东邓小平理论研究
29 新视野
30 学术前沿
31 公共管理与政策评论
32 天津行政学院学报
33 思想理论教育导刊
中州期刊联盟  从数据中读取温度
34 台湾研究
35 中共天津市委党校学报
36 理论学刊
37 红旗文稿
38 中国青年研究
39 中共福建省委党校学报(改名为:中国福建省委党校(福建行政学院)学报)
40 党的文献
41 学习论坛
42 党政研究
43 毛泽东研究
44 长白学刊
45 理论导刊
46 行政管理改革
国际政治 D1,D3,D5,D7,D8
1 世界经济与政治
2 外交评论
3 当代亚太
4 国际问题研究
5 国际政治研究
6 现代国际关系
7 国际政治科学
8 西亚非洲
9 当代世界与社会主义
10 国际安全研究
11 国际观察
12 国际展望
13 美国研究
14 欧洲研究
15 南洋问题研究
16 东北亚论坛
17 南亚研究
18 国外理论动态
19 阿拉伯世界研究
20 太平洋学报
21 国际论坛
22 当代世界
公安管理 D035.3,D631
1 中国人民公安大学学报.社会科学版
法律 D9
1 中国法学
2 法学研究
3 中外法学
4 法学
5 法律科学
6 法学家
7 清华法学
8 法商研究
9 当代法学
10 政治与法律
11 现代法学
12 法学评论
13 政法论坛
14 比较法研究
15 法制与社会发展
16 环球法律评论
17 华东政法大学学报
中州期刊联盟  从数据中读取温度
18 法学论坛
19 国家检察官学院学报
20 法学杂志
21 东方法学
22 行政法学研究
23 法律适用(改名为:法律适用.理论应用)
24 中国刑事法杂志
25 政法论丛
26 河北法学
27 知识产权
28 北方法学
学科门类:第二编 经济
综合性经济科学 F
1 经济研究
2 管理世界
3 经济学
4 南开经济研究
5 经济学家
6 经济评论
7 经济学动态
8 经济科学
9 经济管理
10 当代财经
11 当代经济科学
12 广东财经大学学报
13 中南财经政法大学学报
14 财经科学
15 上海财经大学学报.哲学社会科学版
16 经济纵横
17 贵州财经大学学报
18 经济问题
19 经济经纬
20 现代财经
21 当代经济研究
22 江西财经大学学报
23 云南财经大学学报
24 山西财经大学学报
25 首都经济贸易大学学报
26 河北经贸大学学报
经济学,中国经济,经济管理(除会计,企业经济) F0,F12,F2(除F23,F27)
1 数量经济技术经济研究
2 经济理论与经济管理
3 政治经济学评论
4 改革
5 上海经济研究
6 经济问题探索
7 南方经济
8 中国流通经济
9 地域研究与开发
10 城市问题
11 宏观经济研究
12 城市发展研究
13 中国经济问题
中州期刊联盟  从数据中读取温度
14 产经评论
15 管理学刊
16 区域经济评论
17 科技管理研究
18 华东经济管理
19 西部论坛
20 经济与管理评论
21 现代经济探讨
22 经济体制改革
23 中国经济史研究
24 科学管理研究
25 技术经济
26 生态经济
27 当代经济管理
28 运筹与管理
29 资源开发与市场
30 宏观经济管理
世界经济 F1(除F12)
1 世界经济
2 世界经济文汇
3 国际经济评论
4 世界经济研究
5 经济社会体制比较
6 现代日本经济
7 亚太经济
8 世界经济与政治论坛
9 外国经济与管理
会计(除审计) F23(除F239)
1 会计研究
2 会计与经济研究
3 会计之友
4 财会月刊
5 财会通讯
6 中国注册会计师
7 财务与会计
审计 F239
1 审计研究
2 审计与经济研究
3 南京审计大学学报
农业经济 F3
1 中国农村经济
2 农业经济问题
3 中国农村观察
4 农业技术经济
中州期刊联盟  从数据中读取温度
5 中国土地科学
6 南京农业大学学报.社会科学版
7 农村经济
8 农业现代化研究
9 西北农林科技大学学报.社会科学版
10 中国农业资源与区划
11 华南农业大学学报.社会科学版
12 华中农业大学学报.社会科学版
13 农林经济管理学报
14 林业经济问题
15 林业经济
16 农业经济与管理
17 农业经济
工业经济/邮电通信经济(除旅游经济),企业经济 F4/F6(除F59) ,F27
1 中国工业经济
2 南开管理评论
3 管理科学
4 管理评论
5 产业经济研究
6 软科学
7 预测
8 经济与管理研究
9 工业工程与管理
10 工业技术经济
11 管理案例研究与评论
12 企业经济
13 技术经济与管理研究
14 管理现代化
15 工业工程
16 建筑经济
中州期刊联盟  从数据中读取温度
旅游经济 F59
1 旅游学刊
2 旅游科学
贸易经济 F7
1 国际贸易问题
2 国际经贸探索
3 财贸经济
4 北京工商大学学报.社会科学版
5 商业经济与管理
6 商业经济研究
7 国际贸易
8 国际商务
9 商业研究
10 国际商务研究
11 消费经济(原分类:经济学,中国经济,经济管理(除会计,企业经济))
12 国际经济合作
13 价格月刊
14 财贸研究
15 上海对外经贸大学学报
16 价格理论与实践
财政、国家财政 F81
1 财政研究
2 税务研究
3 国际税收
4 地方财政研究
5 财经研究
6 中央财经大学学报
7 税收经济研究
8 税务与经济
9 财经论丛
10 财经问题研究
货币,金融、银行,保险 F82/84
1 金融研究
2 国际金融研究
3 金融经济学研究
4 金融监管研究
5 金融论坛
6 保险研究
7 金融评论
8 证券市场导报
9 南方金融
10 上海金融
11 新金融
12 财经理论与实践
13 金融理论与实践
14 中国金融
15 投资研究
16 金融发展研究
17 金融与经济
18 征信
19 西南金融
20 武汉金融
学科门类:第三编 文化、教育、历史
文化理论/新闻事业 G0/G21
1 国际新闻界
2 新闻与传播研究
3 新闻记者
4 现代传播
5 新闻大学
6 当代传播
7 新闻与写作
8 新闻界
9 新闻爱好者
10 传媒
11 青年记者
广播、电视事业 G22
1 中国广播电视学刊
2 电视研究
出版事业 G23
1 中国科技期刊研究
2 编辑学报
3 科技与出版
4 编辑之友
5 出版发行研究
6 中国出版
7 出版科学
8 中国编辑
9 现代出版
10 编辑学刊
11 出版广角
博物馆事业 G26
1 中国博物馆
图书馆事业、信息事业类 G25
1 中国图书馆学报
2 图书情报工作
3 大学图书馆学报
4 情报学报
5 图书情报知识
6 图书与情报
7 情报理论与实践
8 图书馆论坛
9 图书馆学研究
10 国家图书馆学刊
11 图书馆杂志
12 图书馆建设
13 情报资料工作
14 图书馆
15 情报杂志
16 情报科学
17 数据分析与知识发现
18 图书馆工作与研究
中州期刊联盟  从数据中读取温度
档案事业 G27
1 档案学通讯
2 档案学研究
3 中国档案
4 浙江档案
5 北京档案
6 档案管理
7 档案与建设
科学、科学研究 G3
1 科学学研究
2 科学学与科学技术管理
3 科研管理
4 科技进步与对策
5 中国科技论坛
6 中国软科学
7 研究与发展管理
教育学/教育事业,师范教育、教师教育(除电化教育) G4(除G43)/G5,G65
1 教育研究
2 北京大学教育评论
3 华东师范大学学报.教育科学版
4 清华大学教育研究
5 全球教育展望
6 教育发展研究
7 教师教育研究
8 比较教育研究
9 教育与经济
10 教育学报
11 外国教育研究
12 现代教育管理
13 湖南师范大学教育科学学报
14 国家教育行政学院学报
15 教育科学
16 中国教育学刊
17 教育学术月刊
18 河北师范大学学报.教育科学版
19 教育理论与实践
20 苏州大学学报.教育科学版
21 当代教育论坛
22 思想理论教育
23 当代教育科学
24 学校党建与思想教育
电化教育 G43
1 开放教育研究
2 现代远程教育研究
3 远程教育杂志
4 中国电化教育
5 电化教育研究
学前教育、幼儿教育 G61
1 学前教育研究
初等教育/中等教育(除各科教育) G62/G63(除G623,G633)
1 课程·教材·教法
2 教育研究与实验
3 教育科学研究
4 外国中小学教育(改名为:比较教育学报)
5 上海教育科研
6 基础教育
7 中小学管理
8 天津师范大学学报.基础教育版
9 中国考试
10 人民教育
初等教育,中等教育(政治) G623.1,G633.2
1 思想政治课教学
2 中学政治教学参考.上旬,高中(改名为:中学政治教学参考.1周,高中教学)
初等教育,中等教育(语文) G623.2,G633.3
1 中学语文教学
2 语文建设
初等教育,中等教育(外语) G623.3,G633.4
1 中小学英语教学与研究
2 中小学外语教学.中学篇
初等教育,中等教育(历史) G623.41,G633.51
1 历史教学
中州期刊联盟  从数据中读取温度
初等教育,中等教育(地理) G623.45,G633.55
1 中学地理教学参考
初等教育,中等教育(数学) G623.5,G633.6
1 数学教育学报
2 数学通报
中等教育(物理) G633.7
1 物理教师
2 物理教学
中等教育(化学) G633.8
1 化学教育(中英文)
2 化学教学
中等教育(生物) G633.91
1 中学生物教学(分成为:中学生物教学.上半月,高初中和中学生物教学.下半月,学研)
高等教育 G64
1 高等教育研究
2 中国高教研究
3 高等工程教育研究
4 复旦教育论坛
5 高校教育管理
6 中国高等教育
7 现代大学教育
8 江苏高教
9 重庆高教研究
10 学位与研究生教育
11 中国大学教学
12 高教探索
13 思想教育研究
14 大学教育科学
15 研究生教育研究
16 黑龙江高教研究
17 思想政治教育研究
18 高教发展与评估
19 中国高校科技
职业技术教育/自学 G71/G79
1 职教论坛
2 职业技术教育
3 教育与职业
4 中国特殊教育
5 中国职业技术教育
6 民族教育研究
7 成人教育
体育 G8
1 体育科学
2 北京体育大学学报
3 上海体育学院学报
4 武汉体育学院学报
5 体育学刊
6 体育与科学
7 中国体育科技
8 西安体育学院学报
9 成都体育学院学报
10 天津体育学院学报
11 体育文化导刊
12 体育学研究
13 沈阳体育学院学报
14 首都体育学院学报
15 山东体育学院学报
16 广州体育学院学报
中州期刊联盟  从数据中读取温度
语言学,汉语,中国少数民族语言 H(除H3/H9)
1 世界汉语教学
2 中国语文
3 中国翻译
4 当代修辞学
5 语言教学与研究
6 当代语言学
7 汉语学习
8 语言科学
9 语言文字应用
10 语文研究
11 语言研究
12 方言
13 上海翻译
14 民族语文
15 汉语学报
16 古汉语研究
17 语言战略研究
外国语言 H3/H9
1 外语教学与研究
2 现代外语
3 外语界
4 外语教学
5 中国外语
6 外国语
7 外语与外语教学
8 外语教学理论与实践
9 解放军外国语学院学报
10 外语电化教学
11 西安外国语大学学报
12 外语学刊
13 外语研究
14 外国语文
15 山东外语教学
文学(除中国文学作品) I(除I21/I29)
1 文学评论
2 文学遗产
3 中国现代文学研究丛刊
4 文艺争鸣
5 当代作家评论
6 文艺理论研究
7 外国文学评论
8 外国文学研究
9 中国文学批评
10 文艺研究
11 外国文学
12 南方文坛
13 中国文学研究(长沙)
14 当代外国文学
15 明清小说研究
16 中国比较文学
17 国外文学
18 红楼梦学刊
19 小说评论
20 民族文学研究
21 鲁迅研究月刊
22 当代文坛
23 扬子江评论(改名为:扬子江文学评论)
24 现代中文学刊
25 中国文化研究
26 新文学史料
中州期刊联盟 从数据中读取温度
27 文艺理论与批评
中国文学作品 I21/I29
1 收获
2 人民文学
3 上海文学
4 花城
5 当代
6 作家
7 山花
8 天涯
9 芙蓉
10 北京文学.原创
11 民族文学
12 十月
13 江南
14 小说月报.原创版
15 长江文艺.原创
艺术(除绘画/电影、电视艺术) J(除J2/J9)
1 民族艺术
2 艺术百家
绘画,雕塑,工艺美术 J2,J3,J5
1 南京艺术学院学报.美术与设计版
2 美术
3 美术研究
4 装饰
5 新美术
6 美术观察
7 美术学报
8 中国书法
音乐 J6
1 中央音乐学院学报
2 音乐研究
3 中国音乐学
4 中国音乐
5 音乐艺术
6 黄钟
7 人民音乐
8 星海音乐学院学报
9 南京艺术学院学报.音乐与表演版
10 音乐创作
舞蹈 J7
1 北京舞蹈学院学报
戏剧、曲艺、杂技艺术 J8
1 戏剧艺术
2 戏剧
3 戏曲艺术
4 四川戏剧
5 戏剧文学
6 中国戏剧
电影、电视艺术 J9
1 电影艺术
2 当代电影
3 北京电影学院学报
4 世界电影
5 电影新作
6 中国电视
7 电影评介
8 电影文学
历史(除中国学、汉学和文物考古) K(除K207.8,K85,K9)
1 历史研究
2 近代史研究
3 中国史研究
4 清史研究
5 史学月刊
6 世界历史
7 史学集刊
8 中国边疆史地研究
9 史林
10 安徽史学
11 中国社会经济史研究
12 抗日战争研究
13 西域研究
14 史学理论研究
15 史学史研究
16 中国农史
17 历史档案
18 民俗研究
19 民国档案
20 中国史研究动态
21 文史
22 中国藏学
中国学、汉学 K207.8
1 文献
2 中国典籍与文化
3 中华文化论坛
文物考古 K85
1 考古
2 考古学报
3 文物
4 考古与文物
5 江汉考古
6 华夏考古
7 南方文物
8 故宫博物院院刊
9 中原文物
10 敦煌研究
11 四川文物
12 文物保护与考古科学
13 北方文物
14 东南文化
15 文博
16 敦煌学辑刊
17 中国国家博物馆馆刊
18 农业考古
第四编 自然科学
综合性理工农医 N/X
1 科学通报
2 中南大学学报.自然科学版
3 北京大学学报.自然科学版
4 工程科学与技术
5 工程科学学报
6 同济大学学报.自然科学版
7 西安交通大学学报
8 浙江大学学报.工学版
9 西南交通大学学报
10 中国科学.技术科学
11 华中科技大学学报.自然科学版
12 东南大学学报.自然科学版
13 天津大学学报.自然科学与工程技术版
14 哈尔滨工业大学学报
15 吉林大学学报.工学版
16 河海大学学报.自然科学版
17 应用基础与工程科学学报
18 上海交通大学学报
19 清华大学学报.自然科学版
20 湖南大学学报.自然科学版
21 武汉大学学报.理学版
22 华南理工大学学报.自然科学版
23 哈尔滨工程大学学报
24 兰州大学学报.自然科学版
25 中山大学学报.自然科学版
26 北京工业大学学报
27 东北大学学报.自然科学版
28 国防科技大学学报
29 北京理工大学学报
30 大连理工大学学报
31 北京师范大学学报.自然科学版
32 浙江大学学报.理学版
33 江苏大学学报.自然科学版
34 南京大学学报.自然科学
35 云南大学学报.自然科学版
36 重庆大学学报
37 空军工程大学学报.自然科学版
38 西北工业大学学报
39 武汉大学学报.工学版
40 西南大学学报.自然科学版
41 厦门大学学报.自然科学版
42 中国科学院大学学报
43 深圳大学学报.理工版
44 中国工程科学
45 四川大学学报.自然科学版
46 华东理工大学学报.自然科学版
47 华东师范大学学报.自然科学版
48 南京理工大学学报
49 北京交通大学学报
50 吉林大学学报.理学版
51 上海大学学报.自然科学版
52 西北大学学报.自然科学版
53 应用科学学报
54 陕西师范大学学报.自然科学版
55 暨南大学学报.自然科学与医学版
56 山东大学学报.理学版
57 复旦学报.自然科学版
58 辽宁工程技术大学学报.自然科学版
59 山东大学学报.工学版
60 华中师范大学学报.自然科学版
61 中国科学技术大学学报
62 天津工业大学学报
63 沈阳工业大学学报
64 哈尔滨理工大学学报
65 山东科技大学学报.自然科学版
66 北京化工大学学报.自然科学版
67 重庆师范大学学报.自然科学版
68 河南科技大学学报.自然科学版
69 广西大学学报.自然科学版
70 兰州理工大学学报
71 河南理工大学学报.自然科学版
72 桂林理工大学学报
73 南开大学学报.自然科学版
74 华南师范大学学报.自然科学版
75 合肥工业大学学报.自然科学版
76 福州大学学报.自然科学版
77 中国科技论文
78 科学技术与工程
79 东北师大学报.自然科学版
80 重庆理工大学学报.自然科学版
81 南京工业大学学报.自然科学版
82 西北师范大学学报.自然科学版
83 南京师大学报.自然科学版
84 海军工程大学学报
85 河南师范大学学报.自然科学版
86 石河子大学学报.自然科学版
87 郑州大学学报.工学版
88 燕山大学学报
89 山西大学学报.自然科学版
90 太原理工大学学报
91 山西农业大学学报.自然科学版
92 山东农业大学学报.自然科学版
93 济南大学学报.自然科学版
94 昆明理工大学学报.自然科学版
95 河北大学学报.自然科学版
96 西安科技大学学报
97 上海理工大学学报
98 西安理工大学学报
99 浙江工业大学学报
100 武汉科技大学学报
101 华北水利水电大学学报.自然科学版
102 江西师范大学学报.自然科学版
103 广西科学
104 南昌大学学报.理科版
105 陕西科技大学学报
106 湖南科技大学学报.自然科学版
107 内蒙古大学学报.自然科学版
108 江苏科技大学学报.自然科学版
109 大连工业大学学报
110 河北科技大学学报
111 广西师范大学学报.自然科学版
112 湖南师范大学自然科学学报
113 安徽大学学报.自然科学版
114 南京信息工程大学学报.自然科学版
115 扬州大学学报.自然科学版
116 天津师范大学学报.自然科学版
117 信阳师范学院学报.自然科学版
118 中南民族大学学报.自然科学版
119 郑州大学学报.理学版
自然科学总论 N
1 系统工程理论与实践
2 自然科学史研究
3 自然辩证法研究
4 复杂系统与复杂性科学
5 科学技术哲学研究
6 自然辩证法通讯
7 中国科技史杂志
8 系统科学学报
9 系统工程学报
10 中国科学基金
11 系统工程
12 系统管理学报
13 中国科学院院刊
14 科技导报
15 科普研究
16 实验室研究与探索
17 实验技术与管理
数学 O1
1 数学学报
2 计算数学
3 中国科学.数学
4 应用数学学报
5 数学年刊.A辑
6 应用数学
7 数学物理学报
8 高校应用数学学报.A辑
9 数学进展
10 系统科学与数学
11 运筹学学报
12 模糊系统与数学
13 应用概率统计
14 工程数学学报
力学 O3
1 力学学报
2 爆炸与冲击
3 振动与冲击
4 固体力学学报
5 工程力学
6 计算力学学报
7 应用数学和力学
8 力学季刊
9 振动工程学报
10 应用力学学报
11 实验力学
12 力学与实践
13 力学进展
物理 O4
1 光学学报
2 物理学报
3 中国激光
4 中国光学
5 物理学进展
6 光子学报
7 发光学报
8 中国科学.物理学、力学、天文学
9 光谱学与光谱分析
10 波谱学杂志
11 声学学报
12 量子光学学报
13 强激光与粒子束
14 原子与分子物理学报
15 量子电子学报
16 计算物理
17 原子核物理评论
18 物理
19 高压物理学报
化学/晶体学 O6/O7
1 分析化学
2 高等学校化学学报
3 化学学报
4 色谱
5 有机化学
6 物理化学学报
7 分析测试学报
8 化学进展
9 无机化学学报
10 分析试验室
11 中国科学.化学
12 分子催化
13 质谱学报
14 分析科学学报
15 理化检验.化学分册
16 化学研究与应用
17 化学通报
18 中国无机分析化学
19 人工晶体学报
20 分子科学学报
21 影像科学与光化学
22 功能高分子学报
23 化学试剂
天文学 P1
1 天文学报
2 天文学进展
测绘学 P2
1 测绘学报
2 武汉大学学报.信息科学版
3 测绘科学
4 测绘通报
5 大地测量与地球动力学
6 遥感学报
7 地球信息科学学报
8 测绘科学技术学报
9 海洋测绘
地球物理学 P3
1 地球物理学报
2 地震学报
3 地震地质
4 地震工程学报
5 地震
6 中国地震
7 地震研究
8 震灾防御技术
9 水文
10 地球物理学进展
11 地震工程与工程振动
大气科学(气象学) P4
1 大气科学
2 气象学报
3 高原气象
4 气象
5 应用气象学报
6 大气科学学报
7 气候与环境研究
8 气候变化研究进展
9 热带气象学报
10 气象科学
地质学 P5
1 岩石学报
2 矿床地质
3 地质学报
4 地学前缘
5 地质通报
6 中国地质
7 地球学报
8 地质论评
9 中国科学.地球科学
10 大地构造与成矿学
11 岩石矿物学杂志
12 沉积学报
13 吉林大学学报.地球科学版
14 地球化学
15 古地理学报
16 地球科学
17 高校地质学报
18 矿物学报
19 第四纪研究
20 现代地质
21 地质与勘探
22 矿物岩石地球化学通报
23 矿物岩石
24 地质科技情报(改名为:地质科技通报)
25 地质科学
26 地层学杂志
27 西北地质
28 沉积与特提斯地质
29 物探与化探
30 岩矿测试
31 水文地质工程地质
32 地球科学与环境学报
33 地质力学学报
海洋学 P7
1 海洋学报
2 海洋地质与第四纪地质
3 海洋通报
4 热带海洋学报
5 应用海洋学学报
6 海洋科学进展
7 海洋地质前沿
8 海洋工程
9 海洋学研究
10 极地研究
11 海洋预报
12 海洋科学
13 海洋湖沼通报
14 海洋与湖沼
15 中国海洋大学学报.自然科学版
地理学 K9,P9
1 地理学报
2 地理科学
3 地理研究
4 地理科学进展
5 人文地理
6 中国沙漠
7 经济地理
8 中国历史地理论丛
9 干旱区地理
10 山地学报
11 地球科学进展
12 冰川冻土
13 地理与地理信息科学
14 湿地科学
15 世界地理研究
16 热带地理
17 干旱区资源与环境
18 干旱区研究
19 湖泊科学
20 中国岩溶
生物科学(除植物学,动物学/人类学) Q(除Q94/Q98)
1 生态学报
2 生物多样性
3 应用生态学报
4 生态学杂志
5 遗传
6 水生生物学报
7 微生物学报
8 生物工程学报
9 应用与环境生物学报
10 微生物学通报
11 古生物学报
12 生物化学与生物物理进展
13 古脊椎动物学报
14 中国生物工程杂志
15 中国科学.生命科学
16 生物技术通报
17 基因组学与应用生物学
18 微体古生物学报
19 中国生物化学与分子生物学报
20 生命科学
21 生物学杂志
植物学 Q94
1 植物生态学报
2 植物学报(2009-)
3 西北植物学报
4 植物生理学报
5 植物科学学报
6 菌物学报
7 植物资源与环境学报
8 植物研究
9 广西植物
10 热带亚热带植物学报
动物学/人类学 Q95/Q98
1 昆虫学报
2 兽类学报
中州期刊联盟 从数据中读取温度
3 动物学杂志
4 应用昆虫学报
5 人类学学报
6 四川动物
7 中国实验动物学报
8 野生动物学报
学科门类:第五编 医药、卫生
综合性医药卫生(除一般理论,教育与普及) R(除R-0,R-4)
1 中华医学杂志
2 南方医科大学学报
3 北京大学学报.医学版
4 中国医学科学院学报
5 第三军医大学学报
6 解放军医学杂志
7 中南大学学报.医学版
8 华中科技大学学报.医学版
9 浙江大学学报.医学版
10 复旦学报.医学版
11 西安交通大学学报.医学版
12 第二军医大学学报
13 郑州大学学报.医学版
14 上海交通大学学报.医学版
15 中国全科医学
16 实用医学杂志
17 中山大学学报.医学版(改名为:中山大学学报.医学科学版)
18 吉林大学学报.医学版
19 中国医科大学学报
20 四川大学学报.医学版
21 重庆医科大学学报
22 首都医科大学学报
23 安徽医科大学学报
24 医学研究生学报
25 南京医科大学学报.自然科学版
26 山东大学学报.医学版
27 医药导报
28 天津医药
29 中国比较医学杂志
30 中国现代医学杂志
31 解放军医学院学报
一般理论,教育与普及 R-0,R-4
1 医学与哲学
2 医学与社会
3 中华护理教育
预防医学、卫生学 R1
1 中华预防医学杂志
2 中华流行病学杂志
3 中国卫生政策研究
4 中国卫生经济
5 中国卫生统计
6 中国医院管理
7 中华疾病控制杂志
8 卫生研究
9 中华医院管理杂志
10 中国卫生事业管理
11 中华劳动卫生职业病杂志
12 营养学报
13 中国卫生资源
14 中国疫苗和免疫
15 现代预防医学
16 环境与健康杂志
17 卫生经济研究
18 中国职业医学
19 环境与职业医学
20 中国学校卫生
21 中国艾滋病性病
22 中国健康教育
23 中国感染控制杂志
24 中国慢性病预防与控制
25 中国公共卫生
26 中国食品卫生杂志
27 中国医院
28 中国预防医学杂志
中国医学 R2
1 中草药
2 中国中药杂志
3 针刺研究
4 中国实验方剂学杂志
5 中国中西医结合杂志
6 北京中医药大学学报
7 中华中医药杂志
8 中医杂志
9 中成药
10 中药材
11 中国针灸
12 中药药理与临床
13 世界科学技术.中医药现代化
14 中药新药与临床药理
15 南京中医药大学学报
16 中华中医药学刊
17 中国中医基础医学杂志
18 时珍国医国药
基础医学 R3
1 中国临床心理学杂志
2 中国寄生虫学与寄生虫病杂志
3 医用生物力学
4 中国人兽共患病学报
5 中国心理卫生杂志
6 中国病理生理杂志
7 病毒学报
8 中国生物医学工程学报
9 细胞与分子免疫学杂志
10 中华微生物学和免疫学杂志
11 中国病原生物学杂志
12 免疫学杂志
13 中国免疫学杂志
14 生理学报
15 生物医学工程学杂志
16 中国临床解剖学杂志
17 解剖学报
18 中国应用生理学杂志
19 现代免疫学
20 中国媒介生物学及控制杂志
21 疾病监测
22 中国健康心理学杂志
23 中国生物制品学杂志
临床医学 R4
1 中华护理杂志
2 中华危重病急救医学
3 中国医学影像技术
4 中国组织工程研究
5 中国康复医学杂志
6 中华病理学杂志
7 护理学杂志
8 中华物理医学与康复杂志
9 中国康复理论与实践
10 中华急诊医学杂志
11 中国医学影像学杂志
12 中华超声影像学杂志
13 中国中西医结合急救杂志
14 中国超声医学杂志
15 临床与实验病理学杂志
16 护理研究
17 中华医学超声杂志(电子版)
18 中华检验医学杂志
19 中国循证医学杂志
20 中国感染与化疗杂志
21 解放军护理杂志
22 中国疼痛医学杂志
23 中华医院感染学杂志
24 磁共振成像
25 中华临床医师杂志(电子版)
26 护理学报
内科学 R5
1 中华心血管病杂志
2 中华地方病学杂志
3 中华内科杂志
4 中华结核和呼吸杂志
5 中华内分泌代谢杂志
6 中华肝脏病杂志
7 中国老年学杂志
8 中华高血压杂志
9 中国实用内科杂志
10 中华血液学杂志
11 中国循环杂志
12 中国糖尿病杂志
13 中华老年医学杂志
14 中华糖尿病杂志
15 中国实验血液学杂志
16 中华消化杂志
17 中国血吸虫病防治杂志
18 中华肾脏病杂志
19 中华风湿病学杂志
20 临床心血管病杂志
21 肠外与肠内营养
22 中国呼吸与危重监护杂志
23 胃肠病学
24 临床肝胆病杂志
外科学 R6
1 中华骨科杂志
2 中华显微外科杂志
3 中华外科杂志
4 中华消化外科杂志
5 中国实用外科杂志
6 中国脊柱脊髓杂志
7 中华胃肠外科杂志
8 中华肝胆外科杂志
9 中国修复重建外科杂志
10 中国矫形外科杂志
11 中华实验外科杂志
12 中华手外科杂志
13 中华泌尿外科杂志
14 中华骨质疏松和骨矿盐疾病杂志
15 中华创伤骨科杂志
16 中华神经外科杂志
17 中华创伤杂志
18 中国普通外科杂志
19 中国微创外科杂志
20 中华男科学杂志
21 中华普通外科杂志
22 中华麻醉学杂志
23 临床麻醉学杂志
24 中华胸心血管外科杂志
25 中华烧伤杂志
26 器官移植
27 中国骨质疏松杂志
28 肾脏病与透析肾移植杂志
29 中国胸心血管外科临床杂志
妇产科学 R71
1 中华妇产科杂志
2 中国实用妇科与产科杂志
3 实用妇产科杂志
4 中华生殖与避孕杂志
5 中华围产医学杂志
6 现代妇产科进展
儿科学 R72
1 中华儿科杂志
2 中华实用儿科临床杂志
3 中国当代儿科杂志
4 中国循证儿科杂志
5 临床儿科杂志
6 中国实用儿科杂志
7 中华小儿外科杂志
肿瘤学 R73
1 中华肿瘤杂志
2 中国癌症杂志
3 肿瘤
4 中华放射肿瘤学杂志
5 中国肿瘤
6 中国肿瘤临床
7 中国肺癌杂志
8 中国肿瘤生物治疗杂志
9 中华肿瘤防治杂志
10 现代肿瘤医学
神经病学与精神病学 R74
1 中华神经科杂志
2 中国神经精神疾病杂志
3 中华行为医学与脑科学杂志
4 中华神经医学杂志
5 中华精神科杂志
6 中华老年心脑血管病杂志
7 中国现代神经疾病杂志
8 中国脑血管病杂志
9 中国神经免疫学和神经病学杂志
皮肤病学与性病学 R75
1 中华皮肤科杂志
2 中国皮肤性病学杂志
3 临床皮肤科杂志
耳鼻咽喉科学 R76
1 中华耳鼻咽喉头颈外科杂志
2 临床耳鼻咽喉头颈外科杂志
3 听力学及言语疾病杂志
4 中华耳科学杂志
眼科学 R77
1 中华眼科杂志
2 中华眼底病杂志
3 中华实验眼科杂志
4 眼科新进展
5 国际眼科杂志
口腔科学 R78
1 中华口腔医学杂志
2 华西口腔医学杂志
3 实用口腔医学杂志
4 口腔医学研究
5 上海口腔医学
特种医学 R8
1 中华放射学杂志
2 介入放射学杂志
3 临床放射学杂志
4 实用放射学杂志
5 放射学实践
6 中国医学计算机成像杂志
7 中国介入影像与治疗学
8 中华核医学与分子影像杂志
9 国际医学放射学杂志
10 中国运动医学杂志
11 中华放射医学与防护杂志
12 航天医学与医学工程
药学 R9
1 药学学报
2 中国药学杂志
3 药物分析杂志
4 中国新药杂志
5 中国现代应用药学
6 中国药理学通报
7 中国医院药学杂志
8 中国药科大学学报
9 中国药理学与毒理学杂志
10 中国医药工业杂志
11 中国临床药理学杂志
12 中国新药与临床杂志
13 沈阳药科大学学报
14 中国药房
15 中国抗生素杂志
学科门类:第六编 农业科学
综合性农业科学 S
1 中国农业科学
2 干旱地区农业研究
3 华北农学报
4 南京农业大学学报
5 西北农林科技大学学报.自然科学版
6 华中农业大学学报
7 中国农业大学学报
8 西北农业学报
9 华南农业大学学报
10 农业生物技术学报
11 西南农业学报
12 江苏农业学报
13 浙江大学学报.农业与生命科学版
14 江西农业大学学报
15 新疆农业科学
16 云南农业大学学报.自然科学
17 吉林农业大学学报
18 沈阳农业大学学报
19 东北农业大学学报
20 中国农业科技导报
21 南方农业学报
22 江苏农业科学
23 山东农业科学
24 河南农业科学
25 湖南农业大学学报.自然科学版
26 浙江农业学报
27 福建农业学报
28 河北农业大学学报
29 福建农林大学学报.自然科学版
30 扬州大学学报.农业与生命科学版
31 四川农业大学学报
农业基础科学 S1
1 土壤学报
2 植物营养与肥料学报
3 水土保持学报
4 土壤
5 土壤通报
6 中国生态农业学报(改名为:中国生态农业学报(中英文))
7 中国土壤与肥料
8 中国农业气象
9 中国水土保持科学
10 水土保持研究
11 水土保持通报
农业工程 S2
1 农业工程学报
2 农业机械学报
3 排灌机械工程学报
4 灌溉排水学报
5 农机化研究
6 中国农机化学报
7 节水灌溉
农学(农艺学),农作物 S3,S5
1 作物学报
2 中国水稻科学
3 玉米科学
4 麦类作物学报
5 中国油料作物学报
6 棉花学报
7 植物遗传资源学报
8 核农学报
9 分子植物育种
10 大豆科学
11 作物杂志
12 杂交水稻
13 花生学报
14 种子
15 中国稻米
植物保护 S4
1 植物保护学报
2 植物病理学报
3 中国生物防治学报
4 植物保护
5 农药学学报
6 环境昆虫学报
7 农药
8 中国植保导刊
9 生物安全学报
园艺 S6
1 园艺学报
2 果树学报
3 北方园艺
4 中国蔬菜
5 中国南方果树
6 食用菌学报
7 热带作物学报
8 中国果树
9 中外葡萄与葡萄酒
10 中国瓜菜
林业 S7
1 林业科学
2 林业科学研究
3 北京林业大学学报
4 中南林业科技大学学报
5 南京林业大学学报.自然科学版
6 经济林研究
7 东北林业大学学报
8 西北林学院学报
9 浙江农林大学学报
10 森林与环境学报
11 世界林业研究
12 林业资源管理
13 西南林业大学学报.自然科学
14 西部林业科学
15 林业工程学报
16 森林工程
畜牧、动物医学、狩猎、蚕、蜂(除草地学、草原学) S8(除S812)
1 畜牧兽医学报
2 动物营养学报
3 中国预防兽医学报
4 中国兽医学报
5 中国兽医科学
6 中国畜牧兽医
7 中国畜牧杂志
8 动物医学进展
9 中国动物传染病学报
10 畜牧与兽医
11 饲料工业
12 家畜生态学报
13 蚕业科学
14 中国兽医杂志
15 中国家禽
16 中国饲料
17 饲料研究
18 黑龙江畜牧兽医
草地学、草原学 S812
1 草业学报
2 中国草地学报
3 草地学报
4 草业科学
水产、渔业 S9
1 水产学报
2 中国水产科学
3 渔业科学进展
4 南方水产科学
5 海洋渔业
6 大连海洋大学学报
7 上海海洋大学学报
8 淡水渔业
9 水产科学
10 水生态学杂志
11 广东海洋大学学报
12 水产学杂志
学科门类:第七编 工业技术
工程基础科学,工程设计与测绘 TB1,TB2
1 图学学报
2 低温与超导
工程材料学 TB3
1 复合材料学报
2 材料工程
3 功能材料
4 无机材料学报
5 玻璃钢/复合材料(改名为:复合材料科学与工程)
6 材料导报
7 宇航材料工艺
8 材料研究学报
9 材料科学与工程学报
工程通用技术与设备 TB4
1 包装工程
声学工程 TB5
1 声学技术
2 应用声学
3 噪声与振动控制
制冷工程 TB6
1 制冷学报
2 低温工程
真空技术 TB7
1 真空科学与技术学报
计量学 TB9
1 计量学报
2 中国测试
矿业工程(除煤矿开采) TD(除TD82)
1 采矿与安全工程学报
2 中国矿业大学学报
3 金属矿山
4 有色金属.选矿部分
5 矿冶工程
6 爆破
7 矿业研究与开发
8 非金属矿
9 矿产综合利用
10 矿业安全与环保
11 工程爆破
煤矿开采 TD82
1 煤炭学报
2 煤炭科学技术
3 煤矿安全
4 煤田地质与勘探
5 煤炭工程
6 工矿自动化
7 煤矿开采(改名为:采矿与岩层控制工程学报)
8 煤炭技术
石油、天然气工业 TE
1 石油勘探与开发
2 石油学报
3 天然气工业
4 油气地质与采收率
5 石油与天然气地质
6 天然气地球科学
7 石油实验地质
8 特种油气藏
9 中国石油大学学报.自然科学版
10 西南石油大学学报.自然科学版
11 中国石油勘探
12 石油钻探技术
13 大庆石油地质与开发
14 石油钻采工艺
15 岩性油气藏
16 断块油气田
17 新疆石油地质
18 油田化学
19 钻井液与完井液
20 中国海上油气
21 东北石油大学学报
22 成都理工大学学报.自然科学版
23 石油机械
24 西安石油大学学报.自然科学版
25 海相油气地质
26 钻采工艺
27 石油学报.石油加工
28 油气储运
29 石油炼制与化工
30 石油地球物理勘探
31 石油物探
32 石油与天然气化工
冶金工业 TF
1 钢铁
2 中国冶金
3 钢铁研究学报
4 有色金属.冶炼部分
5 稀有金属
6 炼钢
7 中国稀土学报
8 稀土
9 烧结球团
10 湿法冶金
11 贵金属
12 有色金属科学与工程
13 钢铁钒钛
14 粉末冶金技术
15 材料与冶金学报
16 粉末冶金工业
17 轻金属
18 稀有金属与硬质合金
19 有色金属工程
20 中国有色冶金
21 炼铁
22 冶金分析
金属学与热处理/焊接、金属切割及金属粘接 TG1/TG4
1 金属学报
2 中国有色金属学报
3 材料热处理学报
4 稀有金属材料与工程
5 焊接学报
6 航空材料学报
7 中国表面工程
8 塑性工程学报
9 中国腐蚀与防护学报
10 金属热处理
11 热加工工艺
12 锻压技术
13 表面技术
14 特种铸造及有色合金
15 机械工程材料
16 铸造
17 材料科学与工艺
18 中国材料进展
19 腐蚀与防护
20 兵器材料科学与工程
21 精密成型工程
22 焊接
金属切削加工及机床/钳工工艺与装配工艺 TG5/TG9
1 金刚石与磨料磨具工程
2 工具技术
机械、仪表工业 TH
1 机械工程学报
2 摩擦学学报
3 电子测量与仪器学报
4 仪器仪表学报
5 光学精密工程
6 中国机械工程
7 振动、测试与诊断
8 流体机械
9 压力容器
10 润滑与密封
11 机械传动
12 工程设计学报
13 机械设计
14 机械设计与研究
15 机械科学与技术(西安)
16 机械设计与制造
17 机械强度
18 机电工程
19 轴承
20 包装与食品机械
21 液压与气动
22 机床与液压
23 组合机床与自动化加工技术
24 中国工程机械学报
25 现代制造工程
26 光学技术
27 仪表技术与传感器
28 化工设备与管道
29 制造技术与机床
30 制造业自动化
武器工业 TJ
1 火炸药学报
2 兵工学报
3 含能材料
4 弹道学报
5 弹箭与制导学报
6 火炮发射与控制学报
7 兵器装备工程学报
8 火工品
9 探测与控制学报
10 爆破器材
11 飞航导弹
12 战术导弹技术
13 火力与指挥控制
14 航空兵器
15 现代防御技术
16 电光与控制
能源与动力工程 TK
1 内燃机学报
2 内燃机工程
3 动力工程学报
4 工程热物理学报
5 燃烧科学与技术
6 太阳能学报
7 热能动力工程
8 热力发电
9 车用发动机
10 热科学与技术
11 可再生能源
12 汽轮机技术
13 锅炉技术
原子能技术 TL
1 原子能科学技术
2 核动力工程
3 核技术
4 核科学与工程
5 核化学与放射化学
6 辐射防护
7 核电子学与探测技术
8 核聚变与等离子体物理
电工技术 TM
1 中国电机工程学报
2 电力系统自动化
3 电网技术
4 电工技术学报
5 电力系统保护与控制
6 高电压技术
7 电力自动化设备
8 电力系统及其自动化学报
9 电机与控制学报
10 电工电能新技术
11 高压电器
12 南方电网技术
13 电力建设
14 中国电力
15 电网与清洁能源
16 电源学报
17 储能科学与技术
18 电池
19 现代电力
20 华北电力大学学报.自然科学版
21 智慧电力
22 电力电子技术
23 电力科学与技术学报
24 电源技术
25 电测与仪表
26 电化学
27 电力工程技术
28 绝缘材料
29 电瓷避雷器
无线电电子学、电信技术 TN
1 电子与信息学报
2 雷达学报
3 电子学报
4 红外与激光工程
5 系统工程与电子技术
6 激光与光电子学进展
7 信号处理
8 通信学报
9 电波科学学报
10 西安电子科技大学学报
11 微波学报
12 红外与毫米波学报
13 现代雷达
14 激光与红外
15 光电子·激光
16 中国科学.信息科学
17 激光技术
18 液晶与显示
19 数据采集与处理
20 重庆邮电大学学报.自然科学版
21 应用光学
22 红外技术
23 北京邮电大学学报
24 半导体技术
25 光电工程
26 微电子学
27 固体电子学研究与进展
28 电子测量技术
29 雷达科学与技术
中州期刊联盟  从数据中读取温度
30 电讯技术
31 电子科技大学学报
32 国外电子测量技术
33 半导体光电
34 压电与声光
35 微纳电子技术
36 电子信息对抗技术
37 电子元件与材料
38 南京邮电大学学报.自然科学版
39 无线电工程
40 中国电子科学研究院学报
41 激光杂志
42 应用激光
43 电子器件
44 电子显微学报
自动化技术、计算机技术(除计算机网络、安全保密) TP(除TP393、TP309)
1 计算机学报
2 软件学报
3 自动化学报
4 计算机研究与发展
5 中国图象图形学报
6 机器人
7 控制与决策
8 计算机科学
9 计算机应用研究
10 计算机应用
11 计算机工程与应用
12 计算机辅助设计与图形学学报
13 控制理论与应用
14 模式识别与人工智能
15 计算机工程
16 计算机集成制造系统
17 中文信息学报
18 传感技术学报
19 小型微型计算机系统
20 智能系统学报
21 计算机科学与探索
22 系统仿真学报
23 计算机工程与设计
24 遥感技术与应用
25 国土资源遥感
26 信息与控制
27 计算机工程与科学
28 控制工程
29 传感器与微系统
30 计算机应用与软件
31 遥感信息
32 计算机仿真
计算机网络、安全保密 TP393,TP309
1 信息网络安全
中州期刊联盟  从数据中读取温度
化学工业(除基本无机化学工业/其他化学工业) TQ(除TQ11/TQ9)
1 化工进展
2 化工学报
3 高分子材料科学与工程
4 高分子学报
5 膜科学与技术
6 高校化学工程学报
7 精细化工
8 化工新型材料
9 现代化工
10 高分子通报
11 过程工程学报
12 化学工程
13 天然气化工.C1,化学与化工
14 应用化工
15 应用化学
16 化学工业与工程
基本无机化学工业/硅酸盐工业 TQ11/TQ17
1 硅酸盐学报
2 硅酸盐通报
3 电镀与涂饰
4 无机盐工业
5 电镀与精饰
6 耐火材料
7 中国陶瓷
8 陶瓷学报
9 电镀与环保
10 炭素技术
基本有机化学工业/精细与专用化学品工业 TQ2/TQ3
1 塑料工业
2 中国塑料
3 工程塑料应用
4 塑料
5 石油化工(原分类:石油、天然气工业)
6 林产化学与工业
7 热固性树脂
8 塑料科技
9 合成树脂及塑料
10 合成橡胶工业
11 弹性体
其他化学工业 TQ41/TQ9
1 燃料化学学报
2 煤炭转化
3 新型炭材料
4 涂料工业
5 洁净煤技术
6 日用化学工业
综合性轻工业、手工业、生活服务业 TS
1 轻工学报
纺织工业、染整工业 TS1
1 纺织学报
2 丝绸
3 棉纺织技术
中州期刊联盟  从数据中读取温度
4 东华大学学报.自然科学版
5 现代纺织技术
6 毛纺科技
7 上海纺织科技
8 针织工业
9 印染
食品工业 TS2
1 食品科学
2 中国食品学报
3 现代食品科技
4 中国粮油学报
5 食品工业科技
6 食品与发酵工业
7 食品科学技术学报
8 食品与机械
9 中国油脂
10 茶叶科学
11 食品科技
12 食品与生物技术学报
13 食品研究与开发
14 粮食与油脂
15 中国酿造
16 河南工业大学学报.自然科学版
17 中国乳品工业
18 中国调味品
19 食品安全质量检测学报
20 中国食品添加剂
其他轻工业、手工业/生活服务技术 TS3,TS91/TS97
1 美食研究
2 北京服装学院学报.自然科学版
烟草工业 TS4
1 烟草科技
2 中国烟草学报
3 中国烟草科学
皮革工业 TS5
1 皮革科学与工程
木材加工工业、家具制造工业 TS6
1 木材工业(改名为:木材科学与技术)
2 林产工业
3 家具与室内装饰
造纸工业 TS7
1 中国造纸学报
2 中国造纸
印刷工业 TS8
中州期刊联盟  从数据中读取温度
1 数字印刷
建筑科学 TU
1 岩石力学与工程学报
2 岩土工程学报
3 建筑结构学报
4 岩土力学
5 土木工程学报
6 城市规划学刊
7 城市规划
8 建筑材料学报
9 国际城市规划
10 建筑结构
11 土木建筑与环境工程(改名为:土木与环境工程学报(中英文))
12 工业建筑
13 规划师
14 工程地质学报
15 建筑科学与工程学报
16 建筑钢结构进展
17 地下空间与工程学报
18 防灾减灾工程学报
19 建筑学报
20 空间结构
21 世界地震工程
22 混凝土
23 建筑科学
24 现代城市研究
25 上海城市规划
26 西安建筑科技大学学报.自然科学版
27 给水排水
28 中国给水排水
29 中国园林
30 沈阳建筑大学学报.自然科学版
31 南方建筑
32 工程抗震与加固改造
水利工程 TV
1 水利学报
2 水科学进展
3 水力发电学报
4 泥沙研究
5 水利水电科技进展
6 水电能源科学
7 水利水电技术(改名为:水利水电技术(中英文))
8 南水北调与水利科技(改名为:南水北调与水利科技(中英文))
9 水利水运工程学报
10 长江科学院院报
11 人民黄河
12 水资源与水工程学报
13 水动力学研究与进展.A辑
14 人民长江
15 中国农村水利水电
16 中国水利水电科学研究院学报
综合运输 U(除U2/U6)
1 交通运输工程学报
2 交通运输系统工程与信息
3 交通信息与安全
4 重庆交通大学学报.自然科学版
铁路运输 U2
1 铁道学报
2 中国铁道科学
3 铁道科学与工程学报
4 铁道工程学报
5 隧道建设(中英文)
6 铁道标准设计
7 铁道建筑
8 城市轨道交通研究
9 都市快轨交通
10 机车电传动
11 铁道运输与经济
12 铁道机车车辆
中州期刊联盟  从数据中读取温度
公路运输 U4
1 中国公路学报
2 汽车工程
3 公路交通科技
4 桥梁建设
5 长安大学学报.自然科学版
6 现代隧道技术
7 汽车安全与节能学报
8 公路
9 汽车技术
10 世界桥梁
水路运输 U6
1 中国造船
2 船舶力学
3 中国舰船研究
4 中国航海
5 大连海事大学学报
6 船舶工程
7 上海海事大学学报
8 舰船科学技术
9 船海工程
10 水运工程
航空、航天 V
1 航空学报
2 宇航学报
3 推进技术
4 航空动力学报
5 空气动力学学报
6 北京航空航天大学学报
7 固体火箭技术
8 中国空间科学技术
9 南京航空航天大学学报
10 实验流体力学
11 飞行力学
12 空间控制技术与应用
13 航天器工程
14 载人航天
15 中国惯性技术学报
16 航空发动机
17 航天返回与遥感
18 航天器环境工程
19 航天控制
20 深空探测学报(改名为:深空探测学报(中英文))
21 空间科学学报
22 导弹与航天运载技术
23 航空制造技术
环境科学 X(除X9)
1 环境科学
2 中国环境科学
3 环境科学学报
4 环境科学研究
5 农业环境科学学报
6 生态环境学报
7 环境工程学报
8 环境化学
9 环境科学与技术
10 中国环境监测
11 生态与农村环境学报
12 中国人口·资源与环境
13 环境工程
14 环境污染与防治
15 自然资源学报
16 资源科学
17 生态毒理学报
中州期刊联盟  从数据中读取温度
18 长江流域资源与环境
19 地球与环境
20 化工环保
21 水处理技术
22 工业水处理
23 环境工程技术学报
24 海洋环境科学
25 水资源保护
26 农业资源与环境学报
27 灾害学
28 自然灾害学报
安全科学 X9
1 中国安全科学学报
2 中国安全生产科学技术
3 安全与环境学报
4 火灾科学
5 消防科学与技术
6 安全与环境工程

Python大数据分析12:高级子查询

我们准备结合scores成绩数据来查询每个学生考的最好的那门课,即每个学生成绩最高的课程号。

首先需要知道每个学生的最高成绩,然后根据这个成绩再去查询对应的课程号,显然是个子查询。

我们首先查询每位学生的最高分:

# coding:utf-8
import pandas as pd

data2 = {
    'SID': ['000001', '000001', '000002', '000003', '000003', '000003', '000004', '000004', '000005', '000006', '000006'],
    'CID': ['A01', 'A02', 'A01', 'A01', 'A02', 'B01', 'A01', 'A03', 'B01', 'A02', 'B01'],
    'score': [56, 78, 90, 74, 86, 89, 67, 80, 77, 76, 90]
}
scores = pd.DataFrame(data2)
frame1 = scores.groupby("SID")["score"].max()
print(frame1)

这里需要按照学号分组,对每组的成绩取最大值。

接下来需要根据这里得到的每个学生的SID和最高成绩,再去成绩中查询对应的课程,由于还是涉及两个DataFrame,我们再次使用连接:

frame2 = pd.merge(scores, frame1, right_on=’SID’, left_on=’SID’)

print(frame2)

可以看出连接后的结果,每位同学的第二个成绩,score_y都是该生的最高分。显然,再次直接选择哪个成绩等于该生的score_y不就得到该生的最高分对应的课程了吗?

这次直接利用该条件选择行,再选择所需显示的列:

print(frame2[frame2[‘score_x’] == frame2[‘score_y’]][[‘SID’, ‘CID’]])

从中可以看出确实每个学生都得到了最高分所对应的课程。

更为简单的做法是直接按照两个列来连接:

frame2 = pd.merge(scores, frame1, right_on=[‘SID’, ‘score’], left_on=[‘SID’, ‘score’])

print(frame2[[‘SID’, ‘CID’]])

由于使用两个列连接,需要使用列表来表示多个连接列,只有两个列都相等才连接。然后就只需要选择所需的学号和课程号即可。

细心的同学可能会发现,这次结果的索引号是连续的,这是因为连接过程已经将课程分数相等考虑进去了,无需再次选择行,所以所有行都是满足要求的,只需选择所需显示的列。

当然,这里第二步的连接操作也并非必须,巧妙的利用索引也能实现同样的效果。我们来试试第二种方法。

比如首先我们得到每个学生最大成绩行的所在索引号:

# coding:utf-8
import pandas as pd

data2 = {
    'SID': ['000001', '000001', '000002', '000003', '000003', '000003', '000004', '000004', '000005', '000006', '000006'],
    'CID': ['A01', 'A02', 'A01', 'A01', 'A02', 'B01', 'A01', 'A03', 'B01', 'A02', 'B01'],
    'score': [56, 78, 90, 74, 86, 89, 67, 80, 77, 76, 90]
}
scores = pd.DataFrame(data2)
idxMax = scores.groupby("SID")["score"].idxmax()
print(idxMax)

这里的idxmax返回每组score最大值所在的索引号。这个索引号具有唯一性,因此完全可以据此来找到相关的课程。

于是我们以这些索引号将相应的行找到,并有选择的显示其中的学号和课程号。

print(scores[scores.index.isin(idxMax)][[‘SID’, ‘CID’]])

下面我们开始使用第三种方法来尝试下,顺便了解下一些更为高级的方法。

这里的关键是排序,也就是对于每个学生的每门课成绩,如果能够按照从高到低排下序,相应课程的信息都很明显。

我们先来排下序:

# coding:utf-8
import pandas as pd

data2 = {
    'SID': ['000001', '000001', '000002', '000003', '000003', '000003', '000004', '000004', '000005', '000006', '000006'],
    'CID': ['A01', 'A02', 'A01', 'A01', 'A02', 'B01', 'A01', 'A03', 'B01', 'A02', 'B01'],
    'score': [56, 78, 90, 74, 86, 89, 67, 80, 77, 76, 90]
}
scores = pd.DataFrame(data2)
scores = scores.sort_values(by=['SID', 'score'], ascending=[True, False])
print(scores)

从中已经看出每个学生的最高分都排在所在学生记录行的第一条。那么如何把它们取出来呢?如果要取出来,就必须找到这些与其他行的不同。显然,此时最大的不同就是它们都是所在学生记录行的第一条。

为此我们尝试增加一个新的列来标记这些究竟是第几行:

scores[‘rank’] = scores.groupby([‘SID’]).cumcount()

print(scores)

这里是对当前记录按照学号来分组,对于每一组,即每一位学生,cumcount会给出积累的个数,我们将其保存到新列rank中。看的出来,每个学生第一行记录rank都为0。

因此,我们只需再次条件选择即可:

print(scores[scores[‘rank’] == 0][[‘SID’, ‘CID’]])

最后,我们尝试将这个练习改变下,再次看看子查询的方法。

查询选修了A01课程的学生A02课程成绩为多少?

我们不妨看看数据,可以发现目前有两个应该显示的结果,分别是1号和3号学生的A02课程。

我们首先使用标准子查询来做,先看看哪些学生选修A01课程:

# coding:utf-8
import pandas as pd

data2 = {
    'SID': ['000001', '000001', '000002', '000003', '000003', '000003', '000004', '000004', '000005', '000006', '000006'],
    'CID': ['A01', 'A02', 'A01', 'A01', 'A02', 'B01', 'A01', 'A03', 'B01', 'A02', 'B01'],
    'score': [56, 78, 90, 74, 86, 89, 67, 80, 77, 76, 90]
}
scores = pd.DataFrame(data2)
CIDs = scores[scores['CID'] == 'A01']['SID']
print(CIDs)

可以看出有很多学生选修了这门课,我们保存到CIDs中。

然后我们再次查询这些学生的A02课程,此时应该是两个条件的并且组合:

print(scores[(scores[‘SID’].isin(CIDs)) & (scores[‘CID’] == ‘A02’)])

我们再使用连接试一试:

frame = pd.merge(scores, scores, right_on=’SID’, left_on=’SID’)

print(frame)

其中也能发现同时选修了A01和A02的学生。

因此,我们可以再次构造条件来选择这些所需行:

print(frame[(frame[‘CID_x’] == ‘A01’) & (frame[‘CID_y’] == ‘A02’)][[‘SID’, ‘CID_y’]])

这里还是一样的选择条件,选择了行和列。

对于这种行列特别明确的子查询,我们还可以考虑使用透视图。我们先构造透视图:

frame = scores.pivot_table(values=’score’, index=’SID’, columns=’CID’, fill_value=-1)

print(frame)

这里四个参数分别表示单元格、行、列的来源数据列,以及缺失单元格默认填充的数值。

再次选择下:

print(frame.loc[frame[‘A01’] != -1][‘A02’])

表示A01课程不为-1就表示选修有成绩,同时显示A02的列,索引列正好是学号。

当然,为了只显示也选修了A02课程的学生,我们可以再次增加选择条件:

print(frame.loc[(frame[‘A01’] != -1) & (frame[‘A02’] != -1)][‘A02’])

此时的结果就是我们所要的内容。

Python大数据分析11:子查询

所谓子查询,就是指利用其他查询的结果作为当前查询的条件,这在我们日常数据查询中非常有用。

比如我们想查询最高身高的学生姓名。我们来看看,这个问题可否一次查询出来?要想查询这个学生姓名,首先需要知道最高的身高,但是最高的身高是多少?这个仍然需要查询。显然,这是个子查询。

我们不妨就按照刚才这个思路来做。首先查询最高身高:

# coding:utf-8
import pandas as pd

data = {'ID': ['000001', '000002', '000003', '000004', '000005', '000006', '000007'],
        'name': ['黎明', '赵怡春', '张富平', '白丽', '牛玉德', '姚华', '李南'],
        'gender': [True, False, True, False, True, False, True],
        'age': [16, 20, 18, 18, 17, 18, 16],
        'height': [1.88, 1.78, 1.81, 1.86, 1.74, 1.75, 1.76]
        }
frame = pd.DataFrame(data)
print(frame['height'].max())

语句并不复杂,就是查询身高列的最大值。

然后我们根据这个最大值再去查询相应的学生姓名:

print(frame[frame[‘height’] == frame[‘height’].max()])

这里我们将刚才查询出来的最高身高作为当前查询的条件,继续查询学生姓名。

当然,为了能看清语句,我们也可以这样写:

maxHeight = frame[‘height’].max()

print(frame[frame[‘height’] == maxHeight])

这里将刚才的最高身高保存到一个变量中,更方便阅读和理解,效果一样。

有时问题会复杂一些,比如我们想查询最高身高的女生姓名。在这里,范围限定在女生,因此最高身高必须要从女生中来查询:

print(frame[frame[‘gender’] == False][‘height’].max())

这里我们增加了选择条件,限定了查询范围。

然后就可以根据这个身高来查询,但是同样仍然要注意要在女生中再次选择。

maxHeight = frame[frame[‘gender’] == False][‘height’].max()

print(frame[(frame[‘gender’] == False) & (frame[‘height’] == maxHeight)])

这里最后我们通过并且的关系确保女生和最高身高两个条件同时被满足。

这里的子查询都是返回一个结果,比如最高的身高,但是更为常见的情况是返回可能更多的结果。

比如我们来查询下前两种最高身高相关的学生姓名。首先需要得到最高的前两种身高:

maxHeight = frame[‘height’].sort_values(ascending=False).head(2)

print(maxHeight)

这里不能使用max,可以考虑采取降序排序的方法,再取前两个数值。结果看起来很不错,不过,大家想一想这样做有没有问题?

是的,如果有两个1.88的学生会怎么样?显然,我们需要将相同身高归入一类。

maxHeight = frame[‘height’].drop_duplicates().sort_values(ascending=False).head(2)

print(maxHeight)

此时即使有相同的最高身高,也不会重复显示,drop_duplicates表示去除重复元素,只保留每种身高。

接下来,我们就可以将等于这些身高的所有学生查询出来:

print(frame[frame[‘height’].isin(maxHeight)])

这里由于是前两种最高身高,不是一个唯一的最高值,因此不能采取相等判断,而是使用isin表示是否在这些身高中。

结果可以看出,有三位同学,因为有的身高可能有多位同学都满足。

子查询通常更多的应用于对于多个DataFrame的查询。比如我们想知道黎明的所有选修课程成绩。从现有的DataFrame来看,学生信息和成绩信息分别在两个不同的DataFrame中,

# coding:utf-8
import pandas as pd

data1 = {'ID': ['000001', '000002', '000003', '000004', '000005', '000006', '000007'],
         'name': ['黎明', '赵怡春', '张富平', '白丽', '牛玉德', '姚华', '李南'],
         'gender': [True, False, True, False, True, False, True],
         'age': [16, 20, 18, 18, 17, 18, 16],
         'height': [1.88, 1.78, 1.81, 1.86, 1.74, 1.75, 1.76]
         }
students = pd.DataFrame(data1)
data2 = {
    'SID': ['000001', '000001', '000002', '000003', '000003', '000003', '000004', '000004', '000005', '000006','000006'],
    'CID': ['A01', 'A02', 'A01', 'A01', 'A02', 'B01', 'A01', 'A03', 'B01', 'A02', 'B01'],
    'score': [56, 78, 90, 74, 86, 89, 67, 80, 77, 76, 90]
}
scores = pd.DataFrame(data2)

我们可以从结果反过来设想下,在scores中有所有学生的课程成绩,但是只能通过学号ID来查询,而我们只有黎明这个信息,所以我们必须先查询黎明的学号。显然,这又是一个子查询问题。

首先先获取黎明的学号:

print(students[students[‘name’] == ‘黎明’][‘ID’])

这只是个简单的行列选择。这里大家要注意,虽然此时返回的只有一个数值,但是从理论上说,也有可能会有多个数值结果,因此返回的结果是个序列,虽然此时该序列只有一个数值。

然后再根据这个ID去scores数据框架中查询对应的课程成绩。

print(scores[scores[‘SID’] == sid[0]])

这里要注意一个小问题,sid后面需要增加一个序号来得到第一个元素。

当然考虑到刚才第一个查询返回的结果可能有多个数值,更为灵活的写法还是使用isin:

print(scores[scores[‘SID’].isin(sid)])

不管一个还是多个,这种写法始终有效。

这里可能有学生也会说,好像通过连接也可以做,确实如此:

frame = pd.merge(students, scores, left_on=’ID’, right_on=’SID’)

print(frame[frame[‘name’] == ‘黎明’])

似乎更为简单,其实对于很多子查询,我们都可以考虑通过连接的方法来替换。

比如我们查询和黎明年龄一样的同学:

age = frame[frame[‘name’] == ‘黎明’][‘age’]

print(frame[(frame[‘age’].isin(age)) & (frame[‘name’] != ‘黎明’)][‘name’])

这里的操作和前面所讲区别不大,只是由于我们只想查询其他同学,于是增加了对黎明记录本身的过滤,

我们再次使用连接完成下:

frame = pd.merge(frame, frame, left_on=’age’, right_on=’age’)

print(frame[(frame[‘name_x’] == ‘黎明’) & (frame[‘name_y’] != ‘黎明’)][‘name_y’])

连接未必总是通过学号等关键列来进行,完全可以根据需要自由选择。比如这里我们按照年龄连接,可以想象,身高一样的都会连接起来,形成一个很大的表格。然后在其中,选择一半为黎明另一半不是黎明的另一半数据中的学生姓名。

Python大数据分析4:案例-安装第三方库出问题怎么办?

这个内容属于选学内容,大家可以根据需求酌情学习。不少同学都反映,在后期课程的学习中,使用到的pandas和tushare等第三方库无法顺利安装,这里我们简单说明下。

首先对于任何第三方库,我们都可以在PyCharm项目中安装。比如我们使用pandas这个库来学习数据查询分析,大家可以在数据查询分析章节的第一节课中详细了解标准安装方法,这里简单先说明下。

在当前项目中选择文件菜单——设置,在打开的界面中,选择当前项目下的项目解释器,并点击右上角的加号,此时可以在新打开的界面上方的输入框中输入,比如pandas,此时应该能够看到左边访问网络,加载显示基本信息的内容,如果可以正常显示这样的详细信息,那么建议大家选择下版本类型。在右下方,选择指定版本,建议选择1.0.1,因为课程介绍使用该版本,主要为了避免因为版本差异可能带来的不同,也方便大家调试和交流。此时即可点击安装按钮安装。

安装好应该没有任何错误提示,底部显示绿色的成功提示,并且这个按钮将变为灰色。此时你会发现安装的不仅有pandas,还有其他的一些必需的配套库,这些都是自动安装,非常方便。

但是也有可能出现错误,原因很多。简单的处理方法可以尝试换个时间、换个网络。也建议大家使用最新的Windows系统,比如我们这里测试的环境都是Win10,安装过程一般都没有问题。但是如果确实存在问题,我们该怎么办呢?

可以尝试在PyCharm终端直接安装,这是第二种方法。选中PyCharm下方的Terminal(终端),输入:

pip install pandas

你会发现同样的安装过程,而且还能提示下载的库文件名称、进度等等信息。

我们也可以通过指定版本号来安装,方法是加上双等于号和版本号:

pip install pandas==1.0.1

不过,这样安装可能与前面的方法区别不大,因为在很多情况下,可能是因为这些第三方库所在的网站访问不稳定导致无法安装。所以利用这种方法,我们可以自由选择所需的文件镜像源:

pip install -i  https://mirrors.aliyun.com/pypi/simple/ pandas

请注意这里-i参数后两个,分别是镜像文件网站,和准备安装的pandas库。你会发现速度非常快,而且很稳定。这里我们使用的是国内阿里云的镜像文件。关于镜像网站,这是一些常见的镜像文件站点:

加州大学:https://www.lfd.uci.edu/~gohlke/pythonlibs

清华:https://pypi.tuna.tsinghua.edu.cn/simple

阿里云:http://mirrors.aliyun.com/pypi/simple

中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple

豆瓣:http://pypi.douban.com/simple

第三种,可以利用独立的whl文件来安装。Whl文件就是第三方库的原始文件,前面的方法也就是通过网络去下载这些文件自动安装,如果网络存在问题,那么我们可以利用专门得到的whl文件直接安装。

比如你有一个别人给你的pandas安装文件,你可以直接粘贴到你的项目中。你选中文件复制,并粘贴到PyCharm的项目中。此时会有一个提示,直接点击OK即可。你将能看到这个文件。还是在终端窗格中输入:

pip install pandas-1.0.1-cp37-cp37m-win_amd64.whl

后面就是完整的文件名称。

很快你也能看到安装的过程。

当然,你可能会好奇如何得到这个安装文件?其实,在刚才介绍的镜像文件网站中,这些都可以找到,比如这是阿里云的镜像,文件很多,加载要等一会,我们还是以pandas为例。全部加载完毕后,可以拖拽寻找下pandas,再次点击,即可看到各种版本的文件。比如按下Ctrl+F查找1.0.1,但是哪一个才是我们所需要的呢?这里有两个关键信息:一是个Python的版本,一个是自己操作系统的版本。大家应该记得我们使用的是3.7版本,因此应该选择cp3.7那几个文件。当前我使用的是Windows操作系统,而且是64位的Win10。这是目前最为常见的配置。于是就可以选择win_amd64,到此文件就已经只有一个了。大家可以根据自己的情况做出合理的选择。当然,我们也可以从一些其他可靠的来源单独获得此类whl文件。

第四种方法可以使用复制全局环境。所谓全局环境,是指电脑系统已经安装好了一些第三方库,只是PyCharm项目还没有安装。因此我们必须将系统安装好的第三方库应用于这些PyCharm项目中。

我们还是在项目中,选择设置,找到项目解释器,点击右上角的那个齿轮按钮,选择添加,在新建环境中,增加了新的名称,比如在现有的名称后修改下。同时选中下面的继承全局站点包,点击OK。即可看到全部系统已有的包都加进来了。

可能大家会问,系统这些全局包是怎么加的?比较方便的方法是安装Anaconda,它会自动安装所有常见的相关第三方包,这些本课程不再深入讲解。

第五种方法可以说是最为原始,但是一定是最有效的方法。那就是直接将已经安装好的电脑上项目的库直接复制过来。

比如这是别人给我们的项目中库文件,我们全部选中复制,在当前PyCharm项目中,右击项目选择在文件夹显示,可以看到当前的项目,双击打开,再双击venv,双击Lib,双击site-packages,将刚才那些库文件直接粘贴过来即可。此时打开项目的项目解释器,你就发现已经全部加载成功了!

当然,大家可以很好奇这些库文件哪里来的?其实就是其他项目中site-packages下的文件,因此,你只需在可以使用的其他电脑或者项目中找到site-packages文件夹,将其中的文件全部复制,就可以粘贴到所需的其他项目中。

退一步说,如果在自己的电脑上,已有项目已经加载过所需的库,那么对于其他新建的项目,也可以直接使用。比如再次打开项目解释器,点击右上角的齿轮按钮,选中显示全部。根据需要,选择已经安装好第三方库的其他项目,即可直接将它们的库文件全部导入进来。

很难说,这里哪个方法更好用,大家可以根据自己的问题,有选择的使用,其实这也是深入了解Python第三方库使用方法的有效途径。遇到这些问题,大家不妨好好的试一试!

检索案例:在商业计划书编写中的应用

现在,商业计划书不仅已经成为各类社会创业者创业过程的第一步,也成为学生创新创业学习的重要实践环节。

首先大家需要明确的一个重要观点,就是不要觉得对于创新创业行为而言,商业计划书的编写是一件可有可无的事情。大家有没有这几种常见的情绪:

觉得写东西很烦,为什么一定要写呢?编纂良好的商业计划书,不仅有助于投资者更好的理解你的创新创业项目的内容,其实更有助于自我更好的反思和总结现有项目的特色和需要完善的地方。通常如果你觉得写不起来,或者几句话似乎就写完了,在很多情况下,这都只能反映你对项目问题了解不足,或者这个项目的价值和意义很有限。

其次,写也是一种重要的总结和思考问题的方法。很多内容只有在你静下心来写的时候,你才能真正去理解和反思其中真正的问题,不断的写作调整其实就是自我认知思路不断完善的过程。

最后,写更是一种技巧,也需要方法。

最为简单的传统起承转合依然沿用在诸如科研论文、报告论文和商业计划书等标准文体中。按照这种思路,我们来看看商业计划书的结构。主要内容包括项目策划、需求分析、项目设计(产品与服务)、竞争分析、市场营销、财务分析等。

那么文献检索在这里能够发挥什么作用呢?我们从几个方面来看下:

在项目选题方面,文献检索的价值作用最大。特色和创新性是创新创业项目最为根本的价值所在。很多人在提出此类项目想法的时候,往往仍然采取其实不是很科学的主观方法,即使是从自己的眼光能做出有效的判断,那么有益的参考也能帮助你更为深入的思考。

我们举个例子。比如我们准备从农村土地流转这个角度来提出一个创新创业项目,最为直观的思考结果是什么呢?很多学生会说,做一个APP,打通农村土地交易双方,这很好吗?其实,这往往反映了缺乏深入的思考。

比如,你能确定这个选题具有时效性吗?通常更能切合时代需要的选题往往更有价值。在百度中,输入“农村土地流转”,限定在政府站点,并且限定了最近一年的时间范围,可以看到相关政策是极受关注的话题。

再如你能确定这个选题具有新颖性吗?不妨再次就拿“农村土地流转 APP”来检索下,你很快能看到很多已有的类似项目,如“土流网”、“聚土宝”等。在这种情况下,如果你只是简单的也做一个类似的项目,很难取得更多人的认可。

当然,也有学生会说,我的APP不一样,会有自己的特色,比如增加了法律援助。这些显然不能随意确定,最好的方式还是仔细调研下已有的这些APP,看看他们都有哪些功能,也只有这样,你才能最终确定你的创意是否是真正的创意。

但是,仅仅凭借互联网上的信息来获取对相关问题的认识仍然存在着思考深度有限和创意思路不广的诸多问题。为什么我们不能使用拥有更多更好资源的文献数据库呢?

比如我们再次以“农村土地流转”为主题在百度学术中检索相关文献信息,时间限定为2015年以来,期刊类型选择CSSCI索引,很快我们看到不少高质量的文献。

比如有一篇谈到了农民工市民化与农村土地流转的关系,从人口城镇化土地城镇化的政策实施提出建议,还有提出社会保障措施与农村土地流转的相关性,这些都构成了我们思考出真正解决问题的关键内容。比如我们是否可以通过将保障服务和农村土地流转服务结合起来,形成一种更有效的服务模式?当然,这里课程只是演示思考问题的方法,并没有对该问题本身做深入分析,大家不妨自己结合感兴趣的话题来试一试。

事实上,既然现在已有很多类似的APP的交易平台,也有很多辅助政策,那么为什么还不能完全解决问题?难道仅仅是因为APP设计不好吗?想到这个地方,大家就能明白利用检索来获取对问题的了解,尤其是学术文献数据库的资源,是一个非常有价值的宝库,大家要学会使用它们。

当然商业计划书的写作并不仅仅是项目的选题,还有很多,再如用户需求。通过检索来了解用户需求是一种非常简单但很有效的方法。

比如百度搜索引擎就有一个专门的大数据营销工具,百度司南,很方便据此了解相关用户真实需求,它就是利用搜索引擎用户检索的特征来推测整体用户需求特征。其中可以进行诸如人群属性定位和分析,以一种清晰量化的方式给予用户更多观察的角度。再如百度指数等工具还能直接对相关用户需求直接进行对比分析,这里直观的比较了两种商品的关注程度。通过需求图谱扩展,用户还可以进一步了解相关商品和用户需求信息,从而扩展思路提供基础。也可以结合地域特征做出更适合自己所在地区的有针对性的分析。对于一些软件应用类产品,除了标准的搜索引擎检索外,还建议大家广泛采用应用市场对比分析方法,更好的了解相关软件应用类产品的市场需求。

当然,借助于互联网,我们还可以非常方便的获取一些商业计划书,百度文库是个常见的选择。但是直接搜索“商业计划书”可能并不是一个更好的选择,大部分高质量的都是付费文档。

可以尝试使用诸如必应等其他搜索引擎,并以文档格式限定检索来得到所需的文档。建议使用pdf文档,此处获取的几篇都是质量不错的参考文档。当然这种以整篇文档做出检索对象的方法不论是效果还是可获得性都不是很理想,最为现实的选择应该根据内容要求,有针对性的对内容分别检索。比如在土地推广的市场营销部分,我们专门检索相关文档,这种专门性的检索往往内容更为准确,有效性更强。

Python大数据分析5:回归分析(每日订单预测)

回归分析主要用于预测数值,通常可以根据一些特征属性来通过拟合函数来预测目标特征。可以分为线性回归分析和多项式回归分析等多种形式,由于线性回归通常只能把输入数据拟合成直线,因此在绝大多数应用场景中并不多见,而非线性回归分析通过函数更为复杂,相应构建的模型变得更灵活,有时结果因此而更为准确。

我们这次使用一个每日需求预测订单数据集,具体下载地址仍然是加州大学尔湾分校的数据集,可以直接点击“Data Folder”获取文件。

这个文件不同列采用分号分隔,普通的Excel无法正常区分每一列。

我们自己使用pandas读取:

import pandas as pd

frame = pd.read_csv(‘C:\\temp\\Daily_Demand_Forecasting_Orders.csv’, sep=’;’)

pd.set_option(‘display.max_columns’, None)

print(frame.head(1))

这里使用sep参数指定了分隔符。虽然可以显示,但是部分列名过长,使用并不方便。

因此,我们可以修改部分列名。

import pandas as pd

frame = pd.read_csv('C:\\temp\\Daily_Demand_Forecasting_Orders.csv', sep=';')
pd.set_option('display.max_columns', None)
frame.rename(columns={'Week of the month (first week, second, third, fourth or fifth week': 'week',
                      'Day of the week (Monday to Friday)': 'day',
                      'Orders from the traffic controller sector': 'sector',
                      'Target (Total orders)': 'Target'}, inplace=True)
print(frame.head(1))

其中,有12个特征数据,都是订单相关属性,最后一个Target表示订单总量。我们的任务就是通过前面12个特征较为准确的预测这个订单总量。这是个典型的回归分析任务。

我们先来看看线性回归,而且只考虑一个特征输入,可以称之为一元线性回归。这里选择了Non-urgent order这个特征(非紧急订单)。

import pandas as pd

frame = pd.read_csv('C:\\temp\\Daily_Demand_Forecasting_Orders.csv', sep=';')
pd.set_option('display.max_columns', None)
frame.rename(columns={'Week of the month (first week, second, third, fourth or fifth week': 'week',
                      'Day of the week (Monday to Friday)': 'day',
                      'Orders from the traffic controller sector': 'sector',
                      'Target (Total orders)': 'Target'}, inplace=True)
X = frame['Non-urgent order'].values.reshape(-1, 1)
print(X)

不过,按照回归分析要求,它需要将特征数据做成二维结构,因此我们需要使用reshape来转换下。其中,第二个1表示1列,第一个-1表示行数根据实际情况,因此其实就是一维列表数据竖起来,做成了多行一列数据。

据此就可以预测了:

import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score
import numpy as np

frame = pd.read_csv('C:\\temp\\Daily_Demand_Forecasting_Orders.csv', sep=';')
pd.set_option('display.max_columns', None)
frame.rename(columns={'Week of the month (first week, second, third, fourth or fifth week': 'week',
                      'Day of the week (Monday to Friday)': 'day',
                      'Orders from the traffic controller sector': 'sector',
                      'Target (Total orders)': 'Target'}, inplace=True)
X = frame['Non-urgent order'].values.reshape(-1, 1)
y = frame['Target']
regressor = LinearRegression()
scores = cross_val_score(regressor, X, y, scoring='r2')
print(np.mean(scores))

使用起来很简单,和前面介绍的各种机器学习一样,就是更换了模型,采用了LinearRegression,注意相应的交叉验证指标不能使用准确度,因为对于这种数值型预测,绝对的数值相等预测并不现实,常见的R方指标更为常见,它是指确定性相关系数,用于衡量模型对未知样本预测的效果,最好的得分是1.0。

虽然交叉验证很简单,但是却无法了解模型的很多细节,因此我们再次换成原始写法:

import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
import sklearn.metrics as sm

frame = pd.read_csv('C:\\temp\\Daily_Demand_Forecasting_Orders.csv', sep=';')
pd.set_option('display.max_columns', None)
frame.rename(columns={'Week of the month (first week, second, third, fourth or fifth week': 'week',
                      'Day of the week (Monday to Friday)': 'day',
                      'Orders from the traffic controller sector': 'sector',
                      'Target (Total orders)': 'Target'}, inplace=True)
X = frame['Non-urgent order'].values.reshape(-1, 1)
y = frame['Target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=7)
regressor = LinearRegression()
regressor.fit(X_train, y_train)
y_test_pred = regressor.predict(X_test)
print(round(sm.mean_squared_error(y_test, y_test_pred), 2))
print(round(sm.r2_score(y_test, y_test_pred), 2))
print(regressor.coef_)
print(regressor.intercept_)

这里我们自己拆分了数据集合,首先了模型训练,并进行了预测,最后还可以直接输出所需的指标。其中coef_和intercept_能分别给出此时的拟合直线的截距和系数。

为了更直观的了解,我们不妨绘制下:

import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

frame = pd.read_csv('C:\\temp\\Daily_Demand_Forecasting_Orders.csv', sep=';')
pd.set_option('display.max_columns', None)
frame.rename(columns={'Week of the month (first week, second, third, fourth or fifth week': 'week',
                      'Day of the week (Monday to Friday)': 'day',
                      'Orders from the traffic controller sector': 'sector',
                      'Target (Total orders)': 'Target'}, inplace=True)
X = frame['Non-urgent order'].values.reshape(-1, 1)
y = frame['Target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=7)
regressor = LinearRegression()
regressor.fit(X_train, y_train)
y_test_pred = regressor.predict(X_test)
plt.figure()
plt.scatter(X_test, y_test, color='green')
plt.plot(X_test, y_test_pred, color='black', linewidth=4)
plt.title('Test data')
plt.show()

这里我们使用原始数据作为散点图,因为预测数据采用的是一元线性,所以是直线结构。

从中可以清楚的看到拟合直线的特点,截距和系数完整的定义了直线的位置。

当然,一元回归效果通常不好,毕竟直线拟合太理想化。

因此,对于更多的情况,我们可以考虑使用不同的回归模型。比如如果存在着较大的异常值,这种异常值通常会对回归分析带来很明显的不利影响,我们可以考虑使用岭回归器:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge
import sklearn.metrics as sm

frame = pd.read_csv('C:\\temp\\Daily_Demand_Forecasting_Orders.csv', sep=';')
pd.set_option('display.max_columns', None)
frame.rename(columns={'Week of the month (first week, second, third, fourth or fifth week': 'week',
                      'Day of the week (Monday to Friday)': 'day',
                      'Orders from the traffic controller sector': 'sector',
                      'Target (Total orders)': 'Target'}, inplace=True)
X = frame['Non-urgent order'].values.reshape(-1, 1)
y = frame['Target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=7)
regressor = Ridge()
regressor.fit(X_train, y_train)
y_test_pred = regressor.predict(X_test)
print(round(sm.r2_score(y_test, y_test_pred), 2))

只需直接替换线性回归模型就可以了。

当然,更有效的方法应该是考虑更多的特征,而不是只有一个特征,可以称为多元回归。我们还是使用一般的线性回归:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import sklearn.metrics as sm

frame = pd.read_csv('C:\\temp\\Daily_Demand_Forecasting_Orders.csv', sep=';')
pd.set_option('display.max_columns', None)
frame.rename(columns={'Week of the month (first week, second, third, fourth or fifth week': 'week',
                      'Day of the week (Monday to Friday)': 'day',
                      'Orders from the traffic controller sector': 'sector',
                      'Target (Total orders)': 'Target'}, inplace=True)

y = frame['Target']
X = frame.drop(columns='Target')

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=7)
regressor = LinearRegression()
regressor.fit(X_train, y_train)
y_test_pred = regressor.predict(X_test)
print(round(sm.r2_score(y_test, y_test_pred), 2))

这里关键的代码只有中间两行,即将Target作为预测数据列,其他所有的列作为特征列。请注意,由于此时X已经是二维结构,因此就无需再转换。

此时的预测R方指标居然为1,这当然说明完全线性的关系,但是更多的原因在于数据量相对较小,拟合相对较为简单。

我们甚至还可以使用更为复杂的回归模型,比如多项式回归,不像线性回归只能把输入数据拟合成直线,而多项式回归模型通过拟合多项式方程来克服这类问题,从而提高模型的准确性。一般模型的曲率是由多项式的次数决定。随着模型曲率的增加,模型变得更准确。但是,增加曲率的同时也增加了模型的复杂性,因此拟合速度会变慢。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import sklearn.metrics as sm
from sklearn.preprocessing import PolynomialFeatures

frame = pd.read_csv('C:\\temp\\Daily_Demand_Forecasting_Orders.csv', sep=';')
pd.set_option('display.max_columns', None)
frame.rename(columns={'Week of the month (first week, second, third, fourth or fifth week': 'week',
                      'Day of the week (Monday to Friday)': 'day',
                      'Orders from the traffic controller sector': 'sector',
                      'Target (Total orders)': 'Target'}, inplace=True)
y = frame['Target']
X = frame.drop(columns='Target')
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=7)

polynomial = PolynomialFeatures(interaction_only=True)
X_train_transformed = polynomial.fit_transform(X_train)
regressor = LinearRegression()
regressor.fit(X_train_transformed, y_train)
X_test_transformed = polynomial.fit_transform(X_test)
y_test_pred = regressor.predict(X_test_transformed)

print(round(sm.r2_score(y_test, y_test_pred), 2))

这里的关键代码在于在进行任何训练预测前,都需要将原始特征数据进行拟合转变,具体是通过PolynomialFeatures的fit_transform方法进行转换,这里有两次,一次是X_train,一次是X_test,然后再将转换后的数据进行训练和预测。

和一般的一元线性回归相比,效果获得了2个百分点的提升。

再如可以使用决策树回归方法:

import pandas as pd
from sklearn.model_selection import train_test_split
import sklearn.metrics as sm
from sklearn.tree import DecisionTreeRegressor

frame = pd.read_csv('C:\\temp\\Daily_Demand_Forecasting_Orders.csv', sep=';')
pd.set_option('display.max_columns', None)
frame.rename(columns={'Week of the month (first week, second, third, fourth or fifth week': 'week',
                      'Day of the week (Monday to Friday)': 'day',
                      'Orders from the traffic controller sector': 'sector',
                      'Target (Total orders)': 'Target'}, inplace=True)
y = frame['Target']
X = frame.drop(columns='Target')
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=7)

regressor = DecisionTreeRegressor(max_depth=6)
regressor.fit(X_train, y_train)
y_test_pred = regressor.predict(X_test)
print(round(sm.r2_score(y_test, y_test_pred), 2))

这里的max_depth可以指定决策树的深度。大家可以注意到,不同的方法、不同的参数对于不同的方法往往效果都不一样,这些就构成了大家需要继续学习的基础,我们也该从经验、理论等多方面来了解对于什么样的数据我们应该使用什么样的模型和参数设置。

在决策树回归分析的基础上,我们还可以使用更为强大的AdaBoost回归方法。

import pandas as pd
from sklearn.model_selection import train_test_split
import sklearn.metrics as sm
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import AdaBoostRegressor

frame = pd.read_csv('C:\\temp\\Daily_Demand_Forecasting_Orders.csv', sep=';')
pd.set_option('display.max_columns', None)
frame.rename(columns={'Week of the month (first week, second, third, fourth or fifth week': 'week',
                      'Day of the week (Monday to Friday)': 'day',
                      'Orders from the traffic controller sector': 'sector',
                      'Target (Total orders)': 'Target'}, inplace=True)
y = frame['Target']
X = frame.drop(columns='Target')
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=7)

regressor = AdaBoostRegressor(DecisionTreeRegressor(max_depth=6))
regressor.fit(X_train, y_train)
y_test_pred = regressor.predict(X_test)
print(round(sm.r2_score(y_test, y_test_pred), 2))

其中,AdaBoostRegressor需要决策树回归为基础,效果也更好。

AdaBoost回归器还可以返回哪个特征最为相关:

import pandas as pd
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import numpy as np
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import AdaBoostRegressor

frame = pd.read_csv('C:\\temp\\Daily_Demand_Forecasting_Orders.csv', sep=';')
pd.set_option('display.max_columns', None)
frame.rename(columns={'Week of the month (first week, second, third, fourth or fifth week': 'week',
                      'Day of the week (Monday to Friday)': 'day',
                      'Orders from the traffic controller sector': 'sector',
                      'Target (Total orders)': 'Target'}, inplace=True)
y = frame['Target']
X = frame.drop(columns='Target')
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=7)
regressor = AdaBoostRegressor(DecisionTreeRegressor(max_depth=6))
regressor.fit(X_train, y_train)
y_test_pred = regressor.predict(X_test)

print(regressor.feature_importances_)

这里12个数值正好对应12个特征,其中最大的0.42对于第三个特征,即Non-urgent order。

最后我们通过一个有趣的绘图结束这个讲解。

这是根据刚才计算的特征重要性绘制的柱状图。数据我们都有了,如何绘制呢?这个需要些技巧。

先看纵轴,需要将最大的数值设定为100,于是:

feature_importances = 100.0 * (regressor.feature_importances_ / max(regressor.feature_importances_))

print(feature_importances)

再看看横轴,这是个排序的结果:

我们调用numpy的sort:

print(np.sort(feature_importances))

不过,它默认是升序。

我们来个降序:

print(np.flipud(np.sort(feature_importances)))

其中的flipud为翻转,正好为降序。

于是我们绘制:

values = np.flipud(np.sort(feature_importances))

plt.figure()

plt.bar(np.arange(12), values)

plt.show()

柱状图的横轴为0到11的12个整数,高度为刚才的特征重要度。

大家可能注意到了,这些方柱好像高低有点变化,这是因为每次计算都会因为随机选择而产生一定的变化。如果想固定下来,可以在AdaBoost回归器中设定固定的随机状态:

regressor = AdaBoostRegressor(DecisionTreeRegressor(max_depth=6), random_state=7)

此时的图表横轴还是不清楚,究竟是什么数据列对应哪一个方柱?

这里是完整的写法:

import pandas as pd
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import numpy as np
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import AdaBoostRegressor

frame = pd.read_csv('C:\\temp\\Daily_Demand_Forecasting_Orders.csv', sep=';')
pd.set_option('display.max_columns', None)
frame.rename(columns={'Week of the month (first week, second, third, fourth or fifth week': 'week',
                      'Day of the week (Monday to Friday)': 'day',
                      'Orders from the traffic controller sector': 'sector',
                      'Target (Total orders)': 'Target'}, inplace=True)
y = frame['Target']
X = frame.drop(columns='Target')
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=7)

regressor = AdaBoostRegressor(DecisionTreeRegressor(max_depth=6), random_state=7)
regressor.fit(X_train, y_train)
y_test_pred = regressor.predict(X_test)

feature_importances = 100.0 * (regressor.feature_importances_ / max(regressor.feature_importances_))
values = np.flipud(np.sort(feature_importances))
index_sorted = np.flipud(np.argsort(feature_importances))
plt.figure()
plt.bar(np.arange(12), values)
plt.xticks(np.arange(12), X.columns.values[index_sorted])
plt.show()

其中增加了两行:

第一行中,argsort也是排序,但是它只给出排序好后的列表元素下标。经过翻转以后,我们再拿这个下标去设置横轴的内容,内容就是12个数据列,只不过这是通过下标来挨个获取,而这个下标的次序正好是目前按照重要性排序好的数据列的次序。

最终我们完成了绘制。大家不妨试一试。

Python大数据分析4:特征数据的处理(会员卡预测)

在上次课上,我们利用决策树进行了会员卡类型的预测。其中,我们发现不同的特征对于预测的准确度有着很大的影响。那么我们该如何选择特征呢?简单的凭借自己的认知和运气显然并不是通用的好方法。今天我们来了解一下专业的方法。

首先,我们在做数据分析前,应该对每个需要处理的数据列进行必要的了解。

常见的方法为:

import pandas as pd

frame = pd.read_csv(‘C:\\temp\\customer.csv’)

print(frame[‘yearly_income’].describe())

对于文本数据,从结果可以看出非空的数据总数(count)、数据的种类数(unique,即相同的数据算一种)、出现频次最高的数据种类(top)及其频次(freq)。

如果需要详细了解具体取值种类,可以使用unique方法:

print(frame[‘yearly_income’].unique())

而对于数值型数据,内容更为丰富。内容主要包括计数、平均值、标准差、最小值、百分位数、最大值。一般通过这些,可以大概看出数据分布是否均匀。

print(frame[‘total_children’].describe())

不过,有些数据虽然看起来是数值,但其实不能作为一般的数值来分析。比如顾客地区ID等,显然平均值等概念并无实际意义。

print(frame[‘customer_region_id’].describe())

对于此类数值,应该处理方式和文本数据一样,使用独热编码来进行转换,可以有效避免算法故作聪明的利用数据之间的大小关系来做出反而有害的计算。

其次,数据预处理。

使用原始数据并不意味着一定要原封不动的使用他们,有时进行必要的转换和创建新的数据反而更为有效,既可以消除原始数据存在问题的产生的不利影响,也可以扩展内容特征。

简单的预处理只需对数据本身做一些数值上的技术处理。

import pandas as pd
from sklearn.preprocessing import OneHotEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
import numpy as np
from sklearn import preprocessing

frame = pd.read_csv('C:\\temp\\customer.csv')
frame['yearly_income'] = frame['yearly_income'].str.split(" ").str[0].str.replace('[^0-9]', '')
frame['yearly_income_new'] = preprocessing.scale(frame['yearly_income'])
y = frame["member_card"]
encoding = OneHotEncoder()
newData = encoding.fit_transform(np.vstack(frame["marital_status"].values)).todense()
frame_new = pd.DataFrame(newData)
frame_full = pd.merge(frame[["yearly_income_new", "total_children", "num_cars_owned"]], frame_new, left_index=True, right_index=True)
X = frame_full
clf = RandomForestClassifier()
scores = cross_val_score(clf, X, y, scoring='accuracy')
print(np.mean(scores))

这里,没有直接将年收入用于计算,而是首先调用preprocessing类型的scale方法,它可以进行均值移除,也就是说将各个特征的平均值调整为0,标准差调整为1。再利用这个新的年收入计算,可以发现效果略有提升。

数据预处理还可以进行了更为深入一些。

比如我们来看看年收入这个数据列。为方便处理,我们将其转换为整数,并测度方差:

import pandas as pd

frame = pd.read_csv(‘C:\\temp\\customer.csv’)

frame[‘yearly_income’] = frame[‘yearly_income’].str.split(” “).str[0].str.replace(‘[^0-9]’, ”)

frame[‘yearly_income_new’] = frame[‘yearly_income’].astype(int)

print(frame[‘yearly_income_new’].describe())

你会发现原始的年收入列方差非常大。方差大意味着数据分布非常分散,而对于会员卡等级预测而言,我们其实只有四种类别,显然过大的数据波动影响反而不利。

如何减少方差呢?我们不妨做个转换,将不同的年收入映射到几个区间中:

frame[‘yearly_income_new’] = frame[‘yearly_income_new’] // 30

print(frame[‘yearly_income_new’].describe())

这里的双斜杠表示整除,原始数据中最大最小数值差距为140,现在转换为5,方差极大的减少。

我们利用这个减少方差的新年收入来替换下过去的决策树方法:

import pandas as pd
from sklearn.preprocessing import OneHotEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
import numpy as np

frame = pd.read_csv('C:\\temp\\customer.csv')
frame['yearly_income'] = frame['yearly_income'].str.split(" ").str[0].str.replace('[^0-9]', '')
frame['yearly_income_new'] = frame['yearly_income'].astype(int)
frame['yearly_income_new'] = frame['yearly_income_new'] // 30
y = frame["member_card"]
encoding = OneHotEncoder()
newData = encoding.fit_transform(np.vstack(frame["marital_status"].values)).todense()
frame_new = pd.DataFrame(newData)
frame_full = pd.merge(frame[["yearly_income_new", "total_children", "num_cars_owned"]], frame_new, left_index=True, right_index=True)
X = frame_full
clf = RandomForestClassifier()
scores = cross_val_score(clf, X, y, scoring='accuracy')
print(np.mean(scores))

你会发现提高了接近0.4个百分点。

我们再举一个增加数据列的例子。

关于时间列,该数据有两个,一个是顾客生日,一个开卡的时间,由此我们可以计算出一个开卡年龄:

import pandas as pd

frame = pd.read_csv(‘C:\\temp\\customer.csv’)

frame[‘age’] = pd.to_datetime(frame[‘date_accnt_opened’]).dt.year – pd.to_datetime(frame[‘birthdate’]).dt.year

frame[‘age’] = frame[‘age’] // 20

print(frame[‘age’].describe())

考虑到过细的年龄数据即导致很大的方差,实际意义也不大,因此我们通过整除20映射到了年龄段。

增加此数据列,观察预测结果:

import pandas as pd
from sklearn.preprocessing import OneHotEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
import numpy as np

frame = pd.read_csv('C:\\temp\\customer.csv')
frame['age'] = pd.to_datetime(frame['date_accnt_opened']).dt.year - pd.to_datetime(frame['birthdate']).dt.year
frame['age'] = frame['age'] // 20
frame['yearly_income'] = frame['yearly_income'].str.split(" ").str[0].str.replace('[^0-9]', '')
y = frame["member_card"]
encoding = OneHotEncoder()
newData = encoding.fit_transform(np.vstack(frame["marital_status"].values)).todense()
frame_new = pd.DataFrame(newData)
frame_full = pd.merge(frame[["age", "yearly_income", "total_children", "num_cars_owned"]], frame_new, left_index=True, right_index=True)
X = frame_full
clf = RandomForestClassifier()
scores = cross_val_score(clf, X, y, scoring='accuracy')
print(np.mean(scores))

实际效果并不好,当然这里我们只是演示一种创建列的可行方法。不过即使如此,我们还是可以改进。

比如我们认为中青年年龄段的消费能力最强,于是我们再次调整年龄数据列:

import pandas as pd
from sklearn.preprocessing import OneHotEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
import numpy as np

frame = pd.read_csv('C:\\temp\\customer.csv')
frame['age'] = pd.to_datetime(frame['date_accnt_opened']).dt.year - pd.to_datetime(frame['birthdate']).dt.year
frame['age'] = frame['age'] // 20
frame.loc[frame['age'] >= 3, 'age'] = 1
frame.loc[frame['age'] <= 1, 'age'] = 1
frame['yearly_income'] = frame['yearly_income'].str.split(" ").str[0].str.replace('[^0-9]', '')
y = frame["member_card"]
encoding = OneHotEncoder()
newData = encoding.fit_transform(np.vstack(frame["marital_status"].values)).todense()
frame_new = pd.DataFrame(newData)
frame_full = pd.merge(frame[["age", "yearly_income", "total_children", "num_cars_owned"]], frame_new, left_index=True,  right_index=True)
X = frame_full
clf = RandomForestClassifier()
scores = cross_val_score(clf, X, y, scoring='accuracy')
print(np.mean(scores))

这里的想法是认为过低的年龄(小于20岁)和过高的年龄(大于60岁)没有区别,消费能力都有限,于是调整为统一的年龄段特征。从结果来看,比刚才的做法要提高1个百分点。当然,这里只是演示如何通过新增列来扩展数据的方法,事实上,年龄列效果非常不好。后面会有介绍。真实的考虑往往还需要更多结合应用的特点来增加真正有价值的数据列,在一些基于时间序列的应用中还可以通过不同行之间的时序关系得到更多的特征信息,如增长率等。

第三,数据选择。一般而言,选择特征数量的增加会导致计算复杂度的指数级增长,因此比较常见的处理方法是首先尝试表现较好的单个特征,在根据情况酌情增加。

那么如何选择这些数据呢?

我们可以根据数据之间的相关性来进行选择。我们就以前面我们曾经使用过的几个数据列,比较下与会员卡列的相关性:

import pandas as pd
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn.preprocessing import OneHotEncoder
import numpy as np

frame = pd.read_csv('C:\\temp\\customer.csv')
frame['age'] = pd.to_datetime(frame['date_accnt_opened']).dt.year - pd.to_datetime(frame['birthdate']).dt.year
frame['age'] = frame['age'] // 20
frame.loc[frame['age'] >= 3, 'age'] = 1
frame.loc[frame['age'] <= 1, 'age'] = 1
frame['yearly_income'] = frame['yearly_income'].str.split(" ").str[0].str.replace('[^0-9]', '')
encoding = OneHotEncoder()
newData = encoding.fit_transform(np.vstack(frame["marital_status"].values)).todense()
frame_new = pd.DataFrame(newData)
frame_full = pd.merge(frame[["age", "yearly_income", "total_children", "num_cars_owned"]], frame_new, left_index=True, right_index=True)
X = frame_full
y = frame["member_card"]
transformer = SelectKBest(score_func=chi2, k='all')
Xt_chi2 = transformer.fit_transform(X, y)
print(transformer.scores_)

这里直到X的生成都是前面介绍过的方法,y为会员卡比较列,我们调用列SelectKBest类型返回最佳相关特征,chi2的参数值表示采用卡方检验,all参数值表示返回所有特征情况。通过运算后,结果可以看出,年龄字段的价值非常小,甚至起到相反的作用,而最大相关度的是年收入和汽车拥有数量。

我们还可以使用主成分分析算法来寻找最小的有效特征集合,对于相关的数据就可以无需全部利用,同时还能保证整体数据有效性不变。这里我们去除了年龄列。

import pandas as pd
from sklearn.preprocessing import OneHotEncoder
import numpy as np
from sklearn.decomposition import PCA

frame = pd.read_csv('C:\\temp\\customer.csv')
frame['yearly_income'] = frame['yearly_income'].str.split(" ").str[0].str.replace('[^0-9]', '')
y = frame["member_card"]
encoding = OneHotEncoder()
newData = encoding.fit_transform(np.vstack(frame["marital_status"].values)).todense()
frame_new = pd.DataFrame(newData)
frame_full = pd.merge(frame[["yearly_income", "total_children", "num_cars_owned"]], frame_new, left_index=True, right_index=True)
X = frame_full
pca = PCA(n_components=2)
Xd = pca.fit_transform(X)
np.set_printoptions(precision=3, suppress=True)
print(pca.explained_variance_ratio_)
print(Xd)

我们定义了只生成两个2成分,并将原始含有6列的X特征最终转化为2列特征,其实还可以通过输出观察到2列各自的贡献度,我们以3位小数限制输出。当然,这里的2列绝不是简单的从原始6列中抽取2列,而是综合各列加权汇总而成的两个特征。

再以这两个特征,虽然特征只有2列,但是已经很取得很好的预测效果。

import pandas as pd
from sklearn.preprocessing import OneHotEncoder
import numpy as np
from sklearn.decomposition import PCA
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score

frame = pd.read_csv('C:\\temp\\customer.csv')
frame['yearly_income'] = frame['yearly_income'].str.split(" ").str[0].str.replace('[^0-9]', '')
y = frame["member_card"]
encoding = OneHotEncoder()
newData = encoding.fit_transform(np.vstack(frame["marital_status"].values)).todense()
frame_new = pd.DataFrame(newData)
frame_full = pd.merge(frame[["yearly_income", "total_children", "num_cars_owned"]], frame_new, left_index=True, right_index=True)
X = frame_full
pca = PCA(n_components=2)
Xd = pca.fit_transform(X)
clf = RandomForestClassifier()
scores = cross_val_score(clf, Xd, y, scoring='accuracy')
print(np.mean(scores))

Python大数据分析3:决策树与随机森林(会员卡预测)

所谓决策树,它也是一种分类方法,我们可以认为就是根据一些特征条件,来对结果类别做出判断,比如结合客户属性特征,看看是否适合办理信用卡等等。此时的类别就是该不该办理信用卡。

这次我们结合一个foodmart 2000数据集,来看看顾客会员卡的等级预测问题。这是一个跨国食品超市的数据,其中提供了1万多条会员卡顾客数据。其中提供了27个相关特征数据,如姓名、地址、收入、教育情况等,还提供了一个会员卡数据列,其中有金卡、银卡、铜卡和普通卡四种类型。

决策树分类方法和前面的方法很相似,关键是先得到所需的很多特征,特征的选择很关键,甚至有效准确的特征比算法还重要。作为练习,我们先找一些重要的特征吧!标准分类模型都是默认采用数值型特征。

因此我们先选择选择了三个数值型特征,分别是小孩数、汽车数和年收入。

其中年收入需要处理下才能使用,即转换为真正的数值。大家会注意到这是个范围,我们可以先直接提取所有的数字:

这里我们采用了是将每个年收入利用str获取字符串表示,并进一步调用replace函数替换所有非数字字符,这里我们采取了一种被称为正则表达式的方法,0-9表示10个数字,^表示不是,显然这样更为灵活,将其全部替换为空字符,即换成没有:

import pandas as pd

frame = pd.read_csv(‘C:\\temp\\customer.csv’)

print(frame[‘yearly_income’].head(2))

frame[‘yearly_income’] = frame[‘yearly_income’].str.replace(‘[^0-9]’, ”)

print(frame[‘yearly_income’].head(2))

从结果来看,可以通过这个整数来间接表达收入的规模。

当然,也可以采取另外一种方法,比如我们只取目前年收入范围的下限,这个是通过先截取到空格为止的前面的所有字符,然后再对齐进行替换:

frame[‘yearly_income’] = frame[‘yearly_income’].str.split(” “).str[0].str.replace(‘[^0-9]’, ”)

print(frame[‘yearly_income’].head(2))

好了,数据到此整理完毕。

代码其实不复杂,还和以前差不多:

import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
import numpy as np

frame = pd.read_csv('C:\\temp\\customer.csv')
frame['yearly_income'] = frame['yearly_income'].str.split(" ").str[0].str.replace('[^0-9]', '')
y = frame["member_card"]
clf = DecisionTreeClassifier()
X = frame[["yearly_income", "total_children", "num_cars_owned"]]
scores = cross_val_score(clf, X, y, scoring='accuracy')
print(np.mean(scores))

这里的主要区别在于:第一,将三个数值列为特征数据,而会员卡列作为预测列;第二,使用了DecisionTreeClassifier分类器。

一般而言,如果能够引入更多的相关特征,决策树分类器的效果很更好一些,比如我们认为受教育程度和职业往往也与会员等级关系密切,于是我们继续增加了教育特征:

X = frame[[“yearly_income”, “total_children”, “num_cars_owned”, “education”]]

scores = cross_val_score(clf, X, y, scoring=’accuracy’)

print(np.mean(scores))

但是我们发现出错了。原因很简单,字符类型的列不能直接参与各种分类运算,因此必须将其转换为数值。

转换方法可以利用LabelEncoder来实现,我们先来看看转换的效果:

import pandas as pd
from sklearn.preprocessing import LabelEncoder

frame = pd.read_csv('C:\\temp\\customer.csv')
encoding = LabelEncoder()
encoding.fit(frame["education"])
education_new = encoding.transform(frame["education"])
print(frame["education"].values)
print(education_new)

创建完LabelEncoder编码器后,首先现以当前受教育程度列训练这个编码器,其实就是让它知道这个列有几种不同的字符串,然后再让其转换这个列。

从结果来看,其实就是对于不同的字符串分配不同的数字,相同的字符串使用同一个数字来表示。

然后我们就可以将这个新的教育列加进去:

import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
import numpy as np

frame = pd.read_csv('C:\\temp\\customer.csv')
frame['yearly_income'] = frame['yearly_income'].str.split(" ").str[0].str.replace('[^0-9]', '')
encoding = LabelEncoder()
encoding.fit(frame["education"])
frame['education_new'] = encoding.transform(frame["education"])
y = frame["member_card"]
clf = DecisionTreeClassifier()
X = frame[["yearly_income", "total_children", "num_cars_owned", "education_new"]]
scores = cross_val_score(clf, X, y, scoring='accuracy')
print(np.mean(scores))

这里首先再DataFrame中建立一个education_new列,并将生成的新教育列赋值过来,既可在后面添加该列直接运算。

这里大家可以注意到了,效果似乎变差了,这是为什么呢?当然特征的选择有可能有问题,但是这里的问题更应该表现在这个数值转换过程。因此LabelEncoder是将字符转为整数,不同的整数虽然可以彼此区分,但是彼此数值的大小却似乎体现一种联系。

比如这里转换的结果我们可以看到,从数值来看,4和3更接近而相似,但是和2更不相似。然而,这其实是不对的,因为4对应的字符串并不和3对应的字符串更相似,似乎和2更相似些。LabelEncoder只是随意分配,并没有考虑字符串本身的相似度,数字只是区分。但是,这种整数却对分类方法产生一定的误导。

因此有效的方法应该使用独热编码。什么是独热编码,我们先看看:

import pandas as pd
from sklearn.preprocessing import OneHotEncoder
import numpy as np

frame = pd.read_csv('C:\\temp\\customer.csv')
encoding = OneHotEncoder()
print(frame["education"].values)
newData = encoding.fit_transform(np.vstack(frame["education"].values)).todense()
print(newData)

我们先看结果,受教育程度列有几种字符串,就会有几个列,每个列对应一种字符串。因此,通过对应的列设置为1可以表示当前行对应的列取这个值。我们明显看到对应关系,有5个列。

这种编码设计的好处在于数值既区分的彼此,也不会产生前面那种数值相似性的问题。

这里略有复杂的地方在于里面需要一种转换,这里简单说明下,

import pandas as pd

import numpy as np

frame = pd.read_csv(‘C:\\temp\\customer.csv’)

print(frame[“education”].values)

print(np.vstack(frame[“education”].values))

这是numpy计算包提供的一种转换功能,可以将一维数值序列变成二维矩阵,里面只有一列,就是刚才这个一维数值序列。

之所以这里需要这种转换,是因为只有有了这个二维矩阵,里面的每一行正好对应原始数据的每一行,后面才能生成含有多个热独编码的新列。

为了能后续进行统一的处理,需要我们首先将顾客DataFrame和这个对应的热度编码合并成一个DataFrame:

import pandas as pd
from sklearn.preprocessing import OneHotEncoder
import numpy as np

frame = pd.read_csv('C:\\temp\\customer.csv')
encoding = OneHotEncoder()
newData = encoding.fit_transform(np.vstack(frame["education"].values)).todense()
frame_new = pd.DataFrame(newData)
frame_full = pd.merge(frame[["yearly_income", "total_children", "num_cars_owned"]], frame_new, left_index=True, right_index=True)
print(frame_full)

这里首先将编码矩阵直接转换为DataFrame,然后和顾客DataFrame中所需的列连接下,这里的连接条件就是按照索引行一一对应连接即可,请大家注意相应的属性设置写法。

最后就可以连成一起了!

import pandas as pd
from sklearn.preprocessing import OneHotEncoder
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
import numpy as np

frame = pd.read_csv('C:\\temp\\customer.csv')
frame['yearly_income'] = frame['yearly_income'].str.split(" ").str[0].str.replace('[^0-9]', '')
y = frame["member_card"]
encoding = OneHotEncoder()
newData = encoding.fit_transform(np.vstack(frame["education"].values)).todense()
frame_new = pd.DataFrame(newData)
frame_full = pd.merge(frame[["yearly_income", "total_children", "num_cars_owned"]], frame_new, left_index=True, right_index=True)
X = frame_full
clf = DecisionTreeClassifier()
scores = cross_val_score(clf, X, y, scoring='accuracy')
print(np.mean(scores))

结果比刚才的LabelEncoder编码改进一些,但是依然低于最初我们没有引入受教育程度的情况,这可能也说明这个列其实意义有限。

那我们可以尝试增加其他列试一试!

newData = encoding.fit_transform(np.vstack(frame[“marital_status”].values)).todense()

我们只需更换这一句里的列,比如是否已婚,就会发现结果提高了,准确度达到77.4%。

有时,甚至需要我们去创建、补充一些新的列,来更好的得到预测模型,很多情况下都需要考虑特定的应用场景特点。大家可以自行多去了解观察。

对于决策树而言,它是利用这些我们选择的特征来进行相应的判断,同时行的选择也会影响效果,因此有时模型的有效性很大程度上取决于我们选择的数据。因此,我们如果根据不同的特征组合和行组合建立不同的多棵决策树,用它们分别进行预测,再根据少数服从多数的原则从多个预测结果中选择最终预测结果,这一定更有把握。

这其实就是随机森林的工作原理。

我们只替换了DecisionTreeClassifier为RandomForestClassifier:

import pandas as pd
from sklearn.preprocessing import OneHotEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
import numpy as np

frame = pd.read_csv('C:\\temp\\customer.csv')
frame['yearly_income'] = frame['yearly_income'].str.split(" ").str[0].str.replace('[^0-9]', '')
y = frame["member_card"]
encoding = OneHotEncoder()
newData = encoding.fit_transform(np.vstack(frame["marital_status"].values)).todense()
frame_new = pd.DataFrame(newData)
frame_full = pd.merge(frame[["yearly_income", "total_children", "num_cars_owned"]], frame_new, left_index=True,
                      right_index=True)
X = frame_full
clf = RandomForestClassifier()
scores = cross_val_score(clf, X, y, scoring='accuracy')
print(np.mean(scores))

效果略有提升。

随机森林还能调节各种参数,甚至还能允许通过算法自行测试得到最优的参数设置:

import pandas as pd
from sklearn.preprocessing import OneHotEncoder
import numpy as np
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier

frame = pd.read_csv('C:\\temp\\customer.csv')
frame['yearly_income'] = frame['yearly_income'].str.split(" ").str[0].str.replace('[^0-9]', '')
y = frame["member_card"]
encoding = OneHotEncoder()
newData = encoding.fit_transform(np.vstack(frame["marital_status"].values)).todense()
frame_new = pd.DataFrame(newData)
frame_full = pd.merge(frame[["yearly_income", "total_children", "num_cars_owned"]], frame_new, left_index=True, right_index=True)
X = frame_full
parameter_space = {
    "max_features": [2, 4, 'auto'],
    "n_estimators": [100, ],
    "criterion": ["gini", "entropy"],
    "min_samples_leaf": [2, 4, 6],
}
clf = RandomForestClassifier()
grid = GridSearchCV(clf, parameter_space)
grid.fit(X, y)
print(grid.best_estimator_)
print(grid.best_score_)

这里我们设置了一些参数及其数值的组合,允许利用GridSearchCV类型去组合搭配,并比较出最好的组合,我们可以通过best_estimator_得到参数设置,通过best_score_得到现在的最优值。

此时即可将best_estimator_得到参数设置回填回去:

clf = RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None,
                             criterion='gini', max_depth=None, max_features=2,
                             max_leaf_nodes=None, max_samples=None,
                             min_impurity_decrease=0.0, min_impurity_split=None,
                             min_samples_leaf=4, min_samples_split=2,
                             min_weight_fraction_leaf=0.0, n_estimators=100,
                             n_jobs=None, oob_score=False, random_state=14,
                             verbose=0, warm_start=False, )
scores = cross_val_score(clf, X, y, scoring='accuracy')
print(np.mean(scores))

此时,已经达到目前我们所做的最好准确度。

请注意,这里有一个参数random_state很有趣,事实上,每次运行由于选择的训练集和测试集可能都不一样,因此总是有些小小的差异,通过这个参数设定,可以将选择的随机化固定下来,从而使得每次运行结果是一定的,更便于对比分析。

Python大数据分析2:数据分析过程的完善(企业欺诈识别)

我们继续来完善上述分析过程。上次我们谈到的方法,其实是一种最为直观简化的方法,主要是方便大家理解如何进行利用机器学习方法来进行数据分类。但是,真正在应用中,我们还需要注意很多问题,我们仍然按照处理流程分别来看下:

首先看下数据预处理。上次我们已经说明了数据存在一定的错误,这个其实很正常,我们获取的数据不仅可能存在的一些诸如遗漏、误写等明显错误,而且还可能存在着一些与应用分析相关的错误,比如对于分类算法,通常还需要对非数值型数据进行数值型的转换。

比如上次企业审计数据存在部分非数值型数据,我们来看看如何使用Python来处理。

import numpy as np

import pandas as pd

frame = pd.read_csv(‘C:\\temp\\audit_risk.csv’)

results = frame.applymap(np.isreal)

print(results)

这里,我们使用了applymap函数,它可以将整个DataFrame所有元素都应用下参数中指定的函数。其中在判断是否为数值时,我们利用了numpy库中的isreal函数,这个需要我们仍然导入numpy库。applymap最终返回一个和原始DataFrame一样大小的新DataFrame,只是其中的每个数值都被处理了下。

由于DataFrame在转换列类型时,通常都是以列为单位的,也就是说,一旦有一列含有非数值元素,它就会将此列全部设置为非数值型,如字符型。所以我们能看到这里有一个列LOCATION_ID,就是这种情况。

显然,此时为了效果,可以只显示列名即可,0表示列,1表示行:

results = frame.applymap(np.isreal).all(0)

print(results)

此时all为0的设置就表示只以列显示结果,并且列中所有元素都满足,该列才命中。

我们已经知道了LOCATION_ID列存在非数值元素。

如果列很多,更有效的方法是只显示有问题的列,即isreal为假的列:

print(results[(results == False)])

接下来如何处理这些异常数据呢?这里介绍一种简单常见的方法:

frame[‘LOCATION_ID’] = pd.to_numeric(frame[‘LOCATION_ID’], errors=’coerce’)

results = frame.applymap(np.isreal).all(0)

print(results[(results == False)])

这里使用to_numeric将其强制转换为数值,同时对于异常数据,则使用空值来替换,这个是通过errors参数为强制来实现的。

从结果来看,现在已经全部都是数值了!

对于空值,也是常见的问题。

我们先查找下空值:

import numpy as np

import pandas as pd

frame = pd.read_csv(‘C:\\temp\\audit_risk.csv’)

frame[‘LOCATION_ID’] = pd.to_numeric(frame[‘LOCATION_ID’], errors=’coerce’)

results = frame.isnull()

print(results)

和刚才一样,也返回一个和原始DataFrame一样大小的新DataFrame,只是其中的每个元素都是真假表示是否为空值。

显然,需要再次查询下定位:

results = frame.isnull().any(0)

print(results[results == True])

这里any表示该列只要有任意一个为空则命中。从结果来看,存在两列,一列是我们替换非数值的LOCATION_ID,还有一个是新的Money_Value。

究竟是那几行呢?

results = frame.isnull().any(1)

print(results[results == True])

只要把any的0换为1,表示行,就能看到。此时凭借着行列就可以手工去修改下数据。

我们这里对于空值都采取了使用0来填充。

frame = frame.fillna(0)

results = frame.isnull().any(1)

print(results[results == True])

从结果来看,已经全部替换完毕。

这是完整代码:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import numpy as np

frame = pd.read_csv('C:\\temp\\audit_risk.csv')
frame['LOCATION_ID'] = pd.to_numeric(frame['LOCATION_ID'], errors='coerce')
frame = frame.fillna(0)
y = frame[frame.columns[len(frame.columns) - 1]]
frame.drop(frame.columns[len(frame.columns) - 1], axis=1, inplace=True)
X = frame
X_train, X_test, y_train, y_test = train_test_split(X, y)
estimator = KNeighborsClassifier()
estimator.fit(X_train, y_train)
y_predicted = estimator.predict(X_test)
print(np.mean(y_test == y_predicted))

当然,除了使用这种0值填充方法外,我们也可以使用更为灵活的填充方法,比如就拿空值所在列的平均值来填充,方法其实很简单:

from sklearn.impute import SimpleImputer

imp = SimpleImputer(strategy=’mean’)

X = imp.fit_transform(X)

只需将刚才填充X的语句换掉即可,这里看得出是使用mean平均值来填充。

当然效果可能会因数据、算法和填充策略而各不一样。这里就需要大家多比较。

除了这些数据问题外,还有一种常见的数据问题,称之为数据规范化问题。也就是说,不同列的数据呈现出不同的波动幅度和取值范围,因此在进行各种算法比较中,这些数据本身的数值差异会对算法产生一些不利影响。因此,我们常常还需要进行必要的规范化。

做法其实很简单:

from sklearn.preprocessing import StandardScaler

X = StandardScaler().fit_transform(X)

只需在模型数据划分前,利用合适的规范化工具处理下整体特征数据处理下即可。

这里结果变优了。当然,需要注意的是,盲目使用未必一定最优。

事实上,有时我们还需针对不同的场景和数据,灵活选择更多的规范化方法。

大家有没有注意到,即使对于同样的代码,每次运行效果都并不完全一样。

这里其实反映了一个重要的问题,那就是数据的选择。由于算法自动切分训练集和测试集,数据的划分不一样,结果就可能不一样,因此更为合理的方法是进行多次验证,这种也被称为交叉验证。比如我们将训练集和测试集交换:

estimator = KNeighborsClassifier()

estimator.fit(X_test, y_test)

y_predicted = estimator.predict(X_train)

print(np.mean(y_train == y_predicted))

效果要差些,因为默认的测试集数量少于训练集,训练效果不好。

当然无需我们自己来手动的分组来试,我们可以利用sklearn中的一些非常方便的方法。

from sklearn.model_selection import cross_val_score

estimator = KNeighborsClassifier()

scores = cross_val_score(estimator, X, y, scoring=’accuracy’)

print(np.mean(scores))

此时,默认分为5组,挨次把其中的一组作为测试集。代码反而更简单了,创建完分类器后,直接调用交叉验证方法,给出分类器模型、训练集、测试集和评价指标,直接就可以输出最终的结果。

事实上,这个结果没有这么高,大约为91%左右。

也可以设置交叉分组的次数:

scores = cross_val_score(estimator, X, y, scoring=’accuracy’, cv=10)

print(np.mean(scores))

这里最为极端的一个例子是自己验证自己,显然这并没有意义:

estimator = KNeighborsClassifier(n_neighbors=1)

estimator.fit(X_train, y_train)

y_predicted = estimator.predict(X_train)

print(np.mean(y_train == y_predicted))

这也说明训练集和测试集分开的必要性。

对于同样的数据,这些模型都是固定的算法,那么究竟有哪些影响结果的因素呢?刚才我们说的都是训练集和测试集的划分和选择问题。其实还有一种可能,即模型参数,不同的参数选择,效果也会不一样,因此称之为参数调优。这些参数也被称为超参数。

比如这里的分类算法而言,究竟邻居数量选择几个是大有学问的,我们大胆的试一试使用一个1个邻居参与运算,看看效果。

estimator = KNeighborsClassifier(n_neighbors=1)

scores = cross_val_score(estimator, X, y, scoring=’accuracy’)

print(np.mean(scores))

你会发现结果变高了一点点。

事实上,默认邻居数量为5。这里是将邻居从1到20全部设置的最终准确度展示结果。可以看出结果呈现出以1和10为最高点,其余数量都依次递减的特点。

这种调参的过程显然也比较麻烦,因此可以考虑使用一些更为简单有效的模型,比如高斯朴素贝叶斯分类,速度很快,而且不需要选择超参数,所以通常很适合作为初步分类手段。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
import numpy as np
from sklearn.model_selection import cross_val_score

frame = pd.read_csv('C:\\temp\\audit_risk.csv')
frame['LOCATION_ID'] = pd.to_numeric(frame['LOCATION_ID'], errors='coerce')
frame = frame.fillna(0)
y = frame[frame.columns[len(frame.columns) - 1]]
frame.drop(frame.columns[len(frame.columns) - 1], axis=1, inplace=True)
X = frame
X_train, X_test, y_train, y_test = train_test_split(X, y)
estimator = GaussianNB()
scores = cross_val_score(estimator, X, y, scoring='accuracy')
print(np.mean(scores))

其中我们仅仅替换了模型,其他没有做任何改变,结果却获得了很好的提升,而且无需设置超参数。

因此,整个机器学习的分析方法可以总结下:

第一,获取数据;

第二,划分特征数据和预测数据;

第三,数据预处理,包括必要的数据替换、填充和规范化(一般不对预测数据做处理);

第四,划分训练集和测试集;

第五,选择合适的模型并训练模型;

第六,预测结果和评估。

有时候,这个过程虽然简单,但是写法需要一步一步,很繁琐,因此可以通过一种称之为管道的方式组装起来,更为方便:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline

frame = pd.read_csv('C:\\temp\\audit_risk.csv')
frame['LOCATION_ID'] = pd.to_numeric(frame['LOCATION_ID'], errors='coerce')
frame = frame.fillna(0)
y = frame[frame.columns[len(frame.columns) - 1]]
frame.drop(frame.columns[len(frame.columns) - 1], axis=1, inplace=True)
X = frame
X_train, X_test, y_train, y_test = train_test_split(X, y)
pipeline = Pipeline([('scale', StandardScaler()),
                     ('predict', KNeighborsClassifier())])
scores = cross_val_score(pipeline, X, y, scoring='accuracy')
print(scores)

这里的pipeline封装了规范化方法、模型方法等,直接使用非常方便。

Python大数据分析1:数据分类分析(企业欺诈识别)

数据分类是一种机器学习的数据预测方法。

在这里,我们谈到的机器学习。大家可能会觉得有点畏惧,觉得是不是很难。我们首先需要对它有个简单的了解:第一,机器学习是一些计算机分析方法的统称,虽然很难,但是Python已经提供了很多很好用的库,我们只需学会如何使用即可,正如相机拍照原理和过程很复杂,但是我们只需按动那个快门键;第二,机器学习方法不同于前面我们介绍的一些基于现有数据进行总结性分析的方法,这些方法或者通过表格,或者通过可视化,提供给大家一种了解现有数据的分析途径。机器学习分析方法更强调智能性,甚至可以对未知数据进行预测分析,这些能力非常强大。

这次我们就先看看分类。在这里,数据分类有着明确的规定,即对于一组数据,我们事先对它们进行一种分类标注,然后通过一些诸如机器学习等分析方法,了解这种分类背后的数据规律,并由该机器学习分析方法自动预测新数据的类别。

我们从一个例子开始。加利福尼亚大学提供了一组免费的公开数据集合,其中提供了各种分析功能适用的数据:其中有三百多种分类目的的数据,我们选择分类数据,进一步选择其中的企业审计数据(Audit Data),此时点击Download后面的Data Folder数据文件夹,即可在打开的界面中选择Audit_Data.zip数据文件即可。

这个数据2015年至2016年间一些公司非机密数据,根据诸如环境状况报告、利润价值记录等信息,预测公司的欺诈可能性,共计26个数据列。这个可能性主要通过最后一列的Risk可以看出,为1表示存在风险,为0表示不存在风险。

接下来,我们需要解释一下如何进行分类分析。和所有其他机器学习方法差不多,都是一种常见的流程。我们接来下就按照这个流程来说明下:

首先是数据获取加载。

我们还是通过pandas读取数据:

import pandas as pd

frame = pd.read_csv(‘C:\\temp\\audit_risk.csv’)

print(frame)

第二步是数据预处理。不同的机器学习方法可能对数据有着不同的要求,比如一般的分类方法,要求所有参与计算的列必须是数值型,同时还可能要求数据不能有缺失的空值。

事实上,这个数据是有些小问题的。

首先我们可以观察下有无非数值型数据。具体Python处理方法我们后面专门来讲,这里我们就不做过多介绍。不过即使如此,我们也可以使用最为常见的Excel来查找下。

在Excel中按下Ctrl+A选中全部记录,按下Ctrl后再点击下第一行,你会发现选择内容去除了第一行的标题,在Excel中直接按下Ctrl+F查找,即可在选择的数据内容中查找,在定位中选择常量下的文本,去除其他选择项目,点击定位即可。此时可以看到已有三块数据被选中,为灰色,建议直接替换为0。同样的方法,在定位中选择空值,也可以快速看到存在的空值记录,建议使用0填充。到此为此,数据预处理手工完成。

第三步是数据划分。这里包括两个操作,一是数据列的划分,将现有数据分为特征列和预测列,也就是说,你准备按照什么数据进行分类,即特征列,这里应该就是除了最后一列外所有的企业数据特征列。分好的类在哪个列标记,即类别类,也是将来准备预测类别的列,因此也可以称之为预测列。这里就是最后一列,取值为0或者1的Risk。

写成代码的形式就是:

import pandas as pd

frame = pd.read_csv(‘C:\\temp\\audit_risk.csv’, header=0)

y = frame[frame.columns[len(frame.columns) – 1]]

frame.drop(frame.columns[len(frame.columns) – 1], axis=1, inplace=True)

X = frame

print(X)

这里首先取出最后一列,按照习惯,预测列名称通常为小写的y。其中这里我们没有使用列名的方法,故意使用了另外一种方法,即按照最后一列的序号来取出相应的列,根据当前列的个数减一可以得到最后一列的序号,因为从零开始表示第一列。然后根据这个序号得到相应的列,这种用法在没有列名的时候比较灵活。然后再删除最后一列,这里没有保存Frame,而且直接通过inplace参数直接在原有DataFrame上删除,axis为1表示以列为单位操作,而第一个参数正是最后一列的序号。按照习惯,特征列名称通常为大写的X。

第二个数据行的划分,主要目的是分为训练集和测试集合。所谓训练集合,是指使用哪些数据来训练分类算法。这些分类模算法必须在一些给定的数据中去训练,或者说去学习,才能自动获取最能反映分类的规则,并保存到分类模型中。一般会把整体数据的大部分作为训练集合,不能太小,否则训练效果会较差。所谓测试集合,主要是用来评估分类算法,看看拿刚才的模型来预测下,比如这里预测下分类结果,看看和已知的结果是否一致,显然越一致算法越好。通常这部分数据较少。到了真实应用场景下,就可以拿真正想预测的数据作为测试集合。

看起来很复杂,其实很简单,我们再次使用一个著名的Python库,叫sklearn,它是目前非常著名的一个实现各种机器学习方法的库。还像以前一样导入到项目,代码为:

import pandas as pd
from sklearn.model_selection import train_test_split

frame = pd.read_csv('C:\\temp\\audit_risk.csv', header=0)
y = frame[frame.columns[len(frame.columns) - 1]]
frame.drop(frame.columns[len(frame.columns) - 1], axis=1, inplace=True)
X = frame

X_train, X_test, y_train, y_test = train_test_split(X, y)
print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)

其中首先导入sklearn中专门用于划分训练集和测试集的train_test_split类型,自动获得四块内容,正好对于特征列和预测列、训练集和测试集的四种组合。

这里输出了下大小,正好看出,所有X相关的特征数据都是26列,所有训练和测试的数据比例划分是3:1,大家看懂了这个结果吗?

也可以通过设置test_size改变默认的分隔设置:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)

test_size默认为0.25,表示测试集的比例。

好了,到了最关键的一步,即第四步,数据训练。就是根据上述分好的数据,利用训练集合相关的两块数据来计算、来学习,得到分类模型。

代码为:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

frame = pd.read_csv('C:\\temp\\audit_risk.csv', header=0)
y = frame[frame.columns[len(frame.columns) - 1]]
frame.drop(frame.columns[len(frame.columns) - 1], axis=1, inplace=True)
X = frame

X_train, X_test, y_train, y_test = train_test_split(X, y)
estimator = KNeighborsClassifier()
estimator.fit(X_train, y_train)

这里首先需要选择一个分类算法,我们选择了k近邻分类算法,生成一个分类器变量,记得此时需要导入这个分类算法。具体分类怎么实现的,我们无需过问,其实有很多不同的算法,后面我们还可以做出选择调整。

然后调用这个分类器变量的fit方法,里面正好就是训练集合的两块数据。

第五步,就是最后一步,效果评估。一般就是使用模型预测下,比如这里的分类预测,然后看看准确度。

代码为:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import numpy as np

frame = pd.read_csv('C:\\temp\\audit_risk.csv', header=0)
y = frame[frame.columns[len(frame.columns) - 1]]
frame.drop(frame.columns[len(frame.columns) - 1], axis=1, inplace=True)
X = frame

X_train, X_test, y_train, y_test = train_test_split(X, y)
estimator = KNeighborsClassifier()
estimator.fit(X_train, y_train)
y_predicted = estimator.predict(X_test)
print(np.mean(y_test == y_predicted))

这里仍然分类器的predict方法直接根据测试集的特征数据来预测。

如果进行效果比较呢?这里我们也无需直接去做,再次使用一个著名的科学计算库numpy,也记得导入,并在项目代码中导入,即可利用它的mean,即平均值,我们只需将预测的结果y_predicted和已知的y_test以是否相等作为条件,看看正确的占比有多少。此时,mean这个方法的参数是一个由真假组成的列表,它会自动计算True在其中的比例,作为平均值。这个预测结果的准确度还是挺高的!95%!

为了好看,我们可以再次改变下输出的格式:

print(“准确度为:{:.1f}%”.format(np.mean(y_test == y_predicted) * 100))

这里使用了字符串的格式化输出功能,其中整个字符串都会直接输出,而花括号括起来的部分,会以format函数中的结果来展示,而花括号里的内容就表示按照一位小数输出。