10/15
今日考题
1.编写可以产生任意指定位数随机验证码的程序(先写思路再写代码)
import random # 导入随机数模块
def ran_cod(figure):
'''
函数用来做随机验证码
参数控制位数
'''
code = '' # 定义空验证码方便之后加随机字符进来
for i in range(figure): # 循环取值 按照要求位数循环
num = str(random.randint(0, 9)) # 取数字转字符串类型方便之后加入
lower = chr(random.randint(65, 90)) # 通过chr实现数字转ASCII码对应的小写英文字母
upper = chr(random.randint(97, 122)) # 通过chr实现数字转ASCII码对应的大写英文字母
cod_part = random.choice([num, lower, upper]) # 在这三个里面再随机选择其中一个
code += cod_part # 随机结果加入code中
return code # 注意缩进循环走完 返出结果
print(ran_cod(int(input('请输入所需验证码位数仅支持数字>>>>')))) # 根据要求调用函数打印
2.聊聊pandas模块
pandas基于numpy
pandas让python变成了数据分析最强语言
pandas针对大规模的表格文件操作有非常大的优势
3.什么是Series,有哪些操作方法
Series可以看成是一个可以自己制作标签来索引的一维数组
# 创建
pd.Series([1,2,3],index=['a','b','c'])
pd.Series({"a":1,"b":2})
# 数据缺失
当原索引被替换之后新加出来的索引没有对应的值会出现NaN
NaNcy这个数据是个浮点型
针对缺失数据可以通过
修改之后的Series.dropna() # 去掉
修改之后的Series.fillna() # 填入指定值
# 布尔值索引
通过另一个Series对应的布尔值取出True的部分
# 索引
s.iloc[] # 根据默认的位置取
s.loc[] # 根据自己定义的那个取
复习巩固
- 课堂小练习
写代码一定要有一个足够严谨且完整的思路
即使写不出来也要想清楚流程该怎么走
# 所以注释必不可少
自己回忆一下在网上找想要的代码的时候
没有注释看起来是多难受
- pandas模块简介
基于numpy构建 主要用于操作excel表格相关数据
内部集成了很多功能 并且有两大数据结构Series和DataFrame
- 数据类型Series
基于numpy数组构建
import pandas as pd
pd.Series([1,2]) # 默认行索引就是0开始的数字
pd.Series([1,2],index['a','b'])
...
"""
行标签1 数据1
行标签2 数据2
dtype:数据类型
"""
- 缺失数据及处理方式
缺失数据关键字是NaN
该关键字属于浮点型
isnull() # 缺失数据展示为True
notnull() # 缺失数据项展示为False
fillna() # 填充缺失数据(非常重要好用)
dropna() # 删除缺失数据项
- 布尔值索引
和numpy中逻辑索引基本一致
先得出布尔值数据然后比对筛选出True对应的数据
| # 或
& # 与
'''符号链接多个条件 条件必须加括号'''
- 规范化索引取值
行索引和标签取值有时候会出现冲突的情况
可以通过关键字限定取值
.loc[] # 根据行标签取值
.iloc[] # 根据索引取值
- 补充知识点
数据什么时候是被修改了 什么时候仅仅是产生了新数据
# 如果执行操作后没有展示结果说明修改了 有结果则没有修改原数据
'''从逻辑上也很好说通:
展示是因为没修改原数据所以不展示给你看一下就没机会看了'''
内容概要
pandas收尾
- Series数据操作
- 基本算术方法
- 核心数据结构DataFrame
- 读取外部数据
- DataFrame相关操作
详细讲解
Series数据操作
s = pd.Series([1,2,3])
# 增
s['a'] = 4
通过指定没有的行标签直接能够添加对应的元素
# 删
del s[0]
这还不理解嘛 删除元素
# 改
s[1] = 1
有的索引则修改对应的值
# 查
s.loc[1]
查不多说了 就和前面说的一样
算数运算符
"""
add 加(add)
sub 减(substract)
div 除(divide)
mul 乘(multiple)
"""
s1 = pd.Series([1,2,3], index=['c','a','d'])
s2 = pd.Series([3,2,1,2], index=['d','c','a','b'])
s1.mul(s2,fill_value=0)
DataFrame创建方法
# DataFrame是表格型数据结构 相当于一个二位数组且含有一组有序的列
# 也可以看作是由Series组成的共用一个索引的字典
第一种:
df1 = pd.DataFrame({'one':[1,2,3,4],'two':[4,3,2,1]})
第二种:
df2= pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([1,2,3],index=['b','a','c'])})
第三种:
df3 = pd.DataFrame(np.array([[10,20],[30,40]]),index=['a','b'],columns=['c1','c2'])
更多
df4 = pd.DataFrame([np.arange(1,8),np.arange(11,18)])
s1 = pd.Series(np.arange(1,9,2))
s2 = pd.Series(np.arange(2,10,2))
s3 = pd.Series(np.arange(5,7),index=[1,2])
df5 = pd.DataFrame({'c1':s1,'c2':s2,'c3':s3})
'''
创建DataFrame仅需要了解即可
因为工作或者是实际应用中肯定是要通过外部获取DataFrame形式的数据的
DataFrame真正的强大后面的取用和过渡才是重点
'''
DataFrame常见属性
1.index 行索引
2.columns 列索引
3.T 转置
4.values 值索引
5.describe 快速统计
DF数据类型补充
在DF中所有的字符类型数据在查看数据类型的时候叫object
只是叫法不同实际 就是str
外部数据读取方法一览
pd.read_csv() # 读取文本文件和.csv(苹果的表格文件)文件数据
pd.read_excel() # 读excel表格文件数据
pd.read_sql() # 读MySQL表格数据
pd.read_html() # 读页面上table标签内所有的数据 不是table标签读不了
'''这部分是重点中的重点每个读取方式都有多个参数一定要熟练掌握'''
读文本文件
pd.read_csv(filepath_or_buffer, sep=',', header='infer', names=None, usecols=None, skiprows=None, skipfooter=None, converters=None, encoding=None)
filepath_or_buffer:指定txt文件或csv文件所在的具体路径
sep:指定原数据集中各字段之间的分隔符,默认为逗号”,”
id name age
1 leo 18
header:是否需要将原数据集中的第一行作为表头,默认将第一行用作字段名称
如果原始数据没有表头需要将该参数设置为None 然后会给你一个数字做参数
names:如果原数据没有表头字段,可以通过该参数在数据读取时给数据框添加具体的表头 肯定要配合header = None使用
usecols:指定需要读取原数据集中的哪些变量名
skiprows:数据读取时,指定需要跳过原数据集开头的行数
有一些表格开头是有几行文字说明的,读取的时候应该跳过
skipfooter:数据读取时,指定需要跳过原数据集末尾的行数
converters:用于数据类型的转换(以字典的形式指定)
比如有些数字作为编号不希望开头的0被去掉就要指定一下类型为str
encoding:如果文件中含有中文,有时需要指定字符编码
复杂小案例
import pandas as pd
data01 = pd.read_csv(r'data_test01.txt',
skiprows = 2, # python能自动过滤掉完全无内容的空行(写2、3都行)
sep = ',', # 默认就是逗号 写不写都行
skipfooter = 3,
)
# 1.针对id原本是01、02自动变成了1、2...
converters = {'id':str}
# 2.点击文件另存修改文件编码之后再次读取出现乱码
encoding='utf-8'
# 3.移除收入千分位非逗号的其他符号
thousands = '&'
# 4.手动将文件表头行删除再次读取
header = None # 默认用索引
names = ['id','year','month','day','gender','occupation','income']
# 5.指定读取的字段
usecols = ['id','income']
"""
回顾一下方法帮助
方式1
方法名?
方式2
光标停留在方法名左括号后面
先按住shift键不松开,再按tab键(没反应就多按几次)
"""
读excel
# 由于文本格式是最不规范的所以读取起来其实是最麻烦的 后面会越学越简单
pd.read_excel(io, sheetname=0, header=0, skiprows=None, skip_footer=0, index_col=None, names=None,
na_values=None, thousands=None, convert_float=True)
io:指定电子表格的具体路径,直接写文件路径就行
sheet—name:指定需要读取电子表格中的第几个Sheet,既可以传数字也可以直接指定Sheet名称
header:是否需要将数据集的第一行用作表头,默认为是需要的
skiprows:读取数据时,指定跳过的开始行数
skip_footer:读取数据时,指定跳过的末尾行数
index_col:指定哪些列用作数据框的行索引(标签)
na_values:指定原始数据中哪些特殊值代表了缺失值
thousands:指定原始数据集中的千分位符
convert_float:默认将所有的数值型字段转换为浮点型字段
converters:通过字典的形式,指定某些列需要转换的形式
pd.read_excel(r'data_test02.xlsx',
header = None,
names = ['ID','Product','Color','Size'],
converters = {'ID':str}
)
自己的爬的链家数据打开
读SQL数据库
# 在anaconda环境下直接安装
# pymysql模块
import pymysql
conn = pymysql.connect(host,port,user,password, database, charset)
host:指定需要访问的MySQL服务器
port:指定访问MySQL数据库的端口号 charset:指定读取MySQL数据库的字符集,如果数据库表中含有中文,一般可以尝试将该参数设置为 “utf8”或“gbk”
user:指定访问MySQL数据库的用户名
password:指定访问MySQL数据库的密码
database:指定访问MySQL数据库的具体库名
'''可以看到读取SQL数据的时候已经没有什么额外参数了
因为SQL数据库里本来数据格式就很规范了 不需要额外操作了'''
# 利用pymysql创建好链接MySQL的链接之后即可通过该链接操作MySQL
pd.read_sql('select * from user', con = conn)
conn.close() # 关闭链接 不然就无端给服务器压力
读取网页table
pd.read_html(r'https://baike.baidu.com/item/%E7%BE%8E%E5%9B%BD%E8%81%8C%E4%B8%9A%E6%A3%92%E7%90%83%E5%A4%A7%E8%81%94%E7%9B%9F/2770327?fr=aladdin')[0]
# 前面找到网页 然后后面索引取值拿第一个表格数据
# 内部就是一个爬虫程序把表格爬下来了
数据概览
'''就用刚才的爬的网址为例 内容比较多方便看到结果'''
mlb.columns # 查看列
mlb.index # 查看行
mlb.shape # 行列
mlb.dtypes # 数据类型
mlb.head() # 取头部多条数据
mlb.tail() # 取尾部多条数据
行列操作
mlb['列字段名词'] # 获取指定列对应的数据
mlb.rename(column={'旧列名称':'新列名称'}) # 重命名 字段名数字类型不加引号
mlb['新列名称']=mlb.列名称/(df.列名称1+df.列名称2) # 创建新的列
mlb.insert(1,'新列名称',新数据) # 自定义位置插入数据
mlb = mlb.append(另一张能对应的表) # 添加行
数据筛选
# 获取指定列数据
df['列名'] # 单列数据
df[['列名1','列名2',...]] # 多列数据
'''df指代任意dataframe'''
'''
这里涉及到数据处理的一个问题
面积需要调整为数字类型得把中文扣掉 方便计算
nd['面积'] = nd['面积'].str[0:-2].astype(float)
'''
# 获取指定行数据 经过上面处理就能进行数字类的操作了
nd.loc[nd['地区'] == '大宁']
nd.loc[(nd['地区'] == '大宁') & (nd['面积'] > 100)]
# 最后一个列表作为参数 里面是想要拿的字段
nd.loc[(nd['地区'] == '大宁') & (nd['面积'] > 100),['小区','地段','房型','面积']]
数据处理
比较复杂的就是上面的 字符串切片操作加上类型转换
nd['面积'] = nd['面积'].str[0:-2].astype(float)
赋值符号左边先规定要更改的是哪一个字段里面的数据
然后选中这个字段的所有数据进行字符串的切片取值
切片取值操作的时候需要加上str告诉dataframe这是个字符串方法
然后加上astype()修改成想要的数据类型
# 下面还有个时间类型的转换
res['Boarding_time'] = pd.to_datetime(res['Boarding_time'], format = '%Y年%m月')
之后指定时间格式 没有的指定日就默认为1