>  기사  >  백엔드 개발  >  Python 시계열 데이터 조작을 위한 일반적인 방법 요약

Python 시계열 데이터 조작을 위한 일반적인 방법 요약

WBOY
WBOY앞으로
2023-04-24 22:22:061818검색

시계열 데이터는 일정 기간 동안 수집된 데이터의 일종으로 금융, 경제, 기상학 등 분야에서 자주 사용되며, 시간에 따른 추세와 패턴을 이해하기 위해 분석되는 경우가 많습니다. Python의 강력하고 널리 사용되는 데이터 조작 라이브러리로, 특히 시계열 데이터 처리에 적합합니다. 시계열 데이터를 쉽게 로드, 조작 및 분석할 수 있는 일련의 도구와 기능을 제공합니다.

이 글에서는 Pandas를 사용하여 시계열 데이터를 조작하는 핵심 기술인 시계열 데이터의 인덱싱 및 슬라이싱, 리샘플링 및 롤링 윈도우 계산, 기타 유용한 일반 작업을 소개합니다. Python 시계열 데이터 조작을 위한 일반적인 방법 요약

데이터 유형

Python

Python에는 날짜를 표시하기 위해 특별히 내장된 데이터 유형이 없습니다. 일반적인 상황에서는 datetime 모듈에서 제공하는 datetime 객체가 날짜 및 시간 작업에 사용됩니다.

import datetime

t = datetime.datetime.now()
print(f"type: {type(t)} and t: {t}")
#type: <class 'datetime.datetime'> and t: 2022-12-26 14:20:51.278230

일반적으로 우리는 날짜와 시간을 저장하기 위해 문자열을 사용합니다. 따라서 이러한 문자열을 사용할 때 날짜/시간 객체로 변환해야 합니다.

일반적으로 시간 문자열의 형식은 다음과 같습니다.

YYYY-MM-DD (예: 2022-01-01)

YYYY/MM/DD (예: 2022/01/01)

    DD-MM- YYYY (예: 01-01-2022)
  • DD/MM/YYYY (예: 01/01/2022)
  • MM-DD-YYYY (예: 01-01-2022)
  • MM/DD/YYYY (예: 01/01 /2022)
  • HH:MM:SS (예: 11:30:00)
  • HH:MM:SS AM/PM (예: 오전 11:30:00)
  • HH:MM AM/PM (예: 11:30 AM)
  • strptime 함수는 문자열과 형식 문자열을 매개변수로 사용하고 날짜/시간 객체를 반환합니다.
  • string = '2022-01-01 11:30:09'
    t = datetime.datetime.strptime(string, "%Y-%m-%d %H:%M:%S")
    print(f"type: {type(t)} and t: {t}")
    #type: <class 'datetime.datetime'> and t: 2022-01-01 11:30:09
  • 형식 문자열은 다음과 같습니다.

strftime 함수를 사용하여 날짜/시간 개체를 다시 특정 형식의 문자열 표현으로 변환할 수도 있습니다.

t = datetime.datetime.now()
t_string = t.strftime("%m/%d/%Y, %H:%M:%S")
#12/26/2022, 14:38:47

t_string = t.strftime("%b/%d/%Y, %H:%M:%S")
#Dec/26/2022, 14:39:32

Unix 시간(POSIX 시간 또는 epoch 시간)은 시간을 단일 숫자 값으로 표현하는 시스템입니다. 1970년 1월 1일 목요일 00:00:00 협정 세계시(UTC) 이후 경과된 초 수를 나타냅니다. Python 시계열 데이터 조작을 위한 일반적인 방법 요약

Unix 시간과 타임스탬프는 종종 같은 의미로 사용됩니다. Unix 시간은 타임스탬프 생성을 위한 표준 버전입니다. 일반적으로 정수 또는 부동 소수점 데이터 유형은 타임스탬프와 Unix 시간을 저장하는 데 사용됩니다.

time 모듈의 mktime 메서드를 사용하여 datetime 객체를 Unix 시간 정수로 변환할 수 있습니다. datetime 모듈의 fromtimestamp 메소드를 사용할 수도 있습니다.

#convert datetime to unix time
import time
from datetime import datetime

