掌握Pandas時間序列分析的20個知識點


作者|Soner Yıldırım
編譯|VK
來源|Towards Datas Science

時間序列數據有很多種定義,它們以不同的方式表示相同的含義。一個簡單的定義是,時間序列數據是包含序列時間戳的數據點。

時間序列數據的來源是周期性測量或觀測。我們觀察了許多行業的時間序列數據。舉幾個例子:

  • 股票價格隨時間變化

  • 日、周、月銷售額

  • 過程中的周期性測量

  • 一段時間內的電力或天然氣消耗率

在這篇文章中,我將列出20點,這將有助於你全面了解如何處理Pandas的時間序列數據處理。


1.不同形式的時間序列數據

時間序列數據可以是特定日期、持續時間或固定定義間隔的形式。

時間戳可以是一天的日期,也可以是給定日期的納秒,具體取決於精度。例如,“2020–01–01 14:59:30”是基於秒的時間戳。

2.時間序列數據結構

Pandas提供靈活高效的數據結構來處理各種時間序列數據。

除了這三種結構,Pandas還支持日期偏移概念,這是一種考慮日歷算法的相對時間長度。

3.創建時間戳

最基本的時間序列數據結構是時間戳,它可以使用to_datetimeTimestamp 函數創建

import pandas as pd

pd.to_datetime('2020-9-13')
Timestamp('2020-09-13 00:00:00')

pd.Timestamp('2020-9-13')
Timestamp('2020-09-13 00:00:00')

4.訪問時間戳的信息

我們可以獲得存儲在時間戳中的日期、月份和年份的信息。

a = pd.Timestamp('2020-9-13')

a.day_name()
'Sunday'

a.month_name()
'September'

a.day
13

a.month
9

a.year
2020

5.獲取不太明顯的信息

Timestamp對象還保存有關日期算術的信息。例如,我們可以問一年是否是閏年。以下是我們可以獲得的一些更具體的信息:

b = pd.Timestamp('2020-9-30')

b.is_month_end
True

b.is_leap_year
True

b.is_quarter_start
False

b.weekofyear
40

6.歐式日期

我們可以使用to_datetime函數來處理歐式日期(即日期優先)。dayfirst參數設置為True。

pd.to_datetime('10-9-2020', dayfirst=True)
Timestamp('2020-09-10 00:00:00')

pd.to_datetime('10-9-2020')
Timestamp('2020-10-09 00:00:00')

注:如果第一項大於12,Pandas知道它不能是月份。

pd.to_datetime('13-9-2020')
Timestamp('2020-09-13 00:00:00')

7.將數據幀轉換為時間序列數據

to_datetime 函數可以將具有適當列的數據幀轉換為時間序列。考慮以下數據幀:

pd.to_datetime(df)

0   2020-04-13 
1   2020-05-16 
2   2019-04-11 
dtype: datetime64[ns]

8.時間序列數據

在現實生活中,我們幾乎總是處理連續的時間序列數據,而不是單獨的日期。Pandas使處理時序數據變得非常簡單。

我們可以將日期列表傳遞給to_datetime函數。

pd.to_datetime(['2020-09-13', '2020-08-12', 
'2020-08-04', '2020-09-05'])

DatetimeIndex(['2020-09-13', '2020-08-12', '2020-08-04', '2020-09-05'], dtype='datetime64[ns]', freq=None)

返回的對象是DatetimeIndex。

有更實用的方法來創建日期序列。

9.創建包含to_datetime和to_timedelta的時間序列

可以通過向時間戳添加TimedeltaIndex來創建DatetimeIndex。

pd.to_datetime('10-9-2020') + pd.to_timedelta(np.arange(5), 'D')

“D”表示“day”,但還有許多其他選項可用。你可以在這里查看整個清單:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_timedelta.html

10.date_range函數

它提供了一種更靈活的方法來創建DatetimeIndex。

pd.date_range(start='2020-01-10', periods=10, freq='M')

periods參數指定索引中的項數。freq是頻率,“M”表示一個月的最后一天。

就freq參數的參數而言,date_range相當靈活。

