1.  데이터 파일 저장

DataFrame_data.to_csv(file_name [, options])

 

🚀  to_csv()을 이용하면 DataFrame 형식의 데이터를 텍스트 파일로 저장

🚀  file_name은 텍스트 파일 이름으로 경로를 포함할 수 있음
🚀  선택사항인 options에는 구분자와 문자의 인코딩 방식 등을 지정

       ⚡️ 지정하지 않으면 구분자는 콤마가 되고, 문자의 인코딩 방식은 'utf-8'이 됨

 

# 네 명의 몸무게 Weight와 키 Height 데이터를 DataFrame 형식으로 생성.
df_WH = pd.DataFrame({'Weight': [62, 67, 55, 74],
                      'Height': [165, 177, 160, 180]},
                      index=['ID_1', 'ID_2', 'ID_3', 'ID_4'])
df_WH

df_WH 출력 결과

# index명 지정하는 경우
df_WH.index.name = 'User'
df_WH

df_WH 출력 결과

 


 📌  텍스트 파일 사용 예시

file_name = '../output/save_DataFrame_cp949.txt'
df_pr.to_csv(file_name, sep=' ', encoding='cp949')

 

2. 데이터 확인

1) DataFrame 만들기

import pandas as pd

# csv 파일 불러오기

df = pd.read_csv('../input/weather.csv')
print(df)

출력 결과


 

2) df.shape

 

👾  shape 속성을 이용하면 데이터의 (행, 열) 크기를 확인할 수 있음

df.shape
# 출력 결과 : (3653, 4)

df.shape[0]
# 출력 결과 : 3653

 


 

3) df.info()

 

👾  info()메서드는 데이터에 대한 전반적인 정보를 나타냄
👾  df를 구성하는 행과 열의 크기, 컬럼명, 컬럼을 구성하는 값의 자료형을 출력해 줌

df.info()

'''
출력 결과)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3653 entries, 0 to 3652
Data columns (total 4 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   date       3653 non-null   object 
 1   temp       3653 non-null   float64
 2   max_wind   3649 non-null   float64
 3   mean_wind  3647 non-null   float64
dtypes: float64(3), object(1)
memory usage: 114.3+ KB
'''

 

  📌  데이터 개수 n=3653 entry, 행 인덱스 번호 0 to 3652
  📌  열 변수 출력 형식 : 실수 float, 문자열 object
  📌  결측치 개수가 나타남 : max_wind, mean_wind 변수에 결측치가 있음 (= 값이 없는 칸이 존재 )

 


 

4) df.head() / df.tail()

 

👾  데이터를 잘 불러 왔는지 확인하기 위해 앞 부분(head)과 마지막 부분(tail)을 확인
👾  head()는 상위 5개 행을 출력하고, tail()은 하위 5개 행을 출력
👾 괄호() 안에 원하는 숫자를 넣으면 그 숫자만큼 행을 출력

# 상위 5행
df.head(5)

출력 결과

# 하위 n행 살펴보기
df.tail()

출력 결과

 


 

5) df.index, df.columns

 

👾  인덱스(행 이름)과 열의 레이블(칼럼 이름)을 출력할 때 사용

# 인덱스 출력
df.index
# 데이터프레임의 인덱스(행 이름)을 반환. 인덱스를 따로 지정하지 않았기 때문에 0부터 시작하는 인덱스가 부여.
# 출력 결과 : RangeIndex(start=0, stop=3653, step=1)
# 컬럼 출력
df.columns
# 출력 결과: Index(['date', 'temp', 'max_wind', 'mean_wind'], dtype='object')

  

 📌  해당 데이터프레임을 구성하는 컬럼명을 확인할 수 있음
 📌  컬럼명을 변경할 때도 유용하게 사용

 


 

6) df.describe()

 

👾  데이터의 컬럼별 요약 통계량을 나타냄
👾  mean(), max() 등 개별 함수를 사용하여 통계량을 계산 할 수 있음

# 요약 통계량 확인하기.
df.describe()

출력 결과


 

7) df.sort_values()

 

👾  데이터를 크기 순으로 정렬

# 형식
DataFrame.sort_values(by=['정렬변수1', '정렬변수2'...], ascending=True, inplace=False


  📌  by=[] : by=을 사용하지 않아도 됨
  📌  ascending=True : True가 기본 값이고 오름차순 정렬. 내림차순 정렬일 경우에는 False 사용.
  📌  inplace=False : True 이면 정렬 결과가 동일 데이터프레임 이름으로 저장. 기본 값은 False.

 

# 최대 풍속 max_wind 컬럼의 값의 크기에 따라 오름차순 정렬
df.sort_values(['max_wind'])

출력 결과

# 최대 풍속 max_wind 컬럼의 값의 크기에 따라 내림차순 정렬
df.sort_values(by=['max_wind'], ascending=False)

출력 결과

 


 

8) df.value_counts()

 

👾  범주형 변수의 빈도분석 결과를 출력, 즉 어떤 컬럼의 unique value(고유값)들의 개수를 구함

bank = pd.read_csv('../input/bank.csv')

# 빈도 분석 출력하기
bank['job'].value_counts()

'''
출력 결과)
job
management       1560
blue-collar      1499
technician       1206
admin.            834
services          661
retired           351
self-employed     256
entrepreneur      239
unemployed        223
housemaid         208
student           153
Name: count, dtype: int64
'''
bank['job'].value_counts(ascending=True)
# -> 위의 결과를 오름차순으로 정렬

 


 

