利用Python进行数据分析(学习笔记)

目录

  • 第壹章 准备工作
    • 1.1 本书内容
    • 1.2 为何利用Python进行数据分析
    • 1.3 重要的Python库
    • 1.4 安装与设置
    • 1.5 社区和会议
    • 1.6 快速浏览本书
  • 第2章 Python语言基础、IPython及Jupyter notebook
  • 2.1 Python解释器
    • 2.2 IPython基础
    • 2.3 Python语言基础
  • 第3章 内建数据结构、函数及文件
    • 3.1 数据结构和序列
    • 3.2 函数
    • 3.3 文件与操作系统
    • 3.4 本章小结
  • 第4章 NumPy基础:数组与向量化计算
    • 4.1 NumPy ndarray:多维数组对象
    • 4.2 通用函数:快速的逐元素数组函数
    • 4.3 使用数组进行面向数组编程
    • 4.4 使用数组进行文件输入和输出
    • 4.5 线性代数
    • 4.6 伪随机数生成
    • 4.7 示例:随机漫步
    • 4.8 本章小结
  • 第5章 pandas入门
    • 5.1 pandas数据结构介绍
    • 5.2 基本功能
    • 5.3 描述性统计的概述与计算
    • 5.4 本章小结
  • 第6章 数据载入、存储及文件格式
    • 6.1 文本格式数据的读写
    • 6.2 二进制格式
    • 6.3 与Web API交互
    • 6.4 与数据库交互
    • 6.5 本章小结
  • 第7章 数据清洗与准备
    • 7.1 处理缺失值
    • 7.2 数据转换
    • 7.3 字符串操作
    • 7.4 本章小结
  • 第8章 数据规整:连接、联合与重塑
    • 8.1 分层索引
    • 8.2 联合与合并数据集
    • 8.3 重塑和透视
    • 8.4 本章小结
  • 第9章 绘图与可视化
    • 9.1 简明matplotlib API入门
    • 9.2 使用pandas和seaborn绘图
    • 9.3 其他Python可视化工具
    • 9.4 本章小结
  • 第壹0章 数据聚合与分组操作
    • 10.1 GroupBy机制
    • 10.2 数据聚合
    • 10.3 应用:通用拆分-应用-联合
    • 10.4 数据透视表与交叉表
    • 10.5 本章小结
  • 第壹1章 时间序列
    • 11.1 日期和时间数据的类型及工具303
    • 11.2 时间序列基础
    • 11.3 日期范围、频率和移位
    • 11.4 时区处理
    • 11.5 时间区间和区间算术
    • 11.6 重新采样与频率转换
    • 11.7 移动窗口函数
    • 11.8 本章小结
  • 第壹2章 高阶pandas
    • 12.1 分类数据
    • 12.2 高阶GroupBy应用
    • 12.3 方法链技术
    • 12.4 本章小结
  • 第壹3章 Python建模库介绍
    • 13.1 pandas与建模代码的结合
    • 13.2 使用Patsy创建模型描述
    • 13.3 statsmodels介绍
    • 13.4 scikit-learn介绍
  • 第壹4章 数据分析示例
    • 14.1 从Bitly获取1.USA.gov数据
    • 14.2 MovieLens 1M数据集
    • 14.3 美国1880~2010年的婴儿名字
    • 14.4 美国农业部食品数据库
    • 14.5 2012年联邦选举委员会数据库
    • 14.6 本章小结
  • 附录A 高阶NumPy
  • 附录B 更多IPython系统相关内容
  • 附录C python常用算法包官方文档

第壹章 准备工作

1.1 本书内容

1.1.1 什么类型的数据

1.2 为何利用Python进行数据分析

1.2.1 Python作为胶水

1.2.2 解决“双语言”难题

1.2.3 为何不使用Python

1.3 重要的Python库

1.3.1 NumPy

1.3.2 pandas

1.3.3 matplotlib

1.3.4 IPython与Jupyter

1.3.5 SciPy

1.3.6 scikit-learn

1.3.7 statsmodels

1.4 安装与设置

1.4.1 Windows

1.4.2 Apple(OS X和macOS)

