<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          時間序列基礎(chǔ)教程總結(jié)

          共 5116字,需瀏覽 11分鐘

           ·

          2021-03-27 13:13

          時間序列 


          作者:小雨姑娘
          轉(zhuǎn)自:Datawhale

          0 數(shù)據(jù)集

          本教程包括兩個數(shù)據(jù)集(后臺回復(fù)“210325”可獲取):

          Google Stocks Data:提供了長達(dá)十三年的股票數(shù)據(jù)。時間粒度精確到天,提供了每個股票每天的最高價,最低價格以及開盤價格等信息。
          Humidity in different world cities:提供了世界各地各個城市的大氣濕度信息,時間粒度為分鐘。

          1. 基本操作(一)

          1.1 讀取數(shù)據(jù)

          在使用pd.read_csv讀取時間序列時,可以設(shè)置兩個參數(shù)。使用parse_dates參數(shù)可以把指定的列從文本類型轉(zhuǎn)化為Pandas內(nèi)置時間類型,使用index_col可以把指定的列轉(zhuǎn)化為數(shù)據(jù)集的索引。

          google = pd.read_csv('../input/stock-time-series-20050101-to-20171231/GOOGL_2006-01-01_to_2018-01-01.csv',
          index_col='Date', parse_dates=['Date'])
          google.head()

          另一個數(shù)據(jù)集也可以以同樣的方法讀入

          1.2 數(shù)據(jù)預(yù)處理

          股票數(shù)據(jù)并不存在缺失值,但是天氣濕度數(shù)據(jù)卻存在缺失值。使用參數(shù)為ffill的fillna()函數(shù),用后一時刻的觀測值進(jìn)行填補(bǔ)。

          humidity = humidity.iloc[1:]
          humidity = humidity.fillna(method='ffill')
          humidity.head()

          1.3 數(shù)據(jù)可視化

          使用pandas Series對象的asfreq[2]函數(shù)對時間序列數(shù)據(jù)以指定頻率作圖。其中M代表以月為基本單位。默認(rèn)是使用時間窗的結(jié)尾作為結(jié)果,例如2019年12月這個月的結(jié)果實際是12月31號的數(shù)據(jù)。

          humidity["Kansas City"].asfreq('M').plot() 
          plt.title('Humidity in Kansas City over time(Monthly frequency)')
          plt.show()

          google['2008':'2010'].plot(subplots=True, figsize=(10,12))
          plt.title('Google stock attributes from 2008 to 2010')
          plt.savefig('stocks.png')
          plt.show()

          1.4 時間戳與時間窗

          時間戳(Timestamps)用來表示某個時間點,時間窗(Periods)用來表示某個時間區(qū)間。時間窗常常用來檢測在某個時間段內(nèi)是否發(fā)生了特殊事件。時間戳與時間窗之間也可以相互進(jìn)行轉(zhuǎn)換。

          創(chuàng)建時間戳:

          timestamp = pd.Timestamp(2017, 1, 1, 12)
          timestamp

          創(chuàng)建時間窗:

          period = pd.Period('2017-01-01')
          period

          檢測時間戳是否在特定時間窗內(nèi)

          period.start_time < timestamp < period.end_time

          將時間戳轉(zhuǎn)換為時間窗

          new_period = timestamp.to_period(freq='H')

          將時間窗轉(zhuǎn)換為時間戳

          new_timestamp = period.to_timestamp(freq='H', how='start')

          1.5 使用date_range方法

          date_range 是一個可以返回多個datetime對象組成的序列的方法。它經(jīng)常被用于創(chuàng)建連續(xù)的時間序列(用法非常簡單,不要再用for循環(huán)創(chuàng)建時間序列了!!)

          dr1 = pd.date_range(start='1/1/18', end='1/9/18')

          也可以指定頻率

          dr2 = pd.date_range(start='1/1/18', end='1/1/19', freq='M')

          1.6 Datetime對象

          pandas.to_datetime() [3]用來將參數(shù)轉(zhuǎn)化為datetime對象。具體使用方法可以看官方文檔

          df = pd.DataFrame({'year': [2015, 2016], 'month': [2, 3], 'day': [4, 5]})

          df = pd.to_datetime(df)
          df = pd.to_datetime('01-01-2017')

          1.7 平移

          除此之外我們還可以把時間序列進(jìn)行平移。這個方法經(jīng)常用于比較時間序列與之前是否相關(guān),判斷是否具有延后性。

          humidity["Vancouver"].asfreq('M').plot(legend=True)
          shifted = humidity["Vancouver"].asfreq('M').shift(10).plot(legend=True)
          shifted.legend(['Vancouver','Vancouver_lagged'])
          plt.show()

          紅色的線是藍(lán)色的線往右平移的結(jié)果

          1.8 重采樣

          上采樣—把時間序列從低頻轉(zhuǎn)化為高頻,其中包含了缺失值的填補(bǔ)與插值操作。

          下采樣—把時間序列從高頻轉(zhuǎn)化為低頻,其中包含了對于數(shù)據(jù)的聚合操作。

          下面代碼使用resample函數(shù),以三天為頻率對數(shù)據(jù)進(jìn)行下采樣,然后采用均值方法對數(shù)據(jù)進(jìn)行聚合。

          pressure = pressure.resample('3D').mean()
          pressure.head()

          2. 基本操作(二)

          2.1 相對差異

          通過Series對象的shift方法可以將數(shù)據(jù)平移一個單位,如下圖:

          shift前:

          shift后:

          通過div方法可以實現(xiàn)列與列的逐屬性相除,這樣就可以得到后一天和前一天的比率,用來觀測數(shù)據(jù)每天的變化情況

          google['Change'] = google.High.div(google.High.shift())
          google['Change'].plot(figsize=(20,8))

          2.2 絕對值差異

          除了觀測改變的比率,還可以觀測改變的值

          google.High.diff().plot(figsize=(20,6))

          2.3 比較多個時間序列

          首先讀取另一個時間序列Microsoft的股票

          microsoft = pd.read_csv('../input/stock-time-series-20050101-to-20171231/MSFT_2006-01-01_to_2018-01-01.csv', index_col='Date', parse_dates=['Date'])

          作圖

          google.High.plot()
          microsoft.High.plot()
          plt.legend(['Google','Microsoft'])
          plt.show()

          但是由于谷歌和微軟單個股票的價格差異過大,很難比較,所以使用時間序列的第一個值進(jìn)行標(biāo)準(zhǔn)化(思考一下,使用第一個值進(jìn)行標(biāo)準(zhǔn)化其實并不是特別魯棒)

          normalized_google = google.High.div(google.High.iloc[0]).mul(100)
          normalized_microsoft = microsoft.High.div(microsoft.High.iloc[0]).mul(100)
          normalized_google.plot()
          normalized_microsoft.plot()
          plt.legend(['Google','Microsoft'])
          plt.show()

          這樣就可以顯然看出買谷歌比買微軟掙得多

          2.4 數(shù)據(jù)平滑

          數(shù)據(jù)平滑可以用來檢測時間序列在一定時期的趨勢,分為rolling與expanding兩個方法。其中rolling考慮幾個時間窗內(nèi)的數(shù)據(jù),expanding考慮之前所有數(shù)據(jù)。

          下面代碼是以90天為單位的時間窗對數(shù)據(jù)進(jìn)行平滑的效果,可以發(fā)現(xiàn)平滑后的數(shù)據(jù)更加穩(wěn)健。

          rolling_google = google.High.rolling('90D').mean()
          google.High.plot()
          rolling_google.plot()
          plt.legend(['High','Rolling Mean'])
          plt.show()

          下面的expanding方法的結(jié)果

          microsoft_mean = microsoft.High.expanding().mean()
          microsoft_std = microsoft.High.expanding().std()
          microsoft.High.plot()
          microsoft_mean.plot()
          microsoft_std.plot()
          plt.legend(['High','Expanding Mean','Expanding Standard Deviation'])
          plt.show()

          2.5 OHLC圖

          OHLC圖是專門針對時間序列的一種圖,其中四個字母的含義如下:open, high, low and close price。這好像就是我媽看股票的時候的那個圖。

          使用這個庫就可以畫出來 import plotly.graph_objs as go

          trace = go.Ohlc(x=google['06-2008'].index,
          open=google['06-2008'].Open,
          high=google['06-2008'].High,
          low=google['06-2008'].Low,
          close=google['06-2008'].Close)
          data = [trace]
          iplot(data, filename='simple_ohlc')

          這個圖主要可以看出來當(dāng)天是跌了還是漲了,然后變了多少。

          2.6 K線圖

          好像也是股票中常見的一種圖,不是特別重要,能看懂就可以。

          trace = go.Candlestick(x=google['03-2008'].index,
          open=google['03-2008'].Open,
          high=google['03-2008'].High,
          low=google['03-2008'].Low,
          close=google['03-2008'].Close)
          data = [trace]
          iplot(data, filename='simple_candlestick')
          缺圖

          2.7 自相關(guān)性與偏自相關(guān)性

          • 自相關(guān)性

          表示當(dāng)前時間與它之前不同時間點之間的相關(guān)性

          • 偏自相關(guān)性

          表示當(dāng)前時間與它之前不同時間點之間,去除了中間時間干擾的相關(guān)性。自相關(guān)性就是時間與時間的相關(guān)性,偏自相關(guān)性是剔除了

          對他們的影響之后再計算的相關(guān)性。至于怎么計算的可以參考博客:
          https://blog.csdn.net/weixin_42382211/article/details/81136787

          自相關(guān):

          plot_acf(humidity["San Diego"],lags=25,title="San Diego")
          plt.show()

          這樣看基本所有滯后的時間長度都存在相關(guān)性,在滯后12、13天的時候相關(guān)性最低,但是都超過了置信區(qū)間(圖中藍(lán)色的區(qū)域)

          偏自相關(guān):

          plot_pacf(humidity["San Diego"],lags=25)
          plt.show()

          看起來所有時間跨度都具有顯著性,但是除了前兩個,偏自相關(guān)性都很弱。


          往期精彩:

          【原創(chuàng)首發(fā)】機(jī)器學(xué)習(xí)公式推導(dǎo)與代碼實現(xiàn)30講.pdf

          【原創(chuàng)首發(fā)】深度學(xué)習(xí)語義分割理論與實戰(zhàn)指南.pdf

           談中小企業(yè)算法崗面試

           算法工程師研發(fā)技能表

           真正想做算法的,不要害怕內(nèi)卷

           算法工程師的日常,一定不能脫離產(chǎn)業(yè)實踐

           技術(shù)學(xué)習(xí)不能眼高手低

           技術(shù)人要學(xué)會自我營銷

           做人不能過擬合

          點個在看

          瀏覽 65
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  8050午夜无码一区二区三区 | wwwaaa| 伊人色色影院 | 国产黄色视频片 | 中文字幕无码在线观看 |