python并不是虛擬機,運行python文件的是python解釋器。python解釋器的工作原理如下:
創(chuàng)新互聯(lián)公司專注于集安網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供集安營銷型網(wǎng)站建設(shè),集安網(wǎng)站制作、集安網(wǎng)頁設(shè)計、集安網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造集安網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供集安網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
一、過程概述
1、python先把代碼(.py文件)編譯成字節(jié)碼,交給字節(jié)碼虛擬機,然后虛擬機會從編譯得到的PyCodeObject對象中一條一條執(zhí)行字節(jié)碼指令,并在當前的上下文環(huán)境中執(zhí)行這條字節(jié)碼指令,從而完成程序的執(zhí)行。Python虛擬機實際上是在模擬操作中執(zhí)行文件的過程。PyCodeObject對象中包含了字節(jié)碼指令以及程序的所有靜態(tài)信息,但沒有包含程序運行時的動態(tài)信息——執(zhí)行環(huán)境(PyFrameObject)
2、字節(jié)碼在python虛擬機程序里對應(yīng)的是PyCodeObject對象;
.pyc文件是字節(jié)碼在磁盤上的表現(xiàn)形式。
3、從整體上看:OS中執(zhí)行程序離不開兩個概念:進程和線程。python中模擬了這兩個概念,模擬進程和線程的分別是PyInterpreterState和PyTreadState。即:每個PyThreadState都對應(yīng)著一個幀棧,python虛擬機在多個線程上切換。當python虛擬機開始執(zhí)行時,它會先進行一些初始化操作,最后進入PyEval_EvalFramEx函數(shù),它的作用是不斷讀取編譯好的字節(jié)碼,并一條一條執(zhí)行,類似CPU執(zhí)行指令的過程。函數(shù)內(nèi)部主要是一個switch結(jié)構(gòu),根據(jù)字節(jié)碼的不同執(zhí)行不同的代碼。
推薦學習《python教程》
二、關(guān)于.pyc文件
PyCodeObject對象的創(chuàng)建時機是模塊加載的時候,即import。
1、執(zhí)行 python test.py 會對test.py進行編譯成字節(jié)碼并解釋執(zhí)行,但不會生成test.pyc
2、如果test.py中加載了其他模塊,如import urllib2,那么python會對urllib2.py進行編譯成字節(jié)碼,生成urllib2.pyc,然后對字節(jié)碼解釋執(zhí)行。
3、如果想生成test.pyc,我們可以使用python內(nèi)置模塊py_compile來編譯。
也可以執(zhí)行命令 python -m test.py 這樣,就生成了test.pyc
4、加載模塊時,如果同時存在.py和.pyc,python會使用.pyc運行,如果.pyc的編譯時間早于.py的時間,則重新編譯.py,并更新.pyc文件。
利用python進行線性回歸
理解什么是線性回歸
線性回歸也被稱為最小二乘法回歸(Linear Regression, also called Ordinary Least-Squares (OLS) Regression)。它的數(shù)學模型是這樣的:
y = a+ b* x+e
其中,a 被稱為常數(shù)項或截距;b 被稱為模型的回歸系數(shù)或斜率;e 為誤差項。a 和 b 是模型的參數(shù)。
當然,模型的參數(shù)只能從樣本數(shù)據(jù)中估計出來:
y'= a' + b'* x
我們的目標是選擇合適的參數(shù),讓這一線性模型最好地擬合觀測值。擬合程度越高,模型越好。
那么,接下來的問題就是,我們?nèi)绾闻袛鄶M合的質(zhì)量呢?
這一線性模型可以用二維平面上的一條直線來表示,被稱為回歸線。
模型的擬合程度越高,也即意味著樣本點圍繞回歸線越緊密。
如何計算樣本點與回歸線之間的緊密程度呢?
高斯和勒讓德找到的方法是:被選擇的參數(shù),應(yīng)該使算出來的回歸線與觀測值之差的平房和最小。用函數(shù)表示為:
這被稱為最小二乘法。最小二乘法的原理是這樣的:當預測值和實際值距離的平方和最小時,就選定模型中的兩個參數(shù)(a 和 b)。這一模型并不一定反映解釋變量和反應(yīng)變量真實的關(guān)系。但它的計算成本低;相比復雜模型更容易解釋。
模型估計出來后,我們要回答的問題是:
我們的模型擬合程度如何?或者說,這個模型對因變量的解釋力如何?(R2)
整個模型是否能顯著預測因變量的變化?(F 檢驗)
每個自變量是否能顯著預測因變量的變化?(t 檢驗)
首先回答第一個問題。為了評估模型的擬合程度如何,我們必須有一個可以比較的基線模型。
如果讓你預測一個人的體重是多少?在沒有任何額外信息的情況下,你可能會用平均值來預測,盡管會存在一定誤差,但總比瞎猜好。
現(xiàn)在,如果你知道他的身高信息,你的預測值肯定與平均值不一樣。額外信息相比平均值更能準確地預測被預測的變量的能力,就代表模型的解釋力大小。
上圖中,SSA 代表由自變量 x 引起的 y 的離差平方和,即回歸平方和,代表回歸模型的解釋力;SSE 代表由隨機因素引起的 y 的離差平方和,即剩余平方和,代表回歸模型未能解釋的部分;SST 為總的離差平方和,即我們僅憑 y 的平均值去估計 y 時所產(chǎn)生的誤差。
用模型能夠解釋的變異除以總的變異就是模型的擬合程度:
R2=SSA/SST=1-SSE
R2(R 的平方)也被稱為決定系數(shù)或判定系數(shù)。
第二個問題,我們的模型是否顯著預測了 y 的變化?
假設(shè) y 與 x 的線性關(guān)系不明顯,那么 SSA 相對 SSE 占有較大的比例的概率則越小。換句話說,在 y 與 x 無線性關(guān)系的前提下,SSA 相對 SSE 的占比越高的概率是越小的,這會呈現(xiàn)一定的概率分布。統(tǒng)計學家告訴我們它滿足 F 分布,就像這樣:
如果 SSA 相對 SSE 占比較大的情況出現(xiàn)了,比如根據(jù) F 分布,這個值出現(xiàn)的概率小于 5%。那么,我們最好是拒絕 y 與 x 線性關(guān)系不顯著的原始假設(shè),認為二者存在顯著的線性關(guān)系較為合適。
第三個問題,每個自變量是否能顯著預測因變量的變化?換句話說,回歸系數(shù)是否顯著?
回歸系數(shù)的顯著性檢驗是圍繞回歸系數(shù)的抽樣分布(t 分布)來進行的,推斷過程類似于整個模型的檢驗過程,不贅言。
實際上,對于只有一個自變量的一元線性模型,模型的顯著性檢驗和回歸系數(shù)的檢驗是一致的,但對于多元線性模型來說,二者就不能等價了。
利用 statsmodels 進行最小二乘回歸
#導入相應(yīng)模塊
In [1]: import numpy as np
In [2]: import pandas as pd
In [3]: import statsmodels.api as sm
#將數(shù)據(jù)導入 pandas 的 dataframe 對象,第一列(年份)作為行標簽
In [4]: df=pd.read_csv('/Users/xiangzhendong/Downloads/vincentarelbundock-Rdatasets-1218370/csv/datasets/longley.csv', index_col=0)
#查看頭部數(shù)據(jù)
In [5]: df.head()
Out[5]:
GNP.deflator ? ? ?GNP ?Unemployed ?Armed.Forces ?Population ?Year ?\
1947 ? ? ? ? ?83.0 ?234.289 ? ? ? 235.6 ? ? ? ? 159.0 ? ? 107.608 ?1947
1948 ? ? ? ? ?88.5 ?259.426 ? ? ? 232.5 ? ? ? ? 145.6 ? ? 108.632 ?1948
1949 ? ? ? ? ?88.2 ?258.054 ? ? ? 368.2 ? ? ? ? 161.6 ? ? 109.773 ?1949
1950 ? ? ? ? ?89.5 ?284.599 ? ? ? 335.1 ? ? ? ? 165.0 ? ? 110.929 ?1950
1951 ? ? ? ? ?96.2 ?328.975 ? ? ? 209.9 ? ? ? ? 309.9 ? ? 112.075 ?1951
Employed
1947 ? ?60.323
1948 ? ?61.122
1949 ? ?60.171
1950 ? ?61.187
1951 ? ?63.221
#設(shè)置預測變量和結(jié)果變量,用 GNP 預測 Employed
In [6]: y=df.Employed #結(jié)果變量
In [7]: X=df.GNP #預測變量
#為模型增加常數(shù)項,即回歸線在 y 軸上的截距
In [8]: X=sm.add_constant(X)
#執(zhí)行最小二乘回歸,X 可以是 numpy array 或 pandas dataframe(行數(shù)等于數(shù)據(jù)點個數(shù),列數(shù)為預測變量個數(shù)),y 可以是一維數(shù)組(numpy array)或 pandas series
In [10]: est=sm.OLS(y,X)
使用 OLS 對象的 fit() 方法來進行模型擬合
In [11]: est=est.fit()
#查看模型擬合的結(jié)果
In [12]: est.summary()
Out[12]:
#查看最終模型的參數(shù)
In [13]: est.params
Out[13]:
const ? ?51.843590
GNP ? ? ? 0.034752
dtype: float64
#選擇 100 個從最小值到最大值平均分布(equally spaced)的數(shù)據(jù)點
In [14]: X_prime=np.linspace(X.GNP.min(), X.GNP.max(),100)[:,np.newaxis]
In [15]: X_prime=sm.add_constant(X_prime)
#計算預測值
In [16]: y_hat=est.predict(X_prime)
In [17]: plt.scatter(X.GNP, y, alpha=0.3) #畫出原始數(shù)據(jù)
#分別給 x 軸和 y 軸命名
In [18]: plt.xlabel("Gross National Product")
In [19]: plt.ylabel("Total Employment")
In [20]: plt.plot(X_prime[:,1], y_hat, 'r', alpha=0.9) #添加回歸線,紅色
多元線性回歸(預測變量不止一個)
我們用一條直線來描述一元線性模型中預測變量和結(jié)果變量的關(guān)系,而在多元回歸中,我們將用一個多維(p)空間來擬合多個預測變量。下面表現(xiàn)了兩個預測變量的三維圖形:商品的銷量以及在電視和廣播兩種不同媒介的廣告預算。
數(shù)學模型是:
Sales = beta_0 + beta_1*TV + beta_2*Radio
圖中,白色的數(shù)據(jù)點是平面上的點,黑色的數(shù)據(jù)點事平面下的點。平面的顏色是由對應(yīng)的商品銷量的高低決定的,高是紅色,低是藍色。
利用 statsmodels 進行多元線性回歸
In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: import statsmodels.api as sm
In [4]: df_adv=pd.read_csv('g.csv',index_col=0)
In [6]: X=df_adv[['TV','Radio']]
In [7]: y=df_adv['Sales']
In [8]: df_adv.head()
Out[8]:
TV ?Radio ?Newspaper ?Sales
1 ?230.1 ? 37.8 ? ? ? 69.2 ? 22.1
2 ? 44.5 ? 39.3 ? ? ? 45.1 ? 10.4
3 ? 17.2 ? 45.9 ? ? ? 69.3 ? ?9.3
4 ?151.5 ? 41.3 ? ? ? 58.5 ? 18.5
5 ?180.8 ? 10.8 ? ? ? 58.4 ? 12.9
In [9]: X=sm.add_constant(X)
In [10]: est=sm.OLS(y,X).fit()
In [11]: est.summary()
Out[11]:
你也可以使用 statsmodels 的 formula 模塊來建立多元回歸模型
In [12]: import statsmodels.formula.api as smf
In [13]: est=smf.ols(formula='Sales ~ TV + Radio',data=df_adv).fit()
處理分類變量
性別或地域都屬于分類變量。
In [15]: df= pd.read_csv('httd.edu/~tibs/ElemStatLearn/datasets/SAheart.data', index_col=0)
In [16]: X=df.copy()
利用 dataframe 的 pop 方法將 chd 列單獨提取出來
In [17]: y=X.pop('chd')
In [18]: df.head()
Out[18]:
sbp ?tobacco ? ldl ?adiposity ?famhist ?typea ?obesity ?alcohol ?\
row.names
1 ? ? ? ? ?160 ? ?12.00 ?5.73 ? ? ?23.11 ?Present ? ? 49 ? ?25.30 ? ?97.20
2 ? ? ? ? ?144 ? ? 0.01 ?4.41 ? ? ?28.61 ? Absent ? ? 55 ? ?28.87 ? ? 2.06
3 ? ? ? ? ?118 ? ? 0.08 ?3.48 ? ? ?32.28 ?Present ? ? 52 ? ?29.14 ? ? 3.81
4 ? ? ? ? ?170 ? ? 7.50 ?6.41 ? ? ?38.03 ?Present ? ? 51 ? ?31.99 ? ?24.26
5 ? ? ? ? ?134 ? ?13.60 ?3.50 ? ? ?27.78 ?Present ? ? 60 ? ?25.99 ? ?57.34
age ?chd
row.names
1 ? ? ? ? ? 52 ? ?1
2 ? ? ? ? ? 63 ? ?1
3 ? ? ? ? ? 46 ? ?0
4 ? ? ? ? ? 58 ? ?1
5 ? ? ? ? ? 49 ? ?1
In [19]: y.groupby(X.famhist).mean()
Out[19]:
famhist
Absent ? ? 0.237037
Present ? ?0.500000
Name: chd, dtype: float64
In [20]: import statsmodels.formula.api as smf
In [21]: df['famhist_ord']=pd.Categorical(df.famhist).labels
In [22]: est=smf.ols(formula="chd ~ famhist_ord", data=df).fit()
分類變量的編碼方式有許多,其中一種編碼方式是虛擬變量編碼(dummy-encoding),就是把一個 k 個水平的分類變量編碼成 k-1 個二分變量。在 statsmodels 中使用 C 函數(shù)實現(xiàn)。
In [24]: est=smf.ols(formula="chd ~ C(famhist)", data=df).fit()
In [26]: est.summary()
Out[26]:
處理交互作用
隨著教育年限(education)的增長,薪酬 (wage) 會增加嗎?這種影響對男性和女性而言是一樣的嗎?
這里的問題就涉及性別與教育年限的交互作用。
換言之,教育年限對薪酬的影響是男女有別的。
#導入相關(guān)模塊
In [1]: import pandas as pd
In [2]: import numpy as np
In [4]: import statsmodels.api as sm
#導入數(shù)據(jù),存入 dataframe 對象
In [5]: df=pd.read_csv('/Users/xiangzhendong/Downloads/pydatafromweb/wages.csv')
In [6]: df[['Wage','Education','Sex']].tail()
Out[6]:
Wage ?Education ?Sex
529 ?11.36 ? ? ? ? 18 ? ?0
530 ? 6.10 ? ? ? ? 12 ? ?1
531 ?23.25 ? ? ? ? 17 ? ?1
532 ?19.88 ? ? ? ? 12 ? ?0
533 ?15.38 ? ? ? ? 16 ? ?0
由于性別是一個二分變量,我們可以繪制兩條回歸線,一條是 sex=0(男性),一條是 sex=1(女性)
#繪制散點圖
In [7]: plt.scatter(df.Education,df.Wage, alpha=0.3)
In [9]: plt.xlabel('education')
In [10]: plt.ylabel('wage')
#linspace 的作用是生成從最小到最大的均勻分布的 n 個數(shù)
In [17]: education_linspace=np.linspace(df.Education.min(), df.Education.max(),100)
In [12]: import statsmodels.formula.api as smf
In [13]: est=smf.ols(formula='Wage ~ Education + Sex', data=df).fit()
In [18]: plt.plot(education_linspace, est.params[0]+est.params[1]education_linspace+est.params[2]0, 'r')
In [19]: plt.plot(education_linspace, est.params[0]+est.params[1]education_linspace+est.params[2]1, 'g')
以上兩條線是平行的。這是因為分類變量只影響回歸線的截距,不影響斜率。
接下來我們可以為回歸模型增加交互項來探索交互效應(yīng)。也就是說,對于兩個類別,回歸線的斜率是不一樣的。
In [32]: plt.scatter(df.Education,df.Wage, alpha=0.3)
In [33]: plt.xlabel('education')
In [34]: plt.ylabel('wage')
#使用*代表我們的回歸模型中除了交互效應(yīng),也包括兩個變量的主效應(yīng);如果只想看交互效應(yīng),可以用:代替,但通常不會只看交互效應(yīng)
In [35]: est=smf.ols(formula='Wage ~ Sex*Education', data=df).fit()
In [36]: plt.plot(education_linspace, est.params[0]+est.params[1]0+est.params[2]education_linspace+est.params[3]0education_linspace, 'r')
In [37]: plt.plot(education_linspace, est.params[0]+est.params[1]1+est.params[2]education_linspace+est.params[3]1education_linspace, 'g')
參考資料:
DataRobot | Ordinary Least Squares in Python
DataRoboe | Multiple Regression using Statsmodels
AnalyticsVidhya | 7 Types of Regression Techniques you should know!
os模塊中的system()函數(shù)可以方便地運行其他程序或者腳本。
語法如下:os.system(command)
其參數(shù)含義如下所示:
command? 要執(zhí)行的命令,相當于在Windows的cmd窗口中輸入的命令。如果要向程序或者腳本傳遞參數(shù),可以使用空格分隔程序及多個參數(shù)。
擴展資料
Python在執(zhí)行時,首先會將.py文件中的源代碼編譯成Python的byte code(字節(jié)碼),然后再由Python Virtual Machine(Python虛擬機)來執(zhí)行這些編譯好的byte code。這種機制的基本思想跟Java,.NET是一致的。然而,Python Virtual Machine與Java或.NET的Virtual Machine不同的是,Python的Virtual Machine是一種更高級的Virtual Machine。
這里的高級并不是通常意義上的高級,不是說Python的Virtual Machine比Java或.NET的功能更強大,而是說和Java 或.NET相比,Python的Virtual Machine距離真實機器的距離更遠?;蛘呖梢赃@么說,Python的Virtual Machine是一種抽象層次更高的Virtual Machine。
基于C的Python編譯出的字節(jié)碼文件,通常是.pyc格式。
除此之外,Python還可以以交互模式運行,比如主流操作系統(tǒng)Unix/Linux、Mac、Windows都可以直接在命令模式下直接運行Python交互環(huán)境。直接下達操作指令即可實現(xiàn)交互操作。
參考資料來源:51CTO.com:使用os.system函數(shù)運行其他程序
學習Python,如果不是系統(tǒng)學習,自學總會遇到很多彎路,但是看到書以后,還是會從頭看到尾,但是不知道重點在哪里
學習方法:
先確定學習的思想
確定學習的方向
確定學習的重點
1.確定學習思想
學習編程,學的不是代碼,代碼可以給你,但是給你了,你看得懂嗎? 我們學的是一個編程思路
如我們要爬12306,我們要有一個思路
制定爬取內(nèi)容
選取目標
準備環(huán)境,上面就提前說了,因為這個本來就是在搞爬蟲,所以...
分析該網(wǎng)站的html結(jié)構(gòu),得到url
爬取數(shù)據(jù)
分析數(shù)據(jù)
封裝數(shù)據(jù)(組裝數(shù)據(jù)),弄成自己想要的樣子
所以思路是最重要的,我們有了思路,那么我們操作起來,就相對來說,畢竟簡單了。
2.確定學習方向
Python的就業(yè)方向里面有很多值得選擇,如:web、爬蟲、運維、黑客、人工智能等。
簡析:
Python web:主要用于后端
爬蟲:數(shù)據(jù)挖掘
運維:主要是漲工資和滿足公司要求
黑客、人工智能:不推薦,一旦決定了,就要一直走下去,沒有回頭路,當然一旦成功,金錢大把大把
3.確定學習重點
入門學習,重點:
Python語言的控制結(jié)構(gòu)
列表、字典、元組
字符串處理
變量聲明和定義
函數(shù)
面向?qū)ο缶幊蹋悍庋b、繼承、虛擬函數(shù)、接口、多繼承、模板
面向?qū)ο缶幊蹋寒惓L幚?/p>
確定放向后(以目前最熱門的web、爬蟲為例):
1.web
重點學習:
1.HTML、css、JS
2.Django、Flask、Tornado三個主流開發(fā)框架
3.協(xié)程、異步線程
2.爬蟲
重點學習
1.并發(fā)編程
2.破解反扒技術(shù)
3.APP的抓取
4.分布式爬蟲
第一:找到一個好的教程
可以買本書,跟著書學習,書上的例子可以跟著寫,課后的習題盡量做。沒有買書的朋友,可以從網(wǎng)上找教程,在浩瀚如煙的互聯(lián)網(wǎng)上,沒有你找不到的,只有你想不到的。
徹底0基礎(chǔ)的朋友,建議先確定自己是否對Python感興趣,興趣是好的老師,只有在興趣的驅(qū)動下你才能堅定不移克服學習上遇到的困難。課課家Python從入門到精通視頻教程
第二,循序漸進
既然是零基礎(chǔ),就不要著急了。你需要做的是,盯住一個教程,從基礎(chǔ)語法,變量類型開始學起,接下來是運算符,條件語句,循環(huán),字符串,list,元組,字典,日期時間,文件讀寫,函數(shù),模塊,異常處理。
第三,照葫蘆畫瓢
這個過程中,如果遇到不懂的,不要深究。不懂就問,不會就敲。能看懂多少就懂多少,重要的是按照教程編寫代碼,你看不懂的,可能照著例子寫了,就懂了。再者,有許多知識,其實對非計算機行業(yè)的人來說,過于專業(yè)了,你也沒有必要懂。
第四,貴在堅持
我不建議大家花費太多的時間在Python學習上,你每天能用30分鐘看看教程,然后照著例子寫代碼就可以了,根本來講,你要學習的不是Python,而是一種思維模式,這種思維模式的建立需要反復的練習,短期內(nèi)用力過猛是無濟于事的。
你永遠不能叫醒一個裝睡的人,也永遠幫不了一個不努力的人。任何工作要做到優(yōu)秀都需要不斷的付出和學習,想要成為一名優(yōu)秀的程序員也是一樣,如果你熱愛Python,熱愛這門語言就應(yīng)該持續(xù)的走下去,人真的去努力。
reset_index用來重置索引,因為有時候?qū)ataframe做處理后索引可能是亂的。
drop=True就是把原來的索引index列去掉,重置index。
drop=False就是保留原來的索引,添加重置的index。
兩者的區(qū)別就是有沒有把原來的index去掉。
此外還有一個參數(shù):inplace
inplace=False(默認)表示原數(shù)組不變,對數(shù)據(jù)進行修改之后結(jié)果給新的數(shù)組。
inplace=True表示直接在原數(shù)組上對數(shù)據(jù)進行修改。
擴展資料:
Python在執(zhí)行時,首先會將.py文件中的源代碼編譯成Python的byte code(字節(jié)碼),然后再由Python Virtual Machine(Python虛擬機)來執(zhí)行這些編譯好的byte code。這種機制的基本思想跟Java,NET是一致的。然而,Python Virtual Machine與Java或.NET的Virtual Machine不同的是,Python的Virtual Machine是一種更高級的Virtual Machine。
參考資料來源:百度百科-Python