t = datetime.now()
unix_t = int(time.mktime(t.timetuple()))
#1672055277

#convert unix time to datetime
unix_t = 1672055277
t = datetime.fromtimestamp(unix_t)
#2022-12-26 14:47:57

dateutil 모듈을 사용하여 날짜 문자열을 구문 분석하여 datetime 객체를 얻습니다.

from dateutil import parser
date = parser.parse("29th of October, 1923")
#datetime.datetime(1923, 10, 29, 0, 0)

Pandas

Pandas는

1, Timestamp 또는 DatetimeIndex의 세 가지 날짜 데이터 유형을 제공합니다. 이는 다른 인덱스 유형처럼 작동하지만 시계열 작업을 위한 특수 기능도 있습니다.

t = pd.to_datetime("29/10/1923", dayfirst=True)
#Timestamp('1923-10-29 00:00:00')

t = pd.Timestamp('2019-01-01', tz = 'Europe/Berlin')
#Timestamp('2019-01-01 00:00:00+0100', tz='Europe/Berlin')

t = pd.to_datetime(["04/23/1920", "10/29/1923"])
#DatetimeIndex(['1920-04-23', '1923-10-29'], dtype='datetime64[ns]', freq=None)

2. 기간 또는 PeriodIndex: 시작과 끝이 있는 시간 간격입니다. 고정 간격으로 구성됩니다.

t = pd.to_datetime(["04/23/1920", "10/29/1923"])
period = t.to_period("D")
#PeriodIndex(['1920-04-23', '1923-10-29'], dtype='period[D]')

3. Timedelta 또는 TimedeltaIndex: 두 날짜 사이의 시간 간격입니다.

delta = pd.TimedeltaIndex(data =['1 days 03:00:00',
 '2 days 09:05:01.000030'])
"""
TimedeltaIndex(['1 days 02:00:00', '1 days 06:05:01.000030'],
dtype='timedelta64[ns]', freq=None)
"""

Pandas에서는 to_datetime 메서드를 사용하여 객체를 datetime 데이터 유형으로 변환하거나 다른 변환을 수행할 수 있습니다.

import pandas as pd
df = pd.read_csv("dataset.txt")
df.head()

"""

date value
0 1991-07-01 3.526591
1 1991-08-01 3.180891
2 1991-09-01 3.252221
3 1991-10-01 3.611003
4 1991-11-01 3.565869
"""

df.info()

"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 204 entries, 0 to 203
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date 204 non-null object
1 value 204 non-null float64
dtypes: float64(1), object(1)
memory usage: 3.3+ KB
"""

# Convert to datetime
df["date"] = pd.to_datetime(df["date"], format = "%Y-%m-%d")

df.info()

"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 204 entries, 0 to 203
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date 204 non-null datetime64[ns]
1 value 204 non-null float64
dtypes: datetime64[ns](1), float64(1)
memory usage: 3.3 KB
"""

# Convert to Unix
df['unix_time'] = df['date'].apply(lambda x: x.timestamp())
df.head()
"""
date value unix_time
0 1991-07-01 3.526591 678326400.0
1 1991-08-01 3.180891 681004800.0
2 1991-09-01 3.252221 683683200.0
3 1991-10-01 3.611003 686275200.0
4 1991-11-01 3.565869 688953600.0
"""

df["date_converted_from_unix"] = pd.to_datetime(df["unix_time"], unit = "s")
df.head()
"""
date value unix_time date_converted_from_unix
0 1991-07-01 3.526591 678326400.0 1991-07-01
1 1991-08-01 3.180891 681004800.0 1991-08-01
2 1991-09-01 3.252221 683683200.0 1991-09-01
3 1991-10-01 3.611003 686275200.0 1991-10-01
4 1991-11-01 3.565869 688953600.0 1991-11-01
"""

또한 pars_dates 매개변수를 사용하여 모든 파일 로드 시 날짜 열을 직접 선언할 수도 있습니다.

df = pd.read_csv("dataset.txt", parse_dates=["date"])
df.info()

