pandas数据探索函数大致可以分为统计特征函数和统计作图函数,作图依赖matplotlib
,所以说创建pandas的dataframe
要求matplotlib
必须没问题,否则可能有点懵。
基本统计特征函数
可用于dataframe
或者series
普通统计特征函数
#计算相关系数矩阵
df.corr(method='pearson')#可使用spearman系数
s1.corr(s2,method='pearson')#计算两个series的相关系数矩阵
#计算协方差矩阵
df.cov()
s1.cov(s2)#计算两个serie之间的协方差
#计算样本偏度(三阶矩)
df.skew()
#计算样本峰度(四阶矩)
df.kurt()
累计统计特征函数
#前i个数累加
df.cumsum()
#前i个数累乘
df.cumprod()
#前i个数最大值
df.cummax()
#前i个数最小值
df.cummin()
滚动统计特征
#滚动统计特征
rolling_funcname()
#滚动求均值,每k列求一次均值
pd.rolling_mean(df,k)
统计作图函数
绘制箱盒图
import matplotlib.pyplot as plt
import numpy as np
#pandas默认index为x轴,kind指定作图类型,支持line,bar,hist,box,kde,pie,area
x = np.random.randn(1000)
d = pd.DataFrame()
d[0]=x
d[1]=x+1
d.plot(kind='box')
plt.show()
绘制对数图形
# df.plot(logx=True)或者df.plot(logy=True)
#绘制x轴或者y轴的对数图形
x = pd.Series(np.exp(np.arange(100)))
x.plot(label='original data',legend=True)
plt.show()
x.plot(label='log data',legend=True,logy=True)
plt.show()
绘制散点图矩阵
from pandas.plotting import scatter_matrix
#查看散点图矩阵
scatter_matrix(df,figsize=(20,16))
plt.show()
绘制相关系数矩阵可视化图,比较容易看出两个变量之间的相关性
correlations = df.corr()
# 查看相关系数矩阵可视化
fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(1,1,1)
cax = ax.matshow(correlations,vmin=-1,vmax=1)
fig.colorbar(cax)
ticks = np.arange(0,df.shape[1],1)
ax.set_xticks(ticks)
ax.set_yticks(ticks)
ax.set_xticklabels(df.columns,rotation=90)
ax.set_yticklabels(df.columns)
plt.show()
划分训练集和测试集
# 划分训练集和测试集
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2)
插值
#s为原始序列,原始序列的第n个值为null
#Lagrange(x,y)函数将(y.index,list(y))分别当做(x,y)传入返回一个ploy1d(x),然后传入x获取拟合值
def ployinterp_column(s,n,k=5):
#利用第n个值的前k个数和后k个数进行插值
y = s[list(range(n-k,n))+list(range(n+1,n+1+k))]
y = y[y.notnull()]
return lagrange(y.index,list(y))(n)
去重
#d可以是list,array,series
np.unique(d)
d.unique()#d是pandas的series或者dataframe
isnull()
或者notnull()
#返回一个bool的series
df.isnull()
df.notnull()
#通过df[df.isnull()]或者df[df.notnull]获取d中的空值或者非空值
df[df.notnull()]
使用keras
搭建神经网络
from keras import Sequential
from keras.layers.core import Dense,Activation
model = Sequential()
#Dense(input_dim,units) input_dim输入维度,units输出维度
model.add(Dense(input_dim=3,units=10))
model.add(Activation('relu'))
model.add(Dense(input_dim=10,units=1))
model.add(Activation('sigmoid'))
model.compile(loss='binary_crossentropy',optimizer='adam')
model.fit(x,y,epochs=1000,batch_size=10)
yp = model.predict_classes(x).reshape(len(y))
yp
kMeans聚类
画出每类的每个特征密度图进行分析并做降维,将高维数据展示在二维图像上。
#完成聚类
from sklearn.cluster import KMeans
k = 3
iteration = 500
data_zs = 1.0*(df-df.mean())/df.std()
model = KMeans(n_clusters=k,n_jobs=4,max_iter=iteration)
model.fit(data_zs)
r1 = pd.Series(model.labels_).value_counts()
r2 = pd.DataFrame(model.cluster_centers_)
r = pd.concat([r2,r1],axis=1)
r.columns=list(df.columns)+[u'类别数目']
df['聚类类别']=model.labels_
#进行kmeans完成聚类之后对每一类画出密度图然后进行分析,加上特定标签
k = 3
def density_plot(data,title):
import matplotlib.pyplot as plt
p=data.iloc[:,:3].plot(kind='kde',linewidth=2,subplots=True,sharex=False)
for i in range(k):
p[i].set_ylabel("密度")
plt.xlabel("聚类类别为%s各属性密度曲线"%title)
plt.legend()
return plt
for i in range(k):
density_plot(df[df['聚类类别']==i],i).savefig('%s%s.png'%("D:\\data\\",i))
#特征数通常是大于3维,难以直接对原特征结果进行展示,TSNE提供一种有效的结果展示
from sklearn.manifold import TSNE
tsne = TSNE()
tsne.fit_transform(data_zs)#进行数据降维
tsne = pd.DataFrame(tsne.embedding_,index = data_zs.index)#转换数据格式
#tsne为降维之后的数据,之后分别使用不同类别的颜色描绘出
d = tsne[df['聚类类别']==0]
plt.plot(d[0],d[1],'r.')
d = tsne[df['聚类类别']==1]
plt.plot(d[0],d[1],'go')
d = tsne[df['聚类类别']==2]
plt.plot(d[0],d[1],'b*')
plt.show()
时序模式算法
因为statsmodels
和scipy
两个包的版本经常冲突,我使用的scipy==1.1.0
和statsmodels==0.9.0
,冲突比较少,可以这样配置。。。
#输入data为观测值序列,返回参数为autocorr为观测值序列自相关函数
acf(data)
#画出自相关系数图
plot_acf(data).show()
#返回偏自相关系数
pacf(data)
#画图偏自相关系数图
plot_pacf(data).show()
#对观测值序列进行单位根检验,返回adf,pvalue
adfuller(Series)
# 对观测值进行差分
df.diff()
#arima 创建ARIMA时序模型
arima = ARIMA(data,(p,d,q))
#arima为d步差分,data为输入的时间序列,p、q为对应的阶
#生成已有模型的报告
summary()/summary2()
# 用得到的时序模型进行预测
arima.forecast(number)
# 检测是否为白噪声序列
acorr_ljungbox(data,lags=1)
使用5折交叉验证计算RSME
from sklearn.model_selection import cross_val_score
scores = cross_val_score(ridgereg,x,y,cv=5,scoring="neg_mean_squared_error")
rsme_cv = np.sqrt(-scores.mean())
rsme_cv