9) df.unique()

 

👾  데이터가 무엇으로 구성되어 있는지 보고 싶을 때 사용. 열의 고유값을 볼 수 있음

# column의 고유값 출력하기
bank['job'].unique()

'''
출력 결과)
array(['management', 'technician', 'blue-collar', 'retired', 'services',
       'admin.', 'entrepreneur', 'self-employed', 'unemployed', 'student',
       nan, 'housemaid'], dtype=object)
'''

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]


 

1. 통계  메서드

sum() 원소의 합
mean()  평균
std() 표준편차
var() 분산
min() 최솟값
max() 최댓값
cumsum() 원소의 누적 합
cumprod() 원소의 누적 곱

 

# 2012년 부터 2016년 까지 우리나라의 계절별 강수량(단위 mm).
table_data3 = {'봄': [256.5, 264.3, 215.9, 223.2, 312.8],
               '여름': [770.6, 567.5, 599.8, 387.1, 446.2],
               '가을': [363.5, 231.2, 293.1, 247.7, 381.6],
               '겨울': [139.3, 59.9, 76.9, 109.1, 108.1]}
columns_list = ['봄', '여름', '가을', '겨울']
index_list = ['2012', '2013', '2014', '2015', '2016']
df3 = pd.DataFrame(table_data3, columns=columns_list, index=index_list)
df3

df3 출력 결과

 

# 2012년에서 2016년에 걸쳐 계절별로 강수량의 평균(mean)과 표준 편차(std)를 구함.
df3.mean()
'''
봄     254.54
여름    554.24
가을    303.42
겨울     98.66
dtype: float64
'''

df3.std()  # 계절별 강수량 표준편차
'''
봄      38.628267
여름    148.888895
가을     67.358496
겨울     30.925523
dtype: float64
'''

 

    📌  연도별로 평균 강수량과 표준 편차를 구할 경우엔 연산의 방향 설정을 위해 axis인자를 추가
    📌  인자 axis가 0이면 DataFrame의 values에서 열별로 연산을 수행하고, 1이면 행별로 연산

    📌  axis 인자를 설정하지 않으면 기본값을 0으로 설정

 

df3.mean(axis=1)
'''
2012    382.475
2013    280.725
2014    296.425
2015    241.775
2016    312.175
dtype: float64
'''

df3.std(axis=1)
'''
2012    274.472128
2013    211.128782
2014    221.150739
2015    114.166760
2016    146.548658
dtype: float64
'''

💡  df.describe()

 

  -  평균, 표준편차, 최솟값과 최댓값 등을 한 번에 구할 수 있는 메서드
  -  25%, 50%, 75% : 백분위수의 각 지점으로, 분포를 반영해 평균을 보완하는 목적으로 사용

df3.describe()

 

출력 결과


 

2.  판다스 데이터  읽기

1) 표 형식 데이터 읽기

🍯  판다스에서 csv파일을 읽을 때는 read_csv() 메서드 이용

🍯  파이썬에서 텍스트파일을 생성하면 기본 문자 인코딩이 ’utf-8’이고, 메모장의 경우 기본 문자 인코딩이 ‘cp949’

DataFrame_data = pd.read_csv(file_name [, options])

 

import pandas as pd

df1 = pd.read_csv('../input/sea_rain1.csv')
df1

 

출력 결과

df1.dtypes
'''
연도      int64
동해    float64
남해    float64
서해    float64
전체    float64
dtype: object
'''

pd.read_csv('../input/sea_rain1_from_notepad.csv')
# UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: 
# invalid start byte

 

    📌  sea_rain1_from_notepad.csv 파일을 메모장으로 생성해서, 인코딩이 'cp949'이므로 에러가 남

            ▶️  메소드 안에 encoding='cp949' 를 붙여주면 된다.

# 올바른 실행 예
pd.read_csv('../input/sea_rain1_from_notepad.csv', encoding='cp949')

 

🍯  txt 파일의 경우 콤마가 아니라 공백(빈칸)으로 구분된 경우 sep 옵션을 이용해서 구분자가 콤마가 아니라 공백임을 지정
🍯  아래 처럼 확장자가 txt라도 read_csv()로 읽을 수 있음.

pd.read_csv('../input/sea_rain1_space.txt', sep=' ')

 

📌  read_csv()로 텍스트 파일을 읽어오면 index가 자동으로 지정
📌  이 때 특정 열 column을 index로 선택하려면

       'index_col=열_이름'을 추가

 

 

pd.read_csv('../input/sea_rain1.csv', index_col='연도')

출력 결과

 

 

 

 

 

[ 내용 참고 :  IT 학원 강의 ]


 

1.  DataFrame을 활용한 데이터 생성

 

🍯  표 Table와 2차원 데이터 처리를 위해 DataFrame을 제공
       ▶️  데이터 Data를 담는 틀 Frame이라는 뜻

 

 

1) 데이터 생성

df = pd.DataFrame(data [, index = index_data, columns = columns_data])


  🐰  data 인자에는 리스트와 형태가 유사한 데이터 타입은 모두 사용 가능
        🥕  리스트, 딕셔너리, numpy의 배열 데이터, Series나 DataFrame 타입의 데이터 입력 가능
  🐰  세로축 라벨을 index라 하고, 가로축 라벨을 columns 라고 함
  🐰  index와 columns를 제외한 부분을 values라고 함

 

