기본 콘텐츠로 건너뛰기

[ML] 결정트리(Decision Tree) 모델

[data analysis]Date 데이터의 조정

Date 데이터의 조정

내용

Date 클래스

날짜는 date 클래스를 사용하여 조정할 수 있습니다. 이 클래스는 year, month, day의 속성을 가지고 있다. 또한 요일은 메소드 weekday()에 의해 확인할 수 있으며 0 ~ 6 사이의 정수를 반환합니다. 각 수치는 다음과 같이 요일을 대표한다.

0:월요일, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일요일

오늘의 날짜를 나타내기 위해서는 today()메소드를 사용합니다.

import datetime
import pandas as pd
today=datetime.date.today()
today
datetime.date(2022, 3, 11)
today.year
2022
today.month
3
today.day
11
today.weekday()
4
print(today)
2022-03-11

date.ctime()은 날짜를 나타내는 문자열을 반환합니다

today.ctime()
'Fri Mar 11 00:00:00 2022'

날짜 문자(열)과 날짜 인덱스

다음과 같이 날짜 타입인 문자열인 경우 분석을 위해서는 date 형식으로 변환하여야 합니다.

x="2010. 10. 11 오후 3:30:00"
type(x)
str

x에서 '오후'를 제거하고 숫자 형식의 문자만을 date 형식으로 변환합니다. 이 변환은 str객체.replace() 메소드를 사용할 수 있습니다. 또한 문자열에서 특정부분만을 변환하기 위해서 str객체.split() 메소드를 사용할 수 있습니다.

x="2010. 10. 11 오후 3:30:00"
type(x)
str
x1=x.replace("오후", "")
x1
'2010. 10. 11  3:30:00'

문자열인 객체 x1를 Timestamp 형으로 전환하기 위해 pd.to_datatime() 메서드를 적용합니다.

x2=pd.to_datetime(x1);x2
Timestamp('2010-10-11 03:30:00')
pd.to_datetime(x.split("오")[0])
Timestamp('2010-10-11 00:00:00')

위 결과 Timestamp는 pandas의 date 타입으로 하나이상의 값들을 포함하는 리스트 형식일 경우 DatatimeIndex 형태로 표현됩니다. 이 자료형은 date 클래스와 같이 .year, .month, .day 속성을 가지고 있어 각각을 호출할 수 있습니다. 또는 .date 속성으로 이들을 모두 호출할 수 있습니다.

x='2024. 10. 11 3:30:00'
type(x), x
(str, '2024. 10. 11 3:30:00')
x_pd=pd.to_datetime(x)
type(x_pd), x_pd
(pandas._libs.tslibs.timestamps.Timestamp, Timestamp('2024-10-11 03:30:00'))
x_pd.year, x_pd.month, x_pd.day
(2024, 10, 11)
x1=['2024. 10. 11 3:30:00', '2024. 10. 12 3:30:00', '2024. 10. 13 3:30:00']
x1_pd=pd.to_datetime(x)
type(x1_pd), x1_pd
(pandas.core.indexes.datetimes.DatetimeIndex,
 DatetimeIndex(['2024-10-11 03:30:00', '2024-10-12 03:30:00',
                '2024-10-13 03:30:00'],
               dtype='datetime64[ns]', freq=None))
x1.date
array([datetime.date(2024, 10, 11), datetime.date(2024, 10, 12),
       datetime.date(2024, 10, 13)], dtype=object)

이러한 객체의 형식을 문자형으로 변화시키기 위해 .strftime() 메소드를 적용합니다. 다음 코드에서 d, m, y는 각각 일, 월, 년을 나타냅니다. y는 연도의 축약된 형태로서 2022일 경우 22만을 표시하고 Y는 2022를 모두 나타냅니다.

x2.strftime('%d/%m/%y')
'11/10/10'

여러개로 구성된 문자열 형식의 날짜 데이터를 Date 형식으로 변환하기 위해 위의 과정에 lambda()함수를 적용합니다.

dateD=['2010. 10. 11 오후 3:30:00', '2010. 10. 12 오후 3:30:00', '2010. 10. 13 오후 3:30:00', '2010. 10. 14 오후 3:30:00', '2010. 10. 15 오후 3:30:00', '2010. 10. 18 오후 3:30:00',]
dateD
['2010. 10. 11 오후 3:30:00',
 '2010. 10. 12 오후 3:30:00',
 '2010. 10. 13 오후 3:30:00',
 '2010. 10. 14 오후 3:30:00',
 '2010. 10. 15 오후 3:30:00',
 '2010. 10. 18 오후 3:30:00']
