代码拉取完成,页面将自动刷新
Pandas模块::
读写不同数据源的数据相关操作和函数:
数据库数据读取:相关的3个函数分别是read_sql,read_sql_table和read_sql_query
read_sql_table:只能够读取数据库的某一个表格,不能实现查询操作
read_sql_query: 只能实现查询操作,不能直接读取数据库中的某个表
read_sql: 是上面两者功能的综合
连接数据库可以用SQLAlchemy这个模块,具体用法如下:
from sqlalchemy import create_engine
engine=create_engine('mysql+pymysql://root:1234@127.0.0.1:3306/testdb?charset=utf8')
mysql和oracle数据库连接字符串的格式:
数据库产品名+连接工具名://用户名:密码@数据库IP地址:数据库端口号/数据库名称?charset=数据库数据编码
连接postgre 如engine=create_engine('postgresql://user:user@13.230.xxx.xx:xxxx/test') 连接工具名可以不填
具体的用法
pd.read_sql_query('SELECT table_name FROM information_schema.tables',con=engine)
pd.read_sql_table('y_kyakusu_daily_mbp_test',con=engine)
pd.read_sql('select * from y_kyakusu_daily_mbp_test',con=engine)
pandas提供了read_table来读取文本文件,提供了read_csv函数来读取csv文件
pandas.read_table(filepath,sep='\t',header='infer',names=none,encoding='utf-8',engine=none,nrows=none)
第一个参数 filename 接收string,代表文件路径。 sep 代表分隔符,read_csv默认为',',read_table默认为tab '\t'
names接收array,表示列名。encoding代表文件的编码格式.nrows 接收int,表示读取前n行。
如: pd.read_table('../data/xxx.csv',sep=',',encoding='gbk')
pd.read_csv('../data/xxx.csv',encoding=gbk)
pd.read_csv('../data/xxx.csv',header=None) 读取文件,但没有列名 如果文件本身自带有列名,则不需要加header=None
但如果文件本身没有列名的话,不加这句会导致文件第一行被自动当作列名来处理,而加上这句后,会使用0,1,2 数字作为默认列名
文本文件存储:
首先,只有pandas对象才能直接进行文本存储 pd.to_csv(path,sep=',',header=True,index=False,encoding=None)
第一个参数path代表文件路径,sep代表分隔符,header代表是否将列名也写入文件,默认是true。index代表是否将行名写入文件,默认是
true.encoding代表存储文件的编码格式。
如 arr.to_csv('../xxx.csv',sep=';',index=False)
读取excel文件:
pd.read_excel(path,sheet_name=0,header=0) 第二个参数代表读取excel具体哪个sheet,默认是0。第三个参数表示将某行数据作为列名
例如 pd.read_excel('JBGP_DATA_TEST.xls',sheet_name='20171108',header=0)
excel文件存储:
pd.to_excel(path,sheetname='None',header=True) sheetname如果不指定则默认为sheet1,除了没有sep参数,其余和to_csv相同
DataFrame常用操作:
dataframe是最常用的pandas对象,类似excel表格,完成数据读取后,数据就以dataframe数据结构存储在内存中
常用属性:
values,index,columns,dtypes,可以获取元素,索引,列名和类型
size:获取元素个数
ndim:获取元素维度数
shape:获取dataframe个数,几行几列
T:T属性能实现dataframe的转置(行列转换) 如 如果df原来是3行4列 那么df.T转置后就会变成4行3列
dataframe的单列数据为一个series,可以使用字典访问的方式来访问dataframe单列数据 如 df['order_id']
也可以使用访问属性的方式访问,如 df.order_id 但应该尽量避免使用访问属性的方式访问
访问某列的前5个元素,df['order_id'][:5]
访问所有列的1-5行元素,df['order_id'][1:6]
可以使用head和tail这两个方法获取多行数据
head:df.head() 获取前5行数据
tail:df.tail() 获取后5行数据
因为head和tail使用的都是默认参数,所以都是获取5行数据,只要在括号中输入行数,就可以查看这些行了
loc 方法是针对DataFrame索引名称的切片方法 ,iloc是针对索引位置的切片方法
单列切片 df.loc[:,'name'] df.iloc[:,3] 两者效果是相同的,获取第三列的元素
多列切片 df.loc[:,['name','id']] 获取name列和id列的元素 df.iloc[:,[1,3]]获取第1列和第3列的元素
df.loc[2:6,['name','id']] 获取2-6行的name列和id列数据
df.iloc[2:7,[1,3]] 获取2-6行的name列和id列数据
从上面的例子可以看出,在使用loc方法的时候,如果传入的索引是一个区间,则前后均为闭区间
而使用iloc方法的时候,如果传入的是一个区间,则是前闭后开区间
删除某行或某列的数据 pd.drop(labels,axis=0,inplace=False) 第一个参数labels 接收string或array ,代表删除的行或列。
axis 代表操作的轴向,默认是0 第三个参数inplace 代表操作是否对原数据生效。
删除列的数据 pd.drop(labels='name',axis=1,inplace=True) 删除name列的数据 , labels='name' 可以直接写成 'name'
删除行的数据 pd.drop(labels=range[1,11],axis=0,inplace=True) 删除1-10行的数据
也可以直接这样写 pd.drop([0],inplace=True) 删除第一行的数据 pd.drop([0,1,2],inplace=True) 删除第一道第三行数据
describe() 用来概括,表达事物整体状况,以及事物间关联,类属关系的统计方法,数值型特征的描述性统计主要包括了计算数值型数据的
完整情况,最小值,均值,中位值,最大值,四分位数,极差,标准差,方差,协方差和变异系数等
如 df[['counts','amounts']].describe()
describe方法还能够支持对category类型的数据进行描述性统计,4个统计量分别是非空元素数目,类别的数目,数目最多的类别和其数目
如 df['name']=df['name'].astype('category') 将name列转换为category类型 之后再使用describe()方法
df['name'].describe() 统计结果出来的就是 count,unique,top,freq
value_counts() 频数统计,用来统计数组中各个值出现的次数, 如 df['b1'].value_counts() 统计各蓝球出现次数
获取数据中整列为空的列的列名 colisnull=df.describe().loc['count']==0 找到count为0的列,设为true 否则为 False
生成出来的数据类似于 [name:False,id:False,b1:True] 这样一个数组,数组里的元素即列名,为空就是true不为空就是false
转换与处理时间序列数据:
时间类型数据在读入python后常常以字符串形式出现,无法实现大部分与时间相关的分析,pandas能够快速实现时间字符串的转换,
信息提取和时间运算
pandas提供了六种时间相关的类 timestamp 最基础常用的时间类 period 表示单个时间跨度,或某个时间段
timedelta 表示不同单位的时间如1d 1h 3min datetimeindex 一组timestamp构成的index
periodtimeindex 一组peroid构成的index timedeltaindex 一组timedelta构成的index
timestamp:df['date_time']=pd.to_datetime(df['date_time']) 将date_time列的数据转换为timestamp型
datetimeindex: dateindex=pd.DatetimeIndex(df['date_time']) dateindex成为一个有timestamp构成的series
periodtimeindex: periodindex=pd.PeriodIndex(df['date_time'],freq='S') freq参数指时间间隔 S 代表秒 经转换后的数据
精确到秒 如2007-04-17 16:35:02 T代表分钟,转换后精确到分 如 2007-04-17 16:35
H代表小时 如2007-04-17 16:00 D代表日 如 2007-04-17 M代表月 如 2007-04 Y代表年 如 2007
提取时间序列数据信息:
year=[i.year for i in df['date_time']] 提取年份 ,生成一个由年份组成的数组
month=[i.month for i in df['date_time']] 提取月份,生成一个由月份组成的数组
day=[i.day for i in df['date_time']] 提取日期
weekday=[i.weekday_name for i in df['date_time']] 提取周几名称
其他相关属性:
week:一年中第几周 date:日期 time:时间 quarter:季节 weekofyear:一年中第几周 dayofyear:一年中第几天
dayofweek:一周第几天 weekday_name:星期名称 weekday:周几 is_leap_year:是否闰年
这些属性可以直接在datetimeindex和periodindex对象中使用 如 dateindex.weekofyear dateindex.weekday[:8]
这样就免掉了上面一步的提取工作
加减时间数据 timedelta:使用该类可以很轻松实现在某个时间上加减一段时间
如 time=df['date_time']+pd.Timedelta(days=1) 日期加1天
time=df['date_time']-pd.to_datetime('2017-1-1') 日期之间相减
timestamp类型的数组可以直接调用平均值方法mean(),而datetimeindex类型的数组则不能调用mean()
timestamp类型可以往datetimeindex类型转换,但datetimeindex则不能向timestamp转换
分组聚合进行组内计算:
groupby 方法提供了拆分功能,能够根据索引或者字段对数据进行分组
如 df.groupby(by=None,axis=0,level=None,as_index=True,sort=True,group_keys=True,squeeze=false)
第一个参数by 接收list,string,mapping或generator,可以是字典或series或numpy数组
第四个参数as_index 表示聚合后的聚合标签是否以dataframe索引形式输出,默认是true
第五个参数sort 表示是否对分组进行排序,默认是true
第六个参数 group_keys 表示是否显示分组的标签名称默认是true
第七个参数 squeeze 表示是否在允许的情况下对返回数据进行降维
实例如 detailgroup=data[['id','name','counts']].groupby(by='id') 分组后的结果并不能直接查看
groupby提供了一些描述性方法来查看数据
count 计算分组的数目 head:返回每组的前n个值 max:返回每组的最大值 mean:返回每组的平均值
median:返回每组的中位数 size:返回每组的大小 min:返回每组的最小值 std:返回每组的标准差 sum:返回每组的和
如 detailgroup.mean().head() 返回前5组的平均值
数据透视表和交叉表:
数据透视表是数据分析中常见的工具之一,根据一个或多个键值对数据进行聚合,根据行或列的分组键将数据划分到各个区域
pivot_table函数创建透视表:
pd.pivot_table(data,values=None,index=None,columns=None,aggfunc='mean',fill_value=None,margins=False,
dropna=True,margins_name='All')
data:表示需要处理的数据 values:用于指定要聚合的数据字段名,默认使用全部数据
index:表示行分组键 columns:表示列分组键 aggfunc:接收functions,表示聚合函数
margins:表示汇总功能的开关,设为true后,结果集中会出现名为"ALL"的行和列 dropna:表示是否删掉全为nan的列
如 pd.pivod_table(df[['order_id','counts','amounts']],index='order_id')
以order_id作为分组键,创建订单透视表,结果类似groupby的效果,index可以有多个
交叉表是一种特殊的透视表,主要用于计算分组频率,利用pandas提供的crosstab函数可以制作交叉表
pd.crosstab(index,columns,values=None,rownames=None,colnames=None,aggfunc=None,margins=False,dropna=True,
normalize=False)
index:表示行索引键 columns:表示列索引键 values:表示聚合数据 rownames:表示行分组键名
colnames:表示列分组键名 aggfunc:接收function,表示聚合函数 margins:表示汇总功能的开关,设置为true后,会表示ALL
的行和列 dropna:表示是否删掉全为nan的列 normalize:表示是否对值进行标准化
堆叠合并数据
横向堆叠,即将两个表在x轴向拼接在一起,可以使用concat函数完成
pd.concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False,keys=None,levels=None,name=None,
verify_integrety=False,copy=True)
objs:接收多个series,dateframe,表示参与连接的pandas对象的列表的组合
axis:接收0或1,表示连接的轴向
join:接收inner或outer,表示其他轴向上的索引是按交集(inner)还是并集(outer)进行合并
join_axes:接收index对象,表示用于其他n-1条轴的索引,不执行并集/交集运算
ignore_index:接收boolean,表示是否不保留连接轴上的索引
keys:接收sequence.表示与连接对象有关的值
纵向堆叠,只要将上面的axis参数值改为1即可
主键合并数据:即通过一个或多个键将两个数据及的行连接起来
pd.merge(left,right,how='inner',on=None,left_on=None,right_no=None,left_index=False,right_index=False
sort=False,suffixes=('_x','_y'),copy=True,indicator=False)
left:表示要添加的新数据1
right:表示要添加的新数据2
how:接收inner,outer,left,right 表示数据的连接方式,默认为inner
on:表示两个数据合并的主键(必须一致)
left_on:表示left参数接收数据用于合并的主键
right_on:表示right参数接收数据用于合并的主键
left_index:表示是否将left参数接收数据的index作为连接主键
right_index:表示是否将right参数接收数据的index作为连接主键
sort:表示是否根据连接键对合并后的数据进行排序
suffixes:接收tuple,表示用于追加到left和right参数接收数据列名相同时的后缀
join方法也可以实现部分主键合并的功能,但是使用join方法时,两个主键的名字必须相同
pd.join(self,other,on=None,how='left',lsuffix='',rsuffix='',sort=False)
other:接收dateframe,series或者包含了多个dateframe的list,表示参与连接的其他dataframe
on:接收列名或这包含列名的list或tuple,表示用于连接的列名
how:接收inner,outer,left,right 表示数据的连接方式,默认为inner
lsuffix:表示用于追加到左侧重叠列名的尾缀
rsuffix:表示用于追加到右侧重叠列名的尾缀
重叠合并数据:
数据分析和处理过程中哦偶尔会出现两份数据的内容几乎一致的情况,但是某些特征在其中一张表上是完整的,而在另一张表上的数据则是
缺失的,这时出了使用将数据一对一表叫然后进行填充的方法外,还有一种方法就是重叠合并
pd.dataframe.combine_first(other)
如: dict1={} dict2={}
# 将字典转换为datafrme
df1=pd.DataFrame(dict1) df2=pd.DataFrame(dict2)
df1.combine_first(df2)
清洗数据:
数据重复会导致数据的方差变小,数据分布发生较大变化。缺失会导致样本信息减少,不仅增加了数据分析的难度,而且会导致数据分析的
结果产生偏差,异常值则会产生 伪回归 .因此需要对数据进行检测,查询是否有重复值,缺失值和异常值,并且要对这些数据进行适当的处理
方差 是指在概率论和统计方差衡量随机变量或一组数据时离散程度的度量。概率论中方差用来度量随机变量和其数学期望(即均值)之间的
偏离程度。统计中的方差是每个样本值与全体样本值的平均数之差的平方值的平均数。
pandas提供了一个名为drop_duplicates的去重方法,该方法只对dataframe和series类型有效,这种方法不会改变数据原始排列
pd.drop_duplicates(self,subset=None,keep='first',inplace=False)
subset:表示进行去重的列。默认是None,表示全部列
keep:表示重复时保留第几个数据,first:保留第一个 last:保留最后一个 false:只要有重复都不保留
相似度计算:
在pandas中,相似度的计算方法为corr,使用改方法计算相似度时,默认为person法,可以通过method参数调节,目前还支持spearman和
kendall法,用法: df[['counts','amounts']].corr(method='kendall')
该方法只能对数值型重复特征去重
检测与处理缺失值:
数据中的某个或某些特征的值是不完整的,这些值称为缺失值。pandas提供了识别缺失值的方法isnull以及识别非缺失值的方法notnull
这两种方法在使用时返回的都是布尔值,结合sum函数和isnull,notnull函数,可以检测数据中缺失值的分布以及数据中一共还有多少
缺失值。
如:df.isnull() df.notnull() df.isnull().sum() df.notnull().sum()
删除法是指将含有缺失值的特征或者记录删除
pd.dropna(self,axis=0,how='any',thresh=None,subset=None,inplace=False)
how:表示删除的形式,any表示只要有缺失值存在就执行删除操作,all表示当且仅当全部为缺失值时才执行删除操作
subset:表示进行去重的列/行。默认为None
df.dropna(axis=1,how='any')
替换法是指用一个特定的值替换缺失值。缺失值所在特征为数值型时,通常利用其均值,中位数和众数等描述其集中趋势的统计量来代替缺失
值,缺失值所在特征为类别型时,则选择使用众数来替换缺失值。
pd.fillna(value=None,method=None,axis=None,inplace=False,limit=None)
value:表示用来替换缺失值的值
method:backfill或bfill表示使用下一个非缺失值来填补缺失值。pad或ffill表示使用上一个非缺失值来填补缺失值。
limit:接收int.表示填补缺失值个数上限,超过则不进行填补。
插值法,删除法简单易行,但是会引起数据结构变动,样本减少。替换法使用难度较低,但是会影响数据的标准差,导致信息量变动。
在面对数据缺失问题时,除了这两种方法之外,还有一种常用的方法,插值法。
常用的插值法有线性插值,多项式插值和样条插值等。线性插值是一种较为简单的插值方法,它针对已知的值求出线性方程,通过求解
线性方程得到缺失值。多项式插值是利用已知的值拟合一个多项式,使得现有的数据满足这个多项式,再利用这个多项式求解缺失值。
常见的多项式插值有拉格朗日插值和牛顿插值等.样条插值是以可变样条来作出一条经过一系列点的光滑曲线的插值方法。插值样条由一些
多项式组成,每一个多项式都由相邻两个数据点决定,这样可以保证两个向另多项式及其导数在连接处连续。
pandas提供了对应的名为interpolate的插值方法,能够进行上述部分插值操作。scipy的interpolate模块更加全面。
from scipy.interpolate import interp1d
#线性插值
linevalue=interp1d(arr_x,arr_y,kind='linear')
linevalue=interp1d(arr_x,arr_y,kind='slinear')
linevalue([xx]) 所生成的值是一个numpy array
#最邻近插值法
value=interp1d(arr_x,arr_y,kind='nearest')
#2阶B样条曲线插值
value=interp1d(arr_x,arr_y,kind='quadratic')
#3阶B样条曲线插值
value=interp1d(arr_x,arr_y,kind='cubic')
#拉格朗日插值
from scipy.interpolate import lagrange
value=lagrange(arr_x,arr_y)
#样条插值
from scipy.interpolate import spline
splinevalue=spline(arr_x,arr_y,xnew=np.array([xx]))
标准化数据:
不同特征之间往往具有不同的量纲,由此所造成的数值间的差异可能很大,在涉及空间距离计算或梯度下降法等情况时,不对其进行处理会
影响到数据分析结果的准确性,为了消除特征之间量纲和取值范围可能造成的影响,需要对数据进行标准化处理
离差标准化:
离差标准化是对原始数据的一种线性变换,结果是将原始书的数值映射到[0,1]区间,转换公式是 X=(x-min)/(max-min)
标准差标准化数据:
标准差标准化也叫零均值标准化,是当前使用最广泛的数据标准化方法 转换公式是 X=(X-均值)/标准差
data=(data-data.mean())/data.std()
转换数据
数据即使经过了清洗,合并和标准化,依旧不能直接拿来做分析建模,为了能够将数据分析工作继续往前推进,需要对数据做一些合理的转化
使之符合分析要求
离散化连续型数据:
某些模型算法,特别是某些分类算法,要求数据是离散的,此时就需要将连续型特征变换成离散型特征,即连续特征离散化
连续特征的离散化就是在数据的取值范围内设定若干个离散的划分点,将取值范围划分为一些离散化的区间
常用的离散化方法主要有三种:等宽法,等频法和聚类分析法
等宽法:将数据的值域分成具有相同宽度的区间,区间的个数由数据本身的特点决定或者由用户指定
pandas提供了cut函数,可以进行连续型数据的等宽离散化
pd.cut(x,bins,right=True,labels=None)
参数 bins:接收int,list,array和tuple.若为int,则代表离散化后的类别数目,若为序列类型的数据,则表示进行切分的区间
right:代表右侧是否为闭区间
labels:代表离散化后各个类别的名称
聚类分析法:
一维聚类的方法包括两个步骤,首先将连续性数据用聚类算法(如 K-Means算法等)进行聚类,然后处理聚类得到簇,为合并到一个
簇的连续型数据做同一种标记
from sklearn.cluster import KMeans
kmodel=KMeans(n_clusters=k,n_jobs=4)
kmodel.fit(data.reshape((len(data),1)))
#输出聚类中心并排序
c=pd.DataFrame(kmodel.cluster_centers_).sort_values(0)
#相邻两项求中点,作为边界点
w=pd.rolling_mean(c,2).iloc[1:]
#将首末边界点加上
w=[0]+list(w[0])+[data.max()]
data=pd.cut(data,w)
Series相关操作:
#生成一个空字典
dict=pd.Series()
#生成一个简单字典
dict=pd.Series([1,2,3,4],index=['a','b','c','d'])
#通过索引进行排序
dict.sort_index()
#通过值进行排序
dict.sort_values()
#根据列索引进行排序
dict.sort_index(axis=1)
#根据某列进行排序
dict.sort_values(by='a')
#通过多个值进行排序
dict.sort_values(by=['a','c'])
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。