import pandas as pd
d1 = pd.DataFrame([[1,2,3], [4,5,6], [7,8,9]])
d1

d1 결과

 

🥕  values 부분에는 입력한 data가 순서대로 입력 돼 있고 가장 좌측의 열과 가장 윗줄의 행에는 각각 숫자가 자동으로 생성되어 index, columns를 구성
  ▶️   명시적으로 입력하지 않더라도 자동으로 index, columns가 생성

 

 


 

📁  numpy의 배열 데이터를 입력해 생성한 DataFrame 데이터의 예

import numpy as np
data_list = np.array([[10,20,30], [40,50,60], [70,80,90]])
print(data_list)
'''
[[10 20 30]
 [40 50 60]
 [70 80 90]]
'''

d2 = pd.DataFrame(data_list)
d2

d2 출력 결과


 

📁 data뿐만 아니라 index와 columns도 지정한 예

data = np.array([[1,2,3], [4,5,6], [7,8,9], [10,11,12]])  # values
index_date = pd.date_range('2019-09-01', periods=4)
columns_list = ['A', 'B', 'C']
d3 = pd.DataFrame(data=data, index=index_date, columns=columns_list)
d3

d3 출력 결과


 

📁  딕셔너리 타입으로 2차원 데이터를 입력한 예

 

      📌  리스트나 넘파이 배열은 행 단위로 입력이 되고, 딕셔너리는 열 단위로 입력됨

table_data = {'연도': [2015, 2016, 2016, 2017, 2017],
              '지사': ['한국', '한국', '미국', '한국', '미국'],
              '고객 수': [200, 250, 450, 300, 500]}
d4 = pd.DataFrame(table_data)

d4 출력 결과

# 입력시 키의 순서를 지정할 수도 있음.
d5 = pd.DataFrame(table_data, columns=['지사', '고객 수', '연도'])
d5

d5 출력 결과


 

📁  DataFrame 데이터에서 index, columns, values을 각각 구한 예

d5.index
# RangeIndex(start=0, stop=5, step=1)

d5.columns
# Index(['지사', '고객 수', '연도'], dtype='object')

d5.values
# 0,한국,200,2015
# 1,한국,250,2016
# 2,미국,450,2016
# 3,한국,300,2017
# 4,미국,500,2017

 


 

2.  데이터 연산

🍯  Pandas의 Series()와 DataFrame()으로 생성된 데이터 끼리는 사칙연산이 가능

🍯  파이썬의 리스트와 numpy의 배열과 달리 pandas의 데이터 끼리는 서로 크기가 달라도 연산이 가능
        ▶️  이 경우 연산을 할 수 있는 항목만 연산을 수행

 

1)  Series()로 생성한 데이터의 예

import pandas as pd

s1 = pd.Series([1,2,3,4,5])
s2 = pd.Series([10,20,30,40,50])
# 덧셈
s1 + s2

'''
0    11
1    22
2    33
3    44
4    55
dtype: int64
'''
# 뺄셈
s2 - s1

'''
0     9
1    18
2    27
3    36
4    45
dtype: int64
'''
# 곱셈
s1 * s2

'''
0     10
1     40
2     90
3    160
4    250
dtype: int64
'''
# 나눗셈
s2 / s1

'''
0    10.0
1    10.0
2    10.0
3    10.0
4    10.0
dtype: float64
'''

 


 

2) 데이터의 크기가 다른 경우

 

🐰   연산할 수 있는 부분만 연산한 결과를 보여주고 연산할 수 없는 부분은 NaN으로 표시

s3 = pd.Series([1,2,3,4])
s4 = pd.Series([10,20,30,40,50])
# 덧셈
s3 + s4

'''
0    11.0
1    22.0
2    33.0
3    44.0
4     NaN
dtype: float64
'''
# 뺄셈
s4 - s3

'''
0     9.0
1    18.0
2    27.0
3    36.0
4     NaN
dtype: float64
'''
# 곱셈
s3 * s4

'''
0     10.0
1     40.0
2     90.0
3    160.0
4      NaN
dtype: float64
'''
# 나눗셈
s4 / s3

'''
0    10.0
1    10.0
2    10.0
3    10.0
4     NaN
dtype: float64
'''

 


3) DataFrame 연산

 

🐰  Series와 마찬가지로 DataFrame도 연산할 수 있는 항목 끼리만 연산하고 그렇지 못한 항목은 NaN으로 표시
        🥕 공간은 차지하되 데이터는 없는 상태

# DataFrame()으로 생성한 데이터의 예
table_data1 = {'A': [1,2,3,4,5],
               'B': [10,20,30,40,50],
               'C': [100,200,300,400,500]}
df1 = pd.DataFrame(table_data1)
df1

table_data2 = {'A': [6,7,8],
               'B': [60,70,80],
               'C': [600,700,800]}
df2 = pd.DataFrame(table_data2)
df2

 

df 1 출력결과
df2 출력 결과

df1 + df2

출력 결과

 

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]


 

1.  Pandas 란

