创建Series
构造函数
pandas.Series(data,index,dtype,copy)
data 数据采取各种形式 ndarray,list,contants
index np.arrange(n)【索引值必须是唯一的和散列的,与数据的长度相同】
dtype 用于数据类型
copy 复制数据 默认为false
创建一个空系列
import pandas as pd
s = ps.Series()
print(s)
从ndarray创建一个系列
ndarray是通过numpy中的np.array()函数创建。ndarray ( N-dimensional array object为N维数
组(简称数组)对象,存储单一数据类型的N维数组ndarray的方便之处,它能够去掉循环的骤,效率高,且容易理解。如果数据是ndarray,则传递的索引必须具有相同的长度。如果没有传递索引值,那么默认的索引将是范围(n)其中n是数组长度。
import pandas as pd
import numpy as np
data = np.array(['a', 'b', 'c', 'd'])
s = pd.Serise(data)
print(s)
从字典创建一个系列
字典(dict)可以作为输入传递,如果没有指定索引,则按排序顺序取得字典键
以构造索引。如果传递了索引,索引中与标签对应的数据中的值将被拉出。
import pandas as pd
import numpy as np
data = {'a':0,'b':1,'c':2}
s = pd.Series(data)
print(s)
从标量创建一个系列
import pandas as pd
import numpy as np
s = pd.Series(5, index=[0,1,2,3])
print(s)
创建DataFrame
DataFrame的创建方法
数据帧( Dataframe )是一个矩阵样式的数据表,包含已排序的列集合,每一列可以是不同的值类型(数值、字符串、布尔值等)
数据帧既有行索引也有列索引,它被视为一个共享相同索
引的Series字典。
生成和添加数据的方法
1.把其他格式的数据整理到DataFrame
2.在已有的DataFrame中插入N列或者N行
使用包含列表的字典创建数据帧
import pandas as pd
data = {'水果':['苹果','梨','草莓']
,'数量':[3,2,5],
'价格':[10,9,8]}
df = pd.DataFrame(data)
print(df)
#按照我们想要的顺序生成数据帧
data = {'platform':['qq','weixin','weibo','taobao'],'year':[2000,2010,2005,2004],'percent':[0.71,0.89,0.63,0.82]}
columns = ['year','platform','percent']
df = pd.DataFrame(data,columns=columns)
#按照给定列顺序进行排序生成数据帧
如果给定的行或者列不存在,那么 内部数据会使用NaN替代
data = {'platform':['qq','weixin','weibo','taobao'],
'year':[2000,2010,2005,2004],
'percent':[0.71,0.89,0.63,0.82]}
columns = ['year','platform','percent','count']
index = ['a','b','c','d']
df = pd.DataFrame(data,columns=columns,index=index)
print(df['year'])#使用列名获取到数据帧中该列的所有数据,返回一个Series序列
print(df.platform)#列名访问序列
print(df.loc['a'])获取index为‘a’的行
用嵌套字典创建
#外层字典的键作为列索引,内层字典的键作为行索引
import pandas as pd
data = {'数量':{'苹果':3,'梨':2,'草莓':5},
'价格':{'苹果':'10','梨':9,'草莓':8}}
df = pd.DataFrame(data)
print(df)
使用包含Series的字典创建
import pandas as pd
data = {'水果':pd.Series(['苹果','梨','草莓']),
'数量':pd.Series([3,2,5]),
'价格':pd.Series([10,9,8])}
df = pd.DataFrame(data)
print(df)
csv文件构建DataFrame
实验的时候数据般比较大,而CSV 文件是文本格式的数据,占用更少的存储,
所以一般数据来源是csV文件,从Csv文件中如何构建DataFrame呢? txt 文件
一般也能用这种方法。
最常用的应该就是pd.read csv('filename.csv') 了,用sep指定数据的分割
方式,默认的是,
df = pd.read_csv('./xxx.csv')
如果csv中没有表头,就要加入head参数
增加N列或者N行
加入我们已经有了一个DataFrame 如下所示
test_dict = {'id':[1,2,3,4,5,6],
'name':['Alice','Bob','Cindy','Eric','Helen','Grace'],
'math':[90,89,99,78,97,93],
'english':[89,94,80,94,94,90]
}
test_dict_df = pd.DataFrame(test_dict)
此时我们又有一门新的课physics,
需要为每个人添加这门课的分数,按照
Index的顺序,我们可以使用insert方法,如下:
new_columns = [92,94,89,77,87,91]
test_dict_df.insert(2,'pyhsics',new_columns,allow_duplicates=True)
test_dict_df
此时,就得到了添加好的DataFrame需要注意的是DataFrame默认不允许添加重复的列,但是在insert函数中有参数allow duplicates=True, 设 置为True后,就可以添加重复的列了,列名也是重复的
此时我们又来了一位新的同学Iric,需要在DataFrame中添加这个同学的信息
我们可以使用loc方法:
new_line = [7,'Iric' ,99]
test_dict_df.loc[6]= new_line
test_dict_df
DataFrame索引与切片
理解索引
简单的说Series是维的ndarray,也可以说它是某种特定环境下的列
表。默认情况下index是0,1,2... 可以在创建的时候自已设定index的值。
Series中存放的数据只能是一维。
DataFrame在Series基础上扩充到二维,三个关键参数:
columns
index
values
索引
因为DataFrame的结构原因,所以就会分为行索引和列索引。在DataFrame中
columns是主要索引对象,在和Series运算中就可以体现出来。
列索引
列索引比较简单,索引下标就是columns :
df.语文
或者
df['语文']
行索引
行索引使用.loc或者iloc
df.loc['小红']
或者
df.iloc[0]
切片
切片就是截取出相应行列的部分。DataFrame 没有列切片。强行用列索引
的方式来切片会报错。
df.loc['小红']:['王二']
dfl.ioc[0:3]
只取一列,可以不用.loc例
如df['A']或者df.loc[:,'A']
取指定的某几列,可以不用.loc例如
df['A'C']]或者df.loc[:,['A'C']]
取指定的某几列,可以不用.loc例如
df['A'C']]或者df.loc[:,['A'C']]
取行的同时,
也取列。必须用.loc
或.iloc
数据排序方法
按实际值 按标签排序
import pandas as pd
import numpy as np
unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],columns=['col2','col1'])
print(unsorted_df)
按值排序
pd.sort_values("col2",inplace=True)
#表示pd按照col2字段排序
inplace 默认为false 原来顺序没变 只是返回排序的
ascending :默认为True 按照升序排序 为False 按照降序排序
按标签排序
使用sort_index()方法,通过传递axis参数和排序顺序,可以对DataFrame排序。默认情况下
import pandas as pd
import numpy as np
unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],columns=['col2','col1'])
sorted_df = unsorted_df.sort_index()
print(unsorted_df)
print(sorted_df)
#降序
import pandas as pd
import numpy as np
unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],columns=['col2','col1'])
sorted_df = unsorted_df.sort_index(ascending=False)
print(unsorted_df)
print(sorted_df)
axis=1 列 0行
sort_values(by='col1')
排序算法
kind = heapsort(堆排序)
kind = quicksort(快速排序)
Panadas文件读取
●文本文件是由若干行字符构成的计算机文件,它是一种典型的顺序文件。常见的
文本文件有txt文件和CSV文件。
txt文件是操作系统附带的一种文本格式,是最常见的一种文件格式,用记事本
可以直接打开。
CSV文件为字符分隔文件(默认分隔符为逗号),文件以纯文本形式存储表格数
据,内容通常为数字和文本。
●Pandans中使用read_table函数和read_csv 函数读取文本文件。
参数 | 说明 |
filepath | 代表文本文件的路径 |
sep | 用于对文件进行拆分的字符。read_csv函数默认读取以,分割的文件到DataFrame read_table函数默认读取制表符 |
header | 指定行数作列名文件没有列名 默认为0 否则设置none header=0 第一行数据作为列名 DataFrame 数据行从第二行开始 |
names | 用于结果的列名列表 如果数据文件中没有列标题行 header=none |
nrows | 需要读取的行数 默认为none |
engine | 使用的分析引擎 C pYTHON |
encoding | 指定字符集 默认为None 常用字符集为utf-8 文本为中文 encoding='gbk' |
读取Excel文件
参数 | 说明 |
io | excel文件路径 |
sheetname | excel表内数据的分表位置 默认0 |
header | 指定作为列名的行,默认为0,即取一行 |
names | 用于结果的列名列表 |
index_col | 指定列为索引列 默认为None |
Pandas文件写入、
结构化数据可以通过pandas中的tocsV函数实现以txt文件或CsV文件格式存储
文件。
pandas提供了to_ excel 函数来写入Excel文件
excel writer :存储excel文件路径。
sheet name :指定存储Excel sheet的名称,默认为sheet1
数据库操作
链接mysql数据库
SQLAlchemy 是PythonSQL 工具包和对象关系映射器
PyMysql是Python中操作mysql的模块
使用SQLAlchemy 作外层 PyMySQL作为驱动 可以实现数据库操作
链接格式
从数据库读取数据
sql or table_name 接受String 表示读取的数据的表名 或者 sql语句
con 接收数据库连接 表示数据库连接信息
index_float 接收int,表示设定的列作为行名
coerce_float 接收boolean 将数据库中的decimal类型的数据转换为pandas中的float64类型的数据
columns 接收list 表示读取数据的列名。
存储数据到数据库
数据清洗
数据质量
数据的实际状态与期望状态的比较
高质量
正确反映真实世界
达到了其在运营决策和规划中的期望状态
期望状态
通常由个人或团体、标准组织、法律法规、业务
要求或软件开发要求定义。
数据质量问题来源
采集标准缺失,或标准执行不到位
源数据有问题但没有发现
软件、硬件、网络问题
处理手法有误
元数据管理水平低下
届洞百出的数据模型
数据没有打通
数据质量管理的必要性
GIGO原则:
“把劣质的数据丢入到最好的模型中去分析处理,就像是把已经腐烂了的桃子,
用最好的卡车,走最快的路线,运输到市场,但是桃子仍然是腐烂的。
错误数据会给企业带来金钱的损失;使员工的效率下降;损伤企业的名誉。
企业的每一个商业决策、客户关系和商业投资都是建立在数据分析的基础上,数
据质量问题开始成为影响数据分析和利用效能的“最后一公里”问题,是困扰许多大
数据公司和企业在拓展其大数据战略不可回避的问题。
缺失值处理
删除法
参数说明
axis 接收0或1 0 行 1 列
how 接收特定String 表示删除的形式 any 只要有缺失值就删除
subset 接收array数据 表示进行去重的列行 默认为None 表示所有列 行
inplace 接收boolean 表示是否在原表上进行操作
替换法
重复值处理
记录重复
特征重复
除了使用相似度矩阵进行特征去重之外 可以通过DataFrame.equals的方法进行特征去重
异常值处理
异常值是指数据中个别值的数值明显偏离其余的数值,有时也称为离群点,检测
异常值就是检验数据中是否有录入错误以及是否含有不合理的数据。
异常值的存在对数据分析十分危险,如果计算分析过程的数据有异常值,那么会
对结果会产生不良影响,从而导致分析结果产生偏差乃至错误。
异常值检测
3σ原则又称为拉依达法则。先假设-组检测数据只含有随机误差,对原始数据进行
计算处理得到标准差,然后按一定的概率确定一个区间,认为误差超过这个区间的就属于
异常值。
此方法仅适用于对正态或近似正态分布的样本数据进行处理,如下表所示,其中σ代
表标准差,μ代表均值,X=μ为图形的对称轴。数据的数值分布几乎全部集中在区间
(μ-3σ,μ+3σ)内,超出这个范围的数据仅占不到0.3%。故根据小概率原理,可以认为
超出3σ的部分数据为异常数据。
箱线图提供了识别异常值的一个标准,即异常值通常被定义为小于QL-1.5IQR或大
于QU+1.5IQR的值。
QL 称为下四分位数,表示全部观察值中有四分之一的数据取值比它小。
QU称为上四分位数,表示全部观察值中有四分之一的数据取值比它
大。
IQR称为四分位数间距,是上四分位数QU与下四分位数QL之差,其间包含了全部观察值的
半。
2.箱线图分析
箱线图依据实际数据绘制,真实、直观地表现出了数据分布的本来面貌,且没有
对数据做任何限制性要求,其判断异常值的标准以四分位数和四分位数间距为基础。
四分位数给出了数据分布的中心、散布和形状的某种指示,具有一定的鲁棒性,
即25%的数据可以变得任意远而不会很大地扰动四分位数,所以异常值通常不能对这
个标准施加影响。鉴于此,箱线图识别异常值的结果比较客观,因此在识别异常值方
面具有定的优越性 。
pandas数据堆叠
数据表横向堆叠
pandas的连接函数concat()函数用于拼接两个数据表
主要参数
objs 接收多个Series DataFrame Panel 的组合 表示参与链接的pandas对象的列表的组合
axis 接收0或1 1 横向 0 纵向
join 接收inner (交集)或者 outer (并集)
数据表纵向堆叠
append函数
使用pandas的append函数把多个列名相同的数据表拼接到一起,列名不一致空值填补
使用merge函数链接数据
函数merge通过一个或多个键将数据表的行连接起来
根据两个表中元素取值是否相同来进行拼接(和行列索引无关)
函数join以索引作为对齐列进行数据连接
join(self, other, on= None, how= left', Isuffix= ",rsuffix=", sort= False)
combine first 函数重叠合并数据
数据映射转换
使用映射函数map可以对数据集中的数据进行映射转换。转换方式有函数转换、表
达式转换和字典转换。
map(arg, na action=None)
自定义函数转换数据
使用函数表达式转换数据类型
使用字典转换数据
数据离散化
等宽离散化指将数据的值域分成具有相同宽的区间,区间的个数由数据本身的特点决定或者用户指定。
cut(x, bins, right= True, labels= None, retbins= False, precision=3, in-
clude lowest= False)
案例1使用离散化处理方法将一组年龄分段, 并统计个年龄段人数。
数据等频离散化
将数据的值域按照分位数划分,划分的结果是每个区间的大小基本相同,但不一-定
完全相同。
qcut(x, q, labels= None, retbins= False, precision = 3, duplicates =
"raise")
案例2:使用qcut函数等频划分一组年龄值,并统计各组人数
大数据分组
数据分组是根据统计研究的需要,将原始数据按照某种标准划分成不
同的组别,分组后的数据称为分组数据。
数据分组的方法有单变量值分组和组距分组两种。
数据分组的主要目的是观察数据的分布特征,在进行数据分组后再计
算出各组中数据出现的频数,就形成了- -张频数分布表。
对于通过调查得到的数据,虽然经过审核、排序等整理手段给予了处
理,但由于数据庞杂,还不能直接进入对数据的分析阶段。在此之前,
有必要对数据进行分组处理,以反映数据分布的特征及规律。
对于非数值型数据就是依据属性的不同将其划分为若
干组,对于数值型数据就是依据数值的不同将数据划分为
若干组 。分组后, 要使组内的差距尽可能小,而组与组之
间则有明显的差异
从而使大量无序、混沌的数据变为有
序、层次分明、显示总体数量特征的资料。
数据分组原则和依据
数据分组应遵循两个基本原则:穷尽性原则和互斥性原则。
穷尽性原则要求调查的每一单位都能无一例外地划归到某一-组去,不
会产生“遗漏”现象。
互斥性原则要求将调查单位分组后,各个组的范围应该互不相容、互
为排斥。即每个调查单位在特定的分组标志下只能归属某一组,而不能同
时或可能同时归属到几个组。
根据研究目的选择分组标志;
选择能够反映现象本质的标志;
考虑现象所处的历史条件或经济条件。
1.根据研究目的选择分组标志
同一现象由于研究 目的不同, 选择的分组标志也就不同,应选择与研究目的有密
切关系的标志作为分组标志,才能使统计分组提供符合要求的分组资料。例如,要
研究工业企业经济类型的构成,就要选择所有制这个标志。
2.选择能够反映现象本质的标志
客观现象的标志多种多样,有的标志能够揭示现象的本质特征,具有决定意义的
重要标志;有的则是非本质、 无关紧要的标志。只有选择那些能够揭示现象本质特
征的重要标志作为分组标志,才能得到反映现象本质特征的分组资料。
3.考虑现象所处的历史条件或经济条件
社会经济现象随时间、地点、条件的不同而经常发生变化。同一分组标志在某一
时期适用,在另一时期就不一定适用,在另一条件下就不一定适用。某一标志在一
定历史条件下是重要的分组标志,但时过境迁,可能失去其重要意义。因此,在选
择分组标志时,应考虑到现象所处的具体历史条件或经济条件,做到与时俱进。
agg聚合
聚合在信息科学中是指对有关的数据进行内容挑选、分析、归类,最
后分析得到人们想要的结果,主要是指任何能够从数组产生标量值的数据
转换过程。
近年来随着大数据的发展,聚合技术已经广泛地应用于文本分析,信
息安全,网络传输等领域。
聚合函数可以实现数据聚合的功能,聚合函数对一组值执行计算并返回单一的值。
常见的聚合函数有:
从0.20.1开始,pandas引入了agg函数,它提供基于列的聚合
操作。
agg函数返回的是一个 DataFrame
函数的参数可以是字符串或
者函数,表示要在列上进行的操作
下 面的代码可以通过 agg聚合求所有学生的身 高平均值
import pandas as pd
data = pd.read csv('./student.csv')
print(data['身高'.agg( mean'))
运行结果为:
1.7349999999999999
下面的代码可以通过agg聚合求学生的身高的最大值
。
import pandas as pd
data = pd.read csv('./student.csv')
print(data['身高'].agg('max'))
运行结果为:
1.88
下面的代码可以通过agg聚合求学所有生的当月消费的总和。
import pandas as pd
data = pd.read csv('./student.csv)
print(data['本月消费'].agg'sum'))
运行结果为:
1530
transform聚合
transform可以很方便地将某个或某些函数处理过程(非聚合)作
用在传入数据的每一列上,从而返回与输入数据形状致的运算结果。
transform作用于Series
transform作用于DataFrame
transform作用于DataFrame的分组过
transform作用于Series,
可以对Series每一个
元素进行指定的操作,例如,对每个元素进行平方操作
。
transform的参数可以是一个函数,表示需要对每
一个 元素进行的操作
1下面的代码可以生成一个Series,
然后通过transform将Series中的每一 个
元素进行平方操作:
import pandas as pd
import numpy as np
<程序>
series = pd. Series([1, 2, 3, 4, 5, 6])
result = series.transform(lambda x: X ** 2)
print(result)
当transform作用于整个DataFrame时, 实际上就是将传入的所有
变换函数作用到每-列中。例如, 下面的代码 可以将所有列映射到0~1
之间。
import pandas as pd
data = pd.read CSV( ./student.csv)
data[l'身高','本月消费'll.transform(lambda s: S / max(s))
代码如下:
import pandas as pd
df = pd.DataFrame({
'restaurant id': [101,102,103, 104,105,106,107],
'address': ['新北区,武进区,钟楼区,栖霞区,'江宁区,'盐都区,‘亭湖区'],
'city': '常州常州,常州,南京','南京,'盐城',盐城'],
'sales': [10,500,48,12,21,22,14]
})
df'city_ total sales'] = df.groupby('city )'sales ].transform('sum')
df['pct'] = df['sales']/ df['city_ total sales']
df'pct'] = df[ pct'].transform(lambda x: format(x, '.2%'))
print(df)
apply聚合
在Python中,函数作为一个对象,能作为参数传递给其它参
数,并且能作为函数的返回值。
def cal(a, b, func):
return func(a, b)
def add(a, b):
return a + b
def sub(a, b):
return a - b
a =5
b =2
print(cal(a, b, add))
print(cal(a, b, sub))
pandas的apply()
函数可以作用于整个Series和DataFrame,功能是自动遍历整个Series 或者DataFrame, 对每
个元素运行指定的函数。
import pandas as pd
data = pd.read csv(./student.csv')
data['带单位的身高' = data['身高'.apply(lambda x: str(x) + '米)
这种情况下可以使用transform,这是apply与transform的一个区别。
import pandas as pd
data = pd.read Csv('./consume.csv)
data['总消费'] = data.groupby('姓名')['消费'J.transform(sum)
print(data)
机器学习
使用sklearn处理数据
机器学习是一门]多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多|门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。它是人工智能核心,是使计算机具有智能的根本途径。
机器学习是一门人工智能的科学,该领域的主要研究对象是人
工智能,特别是如何在经验学习中改善具体算法的性能。
机器学习是对能通过经验自动改进的计算机算法的研究
机器学习是用数据或以往的经验,以此优化计算机程序的性能标
准
机器学习是人工智能及模式识别领域的共同研究热点,其理论和方
法已被广泛应用于解决工程应用和科学领域的复杂问题。
基于机器学习的发展历程,机器学习可以分为传统机器学习与大数据环境下机器学习。
传统机器学习的研究方向主要包括决策树、随机森林、人工神经网络、贝叶斯学习等方面的研究
随着大数据时代各行业对数据分析需求的持续增加,通过机器学习高
效地获取知识,已逐渐成为当今机器学习技术发展的主要推动力。大数据
时代的机器学习更强调“学习本身是手段"机器学习成为一种支持和服务
技术。如何基于机器学习对复杂多样的数据进行深层次的分析,更高效地
利用信息成为当前大数据环境下机器学习研究的主要方向。
基于学习策略,机器学习可以分为模拟人脑的机器学习、直接采用数学
方法的机器学习。
模拟人脑的机器学习又可以分为符号学习与神经网络学习
。
符号学习:模拟人脑的宏现心理级学习过程,以认知心理
学原理为基础,以符号数据为输入,以符号运算为方法,用推
理过程在图或状态空间中搜索,学习的目标为概念或规则等。
符号学习的典型方法有记忆学习、示例学习、演绎学习.类比
学习、解释学习等。
神经网络学习(或连接学习) :
模拟人脑的微观生理级学习
过程,以脑和神经科学原理为基础,以人工神经网络为函数结构
模型,以数值数据为输人,以数值运算为方法,用迭代过程在系
数向量空间中搜索,学习的目标为函数。典型的连接学习有权值
修正学习、拓扑结构学习
Sklearn介绍
Scikit-learn(sklearn)是机器学习中常用的第三方模块,对常用的机器学习方法进行了封装,
包括回归(Regression) 、降维(Dimensionality Reduction)分类(Classfication)
聚类(Clustering)等方法。
Scikit-learn依赖如下软件包:
●Python (>= 2.7 or >= 3.3),
●NumPy (>= 1.8.2),
●SciPy (>= 0.13.3).
数据科学中的第一步通常都是加载数据,SciKit-Learn 中自带-些数据集, 可以尝
试加载。
先从sklearn导入数据集模块,然后,使用数据集中的loaddigits()方法加载数
据。
from sklearn import datasets
digits = datasets.load digits()
print(digits)
from sklearn import datasets
from sklearn.model selection import train test split
boston = datasets.load boston()
train_ X,test X, train y, test y = train test split(boston.data, boston.target,
test size = 0.2, random state = 0)
数据集预处理
现实世界中数据大体上都是不完整,不致的脏数据, 无法直接进行数据挖
掘,或挖掘结果不好。为了提高数据挖掘的质量产生了数据预处理技术。
数据预处理有多种方法:数据清理,数据集成,数据变换,数据归约等。这
些数据处理技术在数据挖掘之前使用,大大提高了数据挖掘模式的质量,降低实
际挖掘所需要的时间。
数据预处理主要包括:
数据清理、数据集成、数据变换、数据归约。
数据清理:
数据清理例程通过填写缺失的值、光滑噪声数据、识别或删除离群点
并解决不一致性来“清理”数据。
主要是达到如下目标:格式标准化,异常数据清除,错误纠正,重复
数据的清除
数据集成:
数据集成例程将多个数据源中的数据结合起来并统一-存储,建
立数据仓库的过程实际上就是数据集成。
数据变换:
通过平滑聚集,数据概化,规范化等方式将数据转换成
适用于数据挖掘的形式
。
数据归约:
数据挖掘时往往数据量非常大,在少量数据上进行挖
掘分析需要很长的时间,数据归约技术可以用来得到数据
集的归约表示,它小得多,但仍然接近于保持原数据的完
整性,并结果与归约前结果相同或几乎相同。
标准化:变换后各维特征有0均值,单位方差。也叫z-score规
范化(零均值规范化)。 计算方式是将特征值减去均值,除以标准差
。
降维就是指采用某种映射方法,将原高维空间中的数据
点映射到低维度的空间中。降维的本质是学习一个映射函数
f : x->y
其中X是原始数据点的表达,目前最多使用向量
表达形式。y是数据点映射后的低维向量表达,通常y的维
度小于X的维度(当然提高维度也是可以的)
。f可能是显
式的或隐式的、线性的或非线性的
。
在sklearn中,可以通过PCA实现降维
from sklearn.decomposition import PCA
data = [[2,8,4,5],[6,3,0,8],[5,4,9,1]]
pca = PCA(n_ components= 2)
result = pca.fit transform(data)
回归分析
回归分析是一种预测性的建模技术,它研究的是因变量(目标) 和自
变量(预测器)之间的关系。这种技术通常用于预测分析,时间序列模型
以及发现变量之间的因果关系。通常使用曲线/线来拟合数据点,目标是
使曲线到数据点的距离差异最小。
线性回归假设目标值与特征之间线性相关,即满足一个多元
次方程。通过构建损失函数,来求解损失函数最小时的参数w和
b。通常可以表达成如下公式:
y(x)=wx+b
y(x)为预测值,自变量X和因变量y是已知的,而线性回归
想实现的是预测新增一个x
其对应的y是多少。因此,为了构
建这个函数关系,目标是通过已知数据点,求解线性模型中w和
b两个参数
求解最佳参数,需要一个标准来对结果进行衡量,为此需要定量化一个目标函数式,
使得计算机可以在求解过程中不断地优化。
针对任何模型求解问题,都是最终都是可以得到一-组预测值y(x),对比已有的真实值
y,数据行数为n,可以将损失函数定义如下:
L =HZH=1(V(x)i-y;)-
n
常见的线性回归求解方式有两种,最小二乘法和梯度下降法。
TO
在sklearn中,可以通过linear model.LinearRegression 进行线性回归分
析。其过程如下:
1.导入模块;
2.生成x、y;
又
3.调用LinearRegression().fit(X, y)得到模型(假设为reg
4.解析reg得到参数;
5.根据模型预测。
from sklearn.linear model import LinearRegression
import numpy as np
X = np.array([1, 1],[1, 2], [2, 2], [2, 3]])
#y=1*x0+2*x1+3
y = np.dot(X, np.array([1, 2]))+ 3
c程序:
reg = LinearRegression().fit(X, y)
print(reg.score(X, y))
print(reg.coef )
print(reg.intercept )
reg.predict(np.array([[3, 5]]))
模拟转盘游戏
import numpy as np
import pandas as pd
#模拟转盘100000次
data = np.random.ranf(100000)
#奖项等级划分
category = (0.0,0.08,0.3,1.0)
labels = ('一等奖','二等奖','三等奖')
#对模拟数据进行划分
result = pd.cut(data, category,labels=labels)
results = pd.value_counts(result)
print(results)
import pandas as pd
df = pd.read_excel('电影导演演员.xlsx')
df
pairs = []
for i in range(len(df)):
actors = df.at[i,'演员'].split(',')
for actor in actors:
pair = (actors,df.at[i,'电影名称'])
pairs.appnd(pair)
pairs = sorted(pairs,key=lambda item:int(item[0][2:1]))