1. python數據分析與應用第三章代碼3-5的數據哪來的
savetxt
import numpy as np
i2 = np.eye(2)
np.savetxt("eye.txt", i2)
3.4 讀入CSV文件
# AAPL,28-01-2011, ,344.17,344.4,333.53,336.1,21144800
c,v=np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True) #index從0開始
3.6.1 算術平均值
np.mean(c) = np.average(c)
3.6.2 加權平均值
t = np.arange(len(c))
np.average(c, weights=t)
3.8 極值
np.min(c)
np.max(c)
np.ptp(c) 最大值與最小值的差值
3.10 統計分析
np.median(c) 中位數
np.msort(c) 升序排序
np.var(c) 方差
3.12 分析股票收益率
np.diff(c) 可以返回一個由相鄰數組元素的差
值構成的數組
returns = np.diff( arr ) / arr[ : -1] #diff返回的數組比收盤價數組少一個元素
np.std(c) 標准差
對數收益率
logreturns = np.diff( np.log(c) ) #應檢查輸入數組以確保其不含有零和負數
where 可以根據指定的條件返回所有滿足條件的數
組元素的索引值。
posretindices = np.where(returns > 0)
np.sqrt(1./252.) 平方根,浮點數
3.14 分析日期數據
# AAPL,28-01-2011, ,344.17,344.4,333.53,336.1,21144800
dates, close=np.loadtxt('data.csv', delimiter=',', usecols=(1,6), converters={1:datestr2num}, unpack=True)
print "Dates =", dates
def datestr2num(s):
return datetime.datetime.strptime(s, "%d-%m-%Y").date().weekday()
# 星期一 0
# 星期二 1
# 星期三 2
# 星期四 3
# 星期五 4
# 星期六 5
# 星期日 6
#output
Dates = [ 4. 0. 1. 2. 3. 4. 0. 1. 2. 3. 4. 0. 1. 2. 3. 4. 1. 2. 4. 0. 1. 2. 3. 4. 0.
1. 2. 3. 4.]
averages = np.zeros(5)
for i in range(5):
indices = np.where(dates == i)
prices = np.take(close, indices) #按數組的元素運算,產生一個數組作為輸出。
>>>a = [4, 3, 5, 7, 6, 8]
>>>indices = [0, 1, 4]
>>>np.take(a, indices)
array([4, 3, 6])
np.argmax(c) #返回的是數組中最大元素的索引值
np.argmin(c)
3.16 匯總數據
# AAPL,28-01-2011, ,344.17,344.4,333.53,336.1,21144800
#得到第一個星期一和最後一個星期五
first_monday = np.ravel(np.where(dates == 0))[0]
last_friday = np.ravel(np.where(dates == 4))[-1]
#創建一個數組,用於存儲三周內每一天的索引值
weeks_indices = np.arange(first_monday, last_friday + 1)
#按照每個子數組5個元素,用split函數切分數組
weeks_indices = np.split(weeks_indices, 5)
#output
[array([1, 2, 3, 4, 5]), array([ 6, 7, 8, 9, 10]), array([11,12, 13, 14, 15])]
weeksummary = np.apply_along_axis(summarize, 1, weeks_indices,open, high, low, close)
def summarize(a, o, h, l, c): #open, high, low, close
monday_open = o[a[0]]
week_high = np.max( np.take(h, a) )
week_low = np.min( np.take(l, a) )
friday_close = c[a[-1]]
return("APPL", monday_open, week_high, week_low, friday_close)
np.savetxt("weeksummary.csv", weeksummary, delimiter=",", fmt="%s") #指定了文件名、需要保存的數組名、分隔符(在這個例子中為英文標點逗號)以及存儲浮點數的格式。
.png
格式字元串以一個百分號開始。接下來是一個可選的標志字元:-表示結果左對齊,0表示左端補0,+表示輸出符號(正號+或負號-)。第三部分為可選的輸出寬度參數,表示輸出的最小位數。第四部分是精度格式符,以」.」開頭,後面跟一個表示精度的整數。最後是一個類型指定字元,在例子中指定為字元串類型。
numpy.apply_along_axis(func1d, axis, arr, *args, **kwargs)
>>>def my_func(a):
... """Average first and last element of a 1-D array"""
... return (a[0] + a[-1]) * 0.5
>>>b = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>>np.apply_along_axis(my_func, 0, b) #沿著X軸運動,取列切片
array([ 4., 5., 6.])
>>>np.apply_along_axis(my_func, 1, b) #沿著y軸運動,取行切片
array([ 2., 5., 8.])
>>>b = np.array([[8,1,7], [4,3,9], [5,2,6]])
>>>np.apply_along_axis(sorted, 1, b)
array([[1, 7, 8],
[3, 4, 9],
[2, 5, 6]])
3.20 計算簡單移動平均線
(1) 使用ones函數創建一個長度為N的元素均初始化為1的數組,然後對整個數組除以N,即可得到權重。如下所示:
N = int(sys.argv[1])
weights = np.ones(N) / N
print "Weights", weights
在N = 5時,輸出結果如下:
Weights [ 0.2 0.2 0.2 0.2 0.2] #權重相等
(2) 使用這些權重值,調用convolve函數:
c = np.loadtxt('data.csv', delimiter=',', usecols=(6,),unpack=True)
sma = np.convolve(weights, c)[N-1:-N+1] #卷積是分析數學中一種重要的運算,定義為一個函數與經過翻轉和平移的另一個函數的乘積的積分。
t = np.arange(N - 1, len(c)) #作圖
plot(t, c[N-1:], lw=1.0)
plot(t, sma, lw=2.0)
show()
3.22 計算指數移動平均線
指數移動平均線(exponential moving average)。指數移動平均線使用的權重是指數衰減的。對歷史上的數據點賦予的權重以指數速度減小,但永遠不會到達0。
x = np.arange(5)
print "Exp", np.exp(x)
#output
Exp [ 1. 2.71828183 7.3890561 20.08553692 54.59815003]
Linspace 返回一個元素值在指定的范圍內均勻分布的數組。
print "Linspace", np.linspace(-1, 0, 5) #起始值、終止值、可選的元素個數
#output
Linspace [-1. -0.75 -0.5 -0.25 0. ]
(1)權重計算
N = int(sys.argv[1])
weights = np.exp(np.linspace(-1. , 0. , N))
(2)權重歸一化處理
weights /= weights.sum()
print "Weights", weights
#output
Weights [ 0.11405072 0.14644403 0.18803785 0.24144538 0.31002201]
(3)計算及作圖
c = np.loadtxt('data.csv', delimiter=',', usecols=(6,),unpack=True)
ema = np.convolve(weights, c)[N-1:-N+1]
t = np.arange(N - 1, len(c))
plot(t, c[N-1:], lw=1.0)
plot(t, ema, lw=2.0)
show()
3.26 用線性模型預測價格
(x, resials, rank, s) = np.linalg.lstsq(A, b) #系數向量x、一個殘差數組、A的秩以及A的奇異值
print x, resials, rank, s
#計算下一個預測值
print np.dot(b, x)
3.28 繪制趨勢線
>>> x = np.arange(6)
>>> x = x.reshape((2, 3))
>>> x
array([[0, 1, 2], [3, 4, 5]])
>>> np.ones_like(x) #用1填充數組
array([[1, 1, 1], [1, 1, 1]])
類似函數
zeros_like
empty_like
zeros
ones
empty
3.30 數組的修剪和壓縮
a = np.arange(5)
print "a =", a
print "Clipped", a.clip(1, 2) #將所有比給定最大值還大的元素全部設為給定的最大值,而所有比給定最小值還小的元素全部設為給定的最小值
#output
a = [0 1 2 3 4]
Clipped [1 1 2 2 2]
a = np.arange(4)
print a
print "Compressed", a.compress(a > 2) #返回一個根據給定條件篩選後的數組
#output
[0 1 2 3]
Compressed [3]
b = np.arange(1, 9)
print "b =", b
print "Factorial", b.prod() #輸出數組元素階乘結果
#output
b = [1 2 3 4 5 6 7 8]
Factorial 40320
print "Factorials", b.cumprod()
#output
2. jieba分詞(R vs. python)
自然語言處理(NLP)是機器學習重要分支之一,主要應用於篇章理解、文本摘要、情感分析、知識圖譜、文本翻譯等領域。而NLP應用首先是對文本進行分詞,當前中文分詞器有Ansj、paoding、盤古分詞等多種,而最基礎的分詞器應該屬於jieba分詞器(比較見下圖)。
下面將分別應用R和python對jieba分詞器在中文分詞、詞性標注和關鍵詞提取領域的應用進行比較。
R實現
通過函數worker()來初始化分詞引擎,使用segment()進行分詞。有四種分詞模式:最大概率法(MP)、隱馬爾科夫模型(HMM)、混合模型(Mix)及索引模型(query),默認為混合模型。具體可查看help(worker).
#install.packages('jiebaR')library(jiebaR)mixseg <- worker()segment( "這是一段測試文本" , mixseg ) #或者用以下操作mixseg['這是一段測試文本']mixseg <= "這是一段測試文本"
python實現
python中需安裝jieba庫,運用jieba.cut實現分詞。cut_all參數為分詞類型,默認為精確模式。
import jiebaseg_list = jieba.cut(u"這是一段測試文本",cut_all = False)print("Full mode: "+ ",".join(seg_list)) #默認精確模式
無論是R還是python都為utf—8編碼。
R實現
可以使用<=.tagger 或者tag 來進行分詞和詞性標注,詞性標注使用混合模型模型分詞,標注採用和 ictclas 兼容的標記法。
words = "我愛北京天安門"tagger = worker("tag") #開啟詞性標注啟發器tagger <= words # r v ns ns # "我" "愛" "北京" "天安門"
python實現
#詞性標注import jieba.posseg as psegwords = pseg.cut("我愛北京天安門")for word,flag in words: print('%s, %s' %(word,flag))
R實現
R關鍵詞提取使用逆向文件頻率(IDF)文本語料庫,通過worker參數「keywords」開啟關鍵詞提取啟發器,topn參數為關鍵詞的個數。
keys = worker("keywords",topn = 5, idf = IDFPATH)keys <= "會議邀請到美國密歇根大學(University of Michigan, Ann Arbor)環境健康科學系副教授奚傳武博士作題為「Multibarrier approach for safe drinking waterin the US : Why it failed in Flint」的學術講座,介紹美國密歇根Flint市飲用水污染事故的發生發展和處置等方面內容。講座後各相關單位同志與奚傳武教授就生活飲用水在線監測系統、美國水污染事件的處置方式、生活飲用水老舊管網改造、如何有效減少消毒副產物以及美國涉水產品和二次供水單位的監管模式等問題進行了探討和交流。本次交流會是我市生活飲用水衛生管理工作洽商機制運行以來的又一次新嘗試,也為我市衛生計生綜合監督部門探索生活飲用水衛生安全管理模式及突發水污染事件的應對措施開拓了眼界和思路。"#結果:# 48.8677 23.4784 22.1402 20.326 18.5354 # "飲用水" "Flint" "衛生" "水污染" "生活"
python實現
python實現關鍵詞提取可運用TF-IDF方法和TextRank方法。allowPOS參數為限定范圍詞性類型。
#關鍵詞提取import jieba.analysecontent = u'會議邀請到美國密歇根大學(University of Michigan, Ann Arbor)環境健康科學系副教授奚傳武博士作題為「Multibarrier approach for safe drinking waterin the US : Why it failed in Flint」的學術講座,介紹美國密歇根Flint市飲用水污染事故的發生發展和處置等方面內容。講座後各相關單位同志與奚傳武教授就生活飲用水在線監測系統、美國水污染事件的處置方式、生活飲用水老舊管網改造、如何有效減少消毒副產物以及美國涉水產品和二次供水單位的監管模式等問題進行了探討和交流。本次交流會是我市生活飲用水衛生管理工作洽商機制運行以來的又一次新嘗試,也為我市衛生計生綜合監督部門探索生活飲用水衛生安全管理模式及突發水污染事件的應對措施開拓了眼界和思路。'#基於TF-IDFkeywords = jieba.analyse.extract_tags(content,topK = 5,withWeight = True,allowPOS = ('n','nr','ns'))for item in keywords: print item[0],item[1] #基於TF-IDF結果# 飲用水 0.448327672795# Flint 0.219353532163# 衛生 0.203120821773# 水污染 0.186477211628# 生活 0.170049997544
#基於TextRankkeywords = jieba.analyse.textrank(content,topK = 5,withWeight = True,allowPOS = ('n','nr','ns'))for item in keywords: print item[0],item[1] #基於TextRank結果:# 飲用水 1.0# 美國 0.570564785973# 奚傳武 0.510738424509# 單位 0.472841889334# 講座 0.443770732053
寫在文後
自然語言處理(NLP)在數據分析領域有其特殊的應用,在R中除了jiebaR包,中文分詞Rwordseg包也非常常用。一般的文本挖掘步驟包括:文本獲取(主要用網路爬取)——文本處理(分詞、詞性標注、刪除停用詞等)——文本分析(主題模型、情感分析)——分析可視化(詞雲、知識圖譜等)。本文是自然語言處理的第一篇,後續將分別總結下應用深度學習Word2vec進行詞嵌入以及主題模型、情感分析的常用NLP方法。
參考資料
Introction · jiebaR 中文分詞 https://qinwenfeng.com/jiebaR/segment.html
知乎:【文本分析】利用jiebaR進行中文分詞 https://zhuanlan.hu.com/p/24882048
雪晴數據網:全棧數據工程師養成攻略 http://www.xueqing.tv/course/73
搜狗實驗室,詞性標注應用 http://www.sogou.com/labs/webservice/
【R文本挖掘】中文分詞Rwordseg http://blog.163.com/zzz216@yeah/blog/static/162554684201412895732586/
3. 隱式馬爾科夫模型 及 Python + HMMlearn的使用
hmmlearn
隱式馬爾科夫模型Hidden Markov Models(HMMs) 是一種通用的概率模型。一個可觀測的變數X的序列被一個內部的隱藏狀態Z所生成。其中,隱藏狀態Z無法被直接觀測。在隱藏狀態之間的轉移被假設是通過 馬爾科夫鏈(Markov chain) 的形式。
模型可以表示為 起始概率向量 和轉移概率矩陣 . 一個觀測量生成的概率可以是關於 的任意分布, 基於當前的隱藏狀態。
HMMs的3個基本問題:
hmmlearn 是Python支持HMMs的包。原來是sklearn的一部分,後來由於介面不一致分成單獨的包了。不過使用起來和sklearn的其他模型類似。
構造HMM model:
初始化的參數主要有 n_components , covariance_type , n_iter 。每個參數的作用我還沒有研究。
通過 fit 方法。
輸入是一個矩陣,包含拼接的觀察序列concatenated sequences of observation (也就是samples),和序列的長度。
EM演算法是背後擬合模型的演算法。基於梯度優化的方法。通常會卡到一個局部極優值上。通常用戶需要用不同的初始化跑多次 fit ,然後選擇分數最高的模型。
分數通過 score 方法計算。
推導出的最優的隱藏狀態可以調用 predict 方法獲得。 predict 方法可以指定解碼器演算法。當前支持的有 viterbi (Vierbi algorithm)和 map (posteriori estimation)。