1.4.3 GNU/Linux14

1.4.4 安装及更新Python包

1.4.5 Python 2和Python 3

1.4.6 集成开发环境和文本编辑器

1.5 社区和会议

1.6 快速浏览本书

1.6.1 代码示例

1.6.2 示例数据

1.6.3导入约定

1.6.4术语

第2章 Python语言基础、IPython及Jupyter notebook

2.1 Python解释器

2.2 IPython基础

2.2.1 运行IPython命令行

2.2.2 运行 Jupyter notebook

2.2.3 Tab补全

2.2.4 内省

2.2.5 %run命令

2.2.6 执行剪贴板中的程序

2.2.7 终端快捷键

2.2.8 关于魔术命令

2.2.9 matplotlib集成

2.3 Python语言基础

Python3 基本数据类型

  • 字符串截取
str = '0123456789'
print(str[0:3:-1])    #截取第一位到第三位的字符
print(str[:])      #截取字符串的全部字符
print(str[6:])     #截取第七个字符到结尾
print(str[:-3])    #截取从头开始到倒数第三个字符之前
print(str[2])      #截取第三个字符
print(str[-1])     #截取倒数第一个字符
print(str[::-1])   #创造一个与原字符串顺序相反的字符串
print(str[-3:-1])  #截取倒数第三位与倒数第一位之前的字符
print(str[-3:])    #截取倒数第三位到结尾
print(str[:-5:-3]) #逆序截取,每个两位取值
  • python 数字逆序输出
# 方法一
numStr = input('请输入一串数字:\n')
len=numStr.__len__()
while len !=0:
        print(numStr[len-1],end='')
        len -= 1
# 方法二
numStr = input('请输入一串数字:\n')
print(numStr[::-1])

2.3.1 语言语义

2.3.2 标量类型

2.3.3 控制流

第3章 内建数据结构、函数及文件

3.1 数据结构和序列

3.1.1 元组

3.1.2 列表

3.1.3 内建序列函数

3.1.4 字典

链接:
Python中dict字典使用方法
Python字典及基本操作

3.1.5集合

3.1.6 列表、集合和字典的推导式

3.2 函数

3.2.1 命名空间、作用域和本地函数

3.2.2 返回多个值

3.2.3 函数是对象

3.2.4 匿名(Lambda)函数

3.2.5 柯里化:部分参数应用

3.2.6 生成器

3.2.7 错误和异常处理

3.3 文件与操作系统

3.3.1 字节与Unicode文件

3.4 本章小结

第4章 NumPy基础:数组与向量化计算

4.1 NumPy ndarray:多维数组对象

4.1.1 生成ndarray

4.1.2 ndarray的数据类型

4.1.3 NumPy数组算术

4.1.4 基础索引与切片

4.1.5 布尔索引

4.1.6 神奇索引

4.1.7 数组转置和换轴

4.2 通用函数:快速的逐元素数组函数

4.3 使用数组进行面向数组编程

4.3.1 将条件逻辑作为数组操作

4.3.2 数学和统计方法

4.3.3 布尔值数组的方法

4.3.4 排序

4.3.5 唯1值与其他集合逻辑

4.4 使用数组进行文件输入和输出

4.5 线性代数

4.6 伪随机数生成

4.7 示例:随机漫步

4.7.1 一次性模拟多次随机漫步

4.8 本章小结

第5章 pandas入门

5.1 pandas数据结构介绍

5.1.1 Series

5.1.2 DataFrame

  • 创建DataFrame
import pandas as pd
# 方法1:字典创建
data = {"name":['google','baidu','yahoo'],"marks":[100,200,300],"price":[1,2,3]}
f1 = pd.DataFrame(data)
# 这是定义一个 DataFrame 对象的常用方法——使用 dict 定义
f2 = pd.DataFrame(data,columns=['name','price','marks'])
# 在 DataFrame 中,columns 跟字典键相比,有一个明显不同,就是其顺序可以被规定
f3 = pd.DataFrame(data,columns=['name','marks','price'],index=['a','b','c'])
# DataFrame 数据的索引也能够自定义
data2 = {'lang':{'first':'python','second':'java'},'price':{'first':5000,'second':2000}}
f4 = pd.DataFrame(data2)
# DataFrame 的方法,除了上面的之外,还可以使用“字典套字典”的方式