"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 204 entries, 0 to 203
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date 204 non-null datetime64[ns]
1 value 204 non-null float64
dtypes: datetime64[ns](1), float64(1)
memory usage: 3.3 KB
"""

단일 시계열 데이터인 경우 날짜 열을 데이터 세트의 인덱스로 사용하는 것이 가장 좋습니다.

df.set_index("date",inplace=True)

"""
Value
date
1991-07-01 3.526591
1991-08-01 3.180891
1991-09-01 3.252221
1991-10-01 3.611003
1991-11-01 3.565869
... ...
2008-02-01 21.654285
2008-03-01 18.264945
2008-04-01 23.107677
2008-05-01 22.912510
2008-06-01 19.431740
"""

Numpy에는 자체 날짜 시간 유형 np.Datetime64도 있습니다. 특히 대규모 데이터 세트로 작업할 때 벡터화는 매우 유용하므로 먼저 사용해야 합니다.

import numpy as np
arr_date = np.array('2000-01-01', dtype=np.datetime64)
arr_date
#array('2000-01-01', dtype='datetime64[D]')

#broadcasting
arr_date = arr_date + np.arange(30)
"""
array(['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04',
'2000-01-05', '2000-01-06', '2000-01-07', '2000-01-08',
'2000-01-09', '2000-01-10', '2000-01-11', '2000-01-12',
'2000-01-13', '2000-01-14', '2000-01-15', '2000-01-16',
'2000-01-17', '2000-01-18', '2000-01-19', '2000-01-20',
'2000-01-21', '2000-01-22', '2000-01-23', '2000-01-24',
'2000-01-25', '2000-01-26', '2000-01-27', '2000-01-28',
'2000-01-29', '2000-01-30'], dtype='datetime64[D]')
"""

유용한 함수

아래 목록은 시계열에 유용할 수 있는 일부 함수입니다.

df = pd.read_csv("dataset.txt", parse_dates=["date"])
df["date"].dt.day_name()

"""
0 Monday
1 Thursday
2 Sunday
3 Tuesday
4 Friday
...
199 Friday
200 Saturday
201 Tuesday
202 Thursday
203 Sunday
Name: date, Length: 204, dtype: object
"""

DataReader

Pandas_datareader는 팬더 라이브러리의 보조 라이브러리입니다. 이는 많은 일반적인 금융 시계열 데이터를 제공합니다.

#pip install pandas-datareader
from pandas_datareader import wb
#GDP per Capita From World Bank
df = wb.download(indicator='NY.GDP.PCAP.KD',
 country=['US', 'FR', 'GB', 'DK', 'NO'], start=1960, end=2019)

"""
NY.GDP.PCAP.KD
country year
Denmark 2019 57203.027794
2018 56563.488473
2017 55735.764901
2016 54556.068955
2015 53254.856370
... ...
United States 1964 21599.818705
1963 20701.269947
1962 20116.235124
1961 19253.547329
1960 19135.268182

