急!python数据分析课程课程作业 求大神指导 今晚之前截止交!!

求python大作业!!!程序和程序描述都要_百度知道
求python大作业!!!程序和程序描述都要
我有更好的答案
让人无从下手,你们老师什么要求。比如“写一个文件搜索函数,用户给定关键字,搜索当前目录和子目录下的所有包含关键字的文件?哪怕很含糊也是可以的嘛,但是你这个问题挺想试一试的
采纳率:57%
具体要求如何
为您推荐:
其他类似问题
您可能关注的内容
python的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。title: Python作业-选课系统
tags: python
author: Chinge Yang
Python作业-选课系统
@(学习)[python]
days6作业-选课系统:
角色:学校、学员、课程、讲师
[ ] 1.创建北京、上海 2 所学校
[ ] 2.创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
[ ] 3.课程包含,周期,价格,通过学校创建课程
[ ] 4.通过学校创建班级, 班级关联课程、讲师
[ ] 5.创建学员时,选择学校,关联班级
[ ] 5.创建讲师角色时要关联学校,
[ ] 6.提供两个角色接口,一个管理接口
6.1学员视图, 可以注册, 交学费, 选择班级
6.2讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班级学员列表 , 修改所管理的学员的成绩
6.3管理视图,创建讲师, 创建班级,创建课程
[ ] 7.上面的操作产生的数据都通过pickle序列化保存到文件里
1. 程序说明
实现功能如下
[x] 1.创建北京、上海2所学校
[x] 2.创建linux,python,go3个课程,linux\py在北京开,go在上海开
[x] 3.课程包含,周期,价格,通过学校创建课程
[x] 4.通过学校创建班级,班级关联课程、讲师
[x] 5.创建学员时,选择学校,关联班级
[x] 5.创建讲师角色时要关联学校
[x] 6.提供两个角色接口,一个管理接口
6.1学员视图,可以注册,交学费,选择班级
6.2讲师视图,讲师可管理自己的班级,上课时选择班级,查看班级学员列表,修改所管理的学员的成绩
6.3管理视图,创建讲师,创建班级,创建课程
[x] 7.上面的操作产生的数据都通过pickle序列化保存到文件里
2. 思路和程序限制
首先设置限制:
1. 学员有地域限制,不能同时选择北京和上海学校;
2. 为避免课程冲突,学员只能选择一个课程,且不考虑历史选课;
3. 讲师上课时只能选择一个班级;
4. 讲师周一到周日都可选择班级授课,一日一课程,一周最多7个班级;
5. 一个帐号只属性一个人,帐户使用用户名登录,对应唯一ID,即学号;
6. 一个班级可能对应多个讲师;
按帐号区分视图:
1. 学员帐号
属性:学号、班级、学校、课程、成绩、名字;
方法:注册、选课、查看班级信息、修改自己信息;
2. 导师帐号
属性:名字、授课班级、学校、授课课程、授课安排;
方法:查看学员信息、排课、修改自己信息、修改学生成绩;
3. 系统帐号
属性:名字、管理员权限
方法:创建班级、分配学员班级、创建课程、创建讲师、管理员功能
从程序上来设计:
1. 人类:属性有名字、年龄、性别;
2. 城市类:属性有城市名;
3. 学校类:属性有学校名;
4. 班级类:属性有班级名,学员,和学员一对多关系;
5. 学生类:继承基本类人,有其它属性选课、成绩,和班级(一对一);
7. 讲师类:继承基本类人,有其它属性教的课程;
7. 课程类:属性有课程名,价格,;
8. 帐户类:属性有帐号名、密码、状态、角色;(与人一对一)
简单流程图:
作业地址:
3. 选课系统程序目录结构
├── __init__.py
├── bin
# 可执行程序入口目录
├── __init__.py
└── course_selection.py
# 程序入口
├── conf
# 配置文件目录
├── __init__.py
├── __pycache__
├── __init__.cpython-35.pyc
└── settings.cpython-35.pyc
└── settings.py
# 配置文件
├── core
# 选课系统主要逻辑程序目录
├── __init__.py
├── __pycache__
├── __init__.cpython-35.pyc
├── initialization.cpython-35.pyc
├── logger.cpython-35.pyc
├── main.cpython-35.pyc
└── operate.cpython-35.pyc
├── logger.py
# 日志记录模块
├── main.py
# 主程序模块
└── operate.py
# 系统操作功能模块
# 数据库目录
├── __init__.py
├── accounts
# 帐户数据库目录
├── 10000
# 数据库文件,以学号为唯一id命名文件名
├── 10001
├── 10002
├── __init__.py
└── user_names
# 学号对应帐户用户名
├── base
# 基础数据库目录
└── base.db
# 基础数据库
└── increment_id
# 记录自增长id最大值
├── lib
├── __init__.py
├── __pycache__
├── __init__.cpython-35.pyc
├── account.cpython-35.pyc
├── banji.cpython-35.pyc
├── base.cpython-35.pyc
├── course.cpython-35.pyc
├── db.cpython-35.pyc
├── people.cpython-35.pyc
└── school.cpython-35.pyc
├── account.py
├── banji.py
├── base.py
# 基础数据类
├── course.py
├── db.py
# 数据库连接类
├── people.py
# 人、学员、讲师类
└── school.py
└── log
# 日志目录
├── __init__.py
└── system.log
# 系统日志
11 directories, 44 files
4. 测试帐户说明
系统帐户:
admin/admin
讲师帐户:
学员帐户:
5. 程序测试过程
----------------- 欢迎进入选课系统 -----------------
--------------------------------------------------
----------------- 欢迎进入管理系统 -----------------
后退(注销)
--------------------------------------------------
--------------- 欢迎进入教务管理系统 ----------------
--------------------------------------------------
班级学员管理
--------------------------------------------------
Please sign in!
Please input user name &&: admin
Please input password &&: admin
Sign in success!
--------------- 欢迎进入教务管理系统 ----------------
--------------------------------------------------
班级学员管理
--------------------------------------------------
Please input the class name.
&&: class1
Please input the course name.
Please input the name of school which you want to add.eg: [ shanghai_oldboy_school ]
&&: shanghai_oldboy_school
Update school shanghai_oldboy_school success
--------------- 欢迎进入教务管理系统 ----------------
--------------------------------------------------
班级学员管理
--------------------------------------------------
Please input the course name.
Please input price of zhe course.
Please input the name of school which you want to add.eg: [ shanghai_oldboy_school ]
&&: shanghai_oldboy_school
Update school shanghai_oldboy_school success
--------------- 欢迎进入教务管理系统 ----------------
--------------------------------------------------
班级学员管理
--------------------------------------------------
Input teaching course.
Create teacher account!
Please input user name &&: t1
Please input password &&: t1`
Please input password confirmation &&: t1
Passwords do not match!
Account register failed !
--------------- 欢迎进入教务管理系统 ----------------
--------------------------------------------------
班级学员管理
--------------------------------------------------
Input teaching course.
Create teacher account!
Please input user name &&: t1
Please input password &&: t1
Please input password confirmation &&: t1
Account [10001] register sucessed !
Please input the name of school which you want to add.eg: [ shanghai_oldboy_school ]
&&: shanghai_oldboy_school
Update school shanghai_oldboy_school success
--------------- 欢迎进入教务管理系统 ----------------
--------------------------------------------------
班级学员管理
--------------------------------------------------
-------------------- 学校信息 ---------------------
school name:beijing_oldboy_school
teachers :
students :
--------------------------------------------------
school name:shanghai_oldboy_school
teachers :
students :
--------------------------------------------------
--------------- 欢迎进入教务管理系统 ----------------
--------------------------------------------------
班级学员管理
--------------------------------------------------
----------------- 欢迎进入管理系统 -----------------
后退(注销)
--------------------------------------------------
----------------- 欢迎进入选课系统 -----------------
--------------------------------------------------
----------------- 欢迎进入学员系统 -----------------
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
Please input user name &&: s1
Please input password &&: s1
Please input password confirmation &&: s1
Account [10002] register sucessed !
----------------- 欢迎进入学员系统 -----------------
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
Does not belong to any school!
You did not join any class!
----------------- 欢迎进入学员系统 -----------------
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
---------------------- 个人信息 ----------------------
account_id: 10002
----------------- 欢迎进入学员系统 -----------------
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
---------------------- 个人信息 ----------------------
account_id: 10002
Input a dict type data to modify your info.eg: {'age': 28, 'name': 'ygqygq2', 'sex': 'male'}
&&: {'age': 28, 'name': '张三', 'sex': 'male'}
User info modify successed!
----------------- 欢迎进入学员系统 -----------------
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
---------------------- 个人信息 ----------------------
account_id: 10002
name: 张三
----------------- 欢迎进入学员系统 -----------------
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
-------------------- 课程信息 ---------------------
学校名称:beijing_oldboy_school
--------------------------------------------------
学校名称:shanghai_oldboy_school
--------------------------------------------------
Please input the course name of you want to learn,eg: [ shanghai_oldboy_school.go ]
&&: shanghai_oldboy_school.java
Select course success
----------------- 欢迎进入学员系统 -----------------
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
---------------------- 个人信息 ----------------------
account_id: 10002
name: 张三
courses: ['java']
----------------- 欢迎进入学员系统 -----------------
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
You did not join any class!
----------------- 欢迎进入学员系统 -----------------
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
----------------- 欢迎进入选课系统 -----------------
--------------------------------------------------
----------------- 欢迎进入讲师系统 -----------------
查看学员信息
修改学员成绩
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
Please sign in!
Please input user name &&: t1
Please input password &&: t1
Sign in success!
----------------- 欢迎进入讲师系统 -----------------
查看学员信息
修改学员成绩
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
---------------------- 个人信息 ----------------------
account_id: 10001
teaching: ['java']
----------------- 欢迎进入讲师系统 -----------------
查看学员信息
修改学员成绩
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
---------------------- 个人信息 ----------------------
account_id: 10001
teaching: ['java']
Input a dict type data to modify your info.eg: {'age': 28, 'name': 'ygqygq2', 'sex': 'male'}
&&: {'age': 36, 'name': '李老师', 'sex': 'female'}
{'teaching': ['java']}
User info modify successed!
----------------- 欢迎进入讲师系统 -----------------
查看学员信息
修改学员成绩
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
---------------------- 个人信息 ----------------------
account_id: 10001
name: 李老师
sex: female
teaching: ['java']
----------------- 欢迎进入讲师系统 -----------------
查看学员信息
修改学员成绩
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
Please input the class name of you will to see the student.
class_name &&: class1
This class class1 is not what you teaching class!
----------------- 欢迎进入讲师系统 -----------------
查看学员信息
修改学员成绩
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
-------------------- 学校信息 ---------------------
school name:beijing_oldboy_school
teachers :
students :
--------------------------------------------------
school name:shanghai_oldboy_school
teachers :
students :
--------------------------------------------------
----------------- 欢迎进入讲师系统 -----------------
查看学员信息
修改学员成绩
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
----------------- 欢迎进入选课系统 -----------------
--------------------------------------------------
----------------- 欢迎进入管理系统 -----------------
后退(注销)
--------------------------------------------------
--------------- 欢迎进入教务管理系统 ----------------
--------------------------------------------------
班级学员管理
--------------------------------------------------
Please sign in!
Please input user name &&: admin
Please input password &&: admin
Sign in success!
--------------- 欢迎进入教务管理系统 ----------------
--------------------------------------------------
班级学员管理
--------------------------------------------------
------------------ 没有班级且已选课的学员 -------------------
-------- beijing_oldboy_school --------
可加入学员的班级:
可加入班级的学员:
--------------------------------------------------
------- shanghai_oldboy_school --------
可加入学员的班级:
class_name:class1
course:['java']
可加入班级的学员:
account_id: 10002 name: 张三
--------------------------------------------------
Please send students to join the corresponding class.
eg: shanghai_oldboy_school.class1.10001
&&: shanghai_oldboy_school.class1.10002
Account 10002 join to shanghai_oldboy_school class1 sucessed
--------------- 欢迎进入教务管理系统 ----------------
--------------------------------------------------
班级学员管理
--------------------------------------------------
-------------------- 学校信息 ---------------------
school name:beijing_oldboy_school
teachers :
students :
--------------------------------------------------
school name:shanghai_oldboy_school
teachers :
students :
--------------------------------------------------
--------------- 欢迎进入教务管理系统 ----------------
--------------------------------------------------
班级学员管理
--------------------------------------------------
----------------- 欢迎进入管理系统 -----------------
后退(注销)
--------------------------------------------------
----------------- 欢迎进入选课系统 -----------------
--------------------------------------------------
----------------- 欢迎进入讲师系统 -----------------
查看学员信息
修改学员成绩
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
Please sign in!
Please input user name &&: t1
Please input password &&: t1
Sign in success!
----------------- 欢迎进入讲师系统 -----------------
查看学员信息
修改学员成绩
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
Please input the class name of you will to see the student.
class_name &&: class1
This class class1 is not what you teaching class!
----------------- 欢迎进入讲师系统 -----------------
查看学员信息
修改学员成绩
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
Please input course scheduling info.【c】to cancel.
format likes 【week: course: class_name】eg: Monday: class1: java, Friday: class1: java
&&: Monday: class1: java, Friday: class1: java
Add ourse scheduling Monday: class1: java successed!
Add ourse scheduling
Friday: class1: java successed!
----------------- 欢迎进入讲师系统 -----------------
查看学员信息
修改学员成绩
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
---------------------- 排课信息 ----------------------
Class: Course
{'class1': 'java'}
{'class1': 'java'}
Please input course scheduling info.【c】to cancel.
format likes 【week: course: class_name】eg: Monday: class1: java, Friday: class1: java
----------------- 欢迎进入讲师系统 -----------------
查看学员信息
修改学员成绩
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
Please input the class name of you will to see the student.
class_name &&: class1
Please input the account id of you will to see the student.【space】to see all students.
account_id &&:
--------------- 学员[]信息 ----------------
account_id: 10002
name: 张三
courses: ['java']
banji: class1
----------------- 欢迎进入讲师系统 -----------------
查看学员信息
修改学员成绩
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
----------------- 欢迎进入讲师系统 -----------------
查看学员信息
修改学员成绩
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
Please input students grades.【c】to cancel.
format likes 【date: class_name: account_id: grade】eg: : class1: 17-04-08: class1: 10002: 77
&&: : class1: 10001: 80
Account 10001 is not in class1!skip add : class1: 10001: 80
----------------- 欢迎进入讲师系统 -----------------
查看学员信息
修改学员成绩
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
Please input students grades.【c】to cancel.
format likes 【date: class_name: account_id: grade】eg: : class1: 17-04-08: class1: 10002: 77
&&: : class1: 10002: 80
Account 10002 grades modify successed!
----------------- 欢迎进入讲师系统 -----------------
查看学员信息
修改学员成绩
查看个人信息
修改个人信息
后退(注销)
--------------------------------------------------
----------------- 欢迎进入选课系统 -----------------
--------------------------------------------------
###################### 谢谢使用 ######################
Process finished with exit code 1
阅读(...) 评论()求大神们解救,第一节课作业就不会做∑(?Д?)【python吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:173,032贴子:
求大神们解救,第一节课作业就不会做∑(?Д?)收藏
楼主苦逼留学党,从没学过编程,但是作死修了一节数据结构的课(用typhon)。。。。结果第一节课留的作业就不会,应该挺简单的,求大神们解救,还可以交个朋友,相互讨论学习下面附上题目参考讲义材料后半部分,然后用python合理的设计full adder组合以及课件后半段
提供python代写、教学、作业辅导服务:( 本人亲自代写、一对一教学、一对一作业辅导 )①作业一对一辅导;②小程序代写、并讲解!代写原则:同一份(解题)代码仅为1人,担保无雷同!代写代码带注释、含讲解!竭诚为您解决python编程疑惑!价格参考表,请访问我的Django网站顶级域名:
登录百度帐号后使用快捷导航没有帐号?
只需一步,快速开始
请完成以下验证码
请完成以下验证码
主题帖子荣誉
查看: 1176|回复: 4
& 累计签到:69 天连续签到:1 天
马上注册加入鱼C,享用更多服务吧^_^
才可以下载或查看,没有帐号?
本帖最后由 轻红 于
19:52 编辑
我的代码是这样的(在小甲鱼老师答案基础上修改着学习中):
# -*- coding: gbk -*-
temp = input('请输入一个年份:')
year = int(temp)
if year/400 == int(year/400):
& & print(str(temp) + & 是闰年!& )
else:
& & if (year/4 == int(year/4)) and (year/100 != int(year/100)):
& && &&&print(str(temp) + & 是闰年!&)
& & else:
& && &&&print(str(temp) + & 不是闰年!!&)复制代码
然后出现的问题是不管我打什么数字它都说是闰年。。。这是为什么呢 - -
& 累计签到:284 天连续签到:1 天
小甲鱼教的是Python 3, 不是Python 2
整数/整数=整数
整数/小数=小数
小数/整数=小数
小数/小数=小数
所以 year / 400 总是整数
& 累计签到:69 天连续签到:1 天
下载了3来试了一下果然如此OTZ
谢谢版主解答!
& 累计签到:22 天连续签到:1 天
看你第一行代码就知道用的是python2了
& 累计签到:291 天连续签到:1 天
看你第一行代码就知道用的是python2了
但是下面是py3的语法。。。
第一行我一般都不写的,windows平台小白飘过
小甲鱼强烈推荐
给我一节课的时间,帮你从繁琐的工作中解脱出来!
- - - - - - - - - - - -
极客Python,新课程!!
特效不会给你基本工资,但却能让你升职加薪
- - - - - - - - - - - -
有备无患,念念不忘
移动客户端下载(未启用)
微信公众号
Powered by
Copyright &
&&& All Rights Reserved.使用Python可视化数据,机器人开发编程
机器学习开发,与Mail.Ru Search数据分析负责人Egor Polusmak和Mail.Ru Group数据科学家Yury Kashnitsky一起探索如何使用Python可视化数据。
在机器学习领域中,可视化并不仅仅用来制作漂亮的报表。项目的各个阶段都大量使用可视化技术。
在开始一项新任务时,通过可视化手段探索数据往往是任务的第一步。我们通过图表汇总数据,放弃无关紧要的细节。相比直接阅读许多行原始数据,可视化能更好地帮助人类把握数据的要点。令人惊叹的是,仅仅通过可视化工具创建一些看上去再简单不过的图表,就能获得大量洞见。
接着,在分析模型表现和模型报告的结果时,我们也常常使用可视化。有时候,为了理解复杂的模型,我们需要将高维空间映射为视觉上更直观的二维或三维图形。
总而言之,可视化是一个相对快捷的从数据中获取新知的手段。因此,学习这一极为重要的技术,并将其纳入你的日常机器学习工具箱,是至关重要的。
本文将使用pandas、matplotlib和seaborn等流行的库,带你上手可视化。
单变量可视化&数量和类型分布
多变量可视化&变量间的相互作用
全数据集&一窥高维空间
下面的材料以Jupyter notebook的形式查看效果最佳。如果你克隆了本教程的代码仓库,你也可以在本地运行。
首先初始化环境:
import numpy as np
import pandas as pd
pd.options.display.max_columns = 12
# 禁用Anaconda警告
import warnings
warnings.simplefilter('ignore')
# 在Jupyter Notebook内部显示图形
%matplotlib inline
import matplotlib.pyplot as plt
# 我们将使用Seaborn库
import seaborn as sns
# SVG格式的图像更清晰
%config InlineBackend.figure_format = 'svg'
# 增加默认的绘图尺寸
from pylab import rcParams
rcParams['figure.figsize'] = 5, 4
在第一篇文章中,我们使用的是某电信运营商的客户离网率数据。这里我们仍旧使用这个数据集。
df = pd.read_csv('../../data/telecom_churn.csv')
数据集的特征:
2. 单变量可视化
单变量(univariate)分析一次只关注一个变量。当我们独立地分析一个特征时,我们通常最关心的是该特征的值的分布,而忽略数据集中的其他变量。
下面我们将考虑不同统计类型的变量,以及相应的可视化工具。
2.1 数量特征
数量特征(quantitative feature)的值为有序数值。这些值可能是离散的,例如整数,也可能是连续的,例如实数,通常用于表示技术和度量。
直方图和密度图
最简单的查看数值变量分布的方法是使用DataFrame的hist()方法绘制它的直方图(histogram)。
features = ['Total day minutes', 'Total intl calls']
df[features].hist(figsize=(12, 4));
直方图依照相等的范围将值分组为柱。直方图的形状可能包含了数据分布的线索:高斯、指数,等等。当分布基本上很有规律,但有一些异常值时,你也可以通过直方图辨认出形状的歪斜之处。当你使用预设某一特定分布类型(通常是高斯)的机器学习方法时,知道特征值的分布是非常重要的。
在以上图形中,我们看到变量Total day minutes(每日通话时长)呈正态分布(译者注:正态分布即高斯分布),而Total intl calls(总国际呼叫数)显著右倾(它右侧的尾巴更长)。
除了直方图,理解分布的另一个(经常更清楚的)方法是密度图(density plots),也叫(更正式的名称)核密度图(Kernel Density Plots)。它们可以看成是直方图平滑过的版本。相比直方图,它们的主要优势是不依赖于柱的尺寸。让我们为上面两个变量创建密度图:
df[features].plot(kind='density', subplots=True,
layout=(1, 2), sharex=False, figsize=(12, 4));
我们也可以使用seaborn的distplot()方法绘制观测数据的分布。例如,Total day minutes(每日通话时长)的分布。默认情况下,图形将同时显示直方图和核密度估计(kernel density estimation,KDE)。
sns.distplot(df['Total intl calls']);
这里直方图的柱形的高度已经归一过了,表示的是密度而不是样本数。
箱形图(box plot)是另一种有用的可视化图形。使用seaborn绘制箱形图:
_, ax = plt.subplots(figsize=(3, 4))
sns.boxplot(data=df['Total intl calls'], ax=ax);
箱形图的主要组成部分是箱子(box)(显然,这是它被称为箱形图的原因),须(whisker)和一些单独的数据点(离群值)。
箱子显示了分布的四分位距;它的长度由25%(Q1,下四分位数)和75%(Q3,上司分位数)决定。箱中的水平线表示中位数(50%)。
从箱子处延伸出来的线被称为须。它们表示数据点的总体散布,具体而言,是位于区间(Q1 - 1.5xIQR, Q3 + 1.5xIQR)的数据点,其中IQR = Q3 - Q1,也就是四分位距。
离群值是须之外的数据点,它们作为单独的数据点,沿着中轴绘制。
我们可以看到,在我们的数据中,大量的国际呼叫是相当少见的。
我们最后考虑的分布图形是提琴形图(violin plot)。
下图左侧是箱形图,右侧是提琴形图。
_, axes = plt.subplots(1, 2, sharey=True, figsize=(6, 4))
sns.boxplot(data=df['Total intl calls'], ax=axes[0]); sns.violinplot(data=df['Total intl calls'], ax=axes[1]);
箱形图和提琴形图的区别是,箱形图显示了单独样本的特定统计数据,而提琴形图聚焦于平滑后的整体分布。
describe()
图形工具之外,我们可以使用DataFrame的describe()方法来获取分布的精确数值统计:
df[features].describe()
describe()的输出基本上是自解释性的。
2.2 类别和二元特征
类别特征(categorical features take)具有固定数目的值。每个值将一个观测数据分配到相应的组,这些组称为类别(category)。类别反映了样本的某个定性属性。二元(binary)变量是一个重要的类别变量的特例,其中类别的可能值正好为2. 如果类别变量的值具有顺序,称为有序(ordinal)类别变量。
让我们查看下数据集的分类平滑:目标变量离网率的分布。首先,我们使用value_counts()得到一张频率表:
df['Churn'].value_counts()
False & &2850
True & & &483
Name: Churn, dtype: int64
默认情况下,频率由高到低排列。
在我们的例子中,数据是失衡的,也就是说,数据集中忠实客户和不忠实客户的比例并不相等。只有一小部分的客户取消了他们的电信服务订阅。我们将在以后的文章中看到,这一事实可能暗示衡量分类表现时存在一些限制,以后我们可能额外惩罚我们的模型在预测少数&离网&分类时所犯的错误。
频率表的图形化表示是条形图。创建条形图最简单的方法是使用seaborn的countplot()函数。seaborn中还有一个函数,起了一个令人困惑的名字(barplot()),barplot()绝大部分情况下用于表示以某个类别特征分组的数值变量的一些基本统计数据。
_, axes = plt.subplots(nrows=1, ncols=2, figsize=(12, 4))
sns.countplot(x='Churn', data=df, ax=axes[0]);
sns.countplot(x='Customer service calls', data=df, ax=axes[1]);
尽管条形图和上面提到的直方图看起来很像,它们是不一样的:
直方图用于查看数值变量的分布,而条形图用于类别特征。
直方图的X轴是数值;条形图的X轴可能是任何类型:数字、字符串、布尔值。
直方图的X轴是一根笛卡尔坐标轴;条形的顺序没有事先定义。不过,值得注意的是,条形经常按照高度排序,也就是值的频率。同时,当我们考虑有序变量(例如Customer service calls(客服呼叫数))时,条形通常按照变量的值排序。
左侧的图形生动地显示了目标变量的失衡性。右侧Customer service calls(客服呼叫数)的条形图暗示了大部分客户最多打了2-3个客服电话就解决了他们的问题。不过,既然我们想要预测少数分类,我们可能对少数不满意的客户的表现更感兴趣。很可能条形图的尾巴包含了大部分的离网客户。目前这只是假想,让我们来看一些更有趣、更强大的可视化技术。
3. 多变量可视化
多变量(multivariate)图形让我们得以在单张图像中查看两个以上变量的联系。和单变量图形一样,可视化的类型取决于将要分析的变量的类型。
3.1 数量&&数量
我们先来看看数量变量之间的相互作用。
让我们看下数据集中的数值变量的相关性。这一信息很重要,因为有一些机器学习算法(比如,线性回归和逻辑回归)不能很好地处理高度相关的输入变量。
首先,我们使用DataFrame的corr()方法计算出每对特征间的相关性。接着,我们将所得的相关矩阵(correlation matrix)传给seaborn的heatmap()方法,该方法根据提供的数值,渲染出一个基于色彩编码的矩阵:
# 丢弃非数值变量
numerical = list(set(df.columns) -
set(['State', 'International plan',
'Voice mail plan', 'Area code', 'Churn',
'Customer service calls']))
# 计算和绘图
corr_matrix = df[numerical].corr()
sns.heatmap(corr_matrix);
从上图我们可以看到,Total day charge(日话费总额)直接基于电话的分钟数计算得到(Total day minutes),这样的变量有4个。这4个变量称为因变量(dependent variable),可以直接去除,因为它们并不贡献任何额外信息。让我们去掉它们:
numerical = list(set(numerical) -
set(['Total day charge', 'Total eve charge',
'Total night charge', 'Total intl charge']))
散点图(scatter plot)将两个数值变量的值显示为二位空间中的笛卡尔坐标(Cartesian coordinate)。还有三维的散点图。
让我们试下matplotlib库的scatter()方法:
plt.scatter(df['Total day minutes'], df['Total night minutes']);
我们得到了两个正态分布变量的散点图,这张图没什么意思。看起来这两个变量并不相关,因为类似椭圆的形状和轴是对齐的。
seaborn库创建的散点图有一个略微奇特的选项:
sns.jointplot(x='Total day minutes', y='Total night minutes',
data=df, kind='scatter');
jointplot()函数绘制了两张直方图,某些情形下它们可能会有用。这一函数还可以让我们绘制平滑过的joint plot:
sns.jointplot('Total day minutes', 'Total night minutes',
data=df, kind="kde", color="g");
这个基本上是我们之前讨论过的核密度图的双变量版本。
散点图矩阵
在某些情形下,我们可能想要绘制如下所示的散点图矩阵(scatterplot matrix)。它的对角线包含变量的分布,而每对变量的散点图填充了矩阵的其余部分。
# 使用SVG格式可能导致pairplot变得非常慢
%config InlineBackend.figure_format = 'png'
sns.pairplot(df[numerical]);
有时候,这样的可视化可能帮我们从数据中得出一些结论。
3.2 数量&&类别
在这一小节中,让我们的图形更有趣一点。我们将尝试从数值和类别特征的相互作用中得到离网预测的新洞见。
更具体地,让我看看输入变量和目标变量离网的关系。
先前我们了解了散点图。散点图中的数据点可以通过色彩或尺寸进行编码,以便在同一张图像中包括第三个类别变量的值。我们可以通过之前的scatter()函数达成这一点,不过,这次让我们换换花样,用lmplot()函数的hue参数来指定感兴趣的类别特征:
sns.lmplot('Total day minutes', 'Total night minutes', data=df,
hue='Churn', fit_reg=False);
看起来占少数的不忠实客户偏向右上角;也就是倾向于在白天和夜间打更多电话的客户。但这不是非常明显,我们也不会基于这一图形下任何确定的结论。
现在,让我们创建箱形图,以可视化两个互斥分组中的数值变量分布的统计数据:忠实客户(Churn=False)和离网客户(Churn=True)。
# 有时我们可以将有序变量作为数值变量分析
numerical.append('Customer service calls')
fig, axes = plt.subplots(nrows=3, ncols=4, figsize=(10, 7))
for idx, feat in enumerate(numerical):
ax = axes[int(idx / 4), idx % 4]
sns.boxplot(x='Churn', y=feat, data=df, ax=ax)
ax.set_xlabel('')
ax.set_ylabel(feat)
fig.tight_layout();
从这一图表中,我们可以看到,两组之间分歧最大的分布是这三个变量:Total day minutes(日通话分钟数)、Customer service calls(客服呼叫数)、Number vmail messages(语音邮件数)。在后续的课程中,我们将学习如何使用随机森林(Random Forest)或梯度提升(Gradient Boosting)来判定特征对分类的重要性;那时我们将看到,前两个特征对于离网预测而言确实非常重要。
让我们分别看下忠实客户和不忠实客户的日通话分钟数。我们将创建箱形图和提琴形图。
_, axes = plt.subplots(1, 2, sharey=True, figsize=(10, 4))
sns.boxplot(x='Churn', y='Total day minutes',
data=df, ax=axes[0]);
sns.violinplot(x='Churn', y='Total day minutes',
data=df, ax=axes[1]);
在这一情形下,提琴形图并没有提供关于数据的额外信息,因为箱形图已经告诉了我们一切:不忠实客户倾向于打更多的电话。
一个有趣的观察:平均而言,终止他们的协议的客户是通讯服务更活跃的用户。也许他们对话费不满意,所以预防离网的一个可能措施是降低通话费率。公司需要进行额外的经济分析,以查明这样的措施是否有利。
当我们想要一次分析两个类别维度下的数量变量时,可以用seaborn库的factorplot()函数。例如,在同一图形中可视化Total day minutes(日通话分钟数)和两个类别变量的相互作用:
sns.factorplot(x='Churn', y='Total day minutes',
col='Customer service calls',
data=df[df[&#39;Customer service calls&#39;] < 8],
kind="box", col_wrap=4, size=3, aspect=.8);
从上图我们可以总结出,从4次呼叫开始,Total day minutes(日通话分钟数)可能不再是客户离网的主要因素。也许,除了我们之前猜测的话费,有些客户因为其他问题对服务不满意,或许这导致了日通话分钟数较少。
3.3 类别&&类别
正如我们之前提到的,变量Customer service calls(客服呼叫数)的唯一值极少,因此,既可以看成数值变量,也可以看成有序类别变量。我们已经通过计数图(countc plot)查看过它的分布了。现在我们感兴趣的是这一有序特征和目标变量Churn(离网)之间的关系。
让我们再一次使用计数图看下客服呼叫数的分布。这次,我们同时传入hue=Churn参数,以便在图形中加入类别维度:
sns.countplot(x=&#39;Customer service calls&#39;, hue=&#39;Churn&#39;, data=df);
观察:呼叫客服达到4次以上后,离网率显著增加了。
现在让我们看下Churn(离网)和二元特征International plan(国际套餐)、Voice mail plan(语音邮件套餐)的关系。
_, axes = plt.subplots(1, 2, sharey=True, figsize=(10, 4))
sns.countplot(x=&#39;International plan&#39;, hue=&#39;Churn&#39;,
data=df, ax=axes[0]);
sns.countplot(x=&#39;Voice mail plan&#39;, hue=&#39;Churn&#39;,
data=df, ax=axes[1]);
观察:开通国际套餐后,离网率会高很多;使用国际套餐是一个强烈的特征。我们在语音邮件套餐上没有观察到相同的效应。
除了使用图形进行类别分析之外,还可以使用统计学的传统工具:列联表(contingency table),又称为交叉制表(cross tabulation),使用表格形式表示多个类别变量的频率分布。特别地,它让我们可以通过查看一列或一行来得知某个变量在另一变量的作用下的分布。
让我们通过交叉制表看看Churn(离网)和类别变量State(州)的关系:
pd.crosstab(df[&#39;State&#39;], df[&#39;Churn&#39;]).T
State(州)的不同值很多:51. 我们看到每个周只有少量数据点&&每个州只有3到17个客户抛弃了运营商。让我们暂时忽略这一点,计算每个州的离网率,由高到低排列:
df.groupby([&#39;State&#39;])[&#39;Churn&#39;].
agg([np.mean]).
sort_values(by=&#39;mean&#39;, ascending=False).T
乍看起来,新泽西和加利福尼亚的离网率超过了25%,夏威夷和阿拉斯加的离网率则不到6%. 然而,这些结论是基于极少的样本得出的,我们的观察可能仅仅是这一特定数据集的性质。我们可以通过Matthews和Cramer相关性假说确认这一点,不过这个超出了这篇文章的范围。
4. 全数据集
4.1 幼稚方法
上面我们查看了数据集的不同刻面(facet),猜测感兴趣的特征,每次选择其中的一小部分进行可视化。我们一次仅仅处理两到三个变量,能比较容易地观察到数据的结构和关系。但是,如果我们想一下子显示所有特征呢?如何确保最终的可视化仍然是可解释的?
我们可以为整个数据集使用hist()或者pairplot()方法,同时查看所有的特征。不过,当特征数目足够多的时候,这样的可视化分析很快就变得缓慢和低效。另外,我们其实仍然可以成对地分析变量,而不用一下子分析所有变量。
大多数现实世界的数据集有很多特征,有时有上万个特征。每一个特征都可以被看成数据点空间的一维。因此,我们经常需要处理高维数据集,可视化整个高维数据集相当难。
为了从整体上查看一个数据集,我们需要在不损失很多数据信息的前提下,降低用于可视化的维度。这一任务称为降维(dimensionality reduction)。降维是一个无监督学习(unsupervised learning)问题,因为我们需要在不借助任何监督输入的前提下,从数据自身得到新的低维特征。
主成分分析(Principal Component Analysis, PCA)是一个著名的降维方法,我们会在之后的课程中讨论它。主成分分析有一个限制,它是线性(linear)算法,因而对数据有某些特定的限制。
有许多非线性方法,统称流形学习(Manifold Learning)。最著名的流形学习方法之一是t-SNE。
让我们为离网数据创建一个t-SNE表示。
这一方法的名字看起来很复杂,有些吓人:t分布随机近邻嵌入(t-distributed Stohastic Neighbor Embedding)。它的数学也很令人印象深刻(我们不会在这里深究数学,勇敢的读者可以阅读Laurens van der Maaten和Geoffrey Hinton在JMLR上发表的原论文)。它的基本思路很简单:为高维特征空间在二维平面(或三维超平面,不过基本上总是使用二维空间)上寻找一个投影,使得在原本的n维空间中相距很远的数据点在屏幕上同样相距较远。而原本相近的点在平面上仍然相近。
本质上,近邻嵌入寻找保留了样本的邻居关系的新的维度较低的数据表示。
现在让我们做些练习。首先,加载类:
from sklearn.manifold import TSNE
from sklearn.preprocessing importStandardScaler
我们去除State(州)和离网(Churn)变量,然后用pandas.Series.map()方法将二元特征的&Yes&/&No&转换成数值:
X = df.drop([&#39;Churn&#39;, &#39;State&#39;], axis=1)
X[&#39;International plan&#39;] = X[&#39;International plan&#39;].
map({&#39;Yes&#39;: 1, &#39;No&#39;: 0})
X[&#39;Voice mail plan&#39;] = X[&#39;Voice mail plan&#39;].
map({&#39;Yes&#39;: 1, &#39;No&#39;: 0})
我们同样需要归一化数据。我们从每个变量中减去均值,然后除以标准差。这些都可以使用StandardScaler来完成。
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
现在可以构建t-SNE表示了:
tsne = TSNE(random_state=17)
tsne_repr = tsne.fit_transform(X_scaled)
然后可视化它的图形:
plt.scatter(tsne_repr[:, 0], tsne_repr[:, 1]);
让我们根据离网情况给t-SNE表示加上色彩(绿色表示忠实用户,红色表示不忠实用户)。
plt.scatter(tsne_repr[:, 0], tsne_repr[:, 1],
c=df[&#39;Churn&#39;].map({False: &#39;green&#39;, True: &#39;red&#39;}));
我们可以看到,离网的客户集中在低维特征空间的一小部分区域。
为了更好地理解这一图像,我们可以使用剩下的两个二元特征给图像着色:International plan(国际套餐)和Voice mail plan(语音邮件套餐)。绿色代表相应的二元特征是正值。
_, axes = plt.subplots(1, 2, sharey=True, figsize=(12, 5))
for i, name in enumerate([&#39;International plan&#39;, &#39;Voice mail plan&#39;]):
axes[i].scatter(tsne_repr[:, 0], tsne_repr[:, 1],
c=df[name].map({&#39;Yes&#39;: &#39;green&#39;, &#39;No&#39;: &#39;red&#39;}))
axes[i].set_title(name)
现在很清楚了,许多退订的不满意客户集中在西南聚类(表示开通了国际套餐但没有开通语音邮件套餐)。
最后,让我们了解下t-SNE的缺陷:
高计算复杂度。scikit-learn的实现在真实任务中往往不太管用。如果你有大量样本,你应该转而使用Multicore-TSNE(多核)。
随机数种子的不同会导致图形大不相同,这给解释带来了困难。请参考文末相关资源给出的t-SNE教程。通常而言,你不应该基于这些图像做出任何深远的结论,因为它可能和单纯的猜测差不多。当然,t-SNE图像中的某些发现可能会启发一个想法,这个想法可以通过更全面深入的研究得到确认,但这并不经常发生。
偶尔,t-SNE可以让你从数据中得到非常好的直觉。下面的论文展示了一个这样的例子:Visualizing MNIST(可视化MNIST)。
有时t-SNE真的能够帮助你更好地理解数据,有时t-SNE能够帮助你画出圣诞树玩具 :-)
原文标题:机器学习开放课程(二):使用Python可视化数据
文章出处:【微信号:jqr_AI,微信公众号:论智】欢迎添加关注!文章转载请注明出处。
关注电子发烧友微信
有趣有料的资讯及技术干货
下载发烧友APP
打造属于您的人脉电子圈
关注发烧友课堂
锁定最新课程活动及技术直播
发布评论请先
机器人也是可以“感觉”外部世界的,而且“感觉”是机器人必不可少的能力。机器人身上携带的各种传感器就相....
iRVision 2.5D 视觉堆垛
视觉堆垛程序通过相机视野内目标比例的变化来估算目标的高度....
近日,哈佛大学的研究人员以日本古老的剪纸艺术kirigami为设计灵感,利用具有感应结构的可变形材料....
对于机器人威胁论,孔博士认为人工智能其实属于计算机的一个范畴,现有的计算机在技术上说它应该属于一个数....
此功能通过视觉计算寻找目标的2D位置和指定的寄存器数值,并引导机器人的运动补偿目标的偏移,不但包括X....
无论是科技发展的推动还是社会各界的关注,都透露了一个信息:机器人是一个具有巨大潜力并将深刻影响和改变....
机器人现如今作为玩具、陪伴者、客户助理、医疗服务人员等走进家庭、教育中心、企业以及工业工厂。网络安全....
随着如Waymo、Uber、Lyft、百度等业者,以及与这些业者合作的汽车制造伙伴纷纷表示,将会推出....
人工智能及未来科技的专家肖尔(Mat Shore)预测,机器人50年内将可发展至拥有无限耐力及等同5....
前阵子索尼机械狗Aibo圈粉无数,可好多人不得不因为它昂贵的价格忍痛割爱,求而不得,寤寐思服就不开心....
首先是“制造成本上升”,2016年制造业最热的新闻就是“别让曹德旺跑啦!”;其次就是“企业利润太低”....
“机器人密度是一个很好的比较标准,以便考虑到各国制造业自动化程度的差异。”国际机器人联合会主席Jun....
研究人员们发现,如果从一个方向施加电压,则可分离材料液滴。而当在另一个方向施加电压时,分离的液滴将会....
全球最大的工程机械制造工厂,有着传统产业智能制造先锋—起重机转台智能生产线,对于徐工集团董事长王民来....
安全咨询公司IOActive最近发起了一场测试性质的概念 攻击 ,通过 勒索软件 来对大公司进行攻击....
技术都会有一个前进的方向,我把它叫做必然,就是这个趋势像重力一样,一定会发生。比如有了芯片、电波等,....
喷涂机器人(spray painting robot), 是可进行自动喷漆或喷涂其他涂料的工业机器人....
喷涂机器人又叫喷漆机器人(spray painting robot), 是可进行自动喷漆或喷涂其他涂....
徐成茂博士 美的集团 中央研究院副院长: 美的的人机共协就是要做到“零交互”。时下,大部分智能家电只....
工作人员正在示范操作该机器人撰写诉讼文书 可根据当事人需要免费提供一系列法律诉讼服务 “您好,请问有....
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司
电信与信息服务业务经营许可证:粤B2-

我要回帖

更多关于 python数据分析课程 的文章

 

随机推荐