🍯  pandas 라이브러리 : 파이썬에서 데이터 분석과 처리를 쉽게 처리할 수 있게 도와준다
🍯  pandas는 numpy를 기반으로 만들어졌지만 좀 더 복잡한 데이터 분석에 특화
🍯  numpy가 같은 데이터 타입의 배열만 처리할 수 있는데 반해 pandas는 데이터 타입이 다양하게 섞여 있을 때도 처리 가능

 

    📌  공식 홈페이지 : https://pandas.pydata.org/

 

pandas - Python Data Analysis Library

pandas pandas is a fast, powerful, flexible and easy to use open source data analysis and manipulation tool, built on top of the Python programming language. Install pandas now!

pandas.pydata.org


2.  구조적 데이터 생성하기

1) Series를 활용한 데이터 생성

🍋  pandas에서 데이터를 생성하는 가장 기본적인 방법은 Series()를 이용하는 것
🍋  Series()를 이용하면 Series 형식의 구조적 데이터(라벨을 갖는 1차원 데이터)를 생성할 수 있음.

 

   📌  다음은 Series()를 이용해 Series 형식의 데이터를 생성하는 방법

s = pd.Series(seq_data)



🍋  Series()의 인자로는 시퀀스 데이터가 들어감
🍋  시퀀스 데이터로는 리스트와 튜플 타입의 데이터를 모두 사용할 수 있지만 주로 리스트 데이터를 이용

import pandas as pd

s1 = pd.Series([10, 20, 30, 40, 50])
print(s1)
s1

 

 

📌  위 쪽의 결과는 print(s1)의 결과

      아래 쪽의 결과는 s1 만 실행했을 때 출력되는 결과 (주피터 노트북 사용 )

 

 

 

 

 

 

 


s1 = pd.Series([10, 20, 30, 40, 50])
s1.index
# 실행 출력
# RangeIndex(start=0, stop=5, step=1)

s1.values

s1.values 결과

 

🍋  numpy의 경우 배열의 모든 원소가 데이터 타입이 같아야 했지만 pandas의 경우에는 원소의 데이터 타입이 달라도 저장 가능

s2 = pd.Series(['a', 'b', 'c', 1, 2, 3])  # 넘파이 였다면 모두 문자열로 변경.
print(s2)
# 0    a
# 1    b
# 2    c
# 3    1
# 4    2
# 5    3
# dtype: object
# 변수 s2에는 문자열과 숫자가 혼합이 되어 있어서 타입이 object

 


3) np.nan

🍋  데이터가 없으면 numpy를 임포트한 후 np.nan으로 데이터가 없음을 표시할 수 있음

import numpy as np
s3 = pd.Series([np.nan, 10, 30])
print(s3)  
'''
출력결과)
0     NaN  -> 데이터를 위한 자리 index는 있지만 실제 값이 없음.
1    10.0
2    30.0
dtype: float64
'''

 

 

4) index

🍋   Series 데이터를 생성할 때 인자로 index 추가 가능

         ▶️  인자로 index를 명시적으로 입력하면 Series 변수(s)의 index에는 자동 생성되는 index 대신 index_seq가 들어가게 됨

         ▶️  index_seq도 리스트와 튜플 타입의 데이터를 모두 사용가능하지만 주로 리스트를 사용

         ▶️ 주의할 점은 seq_data의 항목 개수와 index_seq의 항목 개수가 같아야

s = pd.Series(seq_data, index = index_seq)
# 어느 가게의 날짜별 판매량을 pandas의 Series 형식으로 입력. 하루는 데이터가 없어서 np.nan을 입력
index_data = ['2018-10-07', '2018-10-08', '2018-10-09', '2018-10-10']
s4 = pd.Series([200, 195, np.nan, 205], index=index_data)
s4

s4 실행결과

s4.index
# Index(['2018-10-07', '2018-10-08', '2018-10-09', '2018-10-10'], dtype='object')

 

 

🍋  파이썬의 딕셔너리를 사용하면 데이터와 index를 함께 입력할 수 있음

        ▶️  입력 인자로 딕셔너리 데이터를 입력하면 딕셔너리 데이터의 키 key와 값 value이 각각 Series 데이터의 index와 values로 들어감

s = pd.Series(dict_data)
s5 = pd.Series({'국어': 100, '영어': 95, '수학': 90})
s5
'''
국어,100
영어,95
수학,90
'''

 

3. 날짜 자동 생성 : data_range()

 

🚀  입력해야 할 날짜가 많으면 pandas에서 날짜를 자동생성하는 data_range() 사용
🚀  몇 가지 설정만 하면 원하는 날짜를 자동으로 생성하므로 날짜 데이터를 입력할 때 편리

 

pd.date_range(start=None, end=None, periods=None, freq='D'


    👾  start는 시작날짜, end는 끝날짜
    👾  periods는 날짜 데이터 생성 기간 = 생성 갯수
    👾  freq는 날짜 데이터 생성 주기
    👾  start는 필수이고, end나 periods는 둘 중 하나만 있어도 됨
    👾  freq는 입력하지 않으면 'D' 옵션이 설정돼 달력날짜 기준으로 하루씩 증가

# 시작 날짜와 끝 날짜를 지정해 날짜 데이터를 생성. 하루씩 증가한 날짜 데이터가 생성.
pd.date_range(start='2019-01-01', end='2019-01-07')
'''
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
               '2019-01-05', '2019-01-06', '2019-01-07'],
              dtype='datetime64[ns]', freq='D')
'''

 


 

1) 날짜 데이터 형식

 