dateD1=list(map(lambda x: pd.to_datetime(x.split("오")[0]).strftime('%Y.%m.%d'), dateD))
dateD1
['2010.10.11',
 '2010.10.12',
 '2010.10.13',
 '2010.10.14',
 '2010.10.15',
 '2010.10.18']
pd.to_datetime(dateD1)
DatetimeIndex(['2010-10-11', '2010-10-12', '2010-10-13', '2010-10-14',
               '2010-10-15', '2010-10-18'],
              dtype='datetime64[ns]', freq=None)

일일 주가자료를 주중자료로 변환

FinanceDataReader.DataReader(코드, 시작, 마지막) 함수를 사용하여 일정기간의 주가자료(kospi)를 호출합니다.

import numpy as np
import pandas as pd
import FinanceDataReader as fdr
st=pd.Timestamp(2010,3, 1)
et=pd.Timestamp(2022, 6, 4)
kos=fdr.DataReader('KS11', st, et)
kos.tail(2)
Close Open High Low Volume Change
Date
2022-06-02 2658.99 2670.74 2674.00 2653.59 525260000.0 -0.0100
2022-06-03 2670.65 2679.57 2681.51 2663.00 562470000.0 0.0044

위 자료의 인덱스는 pandas의 DateTimeIndex입니다. 이 자료형은 pandas의 .isocalendar()메서드에 의해 year, week, day로 분리할 수 있습니다.

idx=kos.index
type(idx)
pandas.core.indexes.datetimes.DatetimeIndex
idx[:3]
DatetimeIndex(['2010-03-02', '2010-03-03', '2010-03-04'], dtype='datetime64[ns]', name='Date', freq=None)
time=idx.isocalendar()
time
year week day
Date
2010-03-02 2010 9 2
2010-03-03 2010 9 3
... ... ... ...
2022-06-02 2022 22 4
2022-06-03 2022 22 5
3027 rows × 3 columns

위 time 객체를 kos 객체와 결합합니다.

kos1=pd.concat([time, kos], axis=1)
kos1.tail(2)
Date year week day Close Open High Low Volume Change
2022-06-022022 22 4 2658.99 2670.74 2674.00 2653.59 525260000.0 -0.0100
2022-06-032022 22 5 2670.65 2679.57 2681.51 2663.00 562470000.0 0.0044

week와 day는 순환성입니다. 그러므로 week 단위로 분류하기 위해서는 먼저 위 자료를 년단위로 먼저 구분해야 합니다. 2020년도에 해당하는 자료만을 분류해 봅니다.

kos2020=kos1.iloc[np.where(kos1['year']==2020)[0],:]
kos2020.tail(2)
Dateyear week day Close Open High Low Volume Change
2020-12-29 2020 53 2 2820.51 2810.55 2823.44 2792.06 1.050000e+09 0.0042
2020-12-30 2020 53 3 2873.47 2820.36 2878.21 2809.35 1.070000e+09 0.0188

위 객체를 pandas 라이브러리의 groupby(key) 메서드를 사용하여 week를 key로 하여 분류합니다.

list(kos2020.groupby('week'))[1]
(2,
year week day Close Open High Low Volume Change
2020-01-06 2020 2 1 2155.07 2154.97 2164.42 2149.95 592670000.0 -0.0098
2020-01-07 2020 2 2 2175.54 2166.60 2181.62 2164.27 568240000.0 0.0095
2020-01-08 2020 2 3 2151.31 2156.27 2162.32 2137.72 913830000.0 -0.0111
2020-01-09 2020 2 4 2186.45 2182.20 2186.45 2172.16 592600000.0 0.0163
2020-01-10 2020 2 5 2206.39 2189.48 2206.92 2188.10 594540000.0 0.0091
)

위와 같이 분류된 각 그룹의 열평균을 계산합니다. 주단위 데이터의 구조는 의도대로 조정이 가능합니다. 또한 최종적으로 위 객체의 날짜와 관계된 열을 삭제합니다.

re=kos2020.groupby('week').mean()
re.tail(2)
week year day Close Open High Low Volume Change
52 2020.0 2.5 2769.752500 2761.087500 2783.925000 2739.902500 1.137500e+09 0.003175
53 2020.0 2.0 2834.193333 2817.286667 2845.413333 2800.323333 1.043333e+09 0.007867
re=re.drop(['year', 'day'], axis=1)
re.tail(2)
weekClose Open High Low Volume Change
52 2769.752500 2761.087500 2783.925000 2739.902500 1.137500e+09 0.003175
53 2834.193333 2817.286667 2845.413333 2800.323333 1.043333e+09 0.007867

시간 데이터 수열 생성