[300 rows x 1 columns]
"""

날짜 범위

pandas의 date_range 메소드를 사용하여 날짜 범위를 정의할 수 있습니다.

pd.date_range(start="2021-01-01", end="2022-01-01", freq="D")

"""
DatetimeIndex(['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04',
'2021-01-05', '2021-01-06', '2021-01-07', '2021-01-08',
'2021-01-09', '2021-01-10',
...
'2021-12-23', '2021-12-24', '2021-12-25', '2021-12-26',
'2021-12-27', '2021-12-28', '2021-12-29', '2021-12-30',
'2021-12-31', '2022-01-01'],
dtype='datetime64[ns]', length=366, freq='D')
"""

pd.date_range(start="2021-01-01", end="2022-01-01", freq="BM")

"""
DatetimeIndex(['2021-01-29', '2021-02-26', '2021-03-31', '2021-04-30',
'2021-05-31', '2021-06-30', '2021-07-30', '2021-08-31',
'2021-09-30', '2021-10-29', '2021-11-30', '2021-12-31'],
dtype='datetime64[ns]', freq='BM')
"""

fridays= pd.date_range('2022-11-01', '2022-12-31', freq="W-FRI")
"""
DatetimeIndex(['2022-11-04', '2022-11-11', '2022-11-18', '2022-11-25',
'2022-12-02', '2022-12-09', '2022-12-16', '2022-12-23',
'2022-12-30'],
dtype='datetime64[ns]', freq='W-FRI')
"""

timedelta_range 메소드를 사용하여 시계열을 생성할 수 있습니다.

t = pd.timedelta_range(0, periods=10, freq="H")

"""
TimedeltaIndex(['0 days 00:00:00', '0 days 01:00:00', '0 days 02:00:00',
'0 days 03:00:00', '0 days 04:00:00', '0 days 05:00:00',
'0 days 06:00:00', '0 days 07:00:00', '0 days 08:00:00',
'0 days 09:00:00'],
dtype='timedelta64[ns]', freq='H')
"""

FormattingPython 시계열 데이터 조작을 위한 일반적인 방법 요약

dt.strftime 메소드는 날짜 열의 형식을 변경합니다.

df["new_date"] = df["date"].dt.strftime("%b %d, %Y")
df.head()
"""
date value new_date
0 1991-07-01 3.526591 Jul 01, 1991
1 1991-08-01 3.180891 Aug 01, 1991
2 1991-09-01 3.252221 Sep 01, 1991
3 1991-10-01 3.611003 Oct 01, 1991
4 1991-11-01 3.565869 Nov 01, 1991
"""

Parses

날짜/시간 개체를 구문 분석하고 날짜의 하위 개체를 가져옵니다.

df["year"] = df["date"].dt.year
df["month"] = df["date"].dt.month
df["day"] = df["date"].dt.day
df["calendar"] = df["date"].dt.date
df["hour"] = df["date"].dt.time
df.head()
"""
date value year month day calendar hour
0 1991-07-01 3.526591 1991 7 1 1991-07-01 00:00:00
1 1991-08-01 3.180891 1991 8 1 1991-08-01 00:00:00
2 1991-09-01 3.252221 1991 9 1 1991-09-01 00:00:00
3 1991-10-01 3.611003 1991 10 1 1991-10-01 00:00:00
4 1991-11-01 3.565869 1991 11 1 1991-11-01 00:00:00
"""

재결합할 수도 있습니다.

df["date_joined"] = pd.to_datetime(df[["year","month","day"]])
print(df["date_joined"])
"""
0 1991-07-01
1 1991-08-01
2 1991-09-01
3 1991-10-01
4 1991-11-01
...
199 2008-02-01
200 2008-03-01
201 2008-04-01
202 2008-05-01
203 2008-06-01
Name: date_joined, Length: 204, dtype: datetime64[ns]

Filter query

DataFrame을 필터링하려면 loc 메서드를 사용하세요.

df = df.loc["2021-01-01":"2021-01-10"]

truncate는 두 시간 간격으로 데이터를 쿼리할 수 있습니다.

df_truncated = df.truncate('2021-01-05', '2022-01-10')

Python 시계열 데이터 조작을 위한 일반적인 방법 요약

일반적인 데이터 작업

다음은 시계열 데이터 세트의 값에 대한 작업입니다. 우리는 yfinance 라이브러리를 사용하여 예시용 주식 데이터세트를 생성합니다. Python 시계열 데이터 조작을 위한 일반적인 방법 요약

#get google stock price data
import yfinance as yf
start_date = '2020-01-01'
end_date = '2023-01-01'
ticker = 'GOOGL'
df = yf.download(ticker, start_date, end_date)
df.head()

"""
Date Open High Low Close Adj Close Volume
2020-01-02 67.420502 68.433998 67.324501 68.433998 68.433998 27278000
2020-01-03 67.400002 68.687500 67.365997 68.075996 68.075996 23408000
2020-01-06 67.581497 69.916000 67.550003 69.890503 69.890503 46768000
2020-01-07 70.023003 70.175003 69.578003 69.755501 69.755501 34330000
2020-01-08 69.740997 70.592499 69.631500 70.251999 70.251999 35314000
"""

차이 계산

diff 함수는 한 요소와 다른 요소 사이의 보간을 계산할 수 있습니다.

#subtract that day's value from the previous day
df["Diff_Close"] = df["Close"].diff()
#Subtract that day's value from the day's value 2 days ago
df["Diff_Close_2Days"] = df["Close"].diff(periods=2)

Python 시계열 데이터 조작을 위한 일반적인 방법 요약