# 方法2:列表创建
data3 = [[1,2,3,4],['a','b','c','d']]
f5 = pd.DataFrame(data3,columns=list('ABCD'),index=list('ab'))

# 方法3:单个元素的字典直接转DataFrame
# 3.1:键值为index
data4 = {"name":"xiaoming","age":18,"sex":"male"}
f6 = pd.DataFrame(pd.Series(data4),columns=["Value"])
f7 = pd.DataFrame.from_dict(data4,orient="index")
# 3.2:键值为column
f8 = pd.DataFrame.from_dict(data4,orient="index").T
f9 = pd.DataFrame(data4,index=[0])
  • 查看属性和常用方法
import pandas as pd
data = {"name":['google','baidu','yahoo'],"marks":[100,200,300],"price":[1,2,3]}
f1 = pd.DataFrame(data)

f1.columns    #查看列
f1.index      #查看索引
f1.dtypes     #查看每列的数据类型
f1.info()     #查看各列的数据类型
f1.shape      #查看行列的大小
f1.size       #查看总计有多少个单元格
len(f1)       #查看行数

f1.head()   #返回前几行
f1.tail()   #返回后几行
f1.rename(columns={'price':'rank'},inplace=True)   #修改列名
f1.replace({200:250})     #替换值
f1['rank'].replace({3:4}) #指定列替换
f1['rank'].value_counts() #查看指定列中元素的计数
f1.sort_values(by=['name','rank'],ascending=[False,True])  #依据指定列进行排序,默认是升序
f1.describe()             #查看描述性统计的相关信息
f1.describe(include='all')#查看描述性统计的相关信息
f1['rank'].sum()          #对指定列进行运算,max/min/mean/sum/std
  • axis(轴使用的说明)、增加删除数据列的操作
import pandas as pd
data = {"name":['google','baidu','yahoo'],"marks":[100,200,300],"price":[1,2,3]}
f1 = pd.DataFrame(data)

f1['class'] = 1        #增加列,每次只能增加1列
f1.loc[3] = ['tencent',400,2,6]  #增加index为3的一行数据

del f1['price']        #删除price列
f1.drop(labels='name',inplace=True,axis=1)  #删除name列
f1 = f1.drop(2,axis=0) #删除index=2的一行数据
  • 缺失值和文本字符串的处理
# 缺失值
data = {"name":['google','baidu','yahoo',None,'tencent'],
        "marks":[100,200,300,400,None],
        "price":[1,2,3,None,4]}
f1 = pd.DataFrame(data)

pd.isnull(f1)           #返回所有数据的检测结果
pd.isnull(f1['price'])  #返回某列数据的检测结果
f1.dropna(axis=0,how="any",thresh=None,subset=['name','price'],inplace=False)
# any:如果存在任何NA则放弃该标签
# all:如果所有的值为NA,才放弃该标签
# thresh=n,保留至少有n个非NA数据(行列依据指定的来)
# subset:在某些列的子集中选择出现缺失值的列删除,不在子集中的出现缺失值的列不删除
# inplace:筛选过缺失值的新数据是存在副本还是直接在原数据修改

f1.fillna(value=-1)     #用-1填充缺失值
len(f1.loc[(f1['price'].isnull(),'price')])  #查看某列缺失值的个数

# 文本数据(字符串)处理
f2 = pd.Series(['A','B','C','Aaba','Baca','CABA','dog','cat'])
f2.str.strip()          #去除收尾空格
f2.str.upper()          #转为大写
f2[f2.str.strip().str.endswith("a")]
f1['name'].str.split(" ")  #对指定列数据进行分割
f1['name'].str.split(" ",expand=True) #使用expand方法,把分割出来的数据单独生成一列
f1['name'].str[:3]      #使用[]对字符串进行切片提取
  • 索引设置和索引提取数据(loc / iloc)
data = {"name":['google','baidu','yahoo',None,'tencent'],
        "marks":[100,200,300,400,None],
        "num":['S1','S2','S3','S4','S5'],
        "price":[1,2,3,None,4]}
