시계열 데이터

시계열 데이터는 행과 행사이에 시간의 흐름(순서)가 있고, 행과 행 사이의 시간간격이 동일한 데이터를 의미한다.

예) 가게의 일별 매출량 데이터

 

날짜 요소 뽑기

날짜 타입의 변수로 부터 날짜의 요소(일, 월, 주차, ..)를 뽑을 수 있다.

  • .dt.날짜 요소
메서드 내용
df['date'].dt.date YYYY-MM-DD(문자)
df['date'].dt.year 연(4자리 숫자)
df['date'].dt.month 월(숫자)
df['date'].dt.month_name() 월(문자)
df['date'].dt.day 일(숫자)
df['date'].dt.time HH:MM:SS(문자)
df['date'].dt.hour 시(숫자)
df['date'].dt.minute 분(숫자)
df['date'].dt.second 초(숫자
df['date'].dt.quarter 분기(숫자)
df['date'].dt.day_name() 요일 이름(문자)
df['date'].dt.weekday 요일숫자(0-월, 1-화, 2-수, ...) (=dayofweek) 
df['date'].dt.dayofyear 연 기준 몇일째(숫자)
df['date'].dt.days_in_month 월 일수(숫자) (daysinmonth)

 

data = pd.DataFrame([
    ['2024-02-22', 20153],
    ['2024-02-23', 20546],
    ['2024-02-24', 2053],
    ['2024-02-25', 2033],
    ['2024-02-26', 2234532],
    ['2024-02-27', 2653261],
], columns=["Date", "Sales"])

data['Date'] = pd.to_datetime(data['Date'])

print(data['Date'].dt.date) # 각 행 별 날짜 출력 
print(data['Date'].dt.year) # 각 행 별 년도 출력
print(data['Date'].dt.month)# 각 행 별 월 출력
print(data['Date'].dt.month_name()) # 각 행 별 월 영어로 출력
print(data['Date'].dt.day) # 각 행 별 일 출력
print(data['Date'].dt.time) # 각 행 별 시간 출력 => 현재 데이터에는 시간이 없어서 00:00:00
print(data['Date'].dt.hour) #  현재 데이터에는 시간이 없어서 0
print(data['Date'].dt.minute) #  현재 데이터에는 시간이 없어서 0
print(data['Date'].dt.second) #  현재 데이터에는 시간이 없어서 0
print(data['Date'].dt.quarter) # 각 행 별 분기
print(data['Date'].dt.day_name()) # 요일 이름 (문자)
print(data['Date'].dt.weekday) # 각 행 별 요일 이름 (숫 자)
print(data['Date'].dt.dayofyear) # 각 행 별 연 기준 몇일째 인지
print(data['Date'].dt.days_in_month) # 각 행 별 월 일수

 

 

.shift()

시계열 데이터에서 시간의 흐름 전후로 정보를 이동시킬 때 사용한다.

data = pd.DataFrame([
    ['2024-02-22', 20153],
    ['2024-02-23', 20546],
    ['2024-02-24', 2053],
    ['2024-02-25', 2033],
    ['2024-02-26', 2234532],
    ['2024-02-27', 2653261],
], columns=["Date", "Sales"])

data['Date'] = pd.to_datetime(data['Date'])
data['sales_lag1'] = data['Sales'].shift() # 하루 전날 데이터 열 추가
data['sales_lag2'] = data['Sales'].shift(2) # 2일 전날 데이터 열 추가
data['sales_lag_1'] = data['Sales'].shift(-1) # 다음 날 데이터 열 추가
data

 

 

.rolling().mean()

시간의 흐름에 따라 일정 기간 동안 평균을 이동하면서 구하기

data = pd.DataFrame([
    ['2024-02-22', 200],
    ['2024-02-23', 300],
    ['2024-02-24', 400],
    ['2024-02-25', 50],
    ['2024-02-26', 1000],
    ['2024-02-27', 250],
], columns=["Date", "Sales"])

data['Date'] = pd.to_datetime(data['Date'])
data['sales_mean3'] = data['Sales'].rolling(3).mean() # 3일 동안의 평균
data['sales_max3'] = data['Sales'].rolling(3).max() # 3일 동안의 최대값
data['sales_mean3_min_periods1'] = data['Sales'].rolling(3, min_periods=1).mean() # 3일 동안의 평균을 계산하는데, 하나의 값이라도 존재하면 바로 계산
data

 

 

.diff()

특정 시점 데이터, 이전 시점 데이터와의 차이 구하기

  • .diff() : 현재 - 하루 전
  • .diff(2) : 현재 - 2일 전
data = pd.DataFrame([
    ['2024-02-22', 200],
    ['2024-02-23', 300],
    ['2024-02-24', 400],
    ['2024-02-25', 50],
    ['2024-02-26', 1000],
    ['2024-02-27', 250],
], columns=["Date", "Sales"])

data['Date'] = pd.to_datetime(data['Date'])
data['diff1'] = data['Sales'].diff() # 현재 - 하루 전 값
data['diff2'] = data['Sales'].diff(2) # 현재 - 2일 전 값
data['diff3'] = data['Sales'].diff(3) # 현재 - 3일 전 값

data

728x90

'Language > Python' 카테고리의 다른 글

[Pandas] 데이터분석을 위한 데이터 전처리  (2) 2024.03.01
[Pandas] Pandas 기초  (0) 2024.03.01
[Numpy] Numpy 기초  (0) 2024.02.29
[Python] List, Dictionary  (0) 2024.02.28

데이터 처리

데이터 전처리에는 두 단계가 있다.

1. 원본 데이터에서 하나의 데이터셋으로 데이터 구조를 만드는 것 ( 데이터 분석을 위한 전처리 )

2. 모델링을 위한 데이터 전처리 ( ML, DL 모델링 )

이 두 가지 여기서는 데이터 분석을 위한 데이터 전처리하는 방법에 대해 설명할 것이다.

 

목차

  1. 데이터프레임 변경
  2. 데이터프레임 결

1. 데이터프레임 변경

열 이름 변경

  • columns 속성 변경
  • rename() 메소드 사용

columns

dataframe.columns = update 한 컬럼 이름 리스트

# columns 속성 변경
df.columns = ['name', 'scores', 'age']

 

 

rename() 

dataframe.rename(columns={"기존 이름" : "변경 이름"})

# rename() 메소드 변경: columns={"기존 이름": "변경할 이름"}
df.rename(columns={'NAME': 'name', 'SCORES', 'scores', 'AGE': 'age'})

 

열 추가

  • df['new column name'] = new column data : 데이터프레임 맨 뒤에 열 추가
  • df.insert(index, columnName, value) : 지정한 위치에 열 추가

df['new column name'] = new column data

# df['추가할 열 이름'] = 추가할 열 데이터
# sex = ['Female', 'Male', 'Female', ... ]
df['sex'] = sex

 

dataframe.insert(index, columnName, value)

# df.insert(index, new_column_name, new_column_data)
sex = ['Female', 'Male', 'Male', ... ]
df.insert(3, 'sex', sex)

 

 

열 삭제

df.drop(column_name, axis, inplace )

  • column_name: 삭제하고자 하는 열 이름
  • axis=0: 행 삭제(기본 값)
  • axis=1: 열 삭제
  • inplace=True or False
    • True: 삭제한 결과를 데이터에 반영
    • False: 삭제한 결과를 데이터에 반영하지 않고 삭제한 결과를 조회만.
# 열 하나 삭제
df.drop('column1', axis=1, inplace=True)

# 열 두 개 삭제
df.drop(['column1', 'column2'], axis=1, inplace=True)

 

 

값 변경

열 전체 값 변경

# column1의 모든 값을 0으로 변경
df['column1'] = 0

조건에 의한 변경

  • .loc
  • np.where

.loc

# df['column1']의 값이 30보다 큰 경우의 모든 값을 'column1'의 값을 100으로 변경
df.loc[df['column1'] > 30, 'column1'] = 100

 

np.where(조건문, 참, 거짓)

# column1 의 값이 30보다 큰 경우 100, 아니면 값 그대로
df['column1'] = np.where(df['column1'] > 30, 100, df['column1'])

 

기존 값을 다른 값으로 변경: map()

# male -> 1, female -> 0
df['sex'] = df['sex'].map({'male': 1, 'female':0})

 

숫자형 변수를 범주형 변수로 변경: cut()

  • pd.cut(df[자를 열 이름], 몇 등분할지, 나눈 값을 어떤 범주이름으로 할지 리스트)
# age열의 값들을 3등분하여 각각 y, m o로 명칭한 값을 age_group 열로 추가
df['age_group'] = pd.cut(df['age'], 3, ['y', 'm', 'o'])

2. 데이터 프레임 결합

  1. pd.concat()
  2. pd.merge()

pd.concat([target1, target2, ...],axis, join)

concat 메소드는 행 기준으로 결합할지, 열 기준으로 결합할지 지정할 수 있다.

  • axis=0
    • 행 기준으로 합친다. 즉, 아래나 위로 합친다는 의미이다. 
    • 열 이름을 기준으로 붙이게 된다.
    • join = "outer" ( 기본값 )
      • 모든 행과 열을 합친다. (값이 없는 요소는 NaN으로 채운다.) 
    • join = "inner"
      • 같은 행과 열만 합친다.
  • axis=1
    • 열 기준으로 합친다. 즉, 옆으로 합친다.
    • 행 인덱스를 기준으로 붙이게 된다.
    • join = "outer" ( 기본값 )
      • 모든 행과 열을 합친다. ( 값이 없는 요소는 NaN으로 채운다.)
    • join = "inner"
      • 같은 행과 열만 합친다.

concat([data1, data2], axis=0, join="outer")

axis=0 행 기준으로 모든 행과 열을 결합 하기 때문에 다음과 같은 결과가 나온다.

data1 = pd.DataFrame([
    [10, 15],
    [25, 30]
])

data2 = pd.DataFrame([
    [20, 35],
    [50, 40]
])


pd.concat([data1, data2] ,axis=0, join="outer")

data1, data2
concat 결과

concat([data1, data2], axis=0, join="inner")

data1의 경우 열이 A, B이고, data2의 경우 열이 A, C이기 때문에 열의 이름이 겹치는 A의 값만 결합되게 된다.

data1 = pd.DataFrame([
    [10, 15],
    [25, 30]
])

data2 = pd.DataFrame([
    [20, 35],
    [50, 40]
])

data1.columns = ["A", "B"]
data2.columns = ["A", "C"]

print(data1, end="\n\n")
print(data2, end="\n\n")


pd.concat([data1, data2] ,axis=0, join="inner")

 

concat([data1, data2], axis=1, join="outer")

행의 인덱스를 기준으로 결합을 하는데 모든 행과 열을 합치게 된다.

data1 = pd.DataFrame([
    [10, 15],
    [25, 30]
])

data2 = pd.DataFrame([
    [20, 35],
    [50, 40]
])

data1.columns = ["A", "B"]
data2.columns = ["A", "C"]

print(data1, end="\n\n")
print(data2, end="\n\n")


pd.concat([data1, data2], axis=1, join="outer")

concat([data1, data2], axis=1, join="inner")

data1의 행은 1, 2 data2의 행은 0,1 이 있다. 

이중에서 행 인덱스가 같은 값은 1뿐이기 때문에 다음과 같은 결과값이 나온다.

 

data1 = pd.DataFrame([
    [10, 15],
    [25, 30],
    [32, 54]
])

data2 = pd.DataFrame([
    [20, 35],
    [50, 40]
])

data1.columns = ["A", "B"]
data2.columns = ["A", "C"]
data1.drop(0, inplace=True)

print(data1, end="\n\n")
print(data2, end="\n\n")


pd.concat([data1, data2], axis=1, join="inner")

pd.merge()

  • merge 메소드는 특정 열(key)의 값을 기준으로 결합한다.
  • 데이터베이스의 테이블 조인과 같다.
  • 옆으로만 결합한다.
  • 결합 방법 4가지 ( how )
    • inner: 같은 값만
    • outer: 모두
    • left:  왼쪽 dataframe은 모두, 오른쪽 dataframe 같은 값만
    • right:  오른쪽 dataframe은 모두, 왼쪽 dataframe 같은 값만

pd.merge ( inner, outer, left, right ) 한번에 출력

  • inner
    • 아래 코드에서는 같은 값이 없으므로 출력되는 것이 없다.
  • outer
    • 모두 다 결합하기 때문에 data1, data2의 모든 A값이 나오게 붙게 되고 빈 값들은 NaN으로 채워진다.
  • left
    • data1을 기준으로 결합되는데, data2에 data1과 겹치는 값이 없으므로 결과는 data1에 D열이 추가되고, D열에는 NaN으로 채워진다.
  • right
    • data2를 기준으로 결합되는데, data1에 data2와 겹치는 값이 없으므로 결과는 data2에 B, C열이 추가되고, B, C열에는 NaN으로 채워진다.
data1 = pd.DataFrame([
    [10, 15, 43],
    [25, 30, 54],
])

data2 = pd.DataFrame([
    [20, 35],
    [50, 40]
])

data1.columns = ["A", "B", "C"]
data2.columns = ["A", "D"]

print("=" * 20, "data1", "=" * 20)
print(data1, end="\n\n")
print("=" * 20, "data2", "=" * 20)
print(data2, end="\n\n")


print("=" * 20, "inner", "=" * 20)
print(pd.merge(data1,data2, how="inner"))
print()
print("=" * 20, "outer", "=" * 20)
print(pd.merge(data1,data2, how="outer"))
print()
print("=" * 20, "outer", "=" * 20)
print(pd.merge(data1,data2, how="left"))
print()
print("=" * 20, "outer", "=" * 20)
print(pd.merge(data1,data2, how="right"))

 

 

pd.pivot_table

  • groupby된 데이터를 재구성한다.
  • df.pivot_table(index, columns, values)
columnName = ["Month", "Sex", "Name", "Price"]
data = [
    [1, "Male", "James", 100],
    [1, "Male", "John", 424],
    [2, "Female", "Hana", 2321],
    [2, "Female", "Jane", 545],
    [2, "Male", "Brian", 222],
]

data = pd.DataFrame(data, columns=columnName)
print("========= DataFrame =========")
print(data, end="\n\n")

print("========= Month & Sex ==> Price.sum() =========")
data = data.groupby(['Month', 'Sex'])[['Price']].sum()
print(data, end="\n\n")

print("========= pivot =========")
data.pivot_table(index = "Month", columns = "Sex", values="Price")

 

1월에 Female 정보가 없기 때문에 NaN이 나온다.

728x90

'Language > Python' 카테고리의 다른 글

[Pandas] 시계열 데이터 처리  (0) 2024.03.01
[Pandas] Pandas 기초  (0) 2024.03.01
[Numpy] Numpy 기초  (0) 2024.02.29
[Python] List, Dictionary  (0) 2024.02.28

Pandas

Pandas는 데이터 처리와 분석을 위한 Python 라이브러리이다.

행과 열로 이루어진 데이터 객체(데이터 프레임)를 만들어 데이터를 다룬다.

 

데이터프레임(Dataframe)

데이터프레임은 데이터 분석에서 가장 중요한 데이터 구조이다.

흔히 Excel구조와 같은 2차원 형태이다.

 

아래 그림이 Dataframe의 예시이다.

  • 열, 컬럼: name, number, score
  • 행, 로우: [Kim, 1, A] 와 같은 가로 한줄 한줄

DataFrame

 

시리즈 Series

시리즈는 하나의 정보에 대한 데이터의 지합을 의미한다.

1차원의 형태로 데이터 프레임에서 하나의 열을 떼어낸 것의 자료형은 Series이다.

 

 

Pandas 기초 메소드 및 함수 실습

라이브러리 불러오기

import pandas as pd

 

 

연습할 데이터 읽어오기

path = "https://raw.githubusercontent.com/Datamanim/pandas/main/lol.csv"

data = pd.read_csv(path, sep='\t') # 데이터가 \t로 구분되어 있어서 sep option을 줌.
data

 

불러온 데이터 구조 확인하기

1. df.head()

상위 데이터 조회

# 기본값: 앞쪽 상위 5개 데이터 확인
# data.head(3): 상위 3개 데이터 조회
data.head()

 

2. df.tail()

하위 데이터 조회

 

3. df.shape

# 데이터프레임의 모양 확인 (행의 수 , 열의 수) 형태
data.shape

 

4. df.info()

# 인덱스, 열, 값 개수, 데이터 형식 정보 등을 조회
data.info()

 

5. df.describe()

NaN 데이터는 자동으로 제외하고 수행한다.

  • count: 데이터 개수
  • mean: 데이터 평균
  • std: 데이터 표준편차
  • min: 데이터 최소값
  • 25%, 50%, 75%: 백분위수 지점
  • max: 데이터 최대값
# 데이터의 기초 통계 정보 확인
data.describe()

 

다양한 메소드 사용해보기

정렬

1. sort_index(ascending=False)

인덱스를 기준으로 정렬하기

- ascending=False: 내림차순

- ascending=True: 오름차순

data.sort_index(ascending=False)

 

2. sort_values(by=target, ascending=Fasle)

특정 열을 기준으로 정렬하기

 

- 열 하나 기준

data.sort_values(by="seasonId", ascending=False)

 

 

- 열 여러개 기준

data.sort_values(by=["seasonId", "winner"], ascending=False)

 

고유 값 확인

고유 값 확인을 위한 예제 데이터 불러오기

path = "https://raw.githubusercontent.com/Datamanim/datarepo/main/churnk/X_train.csv"
data = pd.read_csv(path)

 

1. value_counts()

특정 열의 고유한 값들의 개수들을 반환

data['Geography'].value_counts()

 

2. unique()

특정 열의 고유한 값들을 array 로 반환

data['Geography'].unique()

 

 

loc 메소드를 통해 특정 조건의 데이터 조회하기

df.loc[행 조건, 열 이름]

  • 열 이름 생략하면 전체 열을 조회한다.
  • 열 이름 한개로 조회하는 경우 시리즈로 조회
  • 열 이름 리스트 형태로 조회하는 경우 데이터프레임으로 조회
# Geography 열의 값이 Germany인, 데이터의 Surname 열을 조회
data.loc[data['Geography'] == "Germany", "Surname"]

 

# Geography 열의 값이 Germany인 모든 데이터의 전체 열을 조회
data.loc[data['Geography'] == "Germany"]

 

범위 조회 또는 포함 조회

1. df.isin([value1, value2, ...])

매개변수 리스트 내에 포함되는 데이터만 조회

# Geography가 Germany와 France인 데이터만 조회
data.loc[data['Geography'].isin(["Germany", "France"])]

 

2. df.between(value1, value2)

# Tenure값이 1과 4사이인 데이터만 조회
data.loc[data['Tenure'].between(1, 4)]

 

 

집계함수

df.집계함수() 사용시 모든 각 열에 대한 집계함수의 결과를 시리즈 형식으로 보여준다.

  1. sum() : 합
  2. mean() : 평균
  3. max() : 최대값
  4. min() : 최소값
  5. count() : 개수
data = pd.DataFrame([
    [1,2,3,4],
    [5,6,7,8],
    [9,10,11,12],
    [13,14,15,16]
])

data

 

df.집계함수()

print(("=" * 4) + "sum" + ("=" * 4))
print(data.sum(), end="\n\n")

print(("=" * 4) + "mean" + ("=" * 4))
print(data.mean(), end="\n\n")

print(("=" * 4) + "min" + ("=" * 4))
print(data.min(), end="\n\n")

print(("=" * 4) + "max" + ("=" * 4))
print(data.max(), end="\n\n")

print(("=" * 4) + "count" + ("=" * 4))
print(data.count(), end="\n\n")

 

df[열 번호].집계함수()

0번째 열에 대한 집계함수의 결과를 반환

print(("=" * 4) + "sum" + ("=" * 4))
print(data[0].sum(), end="\n\n")

print(("=" * 4) + "mean" + ("=" * 4))
print(data[0].mean(), end="\n\n")

print(("=" * 4) + "min" + ("=" * 4))
print(data[0].min(), end="\n\n")

print(("=" * 4) + "max" + ("=" * 4))
print(data[0].max(), end="\n\n")

print(("=" * 4) + "count" + ("=" * 4))
print(data[0].count(), end="\n\n")

 

그룹으로 묶어서 집계하기 :: groupby()

문법

df.groupby('집계기준변수', as_index=False)['집계대상변수'].집계함수

  • 집계기준변수: 범주형 변수 
    • 여러개 값 가능, 리스트로 넣는다.
  • 집계대상변수: 집계함수로 집계할 변수 혹은 리스트
    • 여러개 값 가능, 리스트로 넣는다.
  • ex) 월별 매출액의 합계 
    • 집계기준변수: 월
    • 집계대상변수: 매출액
  • option
    • as_index=True
      • 집계기준 변수를 인덱스로 사용한다.
