기본 콘텐츠로 건너뛰기

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

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

[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$$ 실수...