기본 콘텐츠로 건너뛰기

벡터와 행렬에 관련된 그림들

[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' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a $\sin^{2}{\left(x \right)} + \cos^{2}{\left(x \right)}$ simplify(a) 1 simplify(b) $\frac{x^{3} + x^{2} - x - 1}{x^{2} + 2 x + 1}$ simplify(b) x - 1 c=gamma(x)/gamma(x-2) c $\frac{\Gamma\left(x\right)}{\Gamma\left(x - 2\right)}$ simplify(c) $\displaystyle \left(x - 2\right) \left(x - 1\right)$ 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. $$\tag{식 1}\Gamma(n) =\begin{cases}(n-1)!& n:\text{자연수}\\\int^\infty_0x^{n-1}e^{-x}\,dx& n:\text{부동소수}\end{cases}$$ x=symbols('x') gamma(x).subs(x,4) $\displaystyle 6$ factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수...