# 월별 매출액의 합계가 시리즈로 조회됨
df.groupby('월', as_index=True)['매출액'].sum()

# 월별 매출액의 합계가 데이터프레임으로 조회됨
df.groupby('월', as_index=True)[['매출액']].sum()
df.groupby('월', as_index=False)['매출액'].sum()

 

여러개의 집계함수 한번에 값 얻기

.agg()

  • 열 하나에 대해 합계, 평균 등의 집계 함수를 한 번에 수행할 수 있게 하는 메소드
  • agg() 메소드의 매개변수로 수행하길 원하는 집계함수 이름을 리스트 형태로 넣어준다.

기본 문법

# 월별 매출액의 합계, 평균, 최대값을 구한다.
df.groypby('월')['매출액'].agg(['sum', 'mean','max'])

 

 

여러 열에 대해 각 열마다 다른 집계 수행

# 월별 매출액에 대해서는 평균, 팁에 대해서는 합계를 구한다.
df.groupby('월', as_index=False).agg({'매출액': 'mean', '팁': 'sum'})

 

728x90

'Language > Python' 카테고리의 다른 글

[Pandas] 시계열 데이터 처리  (0) 2024.03.01
[Pandas] 데이터분석을 위한 데이터 전처리  (2) 2024.03.01
[Numpy] Numpy 기초  (0) 2024.02.29
[Python] List, Dictionary  (0) 2024.02.28