pd.date_range(start='2020-01-10', periods=10, freq='6D')

我們創建了一個頻率為6天的索引。

11.period_range 函數

它返回一個周期索引。語法類似於date_range函數。

pd.period_range('2018', periods=10, freq='M')

12.timedelta_range 函數

返回TimedeltaIndex。

pd.timedelta_range(start='0', periods=24, freq='H')

13時區

默認情況下,pandas的時間序列對象沒有指定的時區。

dates = pd.date_range('2019-01-01','2019-01-10')

dates.tz is None
True

我們可以使用tz_localize方法為這些對象指定一個時區。

dates_lcz = dates.tz_localize('Europe/Berlin')

dates_lcz.tz
<DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD>

14.創建具有指定時區的時間序列

我們還可以使用tz關鍵字參數創建一個帶有時區的時間序列對象。

pd.date_range('2020-01-01', periods = 5, freq = 'D', tz='US/Eastern')

15.偏移量

假設我們有一個時間序列索引,並希望偏移特定時間的所有日期。

A = pd.date_range('2020-01-01', periods=10, freq='D')
A

讓我們在這個序列中增加一周的偏移量。

A + pd.offsets.Week()

16.移動時間序列數據

時間序列數據分析可能需要移動數據點來進行比較。shift函數可及時移動數據。

A.shift(10, freq='M')

17.shift與tshift

  • shift:移動數據

  • tshift:改變時間索引

讓我們創建一個帶有時間序列索引的數據幀,並對其進行繪圖,以查看shift和tshift之間的差異。

dates = pd.date_range('2020-03-01', periods=30, freq='D')
values = np.random.randint(10, size=30)
df = pd.DataFrame({'values':values}, index=dates)

df.head()

讓我們將原始時間序列與移位的時間序列一起繪制出來。

import matplotlib.pyplot as plt

fig, axs = plt.subplots(nrows=3, figsize=(10,6), sharey=True)
plt.tight_layout(pad=4)
df.plot(ax=axs[0], legend=None)
df.shift(10).plot(ax=axs[1], legend=None)
df.tshift(10).plot(ax=axs[2], legend=None)

18.使用重采樣功能重新采樣

時間序列數據的另一個常見操作是重采樣。根據任務的不同,我們可能需要以更高或更低的頻率重新采樣數據。

重采樣創建指定內部的組,並允許你對組進行聚合。

讓我們創建一個包含30個值和時間序列索引的Pandas序列。

A = pd.date_range('2020-01-01', periods=30, freq='D')
values = np.random.randint(10, size=30)
S = pd.Series(values, index=A)

下面將返回3天周期的平均值。

S.resample('3D').mean()

19.Asfreq函數

在某些情況下,我們可能對某些頻率下的值感興趣。Asfreq函數返回指定間隔結束時的值。例如,在上一步創建的序列中,我們可能只需要每隔3天(而不是3天平均值)的值。

S.asfreq('3D')

20.滾動

滾動是時間序列數據的一種非常有用的操作。滾動意味着創建一個具有指定大小的滾動窗口,並對該窗口中的數據執行計算,當然,該窗口會滾動數據。下圖解釋了滾動的概念。

值得注意的是,當整個窗口都在數據中時,計算就開始了。換句話說,如果窗口的大小為3,則第一次聚合將在第三行完成。

讓我們將3天的滾動窗口應用到我們的序列中。

S.rolling(3).mean()[:10]

結論

我們已經全面介紹了Pandas的時間序列分析。值得注意的是,Pandas提供了更多的時間序列分析。

官方文檔涵蓋了時間序列的所有功能和方法。乍一看似乎詳盡無遺,但通過練習你會感到有所成長。

官方文檔:https://pandas.pydata.org/docs/user_guide/timeseries.html

謝謝你的閱讀。如果你有任何反饋,請告訴我。

原文鏈接:https://towardsdatascience.com/20-points-to-master-pandas-time-series-analysis-f90155ee0e8a

歡迎關注磐創AI博客站:
http://panchuang.net/

sklearn機器學習中文官方文檔:
http://sklearn123.com/

歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM