- 数据分析思维
- 业务知识
- Excel
- 数据可视化
- SQL
- 统计学
- Python
第七周:Python(P86-P143)
- Python的数据科学环境(P86)
- Python基础(P87-P97)
- 数据分析常用包:Numpy和Pandas(P98-P112)
- Python连接数据库(P113-P114)
- 数据分析案例(P115-P124)
- 数据可视化:Matplotlib和Seaborn(P125-P138)
- 数据分析平台(P139-P143)
目录
第七周:Python(P86-P143)
一、Python的数据科学环境(P86)
二、Python基础(P87-P97)
(一)基础数据类型(整数、浮点数、字符串、布尔型、None)
(二)变量
(三)数据结构(列表list、元组tuple、字典dict)
(四)控制流(if、for、while)
(五)函数
三、数据分析常用包:Numpy和Pandas(P98-P112)
(一)第三方库
(二)numpy基础
(三)pandas基础
一、Python的数据科学环境(P86)
下载anaconda
Jupyter里同时按住 Shift+Tab 可以查看函数的帮助
二、Python基础(P87-P97)
(一)基础数据类型(整数、浮点数、字符串、布尔型、None)
type():告诉输入是什么数据类型,如 str 是字符串类型,bool 是布尔类型
- 当一个字符里有单引号(双引号)时,在字符外用双引号(单引号)括起
- 当一个字符里既有单引号又有双引号,在字符外用三引号括起
- 字符里有换行时,用三引号括起,输出的格式也会换行
- 转义字符 \,如 \" 输出为 " ,此时引号不再表示边界
布尔类型(注意要大写):
- True(默认为1)
- False(默认为0)
None、空值、0的区别:
- None表示值是缺失的,而不是为0,故不能进行加减乘除运算
- ' '表示值为空,但不缺失
(二)变量
要多次使用某一个值(可以是字符串,可以是数据)时,可以使用变量
可以同时给多个变量赋值
a,b = 1,2
(三)数据结构(列表list、元组tuple、字典dict)
1. 列表list:一串有序的集合,数据量大时查找速度慢 [ ]
- sum():把列表中的值求和
- len():列表中有多少个元素
- 索引:从左往右是从0开始的,从右往左是从-1开始的
- 切片
- 增加:.insert(插入的索引位置,插入的值) 或 .append(插入的值):直接在列表最后插入值,不需要返回一个新的值,是在原列表上插入 或 [ ] + [ ]:如果想在列表后面插入多个值,直接加上一个新列表,需要返回一个新的值
- 删除:.pop(索引),返回被删索引位置的值,若没有给索引值,默认删除最后一个
- 更改
二维列表:[[ ], [ ]]
进阶用法:
- 两个 list 直接 + ,是不会去除重复元素的
- set(a) 会将列表 a 集合化,即去掉其中的重复元素
- 集合化后的交集&、并集|、差集-、判断是否为子集<
生成一个1-100的列表:
# 写法1
list = []
for i in range(1,101):
list.append(i)
# 写法2
list = [i for i in range(1,101)]
生成1-100之间偶数的列表:
# 写法1
list = []
for i in range(1,101):
if i%2 == 0:
list.append(i)
# 写法2
list = [i for i in range(1,101) if i%2 == 0]
2. 元组tuple:( )
- 不能被修改
- 索引也是 a[0] 的方式
3. 字典dict:无序,键key 值value 对,索引时是拿键来索引(根据唯一的哈希值来查找)。数据量大时查找速度不变 { }
进阶用法:
- 提取字典a里的所有key:list(a.keys())
- 提取字典a里的所有value:list(a.values())
- 同时提取字典a里所有的键值对:list(a.items()),输出的值是由一个个元组组成的列表
- a.get():更好的容错机制,如 a.get('name', None),若字典里查到了name,则返回其值;若没有,则返回None(也可以是其他默认值)
- a.setdefault('sex', 'female'):查找有无sex,若没有,新增sex,且值为female
- set(a) 会将字典 a 集合化,元素为字典的 key
- 集合化后的交集&、并集|、差集-、判断是否为子集<
(四)控制流(if、for、while)
1. if:if - elif - else,有一个为True就会直接跳出
2. 循环:一类while,一类for
- break(直接终止循环)、continue(跳出本次循环)
- for i in range(start, stop, step) 从 start 开始,到 stop 前为止(不包含stop),step为步长
(五)函数
- 函数的复用/封装/调用
- 参数,如下图中的 method 即为参数
参数可以给默认值,若调用函数时未给参数值,则使用默认值
def arith(x,y,method='plus'): if method == 'plus': return x+y elif method == 'minus': return x-y elif method == 'time': return x*y elif method == 'divide': return x/y else: print('error method!') arith(1,2) # 未给method值,默认为plus,故结果为3
def desc(list):
size = len(list)
avg = sum(list)/size
# 计算中位数
list.sort() # 排序
if size%2 == 0: # 偶数个
mid = (list[size//2-1]+list[size//2])/2
else: # 奇数个
mid = list[(size-1)//2]
print('max is:',max(list))
print('min is:',min(list))
print('avg is:',avg)
print('mid is:',mid)
desc([1,2,3,4,5,1])
desc([i for i in range(1,100,4)])
map()函数:全匹配,把某种特性或功能赋予所有的值
# 使用内置函数,如str
list(map(str,[1,2,3,4,5])) # ['1', '2', '3', '4', '5']
匿名函数(免去定义函数的复杂,更简洁):lambda 输入:输出
# 匿名函数
list(map(lambda x:x*x, [1,2,3,4,5])) # [1, 4, 9, 16, 25]
三、数据分析常用包:Numpy和Pandas(P98-P112)
(一)第三方库
统计列表里每个元素出现的次数
- 转化成字典,key是元素,value是出现次数
a = [1,2,3,4,1,2,3.1]
d = {}
for i in a:
if i in d.keys():
d[i] = d[i]+1
else:
d[i] = 1
d
- 借助第三方库
按 Tab 可以自动补全
import collections
a = [1,2,3,4,1,2,3.1]
collections.Counter(a)
读取csv:import csv
时间运算:import datetime
数学运算:import math,如开根号是math.sqrt()
数据分析:pandas和numpy
装饰器
迭代器
(二)numpy基础
导入:import numpy as np
转化成数组:np.array(list)
- type() 后显示其数据类型为 numpy.ndarray
- 索引、切片、更改值与 list 一样
- 加减乘除都是针对数组中的每个元素按位计算
(三)pandas基础
导入:import pandas as pd
pandas里主要有两个数据结构:
- Series(一维)
- DataFrame(二维)
Series 和 DataFrame 里面的数据类型是统一的,要么全是数值(int64),要么全是对象(object,即字符串)
故在全是数值的 Series 里添加上一个对象,所有的数据类型都会更改为 object(即字符串)
1. Series
(1)list 转 Series
(2)dict 转 Series
2. DataFrame
(1)dict 转 DataFrame
(2)list 转 DataFrame
(3)基本操作
- 查看基本信息:
d = {
'name':['qinlu','lulu','qinqin'],
'sex':['male','male','female'],
'age':[18,18,20]
}
df = pd.DataFrame(d)
df.info()
- 切片(按列):
# 单一切片(只取某一列)时,数据类型会从DataFrame变为Series
df['age']
# 写法2:df.age
# 同时切多列
df[['age','name']]
- 切片(按行):
# 按行切片
df.iloc[0]
# 写法2:df.loc[0]
df.iloc[0:2] # 等同于df[0:2]
- 切片(行列同时):
df[['age','name']][0:2]
- 更改行索引:
df.index = list('abc')
- 筛选出某个特定值的数据:索引时有True和False,只会返回为True的数据
筛选出age为18的数据:
或写法2:
df.query('age==18')
- 对 True 和 False 结果进行反转:
筛选出 age≤18 的数据:
- 多条件查找:与&、或|
找出 age为18且为 male的数据:
# 写法1
df[(df.age==18)&(df.sex=='male')]
# 写法2
df.query('(age==18)&(sex=="male")')
- iloc:根据所在行的数字位置为索引(不管有没有行标签)
df.iloc[1]
可以同时对行、列切片:
df.iloc[1:2,1] # 行列都是从0开始,1:2是左闭右开
- loc:根据行标签
df.loc['a']
可以同时对行、列切片:
df.loc['a',['age','name']]
把年龄为18岁的都改为19岁: