기본 콘텐츠로 건너뛰기

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

[pandas]DataFrame

DataFrame

내용

DataFrame 생성

Data Frame은 두 개 이상의 Series객체를 결합한 여러개의 행과 열로 구성된 구조입니다. 이 구조의 데이터들은 Series와 같이 정수, 문자, 부동소수, 파이썬 객체 등이 될 수 있으며 각 열 마다 다른 자료 형태들을 복합적으로 사용될 수 있습니다. 이 구조가 가질 수 있는 데이터 형태 및 구조를 구체적으로 나타내면 다음과 같습니다.

  • 1차원 배열, 리스트, 사전, 또는 Series
  • 2차원 numpy 배열
  • Structured or record ndarray(데이터베이스 형식)
  • A Series
  • Another DataFrame

다음 함수에 의해 DataFrame객체를 생성합니다.

  • DataFrame(data, index, columns, dtype);
    • index: 행이름
    • columns: 열이름
    • dtype: 자료형

DataFrame은 행과 열을 가진 2차원입니다. 차원과 모양은 속성 .ndim.shape로 확인 할 수 있습니다.

d=[[ 0. ,  2.5,  5. ,  7.5, 10. ], ['book','house','car','smartphone','computer']]
d_df=pd.DataFrame(d); d_df
0 1 2 3 4
0 0.0 2.5 5.0 7.5 10.0
1 book house car smartphone computer
print(f"d_df의 차원:{d_df.ndim}, _모양:{d_df.shape}")
d_df의 차원:2, _모양:(2, 5)

위 결과와 같이 DataFrmae은 2차원입니다. 즉, 기본 구조는 행과 열로 이루어지며 함수의 인수 index와 columns를 사용하여 각각의 이름을 지정할 수 있습니다. 별도로 지정하지 않는 경우 위 결과와 같이 행인덱스, 열인덱스로 지정됩니다. 생성된 객체의 행이름이나 열이름은 속성 .index, .columns를 적용합니다.

d_df.index=["r1", 'r2']
d_df.columns=['c1', 'c2', 'c3','c4','c5']
d_df
c1 c2 c3 c4 c5
r1 0.0 2.5 5.0 7.5 10.0
r2 book house car smartphone computer

사전 형식의 객체는 인덱스 역할을 하는 key와 값인 value를 같이 나타내는 구조입니다. 이 구조의 객체는 다음 함수에 의해 dataframe으로 전환할 수 있으며 이 객체는 2차원이므로 key의 방향성을 지정해야 합니다.

  • pandas.DataFrame.from_dict(data, orient='columns')
    • orient: 데이터의 방향성을 결정
      데이터의 키가 열이름이 되기 위해서는 'columns'
      행이름이 되기 위해서는 'index'로 지정
      지정되지 않은 부분은 인덱스로 자동지정
data = {'col_1': [3, 2, 1, 0], 'col_2': ['a', 'b', 'c', 'd']}
data_pd=pd.DataFrame.from_dict(data); data_pd
col_1 col_2
0 3 a
1 2 b
2 1 c
3 0 d
data_pd2=pd.DataFrame.from_dict(data, orient='index'); data_pd2
0 1 2 3
col_1 3 2 1 0
col_2 a b c d

두 개이상의 Series를 가진 사전 구조의 데이터를 DataFrame 구조로 전환할 수 있습니다. 다음의 예에서 사전 형식인 d의 키 ‘one’의 값들은 3개, ‘two’의 값들은 4개로 두 Series 값들의 수가 다릅니다. 이 경우 포함되지 않은 경우 NaN이 자동적으로 부여됩니다.

d={'one':pd.Series([1,2,3], index=['a','b','c']), 'two':pd.Series([1,2,3,4], index=['a','b','c','d'])}
df=pd.DataFrame(d); df
one two
a 1.0 1
b 2.0 2
c 3.0 3
d NaN 4

객체의 호출과 슬라이싱

메서드 .head(n), .tail(n)으로 객체의 처음과 마지막 부분을 호출할 수 있습니다. n은 호출할 행의 수이며 기본값은 5입니다.

df.head(1)
one two
a 1.0 1
df.tail(1)
one two
d NaN 4

DataFrame의 슬라이싱은 2차원 array(행렬) 객체와 유사하지만 다음 표와 같이 대괄호 대신 loc[ ], 또는 iloc[ ]를 사용합니다.

함수 내용
df[열이름]
df[ [열이름1, 열이름2, ...] ]
열선택 , 다중의 열을 호출할 경우 호출할 열이름은 하나의 인자가 되어야 하므로 리스트([])로 묶어 표현해야 합니다.
df.loc[행이름, 열이름]라벨(이름)에 의한 행, 열 선택
df.iloc[정수]위치를 나타내는 정수에 의해 행 선택
호출시 범위를 나타내기 위해서는 콜론(":")을 사용합니다.
[시작:마지막] → 시작에서 마지막 직전의 정수를 의미
[:] → 모든 원소를 의미

DataFrame에서 하나의 요소만 추출할 경우 그 요소의 자료형을 가지지만 두 개 이상의 요소를 호출할 경우 Series 또는 DataFrame 객체가 됩니다. 특히 하나의 열이나 행을 슬라이싱(추출)한다면 추출된 객체는 Series 형태가 됩니다.

다음 객체는 파이썬 패키지 FinanceDataReader의 함수 DataReader(대상코드, 시작날짜, 마지막날짜)를 적용하여 코스피('KS11')의 일부 자료를 호출한 것입니다. 이 함수의 결과는 pandas.DataFrame입니다.

st=pd.Timestamp(2024,8,1)
et=pd.Timestamp(2024, 8,21)
df=fdr.DataReader('KS11', st, et)
df.head(2)
Open High Low Close Volume
Date
2024-08-01 2787.27 2794.11 2772.97 2777.68 480833975
2024-08-02 2719.39 2725.05 2666.40 2676.19 531785136 -…
num1=df.iloc[0,0]
num1, type(num1)
(2787.27, numpy.float64)
col1=df['Open']
col1
Date
2024-08-01    2787.27
2024-08-02    2719.39
  ⋮
2024-08-21    2687.20
Name: Open, dtype: float64
type(col1)
pandas.core.series.Series
df.iloc[2:5, :4]
Open High Low Close
Date
2024-08-05 2611.30 2611.30 2386.96 2441.55
2024-08-06 2533.34 2578.77 2491.47 2522.15
2024-08-07 2515.27 2594.83 2510.82 2568.41
df.loc['2024-08-21', ['Open', 'Close']]
Open     2687.20
Close    2701.13
Name: 2024-08-21 00:00:00, dtype: float64
df.iloc[-1]
Open      2.687200e+03
High      2.704980e+03
Low       2.684610e+03
Close     2.701130e+03
Volume    4.173296e+08
Change    1.700000e-03
UpDown    1.000000e+00
Comp      4.500000e+00
Amount    9.378558e+12
MarCap    2.210561e+15
Name: 2024-08-21 00:00:00, dtype: float64

댓글

이 블로그의 인기 게시물

[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