一周内容回顾(10.11-10.15)
day01
爬取王者荣耀皮肤图片
完整代码
import requests import json import os import time #程序开始的时间 st = time.time() url = 'http://pvp.qq.com/web201605/js/herolist.json' # 获取 json 内容 response=requests.get(url).content # 提取 Json 信息 jsonData=json.loads(response) # 打印查看 # print(jsonData) # 初始化下载数量 x = 0 hero_dir='imgs/' #目录不存在则创建 if not os.path.exists(r'王者皮肤'): os.mkdir(r'王者皮肤') for m in range(len(jsonData)): # 英雄编号 ename = jsonData[m]['ename'] # 英雄名称 cname = jsonData[m]['cname'] # 皮肤名称,一般英雄会有多个皮肤 skinName = jsonData[m]['skin_name'].split('|') # 皮肤数量 skinNumber = len(skinName) # 循环遍历处理 for bigskin in range(1,skinNumber+1): # 拼接下载图片url picUrl = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/'+str(ename)+'/'+str(ename)+'-bigskin-'+str(bigskin)+'.jpg' #获取图片内容 picture = requests.get(picUrl).content # 保存图片 with open( hero_dir + cname + "-" + skinName[bigskin-1]+'.jpg','wb') as f: f.write(picture) x=x+1 print("当前下载第"+str(x)+"张皮肤") # 获取结束时间 end = time.time() # 计算执行时间 exec_time = end-st print("找到并下载"+str(x)+"张图片,总共用时"+str(exec_time)+"秒。")
day02
-
-
数据分析的工作流程
-
数据分析三剑客简介
-
ipython模块
-
jupyter模块
-
数据分析
就是从现有的数据中挖掘出价值
数据分析应用领域
1.商品推荐 2.量化交易 3.短视频推送
1.需求分析
2.数据采集
3.数据清洗
4.数据分析
5.生成数据分析报告
6.数据可视化
数据分析三剑客
1.numpy
数学计算模块,该模块是很多计算模块的底层模块
2.pandas
数据分析最为核心的模块之一、主要用于操作excel表格
3.matplotlib
数据可视化
前提
当表格的数据低于10万行的时候采取excel软件操作方便,但是数据高于10万行之后就会出现卡顿,所以pandas模块能够解决数据量较大的情况下的处理操作
能够提供一个更加方便的终端代码编辑环境
能够提供一个jupyter分析环境 其中最为核心的就是notebook
基本功能
# upload 用于上传任意类型的文件
# new下拉框
python3用于创建notebook文件
Text File用于创建文本文件
Folder用于创建文件夹
Terminal用于模拟cmd终端
注意事项
1.notebook文件的后缀名是.ipynb 该文件无法以正常的双击直接打开
2.需要使用专门的notebook环境才可以打开并且查看内部的真实数据
# 内部集成了很多数据分析相关软件及功能 并且自动下载了接近300个数据分析相关模块
下载与安装
去官网下载安装完成之后并不会在界面上生成图标,第一次需要自己搜索打开
点击电脑左下方放大镜搜索anaconda navigator点击启动即可
cell 单元格
cut 剪切
copy 拷贝
paste 粘贴
above 在...上面
below 在...下面
replace 替换
delete 删除
undo 撤销
split 切割
merge 合并
命令行模式与编辑模式
蓝色对应的是命令行模式、绿色对应的是编辑模式
# 两种模式的切换
1.编辑模式切换到命令行模式 按esc键
2.命令行模式切换到编辑模块 鼠标左键点击即可
快捷键使用
1.运行当前单元格
ctrl+enter
2.运行当前单元格并选中下方的单元格
shift+enter
3.书写md格式的标题
方式1:命令行模式下按m键 之后按照警号个数书写几级标题执行即可
方式2:编辑模式下先写文本 之后进入命令行模式按数字来控制几级标题
4.当前单元格的下方新建一个单元格
命令行模式下按b键
5.在当前单元格的上方新建一个单元格
命令行模式下按a键
6.删除单元格
命令行模式下连续按两下d键
7.撤销删除
命令行模式下按z键
day03
-
-
numpy前戏
-
numpy数据结构
-
numpy数据类型
-
numpy是专门用于科学计算的库 并且很多计算库都使用到了numpy
下载模块
在notebook中如果需要执行pip命令下载模块
或者在命令行的开头加上一个感叹号即可
!pip3 install numpy
其他方式
在安装完anaconda之后该软件也会给我们提供一个下载模块的工具
# conda使用方式与pip一致
conda install numpy
导入模块
import numpy
import numpy as np # 起别名np使用更广泛
# 一维数组 np.array([]) # 二维数组 np.array([[],[],[]]) # 三维数组 np.array([[[],[],[]]]) """ 数据在参与计算的时候数组内的所有元素都会挨个对应参与运算 数据内元素的数据类型必须保持一致 """
特性
# numpy中同一个数组内所有数据数据类型肯定是一致的
# numpy中进行数据操作的时候同一个数组内所有的数据都挨个对应参与操作
1.布尔型 bool_
2.整型 int_ int8 int16 int32 int64
3.无符号整型 uint8 uint16 uint32 uint64
4.浮点型 float_ float16 float32 float64
5.复数型 complex_ complex64 complex128
总结
1.numpy数据类型以数字居多是因为它主要用于科学计算,只有数字可以参与计算
2.numpy数据类型后面加下划线是为了跟python数据类型关键字区分开
1.T
# 功能 数组的转置,就相当于是将行变成列,列变成行
2.dtype
数组元素的数据类型
3.size
数组元素的个数
4.ndim
数组的维数
5.shape
数组的维度大小(以元组形式)
常用方法
1.如何查看某个方法的使用说明
方式1:在方法后面跟问号执行即可
方式2:写完方法名后先按shift不松开然后按tab即可(shift+tab)
再次摁下tab显示全部说明
2.array()
将列表转换为数组,可选择显式指定dtype
3.arange()
range的numpy版,支持浮点数
4.linspace()
类似arange(),第三个参数为数组长度
总结
# 这个方法与arange有一些区别,arange是顾头不顾尾
# 这个方法是顾头又顾尾,在1到10之间生成的二十个数每个数字之间的距离相等的,前后两个数做减法肯定相等
5.zeros()
根据指定形状和dtype创建全0数组
6.ones()
根据指定形状和dtype创建全1数组
7.empty()
根据指定形状和dtype创建空数组(随机值)
8.eye()
根据指定边长和dtype创建单位矩阵
针对一维数组,索引与切片操作跟python中的列表完全一致
1.花式索引(间断索引)
2.布尔值索引(逻辑索引)
针对二维数组索引与切片
# res[行索引(切片),列索引(切片)]
如果需要获取二维数组的所有行或列元素
那么对应的行索引或列索引,需要用英文状态的冒号表示
1.数学运算符
+ 数组对应元素的加和
- 数组对应元素的差
* 数组对应元素的乘积
/ 数组对应元素的商
% 数组对应元素商的余数 // 数组对应元素商的整除数 ** 数组对应元素的幂指数
2.比较运算符
>
等价np.greater(arr1,arr2)
判断arr1的元素是否大于arr2的元素
>=
等价np.greater_equal(arr1,arr2)
判断arr1的元素是否大于等于arr2的元素
<
等价np.less(arr1,arr2)
判断arr1的元素是否小于arr2的元素
<=
等价np.less_equal(arr1,arr2)
判断arr1的元素是否小于等于arr2的元素
==
等价np.equal(arr1,arr2)
判断arr1的元素是否等于arr2的元素
!=
等价np.not_equal(arr1,arr2)
判断arr1的元素是否不等于arr2的元素
1.常用的数学函数
np.round(arr)
对各元素四舍五入
np.sqrt(arr)
计算各元素的算术平方根
np.square(arr)
计算各元素的平方值
np.exp(arr)
计算以e为底的指数
np.power(arr, α)
计算各元素的指数
np.log2(arr)
计算以2为底各元素的对数
np.log10(arr)
计算以10为底各元素的对数
np.log(arr)
计算以e为底各元素的对数
2.常用的统计函数
np.max/min(arr,axis)
按照轴的方向计算最/小值
np.mean(arr,axis)
按照轴的方向计算平均值
np.median(arr,axis )
按照轴的方向计算中位数
np.sum(arr,axis)
按照轴的方向计算和
np.std(arr,axis)
按照轴的方向计算标准差
np.var(arr,axis)
按照轴的方向计算方差
'''
注意:
axis=0时,计算数组各列的统计值
axis=1时,计算数组各行的统计值
'''
numpy中的random子模块
np.random
rand 给定形状产生随机数组(0到1之间的数)
randint 给定形状产生随机整数
choice 给定形状产生随机选择
shuffle 与random.shuffle相同
uniform 给定形状产生随机数组(随机均匀分布)
normal 随机正态分布
day04
- 练习题
- pandas模块简介
- 数据类型之Series
- 缺失数据概念
- 数据修改规则
- 布尔值索引
- 行索引/行标签
练习题
1.计算数组每一行和每一列的中位数(不使用axis参数)
import numpy as np
res = np.array([
[ 80.5, 60., 40.1, 20., 90.7],
[ 10.5, 30., 50.4, 70.3, 90.],
[ 35.2, 35., 39.8, 39., 31.],
[91.2, 83.4, 85.6, 67.8, 99.]
])
每一行均值
for i in res:
print('每一行>>>:',i)
print('中位数>>>:',np.median(i))
每一列均值
for i in range(res.shape[1]):
print('每一列>>>:',res[:,i])
print('中位数>>>:',np.median(res[:,i]))
2.jason有10000块钱,去某赌场嗨皮假设输赢概率都是50%,
并且赢一场赚100输一场亏100
jason总共玩了1500场,写程序计算1500场之后jason还剩多少钱
# 先定义一个变量存储jason的本金
money = 10000
# 利用for循环模拟1500次赌局
for i in range(1500):
# 先判断输赢
is_right = np.random.choice([1,0]) # 1表示赢 0表示输
# 判断赢则账户加100
if is_right:
money += 100
# 判断输则账户减100
else:
money -= 100
# 循环结束即1500场完成
print(money)
扩展:统计jason每一次赌完后账户总额
# 先定义一个变量存储jason的本金 money = 10000 # 再定义一个存储每次赌局之后账户金额的变量 package = [] # 先将jason初始的本金添加进来 package.append(money) # 利用for循环模拟1500次赌局 for i in range(1500): # 先判断输赢 is_right = np.random.choice([1,0]) # 1表示赢 0表示输 # 判断赢则账户加100 if is_right: money += 100 # 判断输则账户减100 else: money -= 100 # 每次循环结束之后都将结构添加到列表中 package.append(money) # 循环结束即1500场完成 # print(money) # print('记录',package)
pandas模块简介
基于numpy构建 主要用于操作excel表格类相关数据
内部集成了很多功能 并且有两大数据结构Series、DataFrame
pandas模块的出现使得python在数据分析领域成了举足轻重的存在
主要功能
1.具备诸多功能的两大数据结构
# Series、DataFrame
2.集成时间序列功能
3.提供丰富的数学运算和操作
4.灵活处理缺失数据
下载与导入
# 下载
1.python纯开发环境下
pip3 install pandas
2.anaconda环境下
conda install pandas
'''anaconda已经自动下载好了数据分析相关的模块,无需再下载'''
# 导入
import pandas
import pandas as pd
数据分析三剑客模块由于使用频率很高
所以在很多ipynb文件的开头都会提前导入
import numpy as np
import pandas as pd
基于numpy数组构建
import pandas as pd
pd.Series([1,2,3,4]) # 默认行索引就是从0开始的数字
pd.Series([1,2,3,4],index=['a','b','c','d']) # 自定义行标签
pd.Series({'name':'jason','pwd':123})
pd.Series(0,index=['a','b','c','d'])
"""
行标签1 数据1
行标签2 数据2
dtype:数据类型
"""
缺失数据的关键字是NaN 该关键字属于浮点型(float64)
isnull() # 缺失数据项展示为True
notnull() # 缺失数据项展示为False
fillna() # 填充缺失数据
dropna() # 删除缺失数据项
1.如果执行操作之后有结果说明原数据没有变
2.如果执行操作之后没有结果说明原数据改变
跟numpy中逻辑索引基本一致
先得出布尔值数据然后比对筛选出True对应的数据项
| # 或
& # 与
'''尤其是&符号链接多个条件 条件都必须加括号'''
行索引与行标签取值有时候会出现冲突的情况
.loc[] # 根据行标签取值
.iloc[] # 根据行索引取值
day05
-
-
基本算术方法
-
核心数据结构之DataFrame
-
读取外部数据
-
res = pd.Series([111,222,333,444]) # 增 res['a'] = 123 # 查 res.loc[1] # 改 res[0] = 1 # 删 del res[0]
add 加 sub 减 div 除 mul 乘
表格型数据结构,相当于一个二维数组,含有一组有序的列也可以看作是由Series组成的共用一个索引的字典 第一种: res = pd.DataFrame({'one':[1,2,3,4],'two':[4,3,2,1]}) 第二种: pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([1,2,3],index=['b','a','c'])}) 第三种: pd.DataFrame(np.array([[10,20],[30,40]]),index=['a','b'],columns=['c1','c2'])
常见属性
1.index 行索引 2.columns 列索引 3.T 转置 4.values 值索引 5.describe 快速统计
pd.read_csv() # 可以读取文本文件和.csv结尾的文件数据 pd.read_excel() # 可以读取excel表格文件数据 pd.read_sql() # 可以读取MySQL表格数据 pd.read_html() # 可以读取页面上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:指定原数据集中各字段之间的分隔符,默认为逗号”,” header:是否需要将原数据集中的第一行作为表头,默认将第一行用作字段名称 如果原始数据没有表头需要将该参数设置为None names:如果原数据集中没有字段,可以通过该参数在数据读取时给数据框添加具体的表头 usecols:指定需要读取原数据集中的哪些变量名 skiprows:数据读取时,指定需要跳过原数据集开头的行数 有一些表格开头是有几行文字说明的,读取的时候应该跳过 skipfooter:数据读取时,指定需要跳过原数据集末尾的行数 converters:用于数据类型的转换(以字典的形式指定) encoding:如果文件中含有中文,有时需要指定字符编码
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:通过字典的形式,指定某些列需要转换的形式
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数据库的具体库名
pd.read_html(r'url')
df.columns # 查看列 df.index # 查看行 df.shape # 行列 df.dtypes # 数据类型 df.head() # 取头部多条数据 df.tail() # 取尾部多条数据
df['列字段名词'] # 获取指定列对应的数据
df.rename(column={'旧列名称':'新列名称'})
# 创建新的列
df['新列名称']=df.列名称/(df.列名称1+df.列名称2)
# 自定义位置
df.insert(3,'新列名称',新数据)
# 添加行
df3 = df1.append(df2)
# 获取指定列数据
df['列名'] # 单列数据
df[['列名1','列名2',...]] # 多列数据
# 获取指定行数据
eg:res4.loc[res4['区域名称']=='川沙']
res4.loc[(res4['区域名称']=='川沙') & ([res4['总价']>300]),['','']]
数据处理
sec_car = pd.read_csv(r'sec_cars.csv') sec_car.head() sec_car.dtypes
sec_car.Boarding_time = pd.to_datetime(sec_car.Boarding_time, format = '%Y年%m月')
sec_car.New_price = sec_car.New_price.str[:-1].astype(float)

浙公网安备 33010602011771号