本篇内容关键词:python基础、数据分析、pandas、描述统计、matlibplot、seaborn、可视化分析
1.python基础
1.1python简介
都说python是门胶水语言,可以在需要的地方轻松地粘合目标需求。我觉得python的主要优点有两点:
- 只需聚焦实现逻辑:只要把逻辑捋顺,调用第三方库可以轻易实现处理逻辑。语法简洁,符合日常阅读的习惯。
- 容易获得相关的技术/理论支持:python社区庞大,只要关键词选取得当即可在网络上检索到大多数问题的解决办法。使用者众多,可以轻易找到使用者交流群组。
1.2python安装
新手可以直接安装Anaconda,这是一个开源的python发行版本,发行版的意思就是在python官方本本的基础上添加了一些额外的内容。这些额外的内容在Anaconda中指的的是:python数据科学计算相关的第三方库、conda(开源软件包和环境管理系统)等。前者集成大多数数据科学计算相关的包,大大节省了学习和使用过程中第三方库安装和配置的时间;后者使得可以在该集成的基础上管理和安装新的第三方库。
1.3python语法和使用
水平和时间有限不作总结,推荐两个相关的教程:
- 文字教程:廖雪峰Python教程。使用姿势:
1)建立python语法知识体系:”全篇“扫描一遍;
2)当作工具参考:按照关键词+ sites:www.liaoxuefeng.com。
例如:python 类 site:www.liaoxuefeng.com,即可检索到该网站内关键词相关的内容。
2.视频教程:优达学城免费课程:编程基础:Python,课程老师是一个亲和力满分的帅气印度裔小哥,内容适合完全零基础的小白同学。课程内容比较基础,但是学习的方法和练习内容都挺有意思。
2.python数据分析
2.0相关工具介绍:
- 使用的工具是anaconda集成的jupyter notebook(属于Ipython)
新建ipython notebook 文件(后缀.ipynb)
2 .主要使用pandas和matlibplot两个包
pandas是什么? pandas是一个能提供高效处理结构化数据的数据结构和函数(方法)。
pandas 有两种数据结构,DataFrame和Numpy。为什么要单独创造新的数据结构呢?python自身的数据结构不好用吗?新数据结构有什么优势呢?答案是:新的数据结构好用得飞起,
这两种结构可以进行矩阵运算,这就意味着一些数学矩阵的处理可以被快速地完成,以及快速地进行查询并赋值;
pandas提供了一系列的数据处理的函数(方法),例如从数据读取、数据预处理、数据分析和数据可视化都有相应的函数。值得注意的是,sql中的一些数据处理操作也可以轻易地实现,例如连接(join)操作,分组(groupby)等,都可以通过简洁易维护的代码实现。
2.1数据获取
- 数据读取:
1)读取数据库数据:pd.read_sql()
2)读取文本数据:pd.read_csv()
3)读取excel数据:pd.read_excel()
更多数据读取的姿势,可以结合具体需求和遇到的问题检索,绝大多数基础问题都会有现成的答案。检索相关函数用法时可以加上关键词 doc 即document的缩写,可以轻易搜到相关的文档。
# 以下时简单示例,不做过多的介绍
import pandas as pd
# 读取文件test.xlsx 中 sheet名为测试数据 的数据,数据中有列名 header 设置为真。
data = pd.read_excel('test.xlsx',sheet_name = '测试数据',header = True)
- 数据初始化:
import pandas as pd
import numpy as np
# 1.通过“列表”初始化:列表可以是:等长的numpy多维数组、等长的多维的list
dates = pd.date_range('20190728', periods=3)
df1 = pd.DataFrame(np.random.randn(3, 4), index=dates, columns=list('ABCD'))
df1
# 2.通过“列表”组成的字典初始化:等长的numpy多维数组、等长的多维的list
data = {'A':{'20190728':1,'20190729':1,'20190730':1},
'B':{'20190728':2,'20190729':2,'20190730':2},
'C':{'20190728':3,'20190729':3,'20190730':3},
'D':{'20190728':4,'20190729':4,'20190730':4}
}
# 通过 columns指定获取数据的列和顺序(显式列索引 > 数据列索引)
df2 = pd.DataFrame(data,columns = ['D','C','B'])
df2
2.2探索性分析
- 数据预览
# 查看数据属性,列名和对应数据格式
df.info()
# 查看数据本身 前10条、最后10条和随机10条
df.head(10)
df.tail(10)
df.sample(10)
- 数据切片
通过label(行/列名)、位置(数字坐标)、布尔运算
# 1.通过label(行标签) loc(行标签 :index) iloc(int类型 列标签(默认顺序,从0开始)
df1 = pd.DataFrame(np.random.randn(6,3),index=list('abcdef'),columns=['col1','col3','col88'])
# 1.1.获取index为 a 到index为c的三行数据
df1.loc['a':'c']
# 1.2获取顺序第0行和第1行的两行数据
df1.iloc[0:2]
# 1.3通过位置切片,行和列都切割
df1.iloc[0:2,0:2]
#通过布尔运算切片,筛选出col3值小于0的数据。
df1[df1.col3<0]
#通过布尔运算切片,筛选出col3值小于0的数据,只取指定列。
df1[df1.col3<0][['col3','col88']]
数据长这样:
可参考官方文档:Indexing and Selecting Data
2.3数据清洗
- 行列处理:切片、排序、合并、转换
# 切片 见2.2.2
# 排序 按照列col1降序排列
df2 = df1.sort_values(['col1'], ascending=False)
# 合并:append、join、merge
# 新构造数据df3,强行以“追加”的方式合并,忽略原始的index
df3 = pd.DataFrame(np.random.randn(6,3),index=list('fpqrst'),columns=['col1','col3','col2'])
df_data = df3.append(df2,ignore_index=True)
# 按照特定列 join,可以指定连接方式、重合列明的标识。
df4 = pd.DataFrame(np.random.randint(1,5,size = (3,3)),index=list('fpq'),columns=['col5','col1','col2'])
df5 = pd.DataFrame(np.random.randint(1,5,size = (3,3)),index=list('fpq'),columns=['col6','col1','col2'])
df_join = df4.join(df5.set_index('col1'),on='col1',how='left',lsuffix = '_L',rsuffix = '_R')
# merge 自行参考文档,笔者几乎没用过
# 行列转置
data = {"小明":{"语文":90,"数学":90,'英语':110},
"小红":{"语文":60,"数学":100,'英语':120},
"小黑":{"语文":10,"数学":100,'英语':110}}
df_fenshu = pd.DataFrame(data)
# 将索引转为新的列,方便行列转置
df_fenshu.index.name = '科目'
df_fenshu = df_fenshu.reset_index()
# 转置再转置
df_pivot_pivot_table = df_pivot_table.pivot_table(values = ['数学','英语','语文'],columns = '姓名')
df_pivot_pivot_table = df_pivot_pivot_table.reset_index()
df_pivot_pivot_table
join效果图:
转置效果图:
- 数据类型转换:
# 强制类型转换 int float category datetime64[ns] datetime64
df_pivot_pivot_table.科目.astype('category')
- 缺失值处理:定位、填充、删除
# 缺失值定位
# 返回单元格级别的缺失值信息
df_data.isnull()
# 返回列级别的 缺失值信息
df_data.isnull().any()
# 返回存在缺失值的记录
df_data[df_data.isnull().values==True]
# 缺失值填充
# 填0
df_data.fillna(0)
# 按照列区别填充
values = {'col2': 22222, 'col3': 1, 'col88': 88888}
df_data.fillna(value = values)
# 删除存在缺失值的记录,axis 为0 表示行
df_data.dropna(axis = 0)
- 赋值
# 赋值 按位置、按条件、按行/列
df_data.loc['p':'t'] = 9999
df_data.iloc[6:9,0:2] = -5555
df_data.loc['c'] = 30000
df_data.iloc[:,3] = 77777
df_data
2.4数据分析
- 简单运算:“矩阵”运算
# 可以直接进行四则运算,会自动对齐index相同的数据,indexi不同则没有结果。
df4 + df5
df4 - df5
df4 * df5
df4 / df5
- 统计分析:统计指标计算、聚合分析
df_data.describe()
df_data.col1.mean()
df_data.col1.median()
df_data.col1.max()
# 百分位数
df_data.col1.quantile(0.5)
df_data.col1.sum()
df_data.col1.var()
df_data.col1.std()
df_data.col1.skew()
# 累计求和(cum 累计系列)
df_data.col1.cumsum()
- 可视化分析:对比、分布、联系、构成
见文件:(待更新 + 统计指标补全)