Numpy

Numpy는 수치해석, 통계관련 기능을 제공하는 Python 라이브러리이다.

 

용어

  • Axis: 배열의 각 축을 의미
    • 2차원에서 axis0은 열방향( ⬇️ ), axis1은 행방향을 의미( ➡️ )
  • Rank: 축의 개수 (차원), ex)  1차원, 2차원, 3차원 ...
  • Shape: 축의 개수

라이브러리 불러오기

  1. 별칭 없이 라이브러리 불러오기
  2. 별칭을 주고 라이브러리 불러오기
  3. 특정 함수만 불러오기
# 별칭 없이 라이브러리 불러오기
import numpy

a = numpy.array([1,2])

# 별칭 주고 라이브러리 불러오기
import numpy as np
a = np.array([1,2])

# 특정 함수만 불러오기
from numpy import array
a = array([1,2])

 

배열 만들기 numpy.array(리스트)

1차원 배열

# 라이브러리 
import numpy as np

# 1차원 배열 생성
a = np.array([1,2,3])

# 차원
print(a.ndim) # 1

# 모양
print(a.shape) # (3, ) 원소 3개인 1차원 배열

# 데이터 형식
print(a.dtype) # int

# 배열 원소 조회
print(a[0], a[1], a[2]) # 1 2 3

 

