Update 2017-9-20
最近被一些生活上的事搞得焦头烂额,博客又有些荒废了,继续更…..
网络上有大段的numpy和Pandas博文,我就不一一阐述了,只记录我最近使用出现的坑….
numpy和Pandas配合matplotlib使用,可以快速绘制各类图表,我们可以方便的使用pandas读取xlsx,csv格式的数据.例如我们读取xlsx格式的数据,我们可以在read_excel定义表格是否存在header,便于跳过。pandas读取返回数据类型是dataFrame,而dataframe的每一行数据又是一个ndarray类型,在知道数据表头的前提下,可以将data看成一个大的数组,data[‘列名’]打印某列数据。data每列的列名就是一个key,列数据就是一个value,通过这种方式可以对某几列进行计算。
pd.set_option('display.width', 200) data = pd.read_excel('sales.xlsx', sheetname='sheet1', header=0) print 'data.head() = \n', data.head() print 'data.tail() = \n', data.tail() print 'data.dtypes = \n', data.dtypes print 'data.columns = \n', data.columns for c in data.columns: print c, print data['total'] = data['Jan'] + data['Feb'] + data['Mar'] print data.head() print data['Jan'].sum() print data['Jan'].min() print data['Jan'].max() print data['Jan'].mean()
reindex是对这个dataframe重新组织列名,rename则是对某一行的头进行重命名。
pd.reindex(columns=data.columns) data = data.rename(index={15:'Total'})
除了read_excel外,read_csv可以帮助我们处理cvs格式的数据,当我们接手一个csv数据文件后,要观察这个文件是否存在表头,存在话,可以在data = pd.read_csv(‘xxx’,header=None)跳过,data的数据类型是dataFrame,如果我们想获取某一列数据或者某几列,可以采用iloc[],(这里采用iloc返回的是Seriers类型,如果使用values则转换为np。array类型,而array类型通过tolist则可以转换为 python 内置的list类型)
data = pd.read_csv('wine_data',sep=',',header=None) x = data.iloc[:,1:].values y = data.iloc[:,0].vaues
当然也可以生成一个表头,并且在pd.read_csv(‘wine_data’,sep=’,’,header=cols)制定表头是cols,而cols是一个np.array,当读入数据以后,就可以使用表头获取某几列数据x = data[cols[:-1]]
df.loc[1] 获取第二行
df.loc[:,’test1′] 获取test1的那一列,这个冒号的意思是所有行,逗号表示行与列的区分
df.loc[:,[‘test1′,’test2’]] 获取test1列和test2列的数据
df.loc[1,[‘test1′,’test2’]] 获取第二行的test1和test2列的数据
df.at[1,’test1′] 表示取第二行,test1列的数据,和上面的方法类似
df.iloc[0] 获取第一行
df.iloc[0:2,0:2] 获取前两行前两列的数据
df.iloc[[1,2,4],[0,2]] 获取第1,2,4行中的0,2列的数据
apply函数是对某一行或者某一列使用定义的函数进行处理,例如函数find_state_code,在python,numpy和pandas中axis是一个比较难以理解的概念,stackoverflow给出了非常好的解释。翻译过来就是axis=0沿着列的方向,axis=1沿着行的方向。下面代码就是沿着行的方向把每个行中列名为state的元素进行修改!
def find_state_code(row): if row['state'] != 0: print process.extractOne(row['state'], states, score_cutoff=80) data.apply(find_state_code, axis=1)
pandas.cut将值放入某个bin中,并将bin赋值给这列数据。
>>> pd.cut(np.array([.2, 1.4, 2.5, 6.2, 9.7, 2.1]), 3,labels=["good","medium","bad"]) [good, good, good, medium, bad, good] Categories (3, object): [good < medium < bad]
numpy中提供np.linalg.svd函数,对图像进行奇异值分解,然后我们可以将得到的特征值和特征向量相乘复原这张图像,例如一张图高282px 宽218px rgb,那么分解出来就是u 是282×282 v是218×218 sigma 218.那么u[:, k]代表第k列reshape成为mx1形状的矩阵,v[k]代表k行reshape成为1xn形状的矩阵,二者通过np.dot(uk, vk)做矩阵点乘,再乘sigma即可还原图像。
a = np.array(A) u_r, sigma_r, v_r = np.linalg.svd(a[:, :, 0]) u_g, sigma_g, v_g = np.linalg.svd(a[:, :, 1]) u_b, sigma_b, v_b = np.linalg.svd(a[:, :, 2]) ===== def restore1(sigma, u, v, K): # 奇异值、左特征向量、右特征向量 m = len(u) n = len(v[0]) a = np.zeros((m, n)) for k in range(K): uk = u[:, k].reshape(m, 1) vk = v[k].reshape(1, n) a += sigma[k] * np.dot(uk, vk) a[a < 0] = 0 a[a > 255] = 255 # a = a.clip(0, 255) return np.rint(a).astype('uint8')
np.loadtxt可以读入格式化数据,然后通过usecols选取某几个特定行。np.convolve是特定针对一维向量做卷积的函数,这个函数开始我很疑惑,因为他和对于图像做卷积很不同,通过查询文档(https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.convolve.html),了解到第二个参数是卷积核,python内部实现的时候对这个卷积核做了一个反转,然后才对数据做卷积。
stock_max, stock_min, stock_close, stock_amount = np.loadtxt('SH600000.txt', delimiter='\t', skiprows=2, usecols=(2, 3, 4, 5), unpack=True) stock_sma = np.convolve(stock_close, weight, mode='valid') # simple moving average ============ np.convolve([1, 2, 3], [0, 1, 0.5]) array([ 0. , 1. , 2.5, 4. , 1.5])
具体计算方法是将[0, 1, 0.5]翻转为[0.5,1,0],对[1,2,3]做卷积,[0,0,1],[0,1,2],[1,2,3],[2,3,0],[3,0,0]分别点乘[0.5,1,0]
0.5*null+1*null+0*1=0
0.5*null+1*1+0*0*2=1
0.5*1+1*2+0*3=2.5
0.5*2+1*3+0*null=4
0.5*3+1*null+0*null=1.5
np.polyfit曲线拟合函数,第三个参数是多项式最高次数,拟合完毕结果返回10次拟合多项式系数, 从高次到低次存放在向量poly中.polyval可求得多项式在t处的值stock_ema_hat,这里的stock_ema,stock_ema_hat 都是向量。
poly = np.polyfit(t, stock_ema, 10) stock_ema_hat = np.polyval(poly, t)
candlestick_ohlc是专门用于画股市K线图的,这个包来自于from matplotlib.finance import candlestick_ohlc
one-hot编码主要解决许多不连续的值,比如【男,女】【小学,初中,高中,本科,其他】,对于这种数据使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。
自然状态码为:000,001,010,011,100,101
one-hot编码为:000001,000010,000100,001000,010000,100000
可以看出one-hot编码每个编码互斥,每次只有一个激活。数据变成稀疏的。在pandas中直接使用get_dummies()对这些离散值进行one-hot编码,如下代码所示,data[col]特定指某一列离散值。
data = data.join(pd.get_dummies(data[col],prefix=col)) print data
此外sklearn提供LabelEncoder,可以一次性将所有离散值进行编码(非one-hot编码)。
le = LabelEncoder() for col in data.columns: data[col] = le.fit_transform(data[col])
MinMaxScaler,说白了就是归一化,计算方式是特征值减去最小值除以最大值减去最小值。
mms = MinMaxScaler() data[col] = mms.fit_transform(data[col].values.reshape(-1,1))
pca主成分分析主要用于降维,但是本质上是坐标系的旋转,比如我们使用pca将多维数据降维成2维数据,降维后的坐标轴,其实没有什么实际的意义,但是pca可以让数据更加可视化,便于理解。
采用单变量特征选择(Univariate feature selection)则是在众多变量中选择最重要的变量,抛弃不重要的变量。
pca = PCA(n_components=2,whiten=True,random_state=0) x = pca.fit_transform(x) print pca.explained_variance_ print pca.explained_variane_ratio_ fs = SelectKBest(chi2,k=2) fs.fit(x,y) idx = fs.get_support(indices=True)//idx 返回选中主要的两列(k=2)
numpy下存在numpy.ravel() 和 numpy.flatten(),两者的功能是一致的(将多维数组降位一维),numpy.flatten()返回一份拷贝,对拷贝所做的修改不会影响(reflects)原始矩阵,而numpy.ravel()返回的是视图(view,也颇有几分C/C++引用reference的意味),会影响(reflects)原始矩阵。
================
附引入包
from sklearn.preprocessing import LabelEncoder from sklearn.preprocessing import MinMaxScaler from sklearn.decomposition import PCA from sklearn.feature_selection import SelectKBest, SelectPercentile, chi2 from sklearn.linear_model import LogisticRegressionCV from sklearn import metrics from sklearn.model_selection import train_test_split from sklearn.pipeline import Pipeline from sklearn.preprocessing import PolynomialFeatures from sklearn.manifold import TSNE from matplotlib.finance import candlestick_ohlc from PIL import Image
参考
https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.convolve.html
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.cut.html
http://blog.csdn.net/ariessurfer/article/details/42526673
http://scikit-learn.org/stable/modules/preprocessing.html#preprocessing
ndarrya用法汇总: http://blog.csdn.net/qingyuanluofeng/article/details/51649789
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html
http://skyrover.me/2016/12/08/Pandas%E4%BD%BF%E7%94%A8%E7%AC%94%E8%AE%B0/