f1 = pd.DataFrame(data)
# 索引
# set_index设置多重索引
f2 = f1.set_index(keys=['name','marks','num','price'],append=False,drop=False)
# append=False(是否将原索引保存)
# drop=False(是否保留转换为索引的原数据)

# sort_index 将索引进行排序
f1.sort_index(na_position="last",inplace=True)

# 切片(slicers)对多重索引操作
f1.loc[(slice(0,2),['google'],slice(None)),:]

# 使用idx替代slicers
idx=pd.IndexSlice
f1.loc[idx[0:500,['google'],['marks','price']],idx['price']]

# reset_index 还原索引
f3 = f2.reset_index(drop=True)

# 索引提取(loc和iloc)
# .loc-显示索引,依据名字(标签)进行索引
f1.loc[0]                   #提取index名字为0的数据
f1.loc[:5]                  #提取索引名为5的行
f1.loc[{1,2,4}]             #提取索引名为1,2,4的行
f1.loc[f1['price']>2]       #筛选price>2的数据
f1.loc[:2,['name','price']] #选择前十行的指定两列数据
# .iloc-隐式索引,依据位置查找数据
f1.iloc[2:5]                #此处2:5是索引,左闭右开的原则
f1.iloc[[1,2,4]]            #提取index为1,2,4的行
f1.iloc[:2,[0,1]]           #提取前2行,指定索引为0,1的两列数据
f1.iloc[[0],f1.columns.get_loc('name')]  #使用get_loc获取索引
  • 数据的查询、修改和分组计算
data = {"name":['google','baidu','yahoo','baidu','google'],
        "marks":[100,200,300,400,None],
        "num":['S1','S2','S3','S4','S5'],
        "price":[1,2,3,None,4]}
f1 = pd.DataFrame(data)

# 数据查询(过滤)
f1[(f1['marks']>200)|(f1['price']>1)]  #条件为或
f1[(f1['marks']>200)&(f1['price']>1)]  #条件为和
f1.loc[(f1['marks']>200)&(f1['price']>1)]
f1[~(f1['marks']>200)&(f1['price']>1)] #~代表给定条件相反的数据

# 修改
f1.loc[f1['name'] == 'baidu','name']='Baidu'  #只是修改了值,并未修改数据类型
f1['name'] = f1['name'].map({'baidu':'Baidu'})

# 分组计算
f1.groupby("name").size()              #分组查看每组大小
f1.groupby("name").groups              #查询每个组下数据索引
len(f1.groupby("name"))                #查询每个小组的总数
# 统计计算
f1.groupby("name")['price'].sum()      #单个统计量
f1.groupby("name")['price'].agg([np.min,np.max,np.mean,np.std]) #多个统计量
f1.groupby("name").agg([np.min,np.max,np.mean,np.std])          #对所有列求相同统计量
f1.groupby("name").agg({'price':np.mean,'marks':[np.size,np.mean]})#不同列求不同统计量
# 标准化数据
z_score=lambda s:(s-s.mean())/s.std()  #先定义标准化函数
f1[['price','marks']].transform(z_score)  #标准化数据不同有缺失,处理之前要把缺失值填充为0
# 过滤分组数据
f1.groupby("name").filter(lambda g:len(g)>1) #过滤掉记录有1的数据
f1.groupby("name").filter(lambda g:len(g)>1)['name'].value_counts().min()  #验证过滤出来的数据是否正确
f1.groupby("name").filter(lambda g:g['marks'].mean()>100)                  #过滤指定条件的数据

  • 表连接和数据透视表
data = {"name":['google','baidu','yahoo','baidu','google'],
        "marks":[100,200,300,400,None],
        "num":['S1','S2','S3','S2','S3'],
        "price":[1,2,3,None,4]}

data2 = {"name":['google','baidu'],
        "marks":[100,500],
        "num":['S1','S2'],
        "price":[1,4]}
data3 = {"name":['google','baidu'],
         "country":['USA','China']}
f1 = pd.DataFrame(data,)
f2 = pd.DataFrame(data2)
f3 = pd.DataFrame(data3)