🚀  날짜 데이터를 입력할 때 yyyy-mm-dd  yyyy/mm/dd, yyyy.mm.dd, mm-dd-yyyy, mm/dd/yyyy, mm.dd.yyyy 

      형식 사용가능
        ▶️ 대신 출력은 yyyy-mm-dd 형식으로 생성

pd.date_range(start='2019/01/01', end='2019.01.07')
'''
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
               '2019-01-05', '2019-01-06', '2019-01-07'],
              dtype='datetime64[ns]', freq='D')
'''

pd.date_range(start='2019-01-01', end='01.07.2019')
'''
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
               '2019-01-05', '2019-01-06', '2019-01-07'],
              dtype='datetime64[ns]', freq='D')
'''

# 끝 날짜를 지정하지 않고 periods만 입력해서 날짜 생성.
pd.date_range(start='2019-01-01', periods=7)
'''
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
               '2019-01-05', '2019-01-06', '2019-01-07'],
              dtype='datetime64[ns]', freq='D')
'''

 


 

2)  pandas data_range() 함수의 freq 옵션

약어 설명 사용  예
D 달력 날짜 기준 하루 주기 하루 주기: freq = 'D',  이틀 주기: freq = '2D'
B 업무 날짜 기준 하루 주기 업무일(월~금) 기준으로 생성, freq = 'B',  freq = '3B'
W 일요일 시작 기준 일주일 주기 월요일: W-MON, 화요일: W-TUE, freq = 'W',
freq = 'W-MON'
M 월말 날짜 기준 주기 한 달 주기: freq = 'M', 네 달 주기: freq = '4M'
BM 업무 월말 날짜 기준 주기 freq = 'BM' , freq = '2BM'
MS 월초 날짜 기준 주기 freq = 'MS' , freq = '2MS'
BMS 업무 월초 날짜 기준 주기 freq = 'BMS' , freq = '2BMS'
Q 분기 끝 날짜 기준 주기 freq = 'Q' , freq = '2Q'
BQ 업무 분기 끝 날짜 기준 주기 freq = 'BQ' , freq = '2BQ'
QS 분기 시작 날짜 기준 주기 freq = 'QS' , freq = '2QS'
BQS 업무 분기 시작 날짜 기준 주기 freq = 'BQS' , freq = '2BQS'
A 일년 끝 날짜 기준 주기 freq = 'A' , freq = '2A'
BA 업무 일년 끝 날짜 기준 주기 freq = 'BA' , freq = '2BA'
AS 일년 시작 날짜 기준 주기 freq = 'AS' , freq = '2AS'
BAS 업무 일년 시작 날짜 기준 주기 freq = 'BAS' , freq = '2BAS'
H 시간 기준 주기 1시간 주기: freq = 'H' , 2시간 주기: freq = '2H'
BH 업무 시간 기준 주기 업무 시간(09:00 ~ 17:00) 기준으로 생성
T, min 분 주기 10분 주기: freq = '10T' , 30분 주기: freq = '30min'
S 초 주기 1초 주기: freq = 'S' , 10초 주기: freq = '10S'
# 2일씩 증가하는 날짜를 생성
pd.date_range(start='2019-01-01', periods=4, freq='2D')
# DatetimeIndex(['2019-01-01', '2019-01-03', '2019-01-05', '2019-01-07'], 
# dtype='datetime64[ns]', freq='2D')

 

# 달력의 요일을 기준으로 일주일씩 증가하는 날짜를 생성.
pd.date_range(start='2019-01-06', periods=4, freq='W')
# DatetimeIndex(['2019-01-06', '2019-01-13', '2019-01-20', '2019-01-27'], 
# dtype='datetime64[ns]', freq='W-SUN')
# 업무일 기준 2개월 월말 주기로 12개 날짜를 생성.
pd.date_range(start='2019-01-01', periods=12, freq='2BM')
'''
DatetimeIndex(['2019-01-31', '2019-03-29', '2019-05-31', '2019-07-31',
               '2019-09-30', '2019-11-29', '2020-01-31', '2020-03-31',
               '2020-05-29', '2020-07-31', '2020-09-30', '2020-11-30'],
                dtype='datetime64[ns]', freq='2BM'
'''

 

# 분기 시작일을 기준으로 4개의 날짜를 생성
pd.date_range(start='2019-01-01', periods=4, freq='QS')
# DatetimeIndex(['2019-01-01', '2019-04-01', '2019-07-01', '2019-10-01'], 
# dtype='datetime64[ns]', freq='QS-JAN')

 


 

[ 시간 생성 ]

# 1시간 주기로 10개의 시간을 생성한 예
pd.date_range(start='2019-01-01 08:00', periods=10, freq='H')
'''
DatetimeIndex(['2019-01-01 08:00:00', '2019-01-01 09:00:00',
               '2019-01-01 10:00:00', '2019-01-01 11:00:00',
               '2019-01-01 12:00:00', '2019-01-01 13:00:00',
               '2019-01-01 14:00:00', '2019-01-01 15:00:00',
               '2019-01-01 16:00:00', '2019-01-01 17:00:00'],
              dtype='datetime64[ns]', freq='H')
'''
# 업무 시간을 기준으로 1시간 주기로 10개의 시간을 생성하는 예
# 업무 시간은 9시 부터 17시까지이므로 start시간을 9시 이전으로 설정해도 9시 부터 표시.
pd.date_range(start='2019-01-01 08:00', periods=10, freq='BH')
'''
DatetimeIndex(['2019-01-01 09:00:00', '2019-01-01 10:00:00',
               '2019-01-01 11:00:00', '2019-01-01 12:00:00',
               '2019-01-01 13:00:00', '2019-01-01 14:00:00',
               '2019-01-01 15:00:00', '2019-01-01 16:00:00',
               '2019-01-02 09:00:00', '2019-01-02 10:00:00'],
              dtype='datetime64[ns]', freq='BH')
'''
# date_range()를 이용해 Series의 index를 지정한 예.
index_date = pd.date_range(start='2019-03-01', periods=5, freq='D')
s = pd.Series([51, 62, 55, 49, 58], index=index_date)
s
'''
2019-03-01,51
2019-03-02,62
2019-03-03,55
2019-03-04,49
2019-03-05,58
'''

 

 

 

 

