1. μκ³μ΄ λ°μ΄ν°λ₯Ό μν datetime, Numpy & Pandas
ν΅κ³ λ±μ μνμ λͺ¨λ₯΄μ§λ§ νμ¬μ μκ³μ΄ λ°μ΄ν°λ₯Ό λ€λ€λ³΄κ³ μ μκ³μ΄ 곡λΆλ₯Ό μμνκ² λμλ€
(μ λ°λ―Έ μκ³μ΄ κ°μ)[https://www.udemy.com/course/250-timeseries-kor-sub-top-100/]
μ λ°λ―Έμ μκ³μ΄ κ°μλ₯Ό 보면μ 곡λΆν λ΄μ©λ€ μμ£Όμ λΆμ‘±ν λΆλΆλ€μ κ²μνκ³ μ΅μ’ λͺ©νλ νμ¬μ μ€μ λ°μ΄ν°μ μ μ©ν μ¬λ‘κΉμ§ μκ°νλ κ²μ΄λ€.
곡λΆν μλ‘ ν΅κ³ λͺ¨λΈμ μ¬μ©νμ¬ μκ³μ΄ λ°μ΄ν°μ λν΄ λΆμ λ° λͺ¨λΈλ§μ νλ λ΄μ©λ€μ 보면μ λ΄κ° μνμ μΈ λΆλΆμ λν΄ μ λλ‘ μ΄ν΄νμ§ λͺ»νλλ° μ 리ν΄μ λΈλ‘κ·Έμ μ¬λ¦¬λ κ² λ§λ μΆλ€κ° λ κ°μ μνμ λͺ¨λ₯΄λ μ λ¬Έμλ€μ΄ μ΄λ‘ λ³΄λ€ μ½λμ μΈ λΆλΆλ€μ λ¨Όμ κ°μ Έκ°κ³ μ μ©ν΄ λ³΄κ³ μ΄λ‘ λΆλΆμ μ±μλκ°λ μμΌλ‘ κΈμ νλ² μ 리ν΄λ³΄κ³ μΆμλ€. κ·Έλμ κΈμ μ£Ό λ΄μ©μ μ€μ μ½λ μμ£Όκ° λ κ²μ΄λ€.
1. μκ³μ΄ λ°μ΄ν°λ₯Ό μν datetime, Numpy & Pandas
μκ³μ΄ λ°μ΄ν°μ κ²½μ° λ°μ΄ν°μ μ΄ μ§§κ²λ μ΄, λΆλ¨μ λΆν° μκ°, μΌμ, μ£Ό, μ, λ μκ°μμΌλ‘ μΌμ κ°κ²©μΌλ‘ λ°μ΄ν°λ€μ΄ λμ΄λμ΄ μλ€.
κ·Έλμ μκ°μ λ΄κ³ μλ μΉΌλΌ λλ μΈλ±μ€λ₯Ό νΈλ€λ§ν μ€ μλ©΄ μκ³μ΄ λ°μ΄ν°λ₯Ό λ€λ£¨λλ° μ μ©νλ€.
μ£Όλ‘ μκ°μ λ€λ£¨λ λΌμ΄λΈλ¬λ¦¬λ‘λ νμ΄μ¬μ datetimeμ΄ μκ³ νλ€μ€μ pd.to_datetime μ¬μ©νκΈ°λ νλ€.
μ΄μ μ μ°Έμ¬ν λ°μ΄μ½ μκ³μ΄ λν μμμ μ½λ리뷰 μ€ν°λμμ μμμνμ μκ³μ΄ λ°μ΄ν° μ μ²λ¦¬μ μ£Όλ‘ νλ€μ€μ pd.to_datetimeμ μ¬μ©νμλ€.
μ 체 λ΄μ©μ λ€λ£¨μ§λ μκ³ μ£Όλ‘ μ¬μ©νλ κΈ°λ₯ μμ£Όλ‘λ§ κ°λ¨ν μ 리ν΄λ³΄λ € νλ€.
1-1. datetime
νμ΄μ¬μ λ΄μ₯λ λͺ¨λ μ€ νλλ‘ λ μ§μ μκ°μ λ€λ£¬λ€. κ°λ¨νκ² import ν΄μ μ¬μ©κ°λ₯νλ€.
# Import the entire module:
import datetime
μ¬μ©λ²μ μ΄λ ΅μ§ μμΌλ―λ‘ κ°λ¨νκ²λ§ μ λ¦¬ν΄ λ³΄μλ©΄
# datetime κ°μ²΄ μμ± λ° μκ° μ
λ ₯
tm = datetime.time(hour=5,minute=25,second=1) / tm = datetime.time(5,25,1)
=> datetime.time(5, 25, 1)
print(tm)
=> 05:25:01
print(tm.minute)
=> 25
print(tm.second)
=> 1
type(tm)
=> datetime.time
---------------------------------------------------
# λ μ§ λ° μκ° μ
λ ₯. 2019,1,2 λ€μ μκ°μ΄ μ
λ ₯λμ§ μμΌλ©΄ 2019-02-02 00:00:00 μ΄λ° ννλ‘ μΆλ ₯λλ€
day_time = datetime.datetime(2019, 1, 2, 5, 25, 1)
=> datetime.datetime(2019, 1, 2, 5, 25, 1)
print(day_time)
=> 2019-01-02 05:25:01
print(day_time.day)
=> 2
---------------------------------------------------
x = date.today()
print(x)
=> 2019-01-03
y = datetime.today()
print(y)
=> 2019-01-03 12:15:05.526582
---------------------------------------------------
d = datetime(1969,7,20,20,17)
d.weekday()
=> 6
datetimeμ κ°μ²΄λ₯Ό μμ±νκ³ λ μ§μ μκ°μ μ λ ₯νμ¬ μνλ λ μ§μ datetimeμ λ§λ€κ³ κ±°κΈ°μ νμν λ μ§μ μκ°, λΆ, μ΄ λ±μ μΆμΆν΄ μ¬μ©ν μ μλ€. todayλ₯Ό ν΅ν΄ νμ¬ λ μ§μ μκ°κΉμ§ μΆλ ₯ν μ μλ€.
weekdayλ₯Ό μ¬μ©νλ©΄ μ΄λ λ μ§λ μ νν μμΌμ μλ €μ£Όλ©° 0~6, μμμΌ ~ μΌμμΌ μμΌλ‘ ν λΉλλ€.
++μ λ§ μ¬μνμ§λ§ μ€λ¬΄μμ datetimeμ μ¬μ©νλ κ²½μ°λ vm μλ²μμ μ€μκ°μΌλ‘ μκ³ λ¦¬μ¦μ μ²λ¦¬ν λ μ€κ°μ μ²λ¦¬μλκ° λλ €μ Έ λ³λͺ© λλ μ΄μκ° μμλ€.
μ΄λ datetimeμ μ΄μ©ν΄ μ€μκ°μΌλ‘ λ‘κ·Έλ₯Ό μ°μ΄λ³΄λ©΄μ μ½λ μ€κ°μ κ²μλ₯Ό μν forλ¬Έμ΄ μκ°μ λ§μ΄ μ‘μλ¨Ήμμμ μ°Ύμλ μ μ΄ μμλ€. μ λ§ κΈ°λ³Έμ μ΄κ³ μ¬μ΄ λΌμ΄λΈλ¬λ¦¬μ΄μ§λ§ μ΄λ κ² μ¬μ©λλ κ²½μ°κ° μ’ μ’ μκΈ°μ κΈ°μ΄κ° μ€μνλ€λ κ±Έ λ°°μ λ€.
1-2. Numpy
λ°μ΄ν° λΆμμ΄λ λλΆλΆμ μΈκ³΅μ§λ₯ κ°μλ₯Ό 보면 λνμ΄, νλ€μ€μ λν κΈ°μ΄λ΄μ©λ€μ λ€λ£¨κΈ° λλ¬Έμ μ 체 λ΄μ©μ λ€ λ€λ£¨μ§ μκ² λ€.
λνμ΄μ κ°μ₯ ν° μ₯μ μ λΈλ‘λμΊμ€ν , λ°°μ΄μ λν΄ λ€μν μ°μ°μ μΌκ΄μ μΌλ‘ μ μ©μν¬ μ μλ€λ μ μΌλ‘ μΈλ±μ±μ΄λ μ¬λΌμ΄μ± λ± λΉμ·ν΄ 보μ΄λ 리μ€νΈμ ν° μ°¨μ΄μ μ΄κΈ°λ νλ€.
import numpy as np
arr = np.arange(0,10)
=> array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# BroadCasting
arr + arr
=> array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
arr * arr
=> array([ 0, 1, 4, 9, 16, 25, 36, 49, 64, 81])
arr - arr
=> array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
arr / 2
=> array([0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5])
arr**3
=> array([ 0, 1, 8, 27, 64, 125, 216, 343, 512, 729], dtype=int32)
μ΄λ κ² λ¨μ μ°μ° μΈμλ np.sqrt(), exp(), sin(), log() λ±μ 볡μ‘ν μ°μ°λ μΌκ΄μ μΌλ‘ μ μ©ν΄ μ€ μ μλ€.
μ΄ μΈμλ λ°°μ΄μ λν΄ μ΄ν©, sum() / νκ· κ° mean() / μ΅λκ° max() / μ΅μ-μ΅λκ°μ μΈλ±μ€λ₯Ό μ°Ύλ argmin()κ³Ό argmax(), 쑰건μ ν΅ν΄ κ°μ μ°Ύκ³ λλ κ΅μ²΄κΉμ§ ν μ μλ np.where()κΉμ§ μ μ©ν κΈ°λ₯λ€μ΄ λ§λ€.
νΉν λνμ΄μμ μ€μνλ€κ³ μκ°νλ κΈ°λ₯μ reshapeμ 쑰건μ ν΅ν κ° νν°λ§ λ° μΈλ±μ€ μμΈμ΄λ€.
arr_2d = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
arr_2d, arr_2d.shape
=>
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
=> (3, 4)
arr_2d.reshape(2,6)
=>
array([[ 1, 2, 3, 4, 5, 6],
[ 7, 8, 9, 10, 11, 12]])
---------------------------
μ¬λ¬ μ°¨μμΌλ‘ λμ΄ μλ λ°μ΄ν°λ₯Ό νΈλ€λ§ν λ reshapeμ λ€μν μ°μ°μ κ°μ΄ μ΄μ©νμ¬ μνλ κ°μ μΆμΆ λ° λ³νν μ μλ€.
μμμ Numpyμ κΈ°λ₯λ€μ λν΄ κ°λ¨νκ²λ§ μΈκΈνμκ³ Numpyλ‘ Datetime λ°°μ΄μ λ€λ€λ³Ό κ²μ΄λ€.
import numpy as np
date_array = np.array(['2016-03-15', '2017-05-24', '2018-08-09'], dtype='datetime64')
=> array(['2016-03-15', '2017-05-24', '2018-08-09'], dtype='datetime64[D]')
---
np.array(['2016-03-15', '2017-05-24', '2018-08-09'], dtype='datetime64[h]')
=> array(['2016-03-15T00', '2017-05-24T00', '2018-08-09T00'],
dtype='datetime64[h]')
---
np.array(['2016-03-15', '2017-05-24', '2018-08-09'], dtype='datetime64[Y]')
=> array(['2016', '2017', '2018'], dtype='datetime64[Y]')
λνμ΄λ‘ datetime νμ λ°°μ΄μ μμ± μ datetime64 [h], datetime64 [Y] νμ μ μ§μ νμ¬ μνλ μκ°λλ₯Ό μΆμΆν μ μλ€.
리μ€νΈμ rangeμ λ§μ°¬κ°μ§λ‘ λνμ΄μμλ np.arrange()λ₯Ό ν΅ν΄ μΌμ λ²μ λ΄μ μνλ μ€ν λ§νΌμ λ°°μ΄μ μμ±ν μ μλλ° νμ μ datetimeμΌλ‘ μ€ κ²½μ° μκ° λ°°μ΄λ μμ±μ΄ κ°λ₯νλ€!
# μ€ν
μ¬μ΄μ¦λ dtypeλ₯Ό ν΅ν΄ μ§μ . 7, datetiem64[D] => 7μΌ.
np.arange('2018-06-01', '2018-06-23', 7, dtype='datetime64[D]')
=> array(['2018-06-01', '2018-06-08', '2018-06-15', '2018-06-22'],
dtype='datetime64[D]')
---
np.arange('1968', '1976', dtype='datetime64[Y]')
=> array(['1968', '1969', '1970', '1971', '1972', '1973', '1974', '1975'],
dtype='datetime64[Y]')
μκ³μ΄ λ°μ΄ν°λ₯Ό λ€λ£¬λ€λ©΄ μ£Όλ‘ νλ€μ€λ₯Ό ν΅ν΄μ μ¬μ©νκ² μ§λ§ λνμ΄λ‘λ datetime νμ μ λ€λ£° μ μλ€λ μ κΈ°μ΅ν΄λλ©΄ μ’μ κ² κ°λ€
1-3. Pandas
(1) Pandas Datetime - Index
μκ³μ΄ λ°μ΄ν°λ₯Ό λ€λ£° λ νλ€μ€λ‘ λ€μν νΈλ€λ§μ νλ€. λ¨Όμ λΆμμ νκΈ° μ’κ² μ΄μμΉλ κ²°μΈ‘μΉλ€μ μ²λ¦¬νκ³ λ³΄κΈ° νΈν ννλ‘ λ³ννκ±°λ κ·Έλ£ΉλΌλ¦¬ λ¬Άμ΄μ μ°μ°μ ν΅ν΄ μλ‘μ΄ ννμ ν μ΄λΈκ³Ό μΈμ¬μ΄νΈλ₯Ό λ½μλΈλ€.
μ΄λ κ² μ°μ°ν ν μ΄λΈλ€μ matplotlib, seaborn λλ νλ€μ€μ λ΄μ₯ plotμ μ΄μ©ν΄ μκ°νλ₯Ό νμ¬ λΆμμ μ§ννλ€.
νλ€μ€λ₯Ό μ΄μ©ν λ°μ΄ν° νΈλ€λ§ λ° μκ°νκΉμ§ λ€λ£¨λ©΄ λ΄μ©μ΄ λ무 κΈΈμ΄μ§κΈ° μ¬κΈ°μ λ€λ£¨μ§ μκ³ μκ° νμ μ λν΄ νλ€μ€λ₯Ό μ΄λ»κ² μ¬μ©νλμ§λ₯Ό μ 리νκ³ μ νλ€.
λνμ΄μμ np.arangeμ λ°μ΄ν° νμ μ datetime64λ‘ μ€μ μκ° λ°°μ΄μ μμ±ν κ²μ²λΌ λΉμ·ν κΈ°λ₯μ νλ€μ€μμλ μ§μνλ€.
import pandas as pd
pd.date_range('2020-01-01', periods=7, freq='D')
=> DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
'2020-01-05', '2020-01-06', '2020-01-07'],
dtype='datetime64[ns]', freq='D')
---
pd.date_range('Jan 01, 2018', periods=7, freq='D')
# νλ€μ€μ λ΄μ₯λ ννμ λ¬Έμμ΄μ΄λΌλ©΄ μ΄λ κ² μ
λ ₯ν΄λ μΈμν¨.
=> DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04',
'2018-01-05', '2018-01-06', '2018-01-07'],
dtype='datetime64[ns]', freq='D')
---
# THE WEEK OF JULY 8TH, 2018
idx = pd.date_range('7/8/2018', periods=7, freq='D') # μμ, μμ²νλ κΈ°κ°μ κ°μ, κΈ°κ°μ λΉλ
idx
=> DatetimeIndex(['2018-07-08', '2018-07-09', '2018-07-10', '2018-07-11',
'2018-07-12', '2018-07-13', '2018-07-14'],
dtype='datetime64[ns]', freq='D')
κ½€ λ€μν ννλ₯Ό μ λ ₯μΌλ‘ λ°μμ μμμ λ³Ό μ μλ€. νλ€μ€μμ μΈμνλ ννλΌλ©΄ κΌ ννκ° λμΌνμ§ μμλ μκ° λ°°μ΄μ μμ±ν μ μλ€.
λνμ΄λ‘ μμ±ν νμ λ°°μ΄μ λ°μ΄ν°νλ μμ μΈλ±μ€λ‘ μ€μ νλ κΈ°λ₯λ μ§μνλ€.
some_dates = np.array(['2016-03-15', '2017-05-24', '2018-08-09'], dtype='datetime64[D]')
=> array(['2016-03-15', '2017-05-24', '2018-08-09'], dtype='datetime64[D]')
---
idx = pd.DatetimeIndex(some_dates)
=> DatetimeIndex(['2016-03-15', '2017-05-24', '2018-08-09'], dtype='datetime64[ns]', freq=None)
μ΄λ κ² μΈλ±μ€λ₯Ό μ€μ ν΄μ€ μλ μμ§λ§ μκ³μ΄ λ°μ΄ν°λ₯Ό λΆλ¬μ¬ λ μ»¬λΌ μ€ μκ° μ»¬λΌμ΄ μλ€λ©΄ μλμ²λΌ μΈλ±μ€ μ€μ κ³Ό parse_dates νλΌλ―Έν°λ₯Ό ν΅ν΄ μΈλ±μ€λ₯Ό datetime νμΌλ‘ μ€μ νμ¬ λ°μ΄ν°λ₯Ό λΆλ¬μ¬ μ μλ€.
λ°μ΄ν°λ ν΄λΉ κ°μμμ μ¬μ©ν μ€νλ² μ€μ μ£Όμ κ° λ°μ΄ν°λ₯Ό μ΄μ©νλ€. Close 컬λΌμ λ§κ°μ κ°κ²©, μ’ κ°λ₯Ό μλ―Ένκ³ Volumeμ ν΄λΉ λ μ§μ μ£Όμκ±°λλμ μλ―Ένλ€.
df = pd.read_csv('./Data/starbucks.csv', index_col='Date', parse_dates=True)
Date | Close | Volume |
2015-01-02 | 38.0061 | 6906098 |
2015-01-05 | 37.2781 | 11623796 |
2015-01-06 | 36.9748 | 7664340 |
2015-01-07 | 37.8848 | 9732554 |
2015-01-08 |
38.4961 | 13170548 |
μμ λ°©λ²μΌλ‘ λ°μ΄ν°λ₯Ό λΆλ¬μ¨ νμ μΈλ±μ€λ₯Ό νμΈν΄λ³΄λ©΄
DatetimeIndex(['2015-01-02', '2015-01-05', '2015-01-06', '2015-01-07',
'2015-01-08', '2015-01-09', '2015-01-12', '2015-01-13',
'2015-01-14', '2015-01-15',
...
'2018-12-17', '2018-12-18', '2018-12-19', '2018-12-20',
'2018-12-21', '2018-12-24', '2018-12-26', '2018-12-27',
'2018-12-28', '2018-12-31'],
dtype='datetime64[ns]', name='Date', length=1006, freq=None)
μ΄λ κ² datetime64λ‘ μΈλ±μ€κ° λΆλ¬μμ§λ κ²μ νμΈν μ μλ€.
(2) Time - Resampling
μκ³μ΄ λΆμμ ν¨μ μμ΄μ κΈ°μ΄κ° λλ λ°©λ²μ΄ Resamplingμ΄λ€. datetimeμΈλ±μ€λ₯Ό μΈμνμ¬ λ€μν λ£°μ μ μ μ©ν΄ μνλ λ μ§μ ν¨ν΄μ κ°λ¨νκ² λ¬Άμ΄μ μνλ μ°μ°μ ν μ μλ κ²μ΄ resampleμ μ₯μ μ΄λ€. λ§μ½ μ΄λ λ¬μ 30μΌ νΉμ 31μΌκΉμ§ μλλΌλ νλ€μ€μμ ν΄λΉ μμ λ§μ§λ§ λ μ§λ₯Ό μΈμνμ¬ κ³μ°ν΄μ€λ€.
λ°μ΄ν°λ μμ λμΌν μ£Όκ° λ°μ΄ν°λ₯Ό μ¬μ©νλ€.
Date | Close | Volume |
2015-01-02 | 38.0061 | 6906098 |
2015-01-05 | 37.2781 | 11623796 |
2015-01-06 | 36.9748 | 7664340 |
2015-01-07 | 37.8848 | 9732554 |
2015-01-08 |
38.4961 | 13170548 |
df.resample(rule='A').mean()
μ¬κΈ°μ μ¬μ©ν rule='A'λ year and frequencyλ‘ κ° μ°λ§λ€ λ λ μ§μ λν΄ νκ· κ°μ κ³μ°ν΄μ€λ€. μ΄ μΈμλ λ€μν λ μ§ν¨ν΄λ€μ΄ λ£°μ μ μμΌλ―λ‘ νμν λ£° μ μ μ§μ νμ¬ μ΄μ©νλ©΄ λλ€.
μμ μ½λλ₯Ό μ€νμν€λ©΄ λ€μκ³Ό κ°μ κ²°κ³Όλ₯Ό μ»λλ€.
Date | Close | Volume |
2015-12-31 | 50.078100 | 8.649190e+06 |
2016-12-31 | 53.891732 | 9.300633e+06 |
2017-12-31 | 55.457310 | 9.296078e+06 |
2018-12-31 | 56.870005 | 1.122883e+07 |
(3) Time - Shifting
νλ€μ€μλ shiftλΌλ κΈ°λ₯μ΄ μ‘΄μ¬νλ€. shiftλ₯Ό ν΅ν΄ λ°μ΄ν° κ°λ€μ μ ν λλ λ· νμΌλ‘ μ΄λμν¬ μ μλ€.
νλμ ν λλ μ΄μ λ°μ΄ν°λ₯Ό νλμ© λ°μ΄λ΄κ±°λ λΉκΈ΄λ€κ³ μ΄ν΄νλ©΄ λλ€.
df.shift(1).head()
Date | Close | Volume |
2015-01-02 | 38.0061 | 6906098 |
2015-01-05 | 37.2781 | 11623796 |
2015-01-06 | 36.9748 | 7664340 |
2015-01-07 | 37.8848 | 9732554 |
2015-01-08 |
38.4961 | 13170548 |
μ¬κΈ° κΈ°μ‘΄μ λ°μ΄ν°μμ
Date | Close | Volume |
2015-01-02 | NaN | NaN |
2015-01-05 | 38.0061 | 6906098 |
2015-01-06 | 37.2781 | 11623796 |
2015-01-07 | 36.9748 | 7664340 |
2015-01-08 |
37.8848 | 9732554 |
μ΄λ°©ν₯μΌλ‘ νμ μλ λ°μ΄ν°λ₯Ό νλμ© μλλ‘ λ°μ΄λΈλ€.
df.shift(periods=1, freq='M').head()
λ¨μν νλμ νμ λ°κ³ λΉκΈ°λ κ² μΈμλ λ€λ₯Έ νλΌλ―Έν° μ€μ μ ν΅ν΄ νλ¬ λ¨μλ‘ μ΄λμν€λ κ²λ κ°λ₯νλ€.
- periodsκ°μ ν΅ν΄ λͺ κ°μ νμ λ°μ΄λΌ κ²μΈμ§ μ€μ κ°λ₯
- axis=”columns”λ‘ μ€μ νλ©΄ μμλκ° μλ μμμΌλ‘ μ΄λλ κ°λ₯νλ€.
- κ°μ shiftν κ²½μ° λ§¨ μ²μ-맨 λ§μ§λ§ κ°λ€μ΄ NaNκ°μΌλ‘ μ±μ΄μ§λλ° fill_value=0μ ν΅ν΄ μνλ κ°μΌλ‘ μ±μΈ μ μλ€
- μμμ freq=’M’μ μ€κ² μ²λΌ freq=’D’ λ±λ± μΌ, μλ³λ‘ μ΄λλ κ°λ₯νλ€
(4) Rolling & Expanding
μμμ νλ€μ€λ₯Ό ν΅ν΄ datetimeνμ μ μΈλ±μ€λ₯Ό λ€λ£¨κ³ κ·Έλ£Ήλ³λ‘ μ°μ°μ ν΄λ³΄κ³ μλ€λ‘ λΉκ²¨λ³΄λ©° νΈλ€λ§μ ν΄λ³΄μλ€λ©΄ μ΄μ μΌμ κΈ°κ°λμ νκ· κ°μ μ°μ΄λ³΄λ©΄μ μκ³μ΄ λ°μ΄ν°μ μΆμΈλ₯Ό 보λ λ°©λ²μ μ°μ΅νλ€.
λ¨Όμ νλ€μ€μ rollingμ λν΄ κ°λ¨νκ² μ€λͺ ν΄λ³΄μλ©΄ μκ°μμΌλ‘ λμ΄λ λ°μ΄ν°λ€μ λν΄ μΌμ μ£ΌκΈ°λ§λ€ νκ· κ°μ κ³μ°νμ¬ μλ‘μ΄ λ°μ΄ν°λ₯Ό λ§λ€μ΄λ΄λ κΈ°λ₯μΌλ‘ κΈ°κ°μ΄λ κ³μ° νΉμ μ΄λνκ· ν¨μλΌ νλ€.
ν΄λΉ κ·Έλνλ μ€νλ² μ€ μ£Όμμ’ κ°μ κ·Έλνμ΄λ€. μ΄μ νλ€μ€μ rollingμ μ΄μ©νμ¬ μλ³Έ κ·Έλνμ λΉκ΅ν κ²μ΄λ€.
Rolling
# 7 day rolling mean
df.rolling(window=7).mean().head(15) # window : νλ²μ μΌλ§λ§νΌμ μΉμ
μ λ³Όκ²μΈμ§μ ν¬κΈ°, λͺ κ° νμ λ³Ό 건μ§.
- μ¬μ©νλ λ°μ΄ν°λ μΌλ¨μμ΄κ³ window=7μ κ³§ μΌμ£ΌμΌ λ¨μλ₯Ό μλ―Ένλ€.
Date | Close | Volume |
2015-01-02 | NaN | NaN |
2015-01-05 | NaN | NaN |
2015-01-06 | NaN | NaN |
2015-01-07 | NaN | NaN |
2015-01-08 |
NaN | NaN |
2015-01-09 | NaN | NaN |
2015-01-12 | 37.616786 | 1.238222e+07 |
2015-01-13 | 37.578786 | 1.297288e+07 |
2015-01-14 | 37.614786 | 1.264020e+07 |
2015-01-15 | 37.638114 | 1.270624e+07 |
2015-01-16 | 37.600114 | 1.260380e+07 |
2015-01-20 | 37.515786 | 1.225634e+07 |
2015-01-21 | 37.615786 | 9.868837e+06 |
2015-01-22 | 37.783114 | 1.185335e+07 |
2015-01-23 | 38.273129 | 1.571999e+07 |
- κ²°κ³Όκ°μ 보면 μ²μ μ¬μ―κ° κ°μ λͺ¨λ NaNκ°μ΄ λμ€λλ° κ·Έ μ΄μ λ μμ§ νκ· μ ꡬνλ €λ μΌκ³±κ° κ°μ΄ μ±μμ§μ§ μμκΈ° λλ¬Έμ΄λ€.
- λ‘€λ§ μ°½μ μ¬μ©ν κ²½μ° n-1 κ°μκ° NaNκ°μΌλ‘ λΉκ² λλ€.
df['Close'].plot(figsize=(12,5)).autoscale(axis='x',tight=True)
df.rolling(window=7).mean()['Close'].plot();
κ·ΈλΌ μλ³Έ λ°μ΄ν°κ°κ³Ό μ΄λνκ· ν¨μκ°μ κ·Έλνλ‘ κ·Έλ €μ λΉκ΅ν΄λ³΄λ©΄ μλκ³Ό κ°λ€.
μ¬κΈ°μ μ£Όλͺ©ν μ μ windowμ κ°μ΄λ€. μ¦, νκ· κ°μ κ³μ°ν μ£ΌκΈ°λ₯Ό μΌλ§λ μ£Όλλμ λ°λΌ κ·Έλνμ ννκ° λ§μ΄ λ¬λΌμ§κ² λλ€.
< window = 7 >
< window = 30 >
< window = 180 >
- windowκ°μ λ°λ₯Έ κ·Έλνλ₯Ό λΉκ΅ν΄λ΄€μ λ μλμ° μ°½ ν¬κΈ°κ° ν΄μλ‘ λ°μλλ κ°λ€μ΄ λ§μμ§λ―λ‘ κ·Έλνκ° λ³΄λ€ λ μλ§ν΄μ§λ©° μΌλ°νλλ κ²μ, μΌλ°νλλ μΆμΈλ₯Ό 보μ¬μ€λ€
- λ°λ©΄ μλμ° μ°½ ν¬κΈ°κ° μμμλ‘ μλ³Έ λ°μ΄ν°μ κ°κΉκ² κ·Έλ €μ§λ€. κ³ μμ€μ μΆμΈλ₯Ό 보μ¬μ€λ€.
expanding
μμμ rollingμ μ¬μ©ν κ²½μ° λ°μ΄ν°μ 맨 μμͺ½λΆν° μλμ° κ°μλ§νΌ μ±μμ§μ§ μλ νκΉμ§ νκ· κ°μ κ³μ°νμ§ λͺ»ν΄ NaNκ°μΌλ‘ μ±μμ§λ κ²μ νμΈν μ μμλ€.
expandingμ μ¬μ©νλ©΄ μ΄λνλ©΄μ μλμ° μ°½ κ°μλ§νΌμ λ°μ΄ν°λ₯Ό κ³μ°νλ κ²μ΄ μλ μκ³μ΄μ μμμ λΆν° μ μ°¨ κ³μ°νλ μ°½μ ν¬κΈ°λ₯Ό λλ €κ° λ§¨ λ§μ§λ§ λ°μ΄ν°μμλ λͺ¨λ λ°μ΄ν°μ λν νκ· μ κ³μ°νλ€. μ΄λ κ² κ³μ°νλ λ²μλ₯Ό νμ₯νκΈ°μ expandingμ΄λΌ νλ€.
df['Close'].expanding(min_periods=30).mean().plot(figsize=(12,5));
κ·Έλνλ₯Ό 보면μ λ μ€λͺ ν΄λ³΄μλ©΄
- rollingμ κ²½μ° window, μ°½μ μ§μ ν κ°μλ§νΌ κ° μμ λ§λ€ μ΄λνλ κ²κ³Ό λ€λ₯΄λ€. 2015-07μ λν yκ°μ 맨 μ²μ κ°λΆν° ν΄λΉ μμ κΉμ§ λͺ¨λ λ°μ΄ν°μ λν νκ· κ°μ μλ―Ένλ€
- λ°λΌμ μκ°μ΄ μ§λ μλ‘ νκ· μ λ°μλλ λ°μ΄ν°λ€μ΄ λ§μμ§λ―λ‘ μΌλ°νκ° λλ©΄μ μλ§ν κ·Έλνλ₯Ό κ·Έλ¦¬κ² λλ€
- μκ°μ΄ μ§λκ³ λ§¨ λ§μ§λ§ μμ μΈ 2019-01μ κ²½μ°, μ 체 λ°μ΄ν° νλ μμ λͺ¨λ ν, νλμ μ΄μ λν νκ· κ°μ΄ λλ€.
rolling vs expanding
- rollingμ μμ§μ΄λ μ°½, μλμ°κ° μ΄λνλ©΄μ νκ· κ°μ ꡬνλ€
- expandingμ κ·Έ μ°½μ΄ κ³μ μ΄λκ³Ό λμμ νμ₯νλ©΄μ νκ· κ°μ ꡬνλ€. 맨 μ²μλΆν° μμνμ¬ λκΉμ§ κ°κ²λλ©΄ κ·Έ μ΄μ μ 체 λ°μ΄ν° νκ· μΌλ‘ μλ ΄νλ€.
μ°Έκ³ μλ£
- Numpy
- resample
- shift
- rolling