不寫出y=f(x)這樣的表達式,由隱函數(shù)的等式直接繪制圖像,以x2+y2+xy=1的圖像為例,使用sympy間接調(diào)用matplotlib工具的代碼和該二次曲線圖像如下(注意python里的乘冪符號是**而不是^,還有,python的sympy工具箱的等式不是a==b,而是a-b或者Eq(a,b),這幾點和matlab的區(qū)別很大)
創(chuàng)新互聯(lián)公司2013年成立,先為東湖等服務建站,東湖等地企業(yè),進行企業(yè)商務咨詢服務。為東湖企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。
直接在命令提示行的里面運行代碼的效果
from sympy import *;
x,y=symbols('x y');
plotting.plot_implicit(x**2+y**2+x*y-1);
處理過與時間有關的數(shù)據(jù)的人都知道,差分變化經(jīng)常用來使得結果更加直觀。在這篇文章里將會教你如何用Python來實現(xiàn)這一目的,讀完這篇文章,你將會掌握以下技能:
1、知道什么是差分變換以及滯后差分和差分階數(shù)的設置
2、如何手動計算差分
3、怎樣使用Pandas內(nèi)置的差分函數(shù)
所以,讓我們趕緊開始吧!
為什么要對時間序列數(shù)據(jù)進行差分?
首先來看下為什么要對數(shù)據(jù)進行差分變化,差分變化可以消除數(shù)據(jù)對時間的依賴性,也就是降低時間對數(shù)據(jù)的影響,這些影響通常包括數(shù)據(jù)的變化趨勢以及數(shù)據(jù)周期性變化的規(guī)律。進行差分操作時,一般用現(xiàn)在的觀測值減去上個時刻的值就得到差分結果,就是這么簡單,按照這種定義可以計算一系列的差分變換。
滯后差分
連續(xù)觀測值之間的差分變換叫做一階滯后差分。滯后差分的步長需要根據(jù)數(shù)據(jù)的時間結構做調(diào)整,例如對于周期性變化的數(shù)據(jù),這個時間步長就是數(shù)據(jù)變化的周期。
差分階數(shù)
在進行一次差分之后,時間項的作用并沒有完全去掉,將會繼續(xù)對差分結果進行差分變化,直到完全消除時間項的影響因素為止,這個過程中進行的差分操作次數(shù)就稱為差分階數(shù)。
洗發(fā)水銷售數(shù)據(jù)
這份數(shù)據(jù)是三年來每月洗發(fā)水的銷售情況,總共有36個數(shù)據(jù)記錄,原始數(shù)據(jù)來自Makridakis, Wheelwright和 Hyndman (1998).,可以從下面的地址下到數(shù)據(jù):
下面的代碼將會導入數(shù)據(jù)并將結果畫成折線圖,如下所示:
手動差分
在這一部分中,我們將會自定義一個函數(shù)來實現(xiàn)差分變換,這個函數(shù)將會對提供的數(shù)據(jù)進行遍歷并根據(jù)指定的時間間隔進行差分變換。具體代碼如下:
從上面的代碼中可以看到該函數(shù)將會根據(jù)指定的時間間隔來對數(shù)據(jù)進行變換,一般來說,通常會計算間隔一個數(shù)據(jù)的差分,這樣的結果比較可靠。當然,我們也可以將上面的函數(shù)進行一定的改進,加入差分階數(shù)的指定。
下面將這函數(shù)應用到上面洗發(fā)水銷售的數(shù)據(jù)中去,運行之后繪出下面的圖,具體如下:
自動差分
Pandas庫里提供了一個函數(shù)可以自動計算數(shù)據(jù)的差分,這個函數(shù)是diff(),輸入的數(shù)據(jù)是“series'或”DataFrame'類型的,像前面自定義函數(shù)那樣,我們也可以指定差分的時間間隔,不過在這里這個參數(shù)叫做周期。
下面的例子是用Pandas內(nèi)置函數(shù)來計算差分的,數(shù)據(jù)類型是series的,使用Pandas內(nèi)置函數(shù)的好處是代碼工作量減少了不少,而且繪出的圖中包含更詳細的信息,具體效果如下:
總結
讀完本文想必你已經(jīng)學會用python來實現(xiàn)對數(shù)據(jù)的差分了,尤其是對差分的概念,手動差分,以及使用Pandas內(nèi)置函數(shù)進行差分都有所了解了。如果有什么好的想法歡迎在評論欄里留下。
dta=np.array(dta,dtype=np.float) //這里要轉(zhuǎn)下數(shù)據(jù)類型,不然運行會報錯
dta=pd.Series(dta)
dta.index = pd.Index(sm.tsa.datetools.dates_from_range('2001','2090')) //應該是2090,不是2100
dta.plot(figsize=(12,8))
plt.show() // 在Scala IDE要輸入這個命令才能顯示圖!
raw_input獲取的輸入是字符串,不能直接用np.array,需要用split進行切分,然后強制轉(zhuǎn)化成數(shù)值類型,才能用plot函數(shù)
我把你的代碼稍微修改了一下,可能不太漂亮,不過能運行了
x=[1,2,3]
a = raw_input('function')
a = a.split(' ')#依空格對字符串a(chǎn)進行切分,如果是用逗號分隔,則改成a.split(',')
b = []
for i in range(len(a)):#把切分好的字符強制轉(zhuǎn)化成int類型,如果是小數(shù),將int改為float
b.append(int(a[i]))
plt.plot(x, b, label='x', color="green", linewidth=1)
1、plt.legendplt.legend(loc=0)#顯示圖例的位置。
2、plt.figureplt.figure(figsize=(14,6),dpi=80)#設置繪圖區(qū)域的大小和像素。
3、plt.xticksplt.xticks(new_year)#設置x軸的刻度線為new_year,new_year可以為數(shù)組。
4、plt.xlabelplt.xlabel('year')#x軸標簽。
5、plt.plotplt.plot(number,color='blue',label="actualvalue")#將實際值的折線設置為藍色。
6、兩個圖分開fig,axes=plt.subplots(2,1,sharex=True,figsize=(10,10))。
7、畫豎直線plt.axvline(99,linestyle="dotted",linewidth=4,color='r')#99表示橫坐標。
8、圖片保存plt.savefig('timeseries_y.jpg')。
為避免中文顯示出錯,需導入matplotlib.pylab庫
1.2.1 確定數(shù)據(jù)
1.2.2 創(chuàng)建畫布
1.2.3 添加標題
1.2.4 添加x,y軸名稱
1.2.5 添加x,y軸范圍
1.2.6 添加x,y軸刻度
1.2.7 繪制曲線、圖例, 并保存圖片
保存圖片時,dpi為清晰度,數(shù)值越高越清晰。請注意,函數(shù)結尾處,必須加plt.show(),不然圖像不顯示。
繪制流程與繪制不含子圖的圖像一致,只需注意一點:創(chuàng)建畫布。
合理調(diào)整figsize、dpi,可避免出現(xiàn)第一幅圖橫軸名稱與第二幅圖標題相互遮蓋的現(xiàn)象.
2.2.1 rc參數(shù)類型
2.2.2 方法1:使用rcParams設置
2.2.3 方法2:plot內(nèi)設置
2.2.4 方法3:plot內(nèi)簡化設置
方法2中,線條形狀,linestyle可簡寫為ls;線條寬度,linewidth可簡寫為lw;線條顏色,color可簡寫為c,等等。