[ 내용 참고: IT 학원 강의 ]


 

1.  배열의 연산

 

1) 기본 연산

 

🚀  배열 형태 (shape)가 같다면 덧셈과 뺄셈, 곱셈과 나눗셈 연산을 할 수 있음

import numpy as np

arr1 = np.array([10, 20, 30, 40])
arr2 = np.array([1, 2, 3, 4])

# 각 배열의 같은 위치의 원소끼리 더함.
print(arr1 + arr2)  # [11 22 33 44]

# 두 배열의 차는 같은 위치의 원소끼리 뺌
print(arr1 - arr2)  # [ 9 18 27 36]

# 배열에 상수를 곱하면 각 원소에 상수를 곱함
print(arr1 * 2)  # [20 40 60 80]

# 배열의 거듭제곱은 배열의 각 원소에 거듭제곱.
print(arr1 ** 2)  # [ 100  400  900 1600]

# 두 배열끼리의 곱셈은 각 원소끼리 곱함.
print(arr1 * arr2)  # [ 10  40  90 160]

# 두 배열의 나눗셈은 각 원소끼리 나눔
print(arr1 / arr2)  # [10. 10. 10. 10.]

# 배열은 비교 연산도 가능. 원소별로 조건과 일치하는지 검사한 후 일치하면 True를, 그렇지 않으면 False를 반환
print(arr1 > 20)  # [False False  True  True]

 


 

2) 통계를 위한 연산

🚀  NumPy에는 배열의 합, 평균, 표준 편차, 분산, 최솟값과 최댓값, 누적 합과 누적 곱 등 주로 통계에서 많이 이용하는 메서드가 있음
        ▶️  각각 sum(), mean(), std(), var(), min(), max(), cumsum(), cumprod()

import numpy as np

arr3 = np.arange(5)
print(arr3)  # [0 1 2 3 4]

# 합
print(arr3.sum())  # 10
# 평균
print(arr3.mean())  # 2.0
# 표준 편차
print(arr3.std())  # 1.4142135623730951
# 분산
print(arr3.var())  # 2.0
# 최솟값
print(arr3.min())  # 0
# 최댓값
print(arr3.max())  # 4

arr4 = np.arange(1, 5)
print(arr4)  # [1 2 3 4]
# 누적 합
print(arr4.cumsum())  # [ 1  3  6 10]
# 누적 곱
print(arr4.cumprod())  # [ 1  2  6 24]

 


 

3)  배열의 인덱싱과 슬라이싱

🚀  인덱싱 Indexing : 배열의 위치나 조건을 지정해 배열의 원소를 선택
🚀  슬라이싱 Slicing : 범위를 지정해 배열의 원소를 선택

1) 배열의 인덱싱

 

  👾  1차원 배열에서 특정 위치의 원소를 선택하려면 원소의 위치를 지정
  👾  배열명[위치] : 배열 원소의 위치는 0부터 시작

import numpy as np

a1 = np.array([0, 10, 20, 30, 40, 50])
print(a1[0])  # 0
print(a1[4])  # 40

# 배열을 변경
a1[5] = 70
print(a1)  # [ 0 10 20 30 40 70]

 

  👾  1차원 배열에서 여러 개의 원소를 선택
          ▶️  배열명[위치1, 위치2, ..., 위치n]

  👾  2차원 배열에서 특정 위치의 원소를 선택하려면 행과 열의 위치를 지정
          ▶️  배열명[행_위치, 열_위치]

  👾  2차원 배열의 여러 원소를 선택하기 위해서 아래와 같이 지정
          ▶️  배열명[[행_위치1, 행_위치2, ..., 행_위치n], [열_위치1, 열_위치2, ..., 열_위치n]]

# 1차원 배열
print(a1[[1, 3, 4]])  # [10 30 40]

# 2차원 배열
# 10부터 99까지 10씩 증가하는 1차원 배열을 생성한 후에 3행 3열의 2차원 배열로 모양을 바꿈.
a2 = np.arange(10, 100, 10).reshape(3, 3)
print(a2)
# [[10 20 30]
#  [40 50 60]
#  [70 80 90]]

# 2차원 배열 원소 선택
# 행 위치가 0이고, 열 위치가 2인 원소를 반환.
print(a2[0, 2])  # 30
print(a2[0][2])  # 30

# 2차원 배열의 행과 열의 위치를 지정해서 원소를 선택한 후 값을 변경할 수 있음
a2[2, 2] = 95
print(a2)
# [[10 20 30]
#  [40 50 60]
#  [70 80 95]]