2차원 배열

# 라이브러리 
import numpy as np

# 1차원 배열 생성
a = np.array([[1,2,3],
			[4,5,6],
            [7,8,9]])

# 차원
print(a.ndim) # 2

# 모양
print(a.shape) # (3, 2) 원소 3개인 2차원 배열

# 데이터 형식
print(a.dtype) # int

# 배열 원소 조회
print(a[0][0], a[1][1], a[2][2]) # 1 5 9

 

 

3차원 배열

# 라이브러리 
import numpy as np

# 1차원 배열 생성
a = np.array([
    [[1,2,],[3,4]],
    [[5,6],[7,8]]
])

# 차원
print(a.ndim) # 3

# 모양
print(a.shape) # (2, 2, 2) (2,2) 크기의 2차원 배열이 2개

# 데이터 형식
print(a.dtype) # int

# 배열 원소 조회
print(a[0][0], a[1][1]) # [1 2] [7 8]

 

Axis0 의 의미

  • 데이터의 건수를 의미한다.

2차원 데이터의 Shape가 (200, 4) 이라고 가정해보자. 이때 의미는 컬럼이 4개인 데이터가 100개 있다는 의미이다.

코드로 작성해서 확인해보면 다음과 같다.

# 라이브러리 
import numpy as np

a0 = ['Kim', 20, 201324, 'A']
student = np.array([a0] * 100)
print(student.shape) # (100, 4)
print(student.ndim) # 2

 