# 表连接
pd.concat([f1,f2])                               #数据拼接
pd.merge(f1,f3,on='name')                        #主键相同进行内连接
pd.merge(f1,f3,on=['name','name'])               #多个主键进行内连接
pd.merge(f1,f3,how='left',on=['name','name'])    #多个主键进行左连接
pd.merge(f1,f3,how='right',on=['name','name'])   #多个主键进行右连接
pd.merge(f1,f3,left_index=True,right_index=True) #两表无主键,使用index进行连接
pd.merge(left,right,left_on=['key1','key2'],right_on=['key3','key4'])  #复合主键连接
pd.merge(left,right,left_index=True,right_on=['key3','key4'])          #仅一表有主键,内连接

# 数据透视
pd.pivot_table(f1,values=['price','marks'],columns=['name'],aggfunc=[np.mean,np.max])
pd.crosstab(f1['name'],f1['num'],margins=True) #计算因子的频率,margin=True会加一个合计
  • dataFrame转array方法
#方法1
pd.read_excel(fileName).values
#方法2
np.array(pd.read_excel(fileName))

5.1.3 索引对象

5.2 基本功能

5.2.1 重建索引136

5.2.2 轴向上删除条目138

5.2.3 索引、选择与过滤140

5.2.4 整数索引144

5.2.5 算术和数据对齐145

5.2.6 函数应用和映射150

5.2.7 排序和排名152

5.2.8 含有重复标签的轴索引155

5.3 描述性统计的概述与计算

5.3.1 相关性和协方差159

5.3.2 唯1值、计数和成员属性161

5.4 本章小结

第6章 数据载入、存储及文件格式

6.1 文本格式数据的读写

6.1.1 分块读入文本文件

  • 用pandas读取xls文件
# 方法一:read_excel
import pandas as pd
path=r'D:\iMajorSkill\dataSets\defaultofcreditcardclients2.xls'
data=pd.read_excel(path)
# 方法二:read_table
dataset=pd.read_table(filePath,sep=' ',header=0)
# sep指定分隔符,header=0代表首行为表头
# 方法三:网络读取
import pandas as pd 
data_url = "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv" 
#填写url读取 
df = pd.read_csv(data_url)
  • 导出到csv文件
data.to_csv(filepath, encoding = 'utf-8', index = False)
# index=False表示导出时去掉行名称,如果数据中含有中文,一般encoding指定为‘utf-8’

6.1.2 将数据写入文本格式

6.1.3 使用分隔格式

6.1.4 JSON数据

6.1.5 XML和HTML:网络抓取

6.2 二进制格式

6.2.1 使用HDF5格式

6.2.2 读取Microsoft Excel文件

6.3 与Web API交互

6.4 与数据库交互

6.5 本章小结

第7章 数据清洗与准备

7.1 处理缺失值

连接:缺失值处理python实现
7.1.1 过滤缺失值189

7.1.2 补全缺失值191

7.2 数据转换

7.2.1 删除重复值194

7.2.2 使用函数或映射进行数据转换195

7.2.3 替代值197

7.2.4 重命名轴索引198

7.2.5 离散化和分箱199

7.2.6 检测和过滤异常值202

7.2.7 置换和随机抽样203

7.2.8 计算指标/虚拟变量204

7.3 字符串操作

7.3.1 字符串对象方法

7.3.2 正则表达式

7.3.3 pandas中的向量化字符串函数

7.4 本章小结

第8章 数据规整:连接、联合与重塑

8.1 分层索引

8.1.1重排序和层级排序

8.1.2 按层级进行汇总统计

8.1.3 使用DataFrame的列进行索引

8.2 联合与合并数据集

8.2.1 数据库风格的DataFrame连接

8.2.2 根据索引合并

8.2.3 沿轴向连接

8.2.4 联合重叠数据

8.3 重塑和透视

8.3.1 使用多层索引进行重塑

8.3.2 将“长”透视为“宽”

8.3.3 将“宽”透视为“长”

8.4 本章小结

第9章 绘图与可视化

9.1 简明matplotlib API入门

9.1.1 图片与子图

