toxpython
Ⅰ pytest為啥不能運行指定目錄下的用例
pytest是一個基於python的測試框架,使用非常靈活,通常可以通過命彎坦令行選項來指定需要運行的測試用例。
如果您不能運行指定目錄下的用例,可能有以下幾種可能性:
1. 語法錯誤或者代碼錯誤:請檢查代碼或者測試用例腳本埋顫桐是否有語法錯誤或者代碼錯誤,這可能會導致pytest無法正確讀取測試用例文件。
2. pytest命令行選項設置錯誤:請確保您正確設置了洞談pytest的命令行選項。例如,如果您想運行指定目錄下的測試用例,請在控制台輸入 `pytest /path/to/your/test/directory`。
3. 測試用例文件名錯誤:請檢查測試用例文件名是否正確,pytest默認識別以 `test_*.py` 或者 `*_test.py` 命名的測試用例文件。
4. 依賴包安裝問題:請確保您正確安裝了pytest以及相關依賴包,如果缺少必要的依賴包,可能會導致pytest無法運行測試用例。
如果以上方法都無法解決問題,建議您查看pytest的日誌輸出,以確定具體的錯誤信息。
Ⅱ 為什麼說Python是大數據全棧式開發語言
就像只要會JavaScript就可以寫出完整的Web應用,只要會Python,就可以實現一個完整的大數據處理平台。
雲基礎設施
這年頭,不支持雲平台,不支持海量數據,不支持動態伸縮,根本不敢說自己是做大數據的,頂多也就敢跟人說是做商業智能(BI)。
雲平台分為私有雲和公有雲。私有雲平台如日中天的 OpenStack
,就是Python寫的。曾經的追趕者CloudStack,在剛推出時大肆強調自己是Java寫的,比Python有優勢。結果,搬石砸腳,2015年
初,CloudStack的發起人Citrix宣布加入OpenStack基金會,CloudStack眼看著就要壽終正寢。
如果嫌麻煩不想自己搭建私有雲,用公有雲,不論是AWS,GCE,Azure,還是阿里雲,青雲,在都提供了Python SDK,其中GCE只提供Python和JavaScript的SDK,而青雲只提供Python SDK。可見各家雲平台對Python的重視。
提到基礎設施搭建,不得不提Hadoop,在今天,Hadoop因為其MapRece數據處理速度不夠快,已經不再作為大數據處理的首選,但
是HDFS和Yarn——Hadoop的兩個組件——倒是越來越受歡迎。Hadoop的開發語言是Java,沒有官方提供Python支持,不過有很多第
三方庫封裝了Hadoop的API介面(pydoop,hadoopy等等)。
Hadoop MapRece的替代者,是號稱快上100倍的 Spark ,其開發語言是Scala,但是提供了Scala,Java,Python的開發介面,想要討好那麼多用Python開發的數據科學家,不支持Python,真是說不過去。HDFS的替代品,比如GlusterFS, Ceph 等,都是直接提供Python支持。Yarn的替代者, Mesos 是C++實現,除C++外,提供了Java和Python的支持包。
DevOps
DevOps有個中文名字,叫做 開發自運維 。互聯網時代,只有能夠快速試驗新想法,並在第一時間,安全、可靠的交付業務價值,才能保持競爭力。DevOps推崇的自動化構建/測試/部署,以及系統度量等技術實踐,是互聯網時代必不可少的。
自動化構建是因應用而易的,如果是Python應用,因為有setuptools, pip, virtualenv, tox,
flake8等工具的存在,自動化構建非常簡單。而且,因為幾乎所有Linux系統都內置Python解釋器,所以用Python做自動化,不需要系統預
安裝什麼軟體。
自動化測試方面,基於Python的 Robot Framework 企業級應用最喜歡的自動化測試框架,而且和語言無關。Cucumber也有很多支持者,Python對應的Lettuce可以做到完全一樣的事情。 Locust 在自動化性能測試方面也開始受到越來越多的關注。
自動化配置管理工具,老牌的如Chef和Puppet,是Ruby開發,目前仍保持著強勁的勢頭。不過,新生代 Ansible 和 SaltStack ——均為Python開發——因為較前兩者設計更為輕量化,受到越來越多開發這的歡迎,已經開始給前輩們製造了不少的壓力。
在系統監控與度量方面,傳統的Nagios逐漸沒落,新貴如 Sensu 大受好評,雲服務形式的New Relic已經成為創業公司的標配,這些都不是直接通過Python實現的,不過Python要接入這些工具,並不困難。
除了上述這些工具,基於Python,提供完整DevOps功能的PaaS平台,如 Cloudify 和 Deis ,雖未成氣候,但已經得到大量關注。
網路爬蟲
大數據的數據從哪裡來?除了部分企業有能力自己產生大量的數據,大部分時候,是需要靠爬蟲來抓取互聯網數據來做分析。
網路爬蟲是Python的傳統強勢領域,最流行的爬蟲框架Scrapy,HTTP工具包urlib2,HTML解析工具beautifulsoup,XML解析器lxml,等等,都是能夠獨當一面的類庫。
不過,網路爬蟲並不僅僅是打開網頁,解析HTML這么簡單。高效的爬蟲要能夠支持大量靈活的並發操作,常常要能夠同時幾千甚至上萬個網頁同時抓取,傳統的
線程池方式資源浪費比較大,線程數上千之後系統資源基本上就全浪費在線程調度上了。Python由於能夠很好的支持協程( Coroutine )操作,基於此發展起來很多並發庫,如Gevent,Eventlet,還有Celery之類的分布式任務框架。被認為是比AMQP更高效的ZeroMQ也是最早就提供了Python版本。有了對高並發的支持,網路爬蟲才真正可以達到大數據規模。
抓取下來的數據,需要做分詞處理,Python在這方面也不遜色,著名的自然語言處理程序包NLTK,還有專門做中文分詞的Jieba,都是做分詞的利器。
數據處理
萬事俱備,只欠東風。這東風,就是數據處理演算法。從統計理論,到數據挖掘,機器學習,再到最近幾年提出來的深度學習理論,數據科學正處於百花齊放的時代。數據科學家們都用什麼編程?
如果是在理論研究領域,R語言也許是最受數據科學家歡迎的,但是R語言的問題也很明顯,因為是統計學家們創建了R語言,所以其語法略顯怪異。而且
R語言要想實現大規模分布式系統,還需要很長一段時間的工程之路要走。所以很多公司使用R語言做原型試驗,演算法確定之後,再翻譯成工程語言。
Python也是數據科學家最喜歡的語言之一。和R語言不同,Python本身就是一門工程性語言,數據科學家用Python實現的演算法,可以直
接用在產品中,這對於大數據初創公司節省成本是非常有幫助的。正式因為數據科學家對Python和R的熱愛,Spark為了討好數據科學家,對這兩種語言
提供了非常好的支持。
Python的數據處理相關類庫非常多。高性能的科學計算類庫NumPy和SciPy,給其他高級演算法打了非常好的基礎,matploglib讓
Python畫圖變得像Matlab一樣簡單。Scikit-learn和Milk實現了很多機器學習演算法,基於這兩個庫實現的 Pylearn2 ,是深度學習領域的重要成員。 Theano 利用GPU加速,實現了高性能數學符號計算和多維矩陣計算。當然,還有 Pandas ,一個在工程領域已經廣泛使用的大數據處理類庫,其DataFrame的設計借鑒自R語言,後來又啟發了Spark項目實現了類似機制。
對了,還有 iPython ,這個工具如此有用,以至於我差點把他當成標准庫而忘了介紹。iPython是一個互動式Python運行環境,能夠實時看到每一段Python代碼的結果。默認情況下,iPython運行在命令行,可以執行 ipython notebook 在網頁中運行。用matplotlib繪制的圖可以直接嵌入式的顯示在iPython Notebook中。
iPython Notebook的筆記本文件可以共享給其他人,這樣其他人就可以在自己的環境中重現你的工作成果;如果對方沒有運行環境,還可以直接轉換成HTML或者PDF。
為什麼是Python
正是因為應用開發工程師、運維工程師、數據科學家都喜歡Python,才使得Python成為大數據系統的全棧式開發語言。
對於開發工程師而言,Python的優雅和簡潔無疑是最大的吸引力,在Python互動式環境中,執行 import this
,讀一讀Python之禪,你就明白Python為什麼如此吸引人。Python社區一直非常有活力,和NodeJS社區軟體包爆炸式增長不
同,Python的軟體包增長速度一直比較穩定,同時軟體包的質量也相對較高。有很多人詬病Python對於空格的要求過於苛刻,但正是因為這個要求,才
使得Python在做大型項目時比其他語言有優勢。OpenStack項目總共超過200萬行代碼,證明了這一點。
對於運維工程師而言,Python的最大優勢在於,幾乎所有Linux發行版都內置了Python解釋器。Shell雖然功能強大,但畢竟語法不夠優雅,寫比較復雜的任務會很痛苦。用Python替代Shell,做一些復雜的任務,對運維人員來說,是一次解放。
對於數據科學家而言,Python簡單又不失強大。和C/C++相比,不用做很多的底層工作,可以快速進行模型驗證;和Java相比,Python語法簡
潔,表達能力強,同樣的工作只需要1/3代碼;和Matlab,Octave相比,Python的工程成熟度更高。不止一個編程大牛表達過,Python
是最適合作為大學計算機科學編程課程使用的語言——MIT的計算機入門課程就是使用的Python——因為Python能夠讓人學到編程最重要的東西——
如何解決問題。
Ⅲ Python自動化測試框架有哪些
分享一些可用的Python自動化測試框架。
自動化測試常用的Python框架有哪些?常用的框架有Robot Framework、Pytest、UnitTest/PyUnit、Behave、Lettuce。Pytest、Robot Framework和UnitTest主要用於功能與單元測試,Lettuce和Behave僅適用於行為驅動測試。
一、Robot Framework
Python測試框架之一,Robot Framework被用在測試驅動(test-driven)類型的開發與驗收中。雖然是由Python開發而來,但是它也可以在基於.Net的IronPython和基於Java的Jython上運行。作為一個Python框架,Robot還能夠兼容諸如Windows、MacOS、以及Linux等平台。
在使用Robot Framework(RF)之前,需要先安裝Python 2.7.14及以上的版本。推薦使用Python 3.6.4,以確保適當的注釋能夠被添加到代碼段中,並能夠跟蹤程序的更改。同時還需要安裝Python包管理器--pip。
二、Pytest
適用於多種軟體測試的Pytest,是另一個Python類型的自動化測試框架。憑借著其開源和易學的特點,該工具經常被QA(質量分析)團隊、開發團隊、個人團隊、以及各種開源項目所使用。鑒於Pytest具有「斷言重寫(assert rewriting)」之類的實用功能,許多大型互聯網應用,如Dropbox和Mozilla,都已經從下面將要提到的unittest(Pyunit)切換到了Pytest之上。
除了基本的Python知識,用戶並不需要更多的技術儲備。另外,用戶只需要有一台帶有命令行界面的測試設備,並且安裝好了Python包管理器、以及可用於開發的IDE工具。
三、UnitTest/PyUnit
UnitTest/PyUnit一種標准化的針對單元測試的Python類自動化測試框架。基類TestCase提供了各種斷言方法、以及所有清理和設置的常式。因此,TestCase子類中的每一種方法都是以「test」作為名詞前綴,以標識它們能夠被作為測試用例所運行。用戶可以使用load方法和TestSuite類來分組、並載入各種測試。
可以通過聯合使用,來構建自定義的測試運行器。正如我們使用Junit去測試Selenium那樣,UnitTest也會用到UnitTest-sml-reporting、並能生成各種XML類型的報告。由於UnitTest默認使用了Python,因此我們並不需要什麼先決條件。除了需要具備Python框架的基本知識,您也可以額外地安裝pip、以及用於開發的IDE工具。
四、Behave
行為驅動開發是一種基於敏捷軟體開發的方法。它能夠鼓勵開發人員、業務參與者和QA人員,三者之間的協作。Python測試框架Behave允許團隊避開各種復雜的情況,去執行BDD測試。從本質上說該框架與SpecFlow和Cucumber相似,常被用於執行自動化測試。用戶可以通過簡單易讀的語言來編寫測試用例,並能夠在其執行期間粘貼到代碼之中。而且,那些被設定的行為規范與步驟,也可以被重用到其他的測試方案中。
任何具備Python基礎知識的人都可以使用Behave。其他先決條件還包括:先安裝Python 2.7.14及以上的版本。通過Python包管理器或pip來與Behave協作。大多數開發人員會選擇Pycharm作為開發環境,當然您也可以選用其他的IDE工具。
五、Lettuce
Lettuce是另一種基於Cucumber和Python的行為驅動類自動化工具。Lettuce主要專注於那些具有行為驅動開發特徵的普通任務。它不但簡單易用,而且能夠使得整個測試過程更流暢、甚至更有趣。安裝帶有IDE的Python 2.7.14、及以上的版本。當然,您也可以使用Pycharm或任何其他IDE工具。同時,您還需要安裝Python包管理器。
自動化測試的Python框架,Pytest、Robot Framework和UnitTest可主要用於功能與單元測試,而Lettuce和Behave僅適用於行為驅動測試。對於功能測試而言,Pytest是的。如果您是基於Python自動化測試的新手,Robot Framework是的入門工具。雖然其功能有所受限,但是它非常容易上手。對於基於Python的BDD測試而言,Lettuce和Behave同樣優秀。不過,如果你已經有了一定的Pytest經驗,那麼請使用Pytest-bdd。
Ⅳ Python自動化測試框架有哪些
1、Pytest
適用於多種軟體測試的Pytest,是另一個Python類型的自動化測試框架。憑借著其開源和易學的特點,該工具經常被QA團隊、開發團隊、個人團隊以及各種開源項目所使用。鑒於Pytest具有斷言重寫之類的實用功能,許多大型互聯網應用,如Dropbox和Mozilla,都已經從下面將要提到的unittest切換到Pytest之上。
2、Robot Framework
作為重要的Python測試框架之一,Robot
Framework主要被用在測試驅動類型的開發與驗收中。雖然是由Python開發而來,但是它也可以在基於.net的IronPython和基於段兄Java的Jython上運行。同時,作為一個Python框架,Robot還能夠兼容諸如Windows、MacOS、以及Linux等平台。
3、UnitTest/PyUnit
受到了JUnit啟發的UnitTest/PyUnit,也是一種標准化的針對單元測試的Python類自動化測試框架。它的基類TestCase提供了各種斷言方法、以及所有清理和設置的常式。因此,TestCase子類中的每一種方法都是以test作為名詞前綴,以標識它們能夠握蔽襲被作為測試用例所運行。用戶可以使用load方法和TestSuite類來分組、並載入各種測試。當然,您也可以通過聯合使用,來構建自定義的測試運行器。正如我們使用Junit去測試selenium那樣,UnitTest也會用到UnitTest-sml-reporting、並能生成各種xml類型的報告。
4、Behave
我們都知道:行為驅動開發,是一種基於敏捷軟體開發的方法。它能夠鼓勵開發人員、業務參與者和QA人員,三者之間的協作。作為另一種Python測試框架,Behave允許團隊避開各種復雜的情況,去執行BDD測試。從本質上說,該框架與SpecFlow和Cucumber非常相似,常被用於執行自動化測試。用戶可以通過簡單易讀的語言來編寫測試用例,並能夠在其執行期間粘貼到代碼之中。而且,那些被設定的行為規范與步驟,也可以被重用到其他的測試方案中。
5、Lettuce
Lettuce是另一種基於Cucumber和Python的行為並衫驅動類自動化工具。Lettuce主要專注於那些具有行為驅動開發特徵的普通任務。它不但簡單易用,而且能夠使得整個測試過程更流暢、甚至更有趣。
Ⅳ 銷售量服從泊松分布,怎樣獲取最大利潤
如何實現大數據利潤最大利潤化
制定合適的價格很重要,再怎麼誇大都不過分。價格提高1%意味著經營利潤平均可以增長8.7%(當然,假設銷量沒有損失)。不過我們估計,在許多公司每年制定的成千上萬個定價決策中,多達30%未能給出最合適的價格——這意味著收入大量流失。而且考慮到如今海量數據為公司提供了難得的機會,可以做出合理得多的定價決策,這種現狀尤其令人不安。對那些能夠井然有序地應對復雜的大數據的公司而言,這蘊含著巨大價值。
將數據轉化為利潤的四個步驟
想制定更合適的價格,關鍵是完全明白現在可供公司使用的數據。這就需要放大目標,而不是縮小目標。正如綜合性能源和化工企業沙索(Sasol)集團副總裁兼營銷和銷售總經理湯姆·奧布賴恩(Tom O』Brien)提及這種做法時說:「銷售團隊知道價格,還可能知道銷量,但這種做法需要了解更多信息:極其精細的數據,實際上來自每一張發票,按產品、客戶和包裝分門別類。」
事實上,將大數據成功應用於B2B環境方面最激動人心的一些例子實際上不僅僅著眼於定價,還涉及一家公司的商業引擎的其他方面。比如說,「動態交易評分」(dynamic deal scoring)提供了單筆交易層面的價格指導,還提供了決策逐級上報點、激勵機制、績效評分及更多方面,立足於一系列相似的盈/虧交易。使用較小的、相關的交易樣本很有必要,因為與任何一筆交易息息相關的因素會有變化,這導致一系列總體交易成為毫無用處的衡量基準。我們已見過這種方法應用於技術行業,取得了巨大成功。將銷售利潤率提高了4到8個百分點(相對於同一家公司的對照組)。
想獲得足夠精細的數據,公司就要做好這四項工作
傾聽數據。制定最合理的價格不是牽涉數據的挑戰(公司通常已經坐擁龐大的數據寶庫),而是牽涉分析的挑戰。最出色的B2C公司知道如何解釋自己擁有的海量數據,並見機行事,但B2B公司往往一味管理數據,而不是利用數據推動決策。優秀的分析工具可以幫助公司確定經常被忽視的因素(比如更宏觀的經濟形勢、產品偏好以及銷售代表的洽談),揭示什麼因素左右針對每個客戶群和產品的價格。
提高自動化。人工分析數千種孝頃產品太耗費時間和財力。自動化系統可以識別狹小的客戶群,確定什麼因素左右每個客戶群的價值,並且拿來與歷史交易數據進行比較。這樣一來,公司就可以根據數據,為產品群和客戶群制定有針對性的價格。自動化還大大簡化了復制和調整分析的工作,因此沒必要每次都從頭開始分析。
培養技能、樹立信心。實施新價格既在運營方面帶來了挑戰,又在溝通攜族方面帶來了挑戰。成功的公司非常注重深思熟慮的變革計劃,幫助銷售隊伍了解並接受新的定價方法。公司需要與銷售代表們齊心協力,解釋為什麼實行建議價,這巧隱陸套價格體系是如何運作的,那樣銷售代表就會非常信任價格,從而竭力說服顧客。同樣重要的是制定一套明確清晰的溝通方法,為價格給出一個理由,從而著重突出價值,然後針對具體顧客給出相應的理由。全面的洽談培訓也至關重要,以便讓銷售代表獲得信心和工具,那樣與客戶面對面交流時,能拿出頗有說服力的理由。最優秀的領導陪同銷售代表會見最難拿下的客戶,專注於迅速見效,那樣銷售代表就能樹立起信心,積極奉行新的定價方法。林德集團旗下瑞士PanGas AG公司的總經理羅伯特·克里格(Robert Krieger)說:「表明領導層支持這種新的定價方法這個立場,至關重要。為此,我們採取的做法就是領導層與銷售代表一起拜見難纏的客戶。我們不僅能夠幫助銷售代表,還能夠闡明為什麼制定新價格。」
積極管理績效。想改善績效管理,公司就需要藉助實用的績效指標支持銷售隊伍。最大的影響來自確保銷售一線對於客戶帶來的利潤瞭然於胸;銷售和營銷部門擁有合適的分析技能,得以發現機會,並牢牢抓住機會。還需要將權力下放給銷售隊伍,讓他們自行調整價格,而不是依賴集中式團隊。這不僅需要創業理念,還需要在針對特定的客戶制定價格策略時有一定的創造力。在改變定價策略和績效衡量標準的同時,可能還要改變激勵機制。
我們已經看到了這一幕:軟體、化工、建材和電信等眾多行業的公司利用大數據,幫助制定更合理的定價決策,因而收到顯著成效。這些公司都有數量眾多的庫存單位(SKU)和交易,還有一大批高度分散的客戶;重新制定價格後,都發現利潤率提高了3%到8%,這些價格是在極其精細的產品數據層面制定的。僅舉一例,一家歐洲建材公司為幾種有所選擇的產品制定合適的價格後,利潤增幅高達20%。如果公司想制定合適的價格,就應該充分利用大數據,並投入足夠的資源來支持銷售代表,否則它們會發現自己在為此付出高昂的代價:利潤流失。
轉載請註明:數據分析 » 如何實現大數據利潤最大利潤化
量化分析師的Python_python 金融量化分析_python金融大數據分析
量化分析師的Python_python 金融量化分析_python金融大數據分析
一、SciPy概述
前篇已經大致介紹了NumPy,接下來讓我們看看SciPy能做些什麼。NumPy替我們搞定了向量和矩陣的相關操作,基本上算是一個高級的科學計算器。SciPy基於NumPy提供了更為豐富和高級的功能擴展,在統計、優化、插值、數值積分、時頻轉換等方面提供了大量的可用函數,基本覆蓋了基礎科學計算相關的問題。
在量化分析中,運用最廣泛的是統計和優化的相關技術,本篇重點介紹SciPy中的統計和優化模塊,其他模塊在隨後系列文章中用到時再做詳述。
本篇會涉及到一些矩陣代數,如若感覺不適,可考慮跳過第三部分或者在理解時簡單採用一維的標量代替高維的向量。
首先還是導入相關的模塊,我們使用的是SciPy裡面的統計和優化部分:
In[1]:
import numpy as npimport scipy.stats as statsimport scipy.optimize as opt
二、統計部分2.1 生成隨機數
我們從生成隨機數開始,這樣方便後面的介紹。生成n個隨機數可用rv_continuous.rvs(size=n)或rv_discrete.rvs(size=n),其中rv_continuous表示連續型的隨機分布,如均勻分布(uniform)、正態分布(norm)、貝塔分布(beta)等;rv_discrete表示離散型的隨機分布,如伯努利分布(bernoulli)、幾何分布(geom)、泊松分布(poisson)等。我們生成10個[0, 1]區間上的隨機數和10個服從參數$a = 4$,$b = 2$的貝塔分布隨機數:
In[2]:
rv_unif = stats.uniform.rvs(size=10)print rv_unifrv_beta = stats.beta.rvs(size=10, a=4, b=2)print rv_beta
[ 0.20630272 0.25929204 0.16859206 0.92573462 0.16383319 0.3475617 0.83792048 0.79574153 0.37945051 0.23439682][ 0.71216492 0.85688464 0.70310131 0.3783662 0.69507561 0.78626586 0.54529967 0.4261079 0.26646767 0.8519046 ]
在每個隨機分布的生成函數里,都內置了默認的參數,如均勻分布的上下界默認是0和1。可是一旦需要修改這些參數,每次生成隨機都要敲這么老長一串有點麻煩,能不能簡單點?SciPy里頭有一個Freezing的功能,可以提供簡便版本的命令。SciPy.stats支持定義出某個具體的分布的對象,我們可以做如下的定義,讓beta直接指代具體參數$a = 4$和$b = 2$的貝塔分布。為讓結果具有可比性,這里指定了隨機數的生成種子,由NumPy提供。
In[3]:
np.random.seed(seed=2015)rv_beta = stats.beta.rvs(size=10, a=4, b=2)print "method 1:"print rv_betanp.random.seed(seed=2015)beta = stats.beta(a=4, b=2)print "method 2:"print beta.rvs(size=10)
method 1:[ 0.43857338 0.9411551 0.75116671 0.92002864 0.62030521 0.56585548 0.41843548 0.5953096 0.88983036 0.94675351]method 2:[ 0.43857338 0.9411551 0.75116671 0.92002864 0.62030521 0.56585548 0.41843548 0.5953096 0.88983036 0.94675351]
2.2 假設檢驗
好了,現在我們生成一組數據,並查看相關的統計量(相關分布的參數可以在這里查到:http://docs.scipy.org/doc/scipy/reference/stats.html):
In[4]:
norm_dist = stats.norm(loc=0.5, scale=2)n = 200dat = norm_dist.rvs(size=n)print "mean of data is: " + str(np.mean(dat))print "median of data is: " + str(np.median(dat))print "standard deviation of data is: " + str(np.std(dat))
mean of data is: 0.705195138069median of data is: 0.658167882933standard deviation of data is: 2.08967006905
假設這個數據是我們獲取到的實際的某些數據,如股票日漲跌幅,我們對數據進行簡單的分析。最簡單的是檢驗這一組數據是否服從假設的分布,如正態分布。這個問題是典型的單樣本假設檢驗問題,最為常見的解決方案是採用K-S檢驗( Kolmogorov-Smirnov test)。單樣本K-S檢驗的原假設是給定的數據來自和原假設分布相同的分布,在SciPy中提供了kstest函數,參數分別是數據、擬檢驗的分布名稱和對應的參數:
In[5]:
mu = np.mean(dat)sigma = np.std(dat)stat_val, p_val = stats.kstest(dat, 'norm', (mu, sigma))print 'KS-statistic D = %6.3f p-value = %6.4f' % (stat_val, p_val)
KS-statistic D = 0.045 p-value = 0.8195
假設檢驗的$p$-value值很大(在原假設下,$p$-value是服從[0, 1]區間上的均勻分布的隨機變數,可參考http://en.wikipedia.org/wiki/P-value ),因此我們接受原假設,即該數據通過了正態性的檢驗。在正態性的前提下,我們可進一步檢驗這組數據的均值是不是0。典型的方法是$t$檢驗($t$-test),其中單樣本的$t$檢驗函數為ttest_1samp:
In[6]:
stat_val, p_val = stats.ttest_1samp(dat, 0)print 'One-sample t-statistic D = %6.3f, p-value = %6.4f' % (stat_val, p_val)
One-sample t-statistic D = 4.761, p-value = 0.0000
我們看到$p$-value$ < 0.05$,即給定顯著性水平0.05的前提下,我們應拒絕原假設:數據的均值為0。我們再生成一組數據,嘗試一下雙樣本的$t$檢驗(ttest_ind):
In[7]:
norm_dist2 = stats.norm(loc=-0.2, scale=1.2)dat2 = norm_dist2.rvs(size=n/2)stat_val, p_val = stats.ttest_ind(dat, dat2, equal_var=False)print 'Two-sample t-statistic D = %6.3f, p-value = %6.4f' % (stat_val, p_val)
Two-sample t-statistic D = 5.565, p-value = 0.0000
注意,這里我們生成的第二組數據樣本大小、方差和第一組均不相等,在運用$t$檢驗時需要使用Welch』s $t$-test,即指定ttest_ind中的equal_var=False。我們同樣得到了比較小的$p$-value$,在顯著性水平0.05的前提下拒絕原假設,即認為兩組數據均值不等。
stats還提供其他大量的假設檢驗函數,如bartlett和levene用於檢驗方差是否相等;anderson_ksamp用於進行Anderson-Darling的K-樣本檢驗等。
2.3 其他函數
有時需要知道某數值在一個分布中的分位,或者給定了一個分布,求某分位上的數值。這可以通過cdf和ppf函數完成:
In[8]:
g_dist = stats.gamma(a=2)print "quantiles of 2, 4 and 5:"print g_dist.cdf([2, 4, 5])print "Values of 25%, 50% and 90%:"print g_dist.pdf([0.25, 0.5, 0.95])
quantiles of 2, 4 and 5:[ 0.59399415 0.90842181 0.95957232]Values of 25%, 50% and 90%:[ 0.1947002 0.30326533 0.36740397]
對於一個給定的分布,可以用moment很方便的查看分布的矩信息,例如我們查看$N(0, 1)$的六階原點矩:
In[9]:
stats.norm.moment(6, loc=0, scale=1)
Out[9]:
15.000000000895332
describe函數提供對數據集的統計描述分析,包括數據樣本大小,極值,均值,方差,偏度和峰度:
In[10]:
norm_dist = stats.norm(loc=0, scale=1.8)dat = norm_dist.rvs(size=100)info = stats.describe(dat)print "Data size is: " + str(info[0])print "Minimum value is: " + str(info[1][0])print "Maximum value is: " + str(info[1][1])print "Arithmetic mean is: " + str(info[2])print "Unbiased variance is: " + str(info[3])print "Biased skewness is: " + str(info[4])print "Biased kurtosis is: " + str(info[5])
Data size is: 100Minimum value is: -4.12414564687Maximum value is: 4.82577602489Arithmetic mean is: 0.0962913592209Unbiased variance is: 2.88719292463Biased skewness is: -0.00256548794681Biased kurtosis is: -0.317463421177
當我們知道一組數據服從某些分布的時候,可以調用fit函數來得到對應分布參數的極大似然估計(MLE, maximum-likelihood estimation)。以下代碼示例了假設數據服從正態分布,用極大似然估計分布參數:
In[11]:
norm_dist = stats.norm(loc=0, scale=1.8)dat = norm_dist.rvs(size=100)mu, sigma = stats.norm.fit(dat)print "MLE of data mean:" + str(mu)print "MLE of data standard deviation:" + str(sigma)
MLE of data mean:-0.249880829912MLE of data standard deviation:1.89195303507
pearsonr和spearmanr可以計算Pearson和Spearman相關系數,這兩個相關系數度量了兩組數據的相互線性關聯程度:
In[12]:
norm_dist = stats.norm()dat1 = norm_dist.rvs(size=100)exp_dist = stats.expon()dat2 = exp_dist.rvs(size=100)cor, pval = stats.pearsonr(dat1, dat2)print "Pearson correlation coefficient: " + str(cor)cor, pval = stats.pearsonr(dat1, dat2)print "Spearman's rank correlation coefficient: " + str(cor)
Pearson correlation coefficient: -0.0262911931014Spearman's rank correlation coefficient: -0.0262911931014
其中的$p$-value表示原假設(兩組數據不相關)下,相關系數的顯著性。
最後,在分析金融數據中使用頻繁的線性回歸在SciPy中也有提供,我們來看一個例子:
In[13]:
x = stats.chi2.rvs(3, size=50)y = 2.5 + 1.2 * x + stats.norm.rvs(size=50, loc=0, scale=1.5)slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)print "Slope of fitted model is:" , slopeprint "Intercept of fitted model is:", interceptprint "R-squared:", r_value**2
Slope of fitted model is: 1.44515601191Intercept of fitted model is: 1.91080684516R-squared: 0.798786910173
在前面的鏈接中,可以查到大部分stat中的函數,本節權作簡單介紹,挖掘更多功能的最好方法還是直接讀原始的文檔。另外,StatsModels(http://statsmodels.sourceforge.net )模塊提供了更為專業,更多的統計相關函數。若在SciPy沒有滿足需求,可以採用StatsModels。
三、優化部分
優化問題在投資中可謂是根本問題,如果手上有眾多可選的策略,應如何從中選擇一個「最好」的策略進行投資呢?這時就需要用到一些優化技術針對給定的指標進行尋優。隨著越來越多金融數據的出現,機器學習逐漸應用在投資領域,在機器學習中,優化也是十分重要的一個部分。以下介紹一些常見的優化方法,雖然例子是人工生成的,不直接應用於實際金融數據,我們希望讀者在後面遇到優化問題時,能夠從這些簡單例子迅速上手解決。
3.1 無約束優化問題
所謂的無約束優化問題指的是一個優化問題的尋優可行集合是目標函數自變數的定義域,即沒有外部的限制條件。例如,求解優化問題 [
minimizef(x)=x24.8x+1.2
] 就是一個無約束優化問題,而求解 [
minimizef(x)=x24.8x+1.2subject tox≥0
]則是一個帶約束的優化問題。更進一步,我們假設考慮的問題全部是凸優化問題,即目標函數是凸函數,其自變數的可行集是凸集。(詳細定義可參考斯坦福大學Stephen Boyd教授的教材convex optimization,下載鏈接:http://stanford.e/~boyd/cvxbook )
我們以Rosenbrock函數 [ f(mathbf{x}) = sum{i=1}^{N-1} 100 (x_i – x{i-1}^2)^2 + (1 – x_{i-1})^2 ] 作為尋優的目標函數來簡要介紹在SciPy中使用優化模塊scipy.optimize。
首先需要定義一下這個Rosenbrock函數:
In[14]:
def rosen(x): """The Rosenbrock function""" return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)
3.1.1 Nelder-Mead單純形法
單純形法是運籌學中介紹的求解線性規劃問題的通用方法,這里的Nelder-Mead單純形法與其並不相同,只是用到單純形的概念。設定起始點$mathbf{x}_0 = (1.3, 0.7, 0.8, 1.9, 1.2)$,並進行最小化的尋優。這里『xtol』表示迭代收斂的容忍誤差上界:
In[15]:
x_0 = np.array([0.5, 1.6, 1.1, 0.8, 1.2])res = opt.minimize(rosen, x_0, method='nelder-mead', options={'xtol': 1e-8, 'disp': True})print "Result of minimizing Rosenbrock function via Nelder-Mead Simplex algorithm:"print res
Optimization terminated successfully. Current function value: 0.000000 Iterations: 436 Function evaluations: 706Result of minimizing Rosenbrock function via Nelder-Mead Simplex algorithm: status: 0 nfev: 706 success: True fun: 1.6614969876635003e-17 x: array([ 1., 1., 1., 1., 1.]) message: 'Optimization terminated successfully.' nit: 436
Rosenbrock函數的性質比較好,簡單的優化方法就可以處理了,還可以在minimize中使用method=』powell』來指定使用Powell』s method。這兩種簡單的方法並不使用函數的梯度,在略微復雜的情形下收斂速度比較慢,下面讓我們來看一下用到函數梯度進行尋優的方法。
3.1.2 Broyden-Fletcher-Goldfarb-Shanno法
Broyden-Fletcher-Goldfarb-Shanno(BFGS)法用到了梯度信息,首先求一下Rosenbrock函數的梯度:
[ begin{split} frac{partial f}{partial xj} &= sum{i=1}^N 200(xi – x{i-1}^2)(delta{i,j} – 2x{i-1}delta{i-1,j}) -2(1 – x{i-1})delta_{i-1,j} &= 200(xj – x{j-1}^2) – 400xj(x{j+1} – x_j^2) – 2(1 – x_j) end{split}] 其中當$i=j$時,$delta_{i,j} = 1$,否則$delta_{i,j} = 0$。
邊界的梯度是特例,有如下形式: [ begin{split} frac{partial f}{partial x_0} &= -400x_0(x_1 – x_0^2) – 2(1 – x_0), frac{partial f}{partial x{N-1}} &= 200(x{N-1} – x_{N-2}^2) end{split}]
我們可以如下定義梯度向量的計算函數了:
In[16]:
def rosen_der(x): xm = x[1:-1] xm_m1 = x[:-2] xm_p1 = x[2:] der = np.zeros_like(x) der[1:-1] = 200*(xm-xm_m1**2) - 400*(xm_p1 - xm**2)*xm - 2*(1-xm) der[0] = -400*x[0]*(x[1]-x[0]**2) - 2*(1-x[0]) der[-1] = 200*(x[-1]-x[-2]**2) return der
梯度信息的引入在minimize函數中通過參數jac指定:
In[17]:
res = opt.minimize(rosen, x_0, method='BFGS', jac=rosen_der, options={'disp': True})print "Result of minimizing Rosenbrock function via Broyden-Fletcher-Goldfarb-Shanno algorithm:"print res
Optimization terminated successfully. Current function value: 0.000000 Iterations: 52 Function evaluations: 63 Gradient evaluations: 63Result of minimizing Rosenbrock function via Broyden-Fletcher-Goldfarb-Shanno algorithm: status: 0 success: True njev: 63 nfev: 63 hess_inv: array([[ 0.00726515, 0.01195827, 0.0225785 , 0.04460906, 0.08923649], [ 0.01195827, 0.02417936, 0.04591135, 0.09086889, 0.18165604], [ 0.0225785 , 0.04591135, 0.09208689, 0.18237695, 0.36445491], [ 0.04460906, 0.09086889, 0.18237695, 0.36609277, 0.73152922], [ 0.08923649, 0.18165604, 0.36445491, 0.73152922, 1.46680958]]) fun: 3.179561068096293e-14 x: array([ 1. , 0.99999998, 0.99999996, 0.99999992, 0.99999983]) message: 'Optimization terminated successfully.' jac: array([ 4.47207141e-06, 1.30357917e-06, -1.86454207e-07, -2.00564982e-06, 4.98799446e-07])
3.1.3 牛頓共軛梯度法(Newton-Conjugate-Gradient algorithm)
用到梯度的方法還有牛頓法,牛頓法是收斂速度最快的方法,其缺點在於要求Hessian矩陣(二階導數矩陣)。牛頓法大致的思路是採用泰勒展開的二階近似: [ f(mathbf{x}) approx f(mathbf{x}_0) + nabla f(mathbf{x}_0)(mathbf{x} – mathbf{x}_0) + frac{1}{2}(mathbf{x} – mathbf{x}_0)^Tmathbf{H}(mathbf{x}_0)(mathbf{x} – mathbf{x}_0) ] 其中$mathbf{H}(mathbf{x}_0)$表示二階導數矩陣。若Hessian矩陣是正定的,函數的局部最小值可以通過使上面的二次型的一階導數等於0來獲取,我們有: [ mathbf{x}_{mathrm{opt}} = mathbf{x}_0 – mathbf{H}^{-1}nabla f ]
這里可使用共軛梯度近似Hessian矩陣的逆矩陣。下面給出Rosenbrock函數的Hessian矩陣元素通式:
[ begin{split} H{i,j} = frac{partial^2 f}{partial x_i partial x_j} &= 200(delta{i,j} – 2x{i-1}delta{i-1,j}) – 400xi(delta{i+1,j} – 2xidelta{i,j}) – 400delta{i,j}(x{i+1} – xi^2) + 2delta{i,j}, &= (202 + 1200xi^2 – 400x{i+1}) delta{i,j} – 400x_idelta{i+1,j} – 400x{i-1}delta{i-1,j} end{split}] 其中$i,j in [1, N-2]$。其他邊界上的元素通式為: [ begin{split} frac{partial^2 f}{partial x_0^2} &= 1200x_0^2 – 400x_1 + 2, frac{partial^2 f}{partial x_0 partial x_1} = frac{partial^2 f}{partial x_1 partial x_0} &= -400x_0, frac{partial^2 f}{partial x{N-1} partial x{N-2}} = frac{partial^2 f}{partial x{N-2} partial x{N-1}} &= -400x_{N-2}, frac{partial^2 f}{partial x_{N-1}^2} &= 200. end{split}]
例如,當$N=5$時的Hessian矩陣為:
[ mathbf{H} =
[1200x20400x1+2400x0000400x0202+1200x21400x2400x1000400x1202+1200x22400x3400x2000400x2202+1200x23400x4400x3000400x3200]
]為使用牛頓共軛梯度法,我們需要提供一個計算Hessian矩陣的函數:
In[18]:
def rosen_hess(x): x = np.asarray(x) H = np.diag(-400*x[:-1],1) - np.diag(400*x[:-1],-1) diagonal = np.zeros_like(x) diagonal[0] = 1200*x[0]**2-400*x[1]+2 diagonal[-1] = 200 diagonal[1:-1] = 202 + 1200*x[1:-1]**2 - 400*x[2:] H = H + np.diag(diagonal) return H
In[19]:
res = opt.minimize(rosen, x_0, method='Newton-CG', jac=rosen_der, hess=rosen_hess, options={'xtol': 1e-8, 'disp': True})print "Result of minimizing Rosenbrock function via Newton-Conjugate-Gradient algorithm (Hessian):"print res
Optimization terminated successfully. Current function value: 0.000000 Iterations: 20 Function evaluations: 22 Gradient evaluations: 41 Hessian evaluations: 20Result of minimizing Rosenbrock function via Newton-Conjugate-Gradient algorithm (Hessian): status: 0 success: True njev: 41 nfev: 22 fun: 1.47606641102778e-19 x: array([ 1., 1., 1., 1., 1.]) message: 'Optimization terminated successfully.' nhev: 20 jac: array([ -3.62847530e-11, 2.68148992e-09, 1.16637362e-08, 4.81693414e-08, -2.76999090e-08])
對於一些大型的優化問題,Hessian矩陣將異常大,牛頓共軛梯度法用到的僅是Hessian矩陣和一個任意向量的乘積,為此,用戶可以提供兩個向量,一個是Hessian矩陣和一個任意向量$mathbf{p}$的乘積,另一個是向量$mathbf{p}$,這就減少了存儲的開銷。記向量$mathbf{p} = (p_1, ldots, p_{N-1})$,可有
[ mathbf{H(x)p} = begin{bmatrix} (1200x0^2 – 400x_1 + 2)p_0 -400x_0p_1 vdots -400x{i-1}p{i-1} + (202 + 1200x_i^2 – 400x{i+1})pi – 400x_ip{i+1} vdots -400x{N-2}p{N-2} + 200p_{N-1} end{bmatrix} ]
我們定義如下函數並使用牛頓共軛梯度方法尋優:
In[20]:
def rosen_hess_p(x, p): x = np.asarray(x) Hp = np.zeros_like(x) Hp[0] = (1200*x[0]**2 - 400*x[1] + 2)*p[0] - 400*x[0]*p[1] Hp[1:-1] = -400*x[:-2]*p[:-2]+(202+1200*x[1:-1]**2-400*x[2:])*p[1:-1] -400*x[1:-1]*p[2:] Hp[-1] = -400*x[-2]*p[-2] + 200*p[-1] return Hpres = opt.minimize(rosen, x_0, method='Newton-CG', jac=rosen_der, hessp=rosen_hess_p, options={'xtol': 1e-8, 'disp': True})print "Result of minimizing Rosenbrock function via Newton-Conjugate-Gradient algorithm (Hessian times arbitrary vector):"print res
Optimization terminated successfully. Current function value: 0.000000 Iterations: 20 Function evaluations: 22 Gradient evaluations: 41 Hessian evaluations: 58Result of minimizing Rosenbrock function via Newton-Conjugate-Gradient algorithm (Hessian times arbitrary vector): status: 0
轉載請註明:數據分析 » 量化分析師的Python_python 金融量化分析_python金融大數據分析
Ⅵ 我為什麼說 Python 是大數據全棧式開發語言 怎樣成為數據分析師
就像只要會JavaScript就可以寫出完整的Web應用,只要會Python,就可以實現一個完整的大數據處理平台。
雲基礎設施
這年頭,不支持雲平台,不支持海量數據,不支持動態伸縮,根本不敢說自己是做大數據的,頂多也就敢跟人說是做商業智能(BI)。
雲平台分為私有雲和公有雲。私有雲平台如日中天的 OpenStack
,就是Python寫的。曾經的追趕者CloudStack,在剛推出時大肆強調自己是Java寫的,比Python有優勢。結果,搬石砸腳,2015年
初,CloudStack的發起人Citrix宣布加入OpenStack基金會,CloudStack眼看著就要壽終正寢。
如果嫌麻煩不想自己搭建私有雲,用公有雲,不論是AWS,GCE,Azure,還是阿里雲,青雲,在都提供了Python SDK,其中GCE只提供Python和JavaScript的SDK,而青雲只提供Python SDK。可見各家雲平台對Python的重視。
提到基礎設施搭建,不得不提Hadoop,在今天,Hadoop因為其MapRece數據處理速度不夠快,已經不再作為大數據處理的首選,但
是HDFS和Yarn——Hadoop的兩個組件——倒是越來越受歡迎。Hadoop的開發語言是Java,沒有官方提供Python支持,不過有很多第
三方庫封裝了Hadoop的API介面(pydoop,hadoopy等等)。
Hadoop MapRece的襲蘆替代者,是號稱快上100倍的 Spark ,其開發語言是Scala,但是提供了Scala,Java,Python的開發介面,想要討好那麼多用Python開發的數據科學家,不支持Python,真是說不過去。HDFS的替代品,比如GlusterFS, Ceph 等,都是直接提供Python支持。Yarn的替代者, Mesos 是C++實現,除C++外,提供了Java和Python的支持包。
DevOps
DevOps有個中文名字,叫做 開發自運維 。互聯網時代,只有能夠快速試驗新想法,並在第一時間,安全、可靠的交付業務價值,才能保持競爭力。DevOps推崇的自動化構建/測試/部署,以及系統度量等技術實踐,是互聯網時代必不可少的。
自動化構建是因應用而易的,如果是Python應用,因為有setuptools, pip, virtualenv, tox,
flake8等工具的存在,自動化構建非常簡單。而且,因為幾乎所有Linux系統都內置Python解釋器,所以用Python做自動化,不需要系統預
安裝什麼軟體。
自動化測試方面,基於Python的 Robot Framework 企業級應用最喜歡的自動化測試框架,而且和語言無關。Cucumber也有很多支持者,Python對應的Lettuce可以做到完全一樣的事情。 Locust 在自動化性能測試方面也開始受到越來越多的關注。
自動化配置管理工具,老牌的如Chef和Puppet,是Ruby開發,目前仍保持著強勁的勢頭拍肢帶。不過,新生代 Ansible 和 SaltStack ——均為Python開發——因為較前兩者設計更為輕量化,受到越來越多開發這的歡迎,已經開始給前輩們製造了不少的壓力。
在系統監控與度量方面,傳統的Nagios逐漸沒落,新貴如 Sensu 大受好評,雲服務形式的New Relic已經成為創業公司的標配,這些都不是直接通過Python實現的,不過Python要接入這些工具,並不困難。
除了上述這些工具,基於Python,提供完整DevOps功能的PaaS平台,如 Cloudify 和 Deis ,雖未成氣候,但已經得到大量關注。
網路爬蟲
大數據的數據從哪裡來?除了部分企業有能力自己產生大量的數據,大部分時候,是需要靠爬蟲來抓取互聯網數據來做分析。
網路爬蟲是Python的傳統強勢領域,最流行的爬蟲框架Scrapy,HTTP工具包urlib2,HTML解析工具beautifulsoup,XML解析器lxml,等等,都是能夠獨當一面的類庫。
不過,網路爬蟲並飢碧不僅僅是打開網頁,解析HTML這么簡單。高效的爬蟲要能夠支持大量靈活的並發操作,常常要能夠同時幾千甚至上萬個網頁同時抓取,傳統的
線程池方式資源浪費比較大,線程數上千之後系統資源基本上就全浪費在線程調度上了。Python由於能夠很好的支持協程( Coroutine )操作,基於此發展起來很多並發庫,如Gevent,Eventlet,還有Celery之類的分布式任務框架。被認為是比AMQP更高效的ZeroMQ也是最早就提供了Python版本。有了對高並發的支持,網路爬蟲才真正可以達到大數據規模。
抓取下來的數據,需要做分詞處理,Python在這方面也不遜色,著名的自然語言處理程序包NLTK,還有專門做中文分詞的Jieba,都是做分詞的利器。
數據處理
萬事俱備,只欠東風。這東風,就是數據處理演算法。從統計理論,到數據挖掘,機器學習,再到最近幾年提出來的深度學習理論,數據科學正處於百花齊放的時代。數據科學家們都用什麼編程?
如果是在理論研究領域,R語言也許是最受數據科學家歡迎的,但是R語言的問題也很明顯,因為是統計學家們創建了R語言,所以其語法略顯怪異。而且
R語言要想實現大規模分布式系統,還需要很長一段時間的工程之路要走。所以很多公司使用R語言做原型試驗,演算法確定之後,再翻譯成工程語言。
Python也是數據科學家最喜歡的語言之一。和R語言不同,Python本身就是一門工程性語言,數據科學家用Python實現的演算法,可以直
接用在產品中,這對於大數據初創公司節省成本是非常有幫助的。正式因為數據科學家對Python和R的熱愛,Spark為了討好數據科學家,對這兩種語言
提供了非常好的支持。
Python的數據處理相關類庫非常多。高性能的科學計算類庫NumPy和SciPy,給其他高級演算法打了非常好的基礎,matploglib讓
Python畫圖變得像Matlab一樣簡單。Scikit-learn和Milk實現了很多機器學習演算法,基於這兩個庫實現的 Pylearn2 ,是深度學習領域的重要成員。 Theano 利用GPU加速,實現了高性能數學符號計算和多維矩陣計算。當然,還有 Pandas ,一個在工程領域已經廣泛使用的大數據處理類庫,其DataFrame的設計借鑒自R語言,後來又啟發了Spark項目實現了類似機制。
對了,還有 iPython ,這個工具如此有用,以至於我差點把他當成標准庫而忘了介紹。iPython是一個互動式Python運行環境,能夠實時看到每一段Python代碼的結果。默認情況下,iPython運行在命令行,可以執行 ipython notebook 在網頁中運行。用matplotlib繪制的圖可以直接嵌入式的顯示在iPython Notebook中。
iPython Notebook的筆記本文件可以共享給其他人,這樣其他人就可以在自己的環境中重現你的工作成果;如果對方沒有運行環境,還可以直接轉換成HTML或者PDF。
為什麼是Python
正是因為應用開發工程師、運維工程師、數據科學家都喜歡Python,才使得Python成為大數據系統的全棧式開發語言。
對於開發工程師而言,Python的優雅和簡潔無疑是最大的吸引力,在Python互動式環境中,執行 import this
,讀一讀Python之禪,你就明白Python為什麼如此吸引人。Python社區一直非常有活力,和NodeJS社區軟體包爆炸式增長不
同,Python的軟體包增長速度一直比較穩定,同時軟體包的質量也相對較高。有很多人詬病Python對於空格的要求過於苛刻,但正是因為這個要求,才
使得Python在做大型項目時比其他語言有優勢。OpenStack項目總共超過200萬行代碼,證明了這一點。
對於運維工程師而言,Python的最大優勢在於,幾乎所有Linux發行版都內置了Python解釋器。Shell雖然功能強大,但畢竟語法不夠優雅,寫比較復雜的任務會很痛苦。用Python替代Shell,做一些復雜的任務,對運維人員來說,是一次解放。
對於數據科學家而言,Python簡單又不失強大。和C/C++相比,不用做很多的底層工作,可以快速進行模型驗證;和Java相比,Python語法簡
潔,表達能力強,同樣的工作只需要1/3代碼;和Matlab,Octave相比,Python的工程成熟度更高。不止一個編程大牛表達過,Python
是最適合作為大學計算機科學編程課程使用的語言——MIT的計算機入門課程就是使用的Python——因為Python能夠讓人學到編程最重要的東西——
如何解決問題。
Ⅶ Python自動化測試框架有哪些
自動化測試常用的Python框架有哪些?常用的框架有Robot Framework、Pytest、UnitTest/PyUnit、Behave、Lettuce。Pytest、Robot Framework和UnitTest主要用於功能與單元測試,Lettuce和Behave僅適用於行為驅動測試。
一、Robot Framework
Python測試框架之一,Robot Framework被用在測試驅動(test-driven)類型的開發與驗收中。雖然是由Python開發而來,但是它也可以在基於.Net的IronPython和基於Java的Jython上運行。作為一個Python框架,Robot還能夠兼容諸如Windows、MacOS、以及Linux等平台。
在使用Robot Framework(RF)之前,需要先安裝Python 2.7.14及以上的版本。推薦使用Python 3.6.4,以確保適當的注釋能夠被添加到代碼段中,並能夠跟蹤程序的更改。同時還需要安裝Python包管理器--pip。
二、Pytest
適用於多種軟體測試的Pytest,是另一個Python類型的自動化測試框架。憑借著其開源和易學的特點,該工具經常被QA(質量分析)團隊、開發團隊、個人團隊、以及各種開源項目所使用。鑒於Pytest具有「斷言重寫(assert rewriting)」之類的實用功能,許多大型互聯網應用,如Dropbox和Mozilla,都已經從下面將要提到的unittest(Pyunit)切換到了Pytest之上。
除了基本的Python知識,用戶並不需要更多的技術儲備。另外,用戶只需要有一台帶有命令行界面的測試設備,並且安裝好了Python包管理器、以及可用於開發的IDE工具。
三、UnitTest/PyUnit
UnitTest/PyUnit一種標准化的針對單元測試的Python類自動化測試框架。基類TestCase提供了各種斷言方法、以及所有清理和設置的常式。因此,TestCase子類中的每一種方法都是以「test」作為名詞前綴,以標識它們能夠被作為測試用例所運行。用戶可以使用load方法和TestSuite類來分組、並載入各種測試。
可以通過聯合使用,來構建自定義的測試運行器。正如我們使用Junit去測試Selenium那樣,UnitTest也會用到UnitTest-sml-reporting、並能生成各種XML類型的報告。由於UnitTest默認使用了Python,因此我們並不需要什麼先決條件。除了需要具備Python框架的基本知識,您也可以額外地安裝pip、以及用於開發的IDE工具。
四、Behave
行為驅動開發是一種基於敏捷軟體開發的方法。它能夠鼓勵開發人員、業務參與者和QA人員,三者之間的協作。Python測試框架Behave允許團隊避開各種復雜的情況,去執行BDD測試。從本質上說該框架與SpecFlow和Cucumber相似,常被用於執行自動化測試。用戶可以通過簡單易讀的語言來編寫測試用例,並能夠在其執行期間粘貼到代碼之中。而且,那些被設定的行為規范與步驟,也可以被重用到其他的測試方案中。
任何具備Python基礎知識的人都可以使用Behave。其他先決條件還包括:先安裝Python 2.7.14及以上的版本。通過Python包管理器或pip來與Behave協作。大多數開發人員會選擇Pycharm作為開發環境,當然您也可以選用其他的IDE工具。
五、Lettuce
Lettuce是另一種基於Cucumber和Python的行為驅動類自動化工具。Lettuce主要專注於那些具有行為驅動開發特徵的普通任務。它不但簡單易用,而且能夠使得整個測試過程更流暢、甚至更有趣。安裝帶有IDE的Python 2.7.14、及以上的版本。當然,您也可以使用Pycharm或任何其他IDE工具。同時,您還需要安裝Python包管理器。
Ⅷ Tox - 使用介紹
tox是通用的虛擬環境管理和測試命令行工具。tox能夠讓我們在同一個Host上自定義出多套相互獨立且隔離的python環境(tox是openstack社區最基本的測試工具,比如python程序的兼容性、備氏灶UT等)。它的目標是提供仿扮最先進的自動化打包、測核明試和發布功能。
$ pip install tox
Ⅸ python canvas畫布
"demo all basic canvas interfaces"
from tkinter import *
canvas = Canvas(width=525, height=300, bg='white') # 0,0 is top left corner
canvas.pack(expand=YES, fill=BOTH) # increases down, right
canvas.create_line(100, 100, 200, 200) # fromX, fromY, toX, toY
canvas.create_line(100, 200, 200, 300) # draw shapes
for i in range(1, 20, 2):
canvas.create_line(0, i, 50, i)
canvas.create_oval(10, 10, 200, 200, width=2, fill='blue')
canvas.create_arc(200, 200, 300, 100)
canvas.create_rectangle(200, 200, 300, 300, width=5, fill='red')
canvas.create_line(0, 300, 150, 150, width=10, fill='green')
photo=PhotoImage(file='../gifs/ora-lp4e.gif')
canvas.create_image(325, 25, image=photo, anchor=NW) # embed a photo
widget = Label(canvas, text='Spam', fg='white', bg='black')
widget.pack()
canvas.create_window(100, 100, window=widget) # embed a widget
canvas.create_text(100, 280, text='Ham') # draw some text
mainloop()