a0 은 학생a의 이름, 나이, 학번, 성적 정보를 가지고 있는 리스트이다.

해당 리스트를 np.array() 메소드를 통해서 100개의 데이터를 배열로 만드는 코드이다.

shape를 확인해보면 4개의 컬럼으로 이루어진 100개의 데이터다! 라는 것을 확인할 수 있고, ndim (차수)가 2차원 인것을 확인할 수 있다.

 

Reshape

기존 배열의 Shape를 새로운 형태의 배열로 재구성하는 함수

배열.reshape(행, 열)

np.reshape(배열, 행, 열)

  • array.reshape(3, -1) # array를 3행으로 된 배열로 변환
  • array.resahpe(-1, 3) # array를 3열로 된 배열로 변환
import numpy as np

list_a = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]

array_a = np.array(list_a)
print(array_a)
# [[ 1  2  3]
#  [ 4  5  6]
#  [ 7  8  9]
#  [10 11 12]]
print(array_a.shape) # (4, 3)

array_a = array_a.reshape(12, )
print(array_a)
# [ 1  2  3  4  5  6  7  8  9 10 11 12]
print(array_a.shape) # (12, )

array_a = array_a.reshape(6, -1)
print(array_a)
# [[ 1  2]
#  [ 3  4]
#  [ 5  6]
#  [ 7  8]
#  [ 9 10]
#  [11 12]]
print(array_a.shape) # (6, 2)


