1.pandas的一個技巧
apply() 和applymap()是DataFrame資料類型的函數,map()是Series資料類型的函數。apply()的操作對象DataFrame的一列或者一行資料, applymap()是element-wise的,作用於每個DataFrame的每個資料。 map()也是element-wise的,對Series中的每個資料調用一次函數。 2.PCA分解德國DAX30指數
DAX30指數有三十個股票,聽起來不多的樣子,其實還是挺多的,我們很有必要對其進行主成分分析,然後找出最重要的幾個股票。想必PCA的原理大家應該都是知道,說白了就是在一個迴歸中找到影響最大的那幾個,當然,數學原理就涉及矩陣分解,什麼SVD呀。
先上點代碼
import pandas as pdimport pandas.io.data as webimport numpy as npnp.random.seed(1000)import scipy.stats as scsimport statsmodels.api as smimport matplotlib as mplimport matplotlib.pyplot as pltfrom sklearn.decomposition import KernelPCA#匯入機器學習的PCA包symbols = ['ADS.DE','ALV.DE','BAS.DE','BAYN.DE','BEI.DE','BMW.DE','CBK.DE','CON.DE','DAI.DE', 'DB1.DE','DBK.DE','DPW.DE','DTE.DE','EOAN.DE','FME.DE','FRE.DE','HEI.DE','HEN3.DE', 'IFX.DE','LHA.DE','LIN.DE','LXS.DE','MRK.DE','MUV2.DE','RWE.DE','SAP.DE','SDF.DE', 'SIE.DE','TKA.DE','VOW3.DE','^GDAXI']#DAX30指數各個股票的代碼以及德國30指數代碼,共31個資料列data = pd.DataFrame()for sym in symbols:#擷取資料 data[sym] = web.DataReader(sym,data_source = 'yahoo')['Close']data = data.dropna()#丟棄缺失資料dax = pd.DataFrame(data.pop('^GDAXI'))#將指數資料單獨拿出來,採用pop在擷取的時候已經從原來的地方刪除了這一列資料了scale_function = lambda x:(x-x.mean())/x.std()pca = KernelPCA().fit(data.apply(scale_function))#這裡用到了apply函數。做PCA前,我們要對資料做標準化get_we = lambda x:x/x.sum()print get_we(pca.lambdas_)[:10]
這樣,你就可以看到前十個股票對DAX30指數的貢獻量了。
pca = KernelPCA(n_components = 1).fit(data.apply(scale_function))dax['PCA_1'] =pca.transform(data)dax.apply(scale_function).plot(figsize = (8,4))pca = KernelPCA(n_components = 5).fit(data.apply(scale_function))weights = get_we(pca.lambdas_)dax['PCA_5'] =np.dot(pca.transform(data),weights)
這裡,我們採用只用第一個成分去擬合以及前五個成分去擬合,發現效果好的出奇。這樣我們就做到了降維的工作了。我們再來展開看一下PCA的效果。
plt.figure(figsize = (8,4))plt.scatter(dax['PCA_5'],dax['^GDAXI'],color = 'r')
這裡,我們把PCA後的值與原始值進行散佈圖的繪製,
我們看到,整體效果還是不錯的,但是很顯然,兩邊和中間總是有點問題,所以,如果我們要提高,我們可以在中間分段進行PCA,這樣的話,效果應該會更加好。