累计总数

df["Volume_Cumulative"] = df["Volume"].cumsum()

Python 시계열 데이터 조작을 위한 일반적인 방법 요약

滚动窗口计算

滚动窗口计算(移动平均线)。

df["Close_Rolling_14"] = df["Close"].rolling(14).mean()
df.tail()

Python 시계열 데이터 조작을 위한 일반적인 방법 요약

可以对我们计算的移动平均线进行可视化

Python 시계열 데이터 조작을 위한 일반적인 방법 요약

常用的参数:

  • center:决定滚动窗口是否应以当前观测值为中心。
  • min_periods:窗口中产生结果所需的最小观测次数。
s = pd.Series([1, 2, 3, 4, 5])

#the rolling window will be centered on each observation
rolling_mean = s.rolling(window=3, center=True).mean()
"""
0 NaN
1 2.0
2 3.0
3 4.0
4 NaN
dtype: float64
Explanation:
first window: [na 1 2] = na
second window: [1 2 3] = 2
"""

# the rolling window will not be centered,
#and will instead be anchored to the left side of the window
rolling_mean = s.rolling(window=3, center=False).mean()
"""
0 NaN
1 NaN
2 2.0
3 3.0
4 4.0
dtype: float64
Explanation:
first window: [na na 1] = na
second window: [na 1 2] = na
third window: [1 2 3] = 2
"""

平移

Pandas有两个方法,shift()和tshift(),它们可以指定倍数移动数据或时间序列的索引。Shift()移位数据,而tshift()移位索引。

#shift the data
df_shifted = df.shift(5,axis=0)
df_shifted.head(10)

#shift the indexes
df_tshifted = df.tshift(periods = 4, freq = 'D')
df_tshifted.head(10)

Python 시계열 데이터 조작을 위한 일반적인 방법 요약

df_shifted

Python 시계열 데이터 조작을 위한 일반적인 방법 요약

df_tshifted

时间间隔转换

在 Pandas 中,操 to_period 函数允许将日期转换为特定的时间间隔。可以获取具有许多不同间隔或周期的日期

df["Period"] = df["Date"].dt.to_period('W')

Python 시계열 데이터 조작을 위한 일반적인 방법 요약

频率

Asfreq方法用于将时间序列转换为指定的频率。

monthly_data = df.asfreq('M', method='ffill')

Python 시계열 데이터 조작을 위한 일반적인 방법 요약

常用参数:

freq:数据应该转换到的频率。这可以使用字符串别名(例如,'M'表示月,'H'表示小时)或pandas偏移量对象来指定。

method:如何在转换频率时填充缺失值。这可以是'ffill'(向前填充)或'bfill'(向后填充)之类的字符串。

采样

resample可以改变时间序列频率并重新采样。我们可以进行上采样(到更高的频率)或下采样(到更低的频率)。因为我们正在改变频率,所以我们需要使用一个聚合函数(比如均值、最大值等)。

resample方法的参数:

rule:数据重新采样的频率。这可以使用字符串别名(例如,'M'表示月,'H'表示小时)或pandas偏移量对象来指定。

#down sample
monthly_data = df.resample('M').mean()

Python 시계열 데이터 조작을 위한 일반적인 방법 요약

#up sample
minute_data = data.resample('T').ffill()

Python 시계열 데이터 조작을 위한 일반적인 방법 요약

百分比变化

使用pct_change方法来计算日期之间的变化百分比。

df["PCT"] = df["Close"].pct_change(periods=2)
print(df["PCT"])
"""
Date
2020-01-02 NaN
2020-01-03 NaN
2020-01-06 0.021283
2020-01-07 0.024671
2020-01-08 0.005172
...
2022-12-19 -0.026634
2022-12-20 -0.013738
2022-12-21 0.012890
2022-12-22 -0.014154
2022-12-23 -0.003907
Name: PCT, Length: 752, dtype: float64
"""

总结

在Pandas和NumPy等库的帮助下,可以对时间序列数据执行广泛的操作,包括过滤、聚合和转换。本文介绍的是一些在工作中经常遇到的常见操作,希望对你有所帮助。

위 내용은 Python 시계열 데이터 조작을 위한 일반적인 방법 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제