<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 如何使用 Python 重新采樣和插值您的時間序列數據 > 原文: [https://machinelearningmastery.com/resample-interpolate-time-series-data-python/](https://machinelearningmastery.com/resample-interpolate-time-series-data-python/) 您可能會以錯誤的頻率觀察。 也許它們太精細或不夠精細。 Python 中的 Pandas 庫提供了更改時間序列數據頻率的功能。 在本教程中,您將了解如何在 Python 中使用 Pandas 來增加和減少時間序列數據的采樣頻率。 完成本教程后,您將了解: * 關于時間序列重新采樣,兩種類型的重采樣,以及您需要使用它們的兩個主要原因。 * 如何使用 Pandas 將時間序列數據上采樣到更高的頻率并插入新的觀測值。 * 如何使用 Pandas 將時間序列數據下采樣到較低頻率并總結較高頻率的觀測值。 讓我們開始吧。 **2016 年 12 月更新**:修正了上采樣和下采樣的定義。 ![How To Resample and Interpolate Your Time Series Data With Python](https://img.kancloud.cn/e9/0b/e90bc3ca77d1dc9262a288e2e2db2644_640x427.jpg) 如何使用 Python 重新取樣和插值您的時間序列數據 照片來自 [sung ming whang](https://www.flickr.com/photos/smwhang/4413240111/) ,保留一些權利。 ## 重采樣 重新采樣涉及更改時間序列觀察的頻率。 兩種類型的重采樣是: 1. **上采樣**:增加樣本頻率的位置,例如從幾分鐘到幾秒。 2. **下采樣**:降低樣本頻率的地方,例如從幾天到幾個月。 在這兩種情況下,都必須發明數據。 在上采樣的情況下,可能需要小心確定如何使用插值計算細粒度觀測值。在下采樣的情況下,在選擇用于計算新聚合值的摘要統計時可能需要小心。 您可能有興趣重新采樣時間序列數據的原因可能有兩個: 1. **問題成幀**:如果您的數據與您想要進行預測的頻率相同,則可能需要重新采樣。 2. **特征工程**:重新取樣還可用于為監督學習模型提供額外的結構或洞察學習問題。 這兩種情況之間存在很多重疊。 例如,您可能擁有每日數據,并希望預測每月問題。您可以直接使用每日數據,也可以將其下采樣到月度數據并開發模型。 特征工程視角可以在開發模型時使用來自時間尺度和更多時間尺度的觀察的觀察和總結。 讓我們通過查看真實數據集和一些示例,使重新取樣更具體。 ## 洗發水銷售數據集 該數據集描述了 3 年期間每月洗發水的銷售數量。 單位是銷售計數,有 36 個觀察。原始數據集歸功于 Makridakis,Wheelwright 和 Hyndman(1998)。 下面是前 5 行數據的示例,包括標題行。 ```py "Month","Sales" "1-01",266.0 "1-02",145.9 "1-03",183.1 "1-04",119.3 "1-05",180.3 ``` 下面是從數據市場獲取的整個數據集的圖表。 ![Shampoo Sales Dataset](https://img.kancloud.cn/1b/11/1b1108b700529e9ecb48bf7e2a5c7bd0_724x387.jpg) 洗發水銷售數據集 數據集顯示趨勢增加,可能還有一些季節性組件。 [在此處下載并了解有關數據集的更多信息](https://datamarket.com/data/set/22r0/sales-of-shampoo-over-a-three-year-period)。 ## 加載 Shampoo Sales Dataset 下載數據集并將其放在當前工作目錄中,文件名為“ _shampoo-sales.csv_ ”。 數據集中的時間戳沒有絕對年份,但確實有一個月。我們可以編寫一個自定義日期解析函數來加載這個數據集,并選擇一個任意年份,例如 1900 年,以確定年份的基線。 下面是使用 _read_csv()_ 中的自定義日期解析功能加載 Shampoo Sales 數據集的代碼片段。 ```py from pandas import read_csv from pandas import datetime from matplotlib import pyplot def parser(x): return datetime.strptime('190'+x, '%Y-%m') series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser) print(series.head()) series.plot() pyplot.show() ``` 運行此示例將加載數據集并打印前 5 行。這顯示了日期的正確處理,從 1900 年開始。 ```py Month 1901-01-01 266.0 1901-02-01 145.9 1901-03-01 183.1 1901-04-01 119.3 1901-05-01 180.3 Name: Sales of shampoo over a three year period, dtype: float64 ``` 我們還得到了一個數據集圖,顯示了每月銷售額的上升趨勢。 ![Plot of the Shamoo Sales Dataset](https://img.kancloud.cn/8d/58/8d588dd57598f15129e9e8500c26168a_800x600.jpg) 洗發水銷售數據集的情節 ## Upsample 洗發水銷售 洗發水銷售中的觀察結果是每月一次。 想象一下,我們想要每日銷售信息。我們必須將頻率從月度上升到每日,并使用插值方案填寫新的每日頻率。 Pandas 庫在 _ 系列 _ 和 _DataFrame_ 對象上提供了一個名為 _resample()_ 的函數。這可用于在下采樣時對記錄進行分組,并在進行上采樣時為新觀察創建空間。 我們可以使用此功能通過調用重新采樣并指定日歷日頻率或“D”的首選頻率,將每月數據集轉換為每日數據集。 Pandas 很聰明,您可以輕松地將頻率指定為“1D”甚至是特定于域的內容,例如“5D”。請參閱本教程末尾的更多閱讀部分,以獲取可以使用的別名列表。 ```py from pandas import read_csv from pandas import datetime def parser(x): return datetime.strptime('190'+x, '%Y-%m') series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser) upsampled = series.resample('D') print(upsampled.head(32)) ``` 運行此示例將打印上采樣數據集的前 32 行,顯示 1 月的每一天和 2 月的第一天。 ```py Month 1901-01-01 266.0 1901-01-02 NaN 1901-01-03 NaN 1901-01-04 NaN 1901-01-05 NaN 1901-01-06 NaN 1901-01-07 NaN 1901-01-08 NaN 1901-01-09 NaN 1901-01-10 NaN 1901-01-11 NaN 1901-01-12 NaN 1901-01-13 NaN 1901-01-14 NaN 1901-01-15 NaN 1901-01-16 NaN 1901-01-17 NaN 1901-01-18 NaN 1901-01-19 NaN 1901-01-20 NaN 1901-01-21 NaN 1901-01-22 NaN 1901-01-23 NaN 1901-01-24 NaN 1901-01-25 NaN 1901-01-26 NaN 1901-01-27 NaN 1901-01-28 NaN 1901-01-29 NaN 1901-01-30 NaN 1901-01-31 NaN 1901-02-01 145.9 ``` 我們可以看到 _resample()_ 函數通過將 NaN 值放入新值來創建行。我們可以看到我們仍然從原始數據的 1 月和 2 月的第一個銷售量。 接下來,我們可以在這個新頻率上插入缺失值。 _ 系列 _ Pandas 對象提供 _ 插值()_ 函數來插值缺失值,并且有一個很好的選擇簡單和更復雜的插值函數。您可能具有領域知識,可幫助選擇如何插值。 一個好的起點是使用線性插值。這會在可用數據之間繪制一條直線,在本例中是在該月的第一天,并從該行填充所選頻率的值。 ```py from pandas import read_csv from pandas import datetime def parser(x): return datetime.strptime('190'+x, '%Y-%m') series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser) upsampled = series.resample('D') interpolated = upsampled.interpolate(method='linear') print(interpolated.head(32)) ``` 運行此示例,我們可以看到插值。 ```py Month 1901-01-01 266.000000 1901-01-02 262.125806 1901-01-03 258.251613 1901-01-04 254.377419 1901-01-05 250.503226 1901-01-06 246.629032 1901-01-07 242.754839 1901-01-08 238.880645 1901-01-09 235.006452 1901-01-10 231.132258 1901-01-11 227.258065 1901-01-12 223.383871 1901-01-13 219.509677 1901-01-14 215.635484 1901-01-15 211.761290 1901-01-16 207.887097 1901-01-17 204.012903 1901-01-18 200.138710 1901-01-19 196.264516 1901-01-20 192.390323 1901-01-21 188.516129 1901-01-22 184.641935 1901-01-23 180.767742 1901-01-24 176.893548 1901-01-25 173.019355 1901-01-26 169.145161 1901-01-27 165.270968 1901-01-28 161.396774 1901-01-29 157.522581 1901-01-30 153.648387 1901-01-31 149.774194 1901-02-01 145.900000 ``` 查看線圖,我們看到繪制原始數據沒有區別,因為繪圖已經插入點之間的值以繪制線。 ![Shamoo Sales Interpolated Linear](https://img.kancloud.cn/2b/e3/2be3769b36f8df6c3e8b290131fec266_800x600.jpg) 洗發水銷售插值線性 另一種常見的插值方法是使用多項式或樣條曲線來連接這些值。 這會創建更多曲線,并且在許多數據集上看起來更自然。使用樣條插值需要指定順序(多項式中的項數);在這種情況下,2 的訂單就好了。 ```py from pandas import read_csv from pandas import datetime from matplotlib import pyplot def parser(x): return datetime.strptime('190'+x, '%Y-%m') series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser) upsampled = series.resample('D') interpolated = upsampled.interpolate(method='spline', order=2) print(interpolated.head(32)) interpolated.plot() pyplot.show() ``` 運行該示例,我們可以首先查看原始插值。 ```py Month 1901-01-01 266.000000 1901-01-02 258.630160 1901-01-03 251.560886 1901-01-04 244.720748 1901-01-05 238.109746 1901-01-06 231.727880 1901-01-07 225.575149 1901-01-08 219.651553 1901-01-09 213.957094 1901-01-10 208.491770 1901-01-11 203.255582 1901-01-12 198.248529 1901-01-13 193.470612 1901-01-14 188.921831 1901-01-15 184.602185 1901-01-16 180.511676 1901-01-17 176.650301 1901-01-18 173.018063 1901-01-19 169.614960 1901-01-20 166.440993 1901-01-21 163.496161 1901-01-22 160.780465 1901-01-23 158.293905 1901-01-24 156.036481 1901-01-25 154.008192 1901-01-26 152.209039 1901-01-27 150.639021 1901-01-28 149.298139 1901-01-29 148.186393 1901-01-30 147.303783 1901-01-31 146.650308 1901-02-01 145.900000 ``` 回顧線圖,我們可以在插值上看到更自然的曲線。 ![Shamoo Sales Interpolated Spline](https://img.kancloud.cn/af/a9/afa9cc799b7afc137e84dba4fa3fa47a_800x600.jpg) 洗發水銷售插值樣條 通常,當您缺少觀察值時,插值是一種有用的工具。 接下來,我們將考慮在另一個方向上重新采樣并降低觀測頻率。 ## 降低洗發水銷售量 銷售數據是按月計算的,但也許我們希望數據是季度的。 這一年可分為 4 個營業季,3 個月一塊。 Pandas 中的 _resample()_ 函數不是在現有觀測值之間創建新行,而是按新頻率對所有觀測值進行分組。 我們可以使用像“3M”這樣的別名創建 3 個月的組,但如果我們的觀察結果沒有在 1 月,4 月,7 月或 10 月開始,則可能會遇到麻煩。熊貓確實有一個四分之一的“Q”別名,我們可以用它來達到這個目的。 我們現在必須決定如何從每組 3 條記錄中創建新的季度值。一個很好的起點是計算本季度的平均月銷售數字。為此,我們可以使用 _mean()_ 函數。 綜上所述,我們得到以下代碼示例。 ```py from pandas import read_csv from pandas import datetime from matplotlib import pyplot def parser(x): return datetime.strptime('190'+x, '%Y-%m') series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser) resample = series.resample('Q') quarterly_mean_sales = resample.mean() print(quarterly_mean_sales.head()) quarterly_mean_sales.plot() pyplot.show() ``` 運行該示例將打印季度數據的前 5 行。 ```py Month 1901-03-31 198.333333 1901-06-30 156.033333 1901-09-30 216.366667 1901-12-31 215.100000 1902-03-31 184.633333 Freq: Q-DEC, Name: Sales, dtype: float64 ``` 我們還繪制了季度數據,顯示了 3 年原始觀測中的 Q1-Q4。 ![Shamoo Sales Upsampled Quarterly](https://img.kancloud.cn/b1/a5/b1a5fde8920c387d54a5833d266d5e43_800x600.jpg) 洗發水銷售季度下降 也許我們希望進一步將月度數據轉化為年度數據,也許稍后可以使用它來模擬下一年的數據。 我們可以使用年末頻率的別名“A”對數據進行下采樣,這次使用總和來計算每年的總銷售額。 ```py from pandas import read_csv from pandas import datetime from matplotlib import pyplot def parser(x): return datetime.strptime('190'+x, '%Y-%m') series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser) resample = series.resample('A') quarterly_mean_sales = resample.sum() print(quarterly_mean_sales.head()) quarterly_mean_sales.plot() pyplot.show() ``` 運行該示例顯示了 3 年觀察的 3 條記錄。 我們還得到一個圖,正確顯示沿 x 軸的年份和沿 y 軸的每年銷售總數。 ![Shamoo Sales Upsampled Yearly Sum](https://img.kancloud.cn/79/b1/79b132544394327a523a65eb282b9236_800x600.jpg) 洗發水銷售額下降年度總和 ## 進一步閱讀 本節提供本教程中使用的 Pandas 函數的鏈接和進一步閱讀。 * [pandas.Series.resample API 文檔](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.resample.html)了解有關如何配置 resample()函數的更多信息。 * [Pandas 時間序列重采樣示例](http://pandas.pydata.org/pandas-docs/stable/timeseries.html#resampling),用于更一般的代碼示例。 * [Pandas Offset 在重新采樣](http://pandas.pydata.org/pandas-docs/stable/timeseries.html#offset-aliases)時使用的所有內置方法用于更改數據粒度的別名。 * [pandas.Series.interpolate API 文檔](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.interpolate.html)了解有關如何配置 interpolate()函數的更多信息。 ## 摘要 在本教程中,您了解了如何使用 Python 中的 Pandas 重新采樣時間序列數據。 具體來說,你學到了: * 關于時間序列重采樣以及下采樣和上采樣觀察頻率之間的差異和原因。 * 如何使用 Pandas 對時間序列數據進行上采樣以及如何使用不同的插值方案。 * 如何使用 Pandas 對時間序列數據進行下采樣以及如何匯總分組數據。 您對重新采樣或插值時間序列數據或本教程有任何疑問嗎? 在評論中提出您的問題,我會盡力回答。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看