특정한 기간의 시간 데이터 수열은 pandas.period_range(start, end, freq), pd.date_range(start, end, periods, freq) 함수에 의해 생성할 수 있습니다. 수열 생성의 규칙은 이 함수의 매개변수 freq에 의해 지정될 수 있습니다. 다음예의 'D'는 그 구간내에 모든 날짜, 'b'는 업무일을 기준으로 생성합니다.

pd.period_range(start='2022-5-31', end='2022-6-7',freq='D')
PeriodIndex(['2022-05-31', '2022-06-01', '2022-06-02', '2022-06-03',
             '2022-06-04', '2022-06-05', '2022-06-06', '2022-06-07'],
            dtype='period[D]')
d=pd.period_range(start='2022-5-31', end='2022-6-7',freq='b')
d
PeriodIndex(['2022-05-31', '2022-06-01', '2022-06-02', '2022-06-03',
             '2022-06-06', '2022-06-07'],
            dtype='period[B]')
d.dayofweek
Int64Index([1, 2, 3, 4, 0, 1], dtype='int64')
d.weekday
Int64Index([1, 2, 3, 4, 0, 1], dtype='int64')
a=pd.date_range(start="2024-3-1", end="2024-3-30", periods=7)
a
DatetimeIndex(['2024-03-01 00:00:00', '2024-03-05 20:00:00',
               '2024-03-10 16:00:00', '2024-03-15 12:00:00',
               '2024-03-20 08:00:00', '2024-03-25 04:00:00',
               '2024-03-30 00:00:00'],
              dtype='datetime64[ns]', freq=None)

.date 속성을 적용하여 시간 부분을 삭제하고 나타낼 수 있습니다.

a.date
array([datetime.date(2024, 3, 1), datetime.date(2024, 3, 5),
       datetime.date(2024, 3, 10), datetime.date(2024, 3, 15),
       datetime.date(2024, 3, 20), datetime.date(2024, 3, 25),
       datetime.date(2024, 3, 30)], dtype=object)

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같

[matplotlib] 히스토그램(Histogram)

히스토그램(Histogram) 히스토그램은 확률분포의 그래픽적인 표현이며 막대그래프의 종류입니다. 이 그래프가 확률분포와 관계가 있으므로 통계적 요소를 나타내기 위해 많이 사용됩니다. plt.hist(X, bins=10)함수를 사용합니다. x=np.random.randn(1000) plt.hist(x, 10) plt.show() 위 그래프의 y축은 각 구간에 해당하는 갯수이다. 빈도수 대신 확률밀도를 나타내기 위해서는 위 함수의 매개변수 normed=True로 조정하여 나타낼 수 있다. 또한 매개변수 bins의 인수를 숫자로 전달할 수 있지만 리스트 객체로 지정할 수 있다. 막대그래프의 경우와 마찬가지로 각 막대의 폭은 매개변수 width에 의해 조정된다. y=np.linspace(min(x)-1, max(x)+1, 10) y array([-4.48810153, -3.54351935, -2.59893717, -1.65435499, -0.70977282, 0.23480936, 1.17939154, 2.12397372, 3.0685559 , 4.01313807]) plt.hist(x, y, normed=True) plt.show()

R 미분과 적분

내용 expression 미분 2차 미분 mosaic를 사용한 미분 적분 미분과 적분 R에서의 미분과 적분 함수는 expression()함수에 의해 생성된 표현식을 대상으로 합니다. expression expression(문자, 또는 식) 이 표현식의 평가는 eval() 함수에 의해 실행됩니다. > ex1<-expression(1+0:9) > ex1 expression(1 + 0:9) > eval(ex1) [1] 1 2 3 4 5 6 7 8 9 10 > ex2<-expression(u, 2, u+0:9) > ex2 expression(u, 2, u + 0:9) > ex2[1] expression(u) > ex2[2] expression(2) > ex2[3] expression(u + 0:9) > u<-0.9 > eval(ex2[3]) [1] 0.9 1.9 2.9 3.9 4.9 5.9 6.9 7.9 8.9 9.9 미분 D(표현식, 미분 변수) 함수로 미분을 실행합니다. 이 함수의 표현식은 expression() 함수로 생성된 객체이며 미분 변수는 다음 식의 분모의 변수를 의미합니다. $$\frac{d}{d \text{변수}}\text{표현식}$$ 이 함수는 어떤 함수의 미분의 결과를 표현식으로 반환합니다. > D(expression(2*x^3), "x") 2 * (3 * x^2) > eq<-expression(log(x)) > eq expression(log(x)) > D(eq, "x") 1/x > eq2<-expression(a/(1+b*exp(-d*x))); eq2 expression(a/(1 + b * exp(-d * x))) > D(eq2, "x") a * (b * (exp(-d * x) * d))/(1 + b