9.1.2 颜色、标记和线类型

9.1.3 刻度、标签和图例

9.1.4 注释与子图加工

9.1.5 将图片保存到文件

9.1.6 matplotlib设置

9.2 使用pandas和seaborn绘图

9.2.1 折线图

9.2.2 柱状图

9.2.3 直方图和密度图

9.2.4 散点图或点图

9.2.5 分面网格和分类数据

9.3 其他Python可视化工具

9.4 本章小结

第壹0章 数据聚合与分组操作

10.1 GroupBy机制

10.1.1 遍历各分组

10.1.2 选择一列或所有列的子集

10.1.3 使用字典和Series分组

10.1.4 使用函数分组

10.1.5 根据索引层级分组

10.2 数据聚合

10.2.1 逐列及多函数应用

10.2.2 返回不含行索引的聚合数据

10.3 应用:通用拆分-应用-联合

10.3.1 压缩分组键

10.3.2 分位数与桶分析

10.3.3 示例:使用指定分组值填充缺失值

10.3.4 示例:随机采样与排列

10.3.5 示例:分组加权平均和相关性

10.3.6 示例:逐组线性回归

10.4 数据透视表与交叉表

10.4.1 交叉表:crosstab

10.5 本章小结

第壹1章 时间序列

11.1 日期和时间数据的类型及工具303

11.1.1 字符串与datetime互相转换305

  • 日期格式
import datetime
datetime.datetime.now().isocalendar()
# (2020,13,6)返回参数分别是年,第几周,星期几

11.2 时间序列基础

11.2.1 索引、选择、子集

11.2.2 含有重复索引的时间序列

11.3 日期范围、频率和移位

11.3.1 生成日期范围

11.3.2 频率和日期偏置

11.3.3 移位(前向和后向)日期

import pandas as pd
date_list = [str(x)[:10] for x in pd.Series(pd.date_range('6/1/2020',periods=6,freq='M'))]
date_list

11.4 时区处理

11.4.1 时区的本地化和转换

11.4.2 时区感知时间戳对象的操作

11.4.3 不同时区间的操作

11.5 时间区间和区间算术

11.5.1 区间频率转换

11.5.2 季度区间频率

11.5.3 将时间戳转换为区间(以及逆转换)

11.5.4 从数组生成PeriodIndex

11.6 重新采样与频率转换

11.6.1 向下采样

11.6.2 向上采样与插值

11.6.3 使用区间进行重新采样

11.7 移动窗口函数

11.7.1 指数加权函数

11.7.2 二元移动窗口函数

11.7.3 用户自定义的移动窗口函数

11.8 本章小结

第壹2章 高阶pandas

12.1 分类数据

12.1.1 背景和目标

12.1.2 pandas中的Categorical类型

12.1.3 使用Categorical对象进行计算

12.1.4 分类方法

12.2 高阶GroupBy应用

12.2.1 分组转换和“展开”GroupBy

12.2.2 分组的时间重新采样

12.3 方法链技术

12.3.1 pipe方法

12.4 本章小结

第壹3章 Python建模库介绍

13.1 pandas与建模代码的结合

13.2 使用Patsy创建模型描述

13.2.1 Patsy公式中的数据转换

13.2.2 分类数据与Patsy

13.3 statsmodels介绍

13.3.1 评估线性模型

13.3.2 评估时间序列处理

13.4 scikit-learn介绍

13.5 继续你的教育

第壹4章 数据分析示例

14.1 从Bitly获取1.USA.gov数据

14.1.1 纯Python时区计数

14.1.2 使用pandas进行时区计数

14.2 MovieLens 1M数据集

14.2.1 测量评价分歧

14.3 美国1880~2010年的婴儿名字

14.3.1分析名字趋势

14.4 美国农业部食品数据库

14.5 2012年联邦选举委员会数据库

14.5.1 按职业和雇主的捐献统计

14.5.2 捐赠金额分桶

14.5.3 按州进行捐赠统计

14.6 本章小结

附录A 高阶NumPy

附录B 更多IPython系统相关内容

附录C python常用算法包官方文档

XGBoost官方文档

你可能感兴趣的:(笔记,python)