array_a = array_a.reshape(-1, 6)
print(array_a)
# [[ 1  2  3  4  5  6]
#  [ 7  8  9 10 11 12]]
print(array_a.shape) # (2, 6)

 

배열 데이터 조회 

인덱싱

요소 조회

  • 배열[행인덱스, 열인덱스]
  • 배열[행인덱스][열인덱스]

행 조회

  • 배열[행 인덱스. :]
  • 배열[행 인덱스]
  • 배열[[행1, 행2]]
  • 배열[[행1, 행2], :]

 

요소 조회 예제 코드

import numpy as np

list_a = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]

array_a = np.array(list_a)

print(array_a[0,0]) # 1
print(array_a[0][0]) # 1

 

행 조회 예제 코드

import numpy as np

list_a = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]

array_a = np.array(list_a)

print(array_a[0, :]) # [1 2 3]
print(array_a[1]) # [4 5 6]
print(array_a[[0,1]]) # [[1 2 3] [4 5 6]]
print(array_a[[0,1], :]) # [[1 2 3] [4 5 6]]

 

 

슬라이싱

  • 배열[시작:끝]
  • 배열[행인덱스, 시작:끝]
  • 배열[시작:끝, 시작:끝]
import numpy as np

list_a = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]

array_a = np.array(list_a)

