05丨Python科学计算
在 NumPy 中数据结构是围绕 ndarray 展开的, Pandas 中的核心数据结构是Series 和 DataFrame 这两个核心数据结构,他们分别代表着一维的序列和二维的表结构。基于这两种数据结构,Pandas 可以对数据进行导入、清洗、处理、统计和输出。
- 数据结构:Series 和 DataFrame
- Series 是个定长的字典序列,有两个基本属性:index 和 values。在 Series 结构中,index 默认是 0,1,2,……递增的整数序列,当然我们也可以自己来指定索引,比如 index=[‘a’, ‘b’, ‘c’, ‘d’]。
import pandas as pd
from pandas import Series, DataFrame
x1 = Series([1,2,3,4])
x2 = Series(data=[1,2,3,4], index=['a', 'b', 'c', 'd'])
print x1
print x2
结果:
0 1
1 2
2 3
3 4
dtype: int64
a 1
b 2
c 3
d 4
dtype: int64
- DataFrame 类型数据结构类似数据库表。
import pandas as pd
from pandas import Series, DataFrame
data = {'Chinese': [66, 95, 93, 90,80],'English': [65, 85, 92, 88, 90],'Math': [30, 98, 96, 77, 90]}
df1= DataFrame(data)
df2 = DataFrame(data, index=['ZhangFei', 'GuanYu', 'ZhaoYun', 'HuangZhong', 'DianWei'], columns=['English', 'Math', 'Chinese'])
print df1
print df2
English Math Chinese
ZhangFei 65 30 66
GuanYu 85 98 95
ZhaoYun 92 96 93
HuangZhong 88 77 90
DianWei 90 90 80
- 数据的导入和导出
Pandas 允许直接从 xlsx,csv 等文件中导入数据,也可以输出到 xlsx, csv 等文件,非常方便。
import pandas as pd
from pandas import Series, DataFrame
score = DataFrame(pd.read_excel('data.xlsx'))
score.to_excel('data1.xlsx')
print score
- 数据清洗
示例数据:
English Math Chinese
ZhangFei 65 30 66
GuanYu 85 98 95
ZhaoYun 92 96 93
HuangZhong 88 77 90
DianWei 90 90 80
- 删除 DataFrame 中的不必要的列或行
df2 = df2.drop(columns=['Chinese']) #删除列
df2 = df2.drop(index=['ZhangFei']) #删除行
- 重命名列名 columns,让列表名更容易识别
df2.rename(columns={'Chinese': 'YuWen', 'English': 'Yingyu'}, inplace = True)
- 去重复的值
df = df.drop_duplicates() #去除重复行
- 格式问题更改数据格式
这是个比较常用的操作,因为很多时候数据格式不规范,我们可以使用 astype 函数来规范数据格式,比如我们把 Chinese 字段的值改成 str 类型,或者 int64 可以这么写:
df2['Chinese'].astype('str')
df2['Chinese'].astype(np.int64)
#删除左右两边空格
df2['Chinese']=df2['Chinese'].map(str.strip)
#删除左边空格
df2['Chinese']=df2['Chinese'].map(str.lstrip)
#删除右边空格
df2['Chinese']=df2['Chinese'].map(str.rstrip)
df2['Chinese']=df2['Chinese'].str.strip('$') #删除Chinese 字段里有美元符号
#全部大写
df2.columns = df2.columns.str.upper()
#全部小写
df2.columns = df2.columns.str.lower()
#首字母大写
df2.columns = df2.columns.str.title()
- 如果我们想看下哪个地方存在空值 NaN,可以针对数据表 df 进行 df.isnull();如果我想知道哪列存在空值,可以使用 df.isnull().any()
- 使用 apply 函数对数据进行清洗
apply 函数是 Pandas 中自由度非常高的函数,使用频率也非常高。比如我们想对 name 列的数值都进行大写转化可以用:
df['name'] = df['name'].apply(str.upper)
我们也可以定义个函数,在 apply 中进行使用。比如定义 double_df 函数是将原来的数值 *2 进行返回。然后对 df1 中的“语文”列的数值进行 *2 处理,可以写成:
def double_df(x):
return 2*x
df1[u'语文'] = df1[u'语文'].apply(double_df)
我们也可以定义更复杂的函数,比如对于 DataFrame,我们新增两列,其中’new1’列是“语文”和“英语”成绩之和的 m 倍,'new2’列是“语文”和“英语”成绩之和的 n 倍,我们可以这样写:
def plus(df,n,m):
df['new1'] = (df[u'语文']+df[u'英语']) * m
df['new2'] = (df[u'语文']+df[u'英语']) * n
return df
df1 = df1.apply(plus,axis=1,args=(2,3,))
其中 axis=1 代表按照列为轴进行操作,axis=0 代表按照行为轴进行操作,args 是传递的两个参数,即 n=2, m=3,在 plus 函数中使用到了 n 和 m,从而生成新的 df。
-
数据统计
数据表合并
两个 DataFrame 数据表的合并使用的是 merge() 函数,有下面 5 种形式:
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
df2 = DataFrame({'name':['ZhangFei', 'GuanYu', 'A', 'B', 'C'], 'data2':range(5)})
结果:
name data1
0 ZhangFei 0
1 GuanYu 1
2 a 2
3 b 3
4 c 4
=================
name data2
0 ZhangFei 0
1 GuanYu 1
2 A 2
3 B 3
4 C 4
- 基于指定列进行连接
df3 = pd.merge(df1, df2, on='name')
name data1 data2
0 ZhangFei 0 0
1 GuanYu 1 1
- inner 内连接
df3 = pd.merge(df1, df2, how='inner')
结果类似交集
- left 左连接
df3 = pd.merge(df1, df2, how='left')
name data1 data2
0 ZhangFei 0 0.0
1 GuanYu 1 1.0
2 a 2 NaN
3 b 3 NaN
4 c 4 NaN
- right 右连接
类似上面
- right 右连接
- outer 外连接
类似并集
- outer 外连接
- 如何用 SQL 方式打开 Pandas
借助工具pandasql,可以在 Python 里可以直接使用 SQL 语句来操作 Pandas。pandasql 中的主要函数是 sqldf,它接收两个参数:一个 SQL 查询语句,还有一组环境变量 globals() 或 locals()。
···
import pandas as pd
from pandas import DataFrame
from pandasql import sqldf, load_meat, load_births
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
pysqldf = lambda sql: sqldf(sql, globals())
sql = "select * from df1 where name ='ZhangFei'"
print pysqldf(sql)
···
06 | 学数据分析要掌握哪些基本概念?
商业智能 BI、数据仓库 DW、数据挖掘 DM 三者之间的关系
商业智能的英文是 Business Intelligence,缩写是 BI。商业智能可以说是基于数据仓库,经过了数据挖掘后,得到了商业价值的过程。所以说数据仓库是个金矿,数据挖掘是炼金术,而商业报告则是黄金。
数据仓库的英文是 Data Warehouse,缩写是 DW。它可以说是 BI 这个房子的地基,搭建好 DW 这个地基之后,才能进行分析使用,最后产生价值。数据仓库可以说是数据库的升级概念。
数据挖掘的英文是 Data Mining,缩写是 DM。在商业智能 BI 中经常会使用到数据挖掘技术。数据挖掘的核心包括分类、聚类、预测、关联分析等任务,通过这些炼金术,我们可以从数据仓库中得到宝藏,比如商业报告。
元数据(MetaData):描述其它数据的数据,也称为“中介数据”。
数据元(Data Element):就是最小数据单元。数据挖掘的流程
1. 分类就是通过训练集得到一个分类模型,然后用这个模型可以对其他数据进行分类。
2. 聚类人以群分,物以类聚。聚类就是将数据自动聚类成几个类别,聚到一起的相似度大,不在一起的差异性大。我们往往利用聚类来做数据划分。
3. 预测顾名思义,就是通过当前和历史数据来预测未来趋势,它可以更好地帮助我们识别机遇和风险。
4. 关联分析就是发现数据中的关联规则,它被广泛应用在购物篮分析,或事务数据分析中。
输入数据--->数据预处理(特征选择、维规约、规范化、选择数据子集)--->数据挖掘-->数据后处理(模式过滤、可视化、模式表示)--->信息
数据预处理中,我们会对数据进行几个处理步骤:数据清洗,数据集成,以及数据变换。1. 数据清洗主要是为了去除重复数据,去噪声(即干扰数据)以及填充缺失值。2. 数据集成是将多个数据源中的数据存放在一个统一的数据存储中。3. 数据变换就是将数据转换成适合数据挖掘的形式。比如,通过归一化将属性数据按照比例缩放,这样就可以将数值落入一个特定的区间内,比如 0~1 之间。我会在后面的几节课给你讲解如何对数据进行预处理。
数据后处理是将模型预测的结果进一步处理后,再导出。比如在二分类问题中,一般能得到的是 0~1 之间的概率值,此时把数据以 0.5 为界限进行四舍五入就可以实现后处理。
上帝不会告诉我们规律,而是展示给我们数据
原文中使用追女生的做了形象的类比:比如你认识了两个漂亮的女孩。
商业智能会告诉你要追哪个?成功概率有多大?
数据仓库会说,我这里存储了这两个女孩的相关信息,你要吗?其中每个女孩的数据都有单独的文件夹,里面有她们各自的姓名、生日、喜好和联系方式等,这些具体的信息就是数据元,加起来叫作元数据。
数据挖掘会帮助你确定追哪个女孩,并且整理好数据仓库,这里就可以使用到各种算法,帮你做决策了。
你可能会用到分类算法。御姐、萝莉、女王,她到底属于哪个分类?
如果认识的女孩太多了,多到你已经数不过来了,比如说 5 万人!你就可以使用聚类算法了,它帮你把这些女孩分成多个群组,比如 5 个组。然后再对每个群组的特性进行了解,进行决策。这样就把 5 万人的决策,转化成了 5 个组的决策。成功实现降维,大大提升了效率。
如果你想知道这个女孩的闺蜜是谁,那么关联分析算法可以告诉你。
如果你的数据来源比较多,比如有很多朋友给你介绍女朋友,很多人都推荐了同一个,你就需要去重,这叫数据清洗;为了方便记忆,你把不同朋友推荐的女孩信息合成一个,这叫数据集成;有些数据渠道统计的体重的单位是公斤,有些是斤,你就需要将它们转换成同一个单位,这叫数据变换。最后你可以进行数据可视化了,它会直观地把你想要的结果呈现出来。