# 2차원 배열 여러 원소 선택
print(a2[[0, 2], [0, 1]])  # [10 80]

 

  👾  배열에 조건을 지정해 조건을 만족하는 배열을 선택
          ▶️ 배열명[조건]

a = np.array([1, 2, 3, 4, 5, 6])
print(a[a > 3])  # [4 5 6]

# 짝수만 선택하는 예
print(a[(a % 2) == 0])  # [2 4 6]

# -인덱스도 사용가능
print(a1[-2])  # 40

 


 

2) 배열의 슬라이싱


  👾  1차원 배열의 경우 슬라이싱은 배열의 시작과 끝 위치를 지정
  👾  배열[시작_위치:끝_위치]
  👾  반환되는 원소의 범위는 '시작_위치 ~ 끝_위치 -1'
          ▶️ 시작 위치를 지정하지 않으면 0
          ▶️ 끝 위치를 지정하지 않으면 배열이 길이

 

import numpy as np

b1 = np.array([0, 10, 20, 30, 40, 50])
print(b1[1:4])  # [10 20 30]

# 1차원 배열에서 '시작_위치'와 '끝_위치'를 지정하지 않고 슬라이싱하는 예.
print(b1[:3])  # [ 0 10 20]
print(b1[2:])  # [20 30 40 50]
print(b1[:])  # [ 0 10 20 30 40 50]

# 슬라이싱을 이용해 원소를 변경할 수 있음.
b1[2:5] = np.array([25, 35, 45])
print(b1)  # [ 0 10 25 35 45 50]

# 여러 원소의 값을 같은 값으로 변경하는 예
b1[3:6] = 60
print(b1)  # [ 0 10 25 60 60 60]

 

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]


 

1.  넘파이란 ?

🥑  NumPy : 배열 데이터를 효과적으로 다루고, 과학 연산을 쉽고 빠르게 할 수 있게 만든 패키지
🥑  파이썬의 기본 데이터 형식과 내장 함수를 이용하는 것보다 다차원 배열 데이터를 효과적으로 처리
🥑  NumPy는 파이썬의 내장 모듈이 아니라서 별도로 설치

import numpy as np

 

 

    📁 NumPy 홈페이지 : https://numpy.org/

 

NumPy -

Use the interactive shell to try NumPy in the browser

numpy.org


 

1) 배열 생성 

👾  배열 (Array) 이란?  순서가 있는 같은 종류의 데이터가 저장된 집합
👾  NumPy를 이용해 배열을 처리하기 위해서는 우선 NumPy로 배열을 생성해야 함

①  시퀀스 데이터로부터 배열 생성하기  'np. array()'

    - 시퀀스 데이터 seq_data를 인자로 받아 NumPy의 배열 객체 array object를 생성

# 정수 리스트로 배열 생성
data1 = [0, 1, 2, 3, 4, 5]
print(data1)  # [0, 1, 2, 3, 4, 5]
a1 = np.array(data1)
print(a1)  # [0 1 2 3 4 5]
print(a1.dtype)  # int64

# 정수와 실수가 혼합된 경우
data2 = [0.1, 5, 4, 12, 0.5]
a2 = np.array(data2)
print(a2)  # [ 0.1  5.   4.  12.   0.5]
print(a2.dtype)  # float64. 정수와 실수가 혼합돼 있을 때 모두 실수로 변환.

# 숫자와 문자가 있는 경우
data3 = [0.1, 5, 4, 12, 'test']
a3 = np.array(data3)
print(a3)  # ['0.1' '5' '4' '12' 'test']
print(a3.dtype)  # <U32 -> 길이가 32인 유니코드 문자열

# array()에 직접 리스트를 넣어서 배열 객체도 생성 가능
a3 = np.array([0.5, 2, 0.01, 8])
print(a3)  # [0.5  2.   0.01 8.  ]

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

    


 

②  범위를 지정해 배열 생성  'np.arange()'
 

    ·  arange()를 이용해 Numpy 배열을 생성, 파이썬의 range()와 사용방법이 비슷 

# 기본 형식
arr_obj = np.arrange([start,] stop[, step])

 

     📌  start부터 시작해서 stop 전까지 step만큼 계속 더해 NumPy 배열을 생성
            ➡️ start가 0인 경우에는 생략가능
            ➡️ step이 1인 경우에는 생략가능

a1 = np.arange(0, 10, 2)
print(a1)  # [0 2 4 6 8]

a2 = np.arange(1, 10)
print(a2)  # [1 2 3 4 5 6 7 8 9]

a3 = np.arange(5)
print(a3)  # [0 1 2 3 4]

 


 

③  2차원 배열로 변경 '.reshape(m, n)'

 

    ·  arrange()를 이용해 생성한 1차원 배열에 reshape(m, n)을 추가하면 m 행  n 열의 2차원 배열(행렬)로 변경
    ·  주의할 점은 arange()로 생성되는 배열의 원소 개수와 reshape(m, n)의 m * n 의 개수와 같아야

a4 = np.arange(12).reshape(4, 3)
print(a4)
# [[ 0  1  2]
#  [ 3  4  5]
#  [ 6  7  8]
#  [ 9 10 11]]

 


 

④  배열의 형태  '.shape'

# NumPy 배열의 형태를 알기 위헤서는 'ndarray.shape'를 실행
print(a4.shape)  # (4, 3)