print(array_a[0:2]) # [[1 2 3] [4 5 6]]
print(array_a[0, 0:2]) # [1 2] 
print(array_a[0:2, 0:2]) # [[1 2] [4 5]]

 

 

집계 함수

sum(), mean(), std() 모두 옵션없이 사용하면, 전체 데이터에 대한 집계가 계산된다.

  • numpy.sum() : 합계
  • numpy.mean() : 평균
  • numpy.std() : 표준편차

 

option

  • axis = 0 : 행 방향 집계
  • axis = 1 : 열 방향 집계
import numpy as np

list_a = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]
array_a = np.array(list_a)

# no option

# numpy.sum()
# 함수로서 사용
print(np.sum(array_a)) # 78
# 메소드로서 사용
print(array_a.sum()) # 78

# numpy.mean()
# 함수로서 사용
print(np.mean(array_a)) # 6.5
# 메소드로서 사용
print(array_a.mean()) # 6.5

# numpy.std()
# 함수로서 사용
print(np.std(array_a)) # 3.452052529534663
# 메소드로서 사용
print(array_a.std()) # 3.452052529534663

# axis=0
# numpy.sum()
print(array_a.sum(axis=0)) # [22 26 30]

# numpy.mean()
print(array_a.mean(axis=0)) # [5.5 6.5 7.5]