# 1차원 배열의 경우 '(n, )'처럼 표시
print(a1.shape)  # (5,)

 


 

범위의 시작과 끝, 데이터 개수 지정하여 배열 생성  'np.linspace()'

# 기본 형식
arr_obj = np.linspace(start, stop[, num])
# linspace()는 start부터 stop까지 num개의 배열을 같은 간격으로 생성. 
# num을 지정하지 않으면 50이 기본값.

 

a1 = np.linspace(1, 10, 10)
print(a1)  # [ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10.]

a2 = np.linspace(1, 10, 4)
print(a2)  # [ 1.  4.  7. 10.]

# 0부터 파이까지 동일한 간격으로 20개를 나눈 배열 생성
a3 = np.linspace(0, np.pi, 20)
print(a3)
# [0.         0.16534698 0.33069396 0.49604095 0.66138793 0.82673491
#  0.99208189 1.15742887 1.32277585 1.48812284 1.65346982 1.8188168
#  1.98416378 2.14951076 2.31485774 2.48020473 2.64555171 2.81089869
#  2.97624567 3.14159265]

 


2)  특별한 형태의 배열 생성

👾  모든 원소가 0 혹은 1인 다차원 배열을 만들기 위해서는 'zeros()'와 'ones()'를 이용

a1 = np.zeros(10)
print(a1)  # [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

# 3 * 4의 2차원 배열을 생성
a2 = np.zeros((3, 4))
print(a2)
# [[0. 0. 0. 0.]
#  [0. 0. 0. 0.]
#  [0. 0. 0. 0.]]

a3 = np.ones(5)
print(a3)  # [1. 1. 1. 1. 1.]

 


 

3)  배열의 데이터 타입 변환

👾  배열은 숫자뿐만 아니라 문자열도 원소로 가질 수 있음

# 문자열이 원소인 배열 생성 예
a1 = np.array(['1.5', '0.62', '2', '3.14', '3.141592'])
print(a1)  # ['1.5' '0.62' '2' '3.14' '3.141592']
print(a1.dtype)  # <U8. 데이터 형식이 유니코드이며 문자의 수는 최대 8개라는 의미

 


 

4)  NumPy 데이터의 형식

b 불. bool
기호가 있는 정수. (signed) integer
u 기호가 없는 정수. unsigned integer
f 실수. floating-point
c 복소수. complex-floating point
M 날짜. datetime
O 파이썬 객체. (Python) objects
S or a 바이트 문자열. (byte) string
U 유니코드. Unicode


👾  배열이 문자열(숫자 표시)로 돼 있다면 연산을 위해서는 문자열을 숫자(정수나 실수)로 변환해야 함
👾  형 변환은 astype()로 가능

num_arr = str_arr.astype(dtype)
# 실수가 입력된 문자열을 원소로 갖는 배열을 실수 타입으로 변환하는 예.
str_a1 = np.array(['1.567', '0.123', '5.123', '9', '8'])
num_a1 = str_a1.astype(float)
print(num_a1)  # [1.567 0.123 5.123 9.    8.   ]
print(str_a1.dtype)  # <U5
print(num_a1.dtype)  # float64

# 정수를 문자열 원소로 갖는 배열을 정수로 변환하는 예.
str_a2 = np.array(['1', '3', '5', '7', '9'])
num_a2 = str_a2.astype(int)
print(str_a2.dtype)  # <U1
print(num_a2)  # [1 3 5 7 9]
print(num_a2.dtype)  # int64

 


 

5) 난수 배열의 생성

👾  rand() 함수를 이용하면 실수 난수를 요소로 갖는 배열을 생성
👾  randint() 함수를 이용하면 정수 난수를 요소로 갖는 배열을 생성

rand_num = np.random.rand([d0, d1, ..., dn])
rand_num = np.random.randint([low,] high [, size])

 

    📌  rand() 함수는 [0, 1) 사이의 실수 난수를 갖는 배열을 생성
            ▶️  [a, b)의 표현은 배열 크기
    📌  randint() 함수는 [low, high) 사이의 정수 난수를 갖는 배열을 생성
            ▶️ size는 배열의 형태 지정
            ▶️ low를 입력하지 않으면 0으로 간주
            ▶️ size를 입력하지 않으면 1로 간주

 

a1 = np.random.rand(2, 3)
print(a1)
# [[0.4980917  0.8726201  0.73129453]
#  [0.0029339  0.16124396 0.4579657 ]]

a2 = np.random.rand()
print(a2)  # 0.9081515820816426

a3 = np.random.rand(2, 3, 4)
print(a3)
# [[[0.03399706 0.84441171 0.17392205 0.09881563]
#   [0.98804228 0.5106279  0.49711395 0.34850446]
#   [0.12695874 0.70715927 0.08024678 0.58860936]]
#
#  [[0.02316629 0.75390742 0.09401929 0.56745535]
#   [0.10507769 0.53669669 0.35367215 0.1756888 ]
#   [0.02745259 0.90007949 0.42169534 0.46447165]]]

a4 = np.random.randint(10, size=(3, 4))
print(a4)
# [[9 9 5 6]
#  [3 3 5 5]
#  [9 3 5 3]]

a5 = np.random.randint(1, 30)
print(a5)  # 23

a6 = np.random.randint(1, 30, 3)
print(a6) # [ 3 19 17]

 

 

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]

+ Recent posts