# numpy.std()
print(array_a.std(axis=0)) # [3.35410197 3.35410197 3.35410197]


# axis=1
# numpy.sum()
print(array_a.sum(axis=1)) # [ 6 15 24 33]

# numpy.mean()
print(array_a.mean(axis=1)) #  2.  5.  8. 11.]

# numpy.std()
print(array_a.std(axis=1)) # [0.81649658 0.81649658 0.81649658 0.81649658]

 

가장 큰(작은) 값의 인덱스 반환 

  • numpy.argmax(array, axis)
  • numpy.argmin(array, axis)
  • axis 생략: 전체 데이터
  • axis 0 : 열 기준 큰 값
  • axis 1 : 행 기준 큰 값
import numpy as np

list_a = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]
array_a = np.array(list_a)

# 전체 데이터 중 큰 값 인덱스 조회
print(np.argmax(array_a)) # 11

# axis = 0
# 열 별로 가장 큰 값의 인덱스 조회
print(np.argmax(array_a, axis=0)) # [3 3 3]

# axis = 1
# 행 별로 가장 큰 값의 인덱스 조회
print(np.argmax(array_a, axis=1)) # [2 2 2 2]

# 전체 데이터 중 작은 값 인덱스 조회
print(np.argmin(array_a)) # 0

# axis = 0
# 열 별로 가장 작은 값의 인덱스 조회
print(np.argmin(array_a, axis=0)) # [0 0 0]

# axis = 1
# 행 별로 가장 작은 값의 인덱스 조회
print(np.argmin(array_a, axis=1)) # [0 0 0 0]

 

조건에 따라 값 지정하기 :: numpy.where

numpy.where(조건문, 참일 때 값, 거짓일 때 값)

import numpy as np

list_a = [1,2,3,4,5,6,7]
array_a = np.array(list_a)

array_a = np.where(array_a < 4, 1, 0)
print(array_a) # [1 1 1 0 0 0 0]
728x90

'Language > Python' 카테고리의 다른 글

[Pandas] 시계열 데이터 처리  (0) 2024.03.01
[Pandas] 데이터분석을 위한 데이터 전처리  (2) 2024.03.01
[Pandas] Pandas 기초  (0) 2024.03.01
[Python] List, Dictionary  (0) 2024.02.28

+ Recent posts