☐ Python pandas 소개 ○ pandas는 열(column)을 기준으로 하는 입력 데이터 분석용 API이다. ○ 주요 내용 - DataFrame 및 Series에 대한 소개 - DataFrame 및 Series에 대한 액세스 및 데이터 수정 - DataFrame으로 CSV 데이터 가져 오기 - DataFrame re-indexing을 통한 데이터 섞기 ○ 기본 개념 - pandas API를 가져와서 버전 출력하기 from __future__ import print_function import pandas as pd pd.__version__ |
- pandas를 구성하는 두 개의 클래스 (객체를 정의해 놓은 설계도) ① Series: DataFrame을 구성하는 각 열(헤더 포함) ② DataFrame: 행과 열(헤더 포함)로 이루어진 관계형 데이터 테이블 · DataFrame은 한 개 이상의 Series를 가진다. - Series 객체를 통한 Series 생성 pd.Series(['San Francisco', 'San Jose', 'Sacramento']) |
- DataFrame 객체를 통한 DataFrame 생성 · dict 명(각 열의 헤더로 사용됨)으로 Series를 생성해서 DataFrame 객체에 전달 · 퀴즈) 아래 코드에서 dict는? city_names, population city_names = pd.Series(['San Francisco', 'San Jose', 'Sacramento']) population = pd.Series([852469, 1015785, 485199]) pd.DataFrame({ 'City name': city_names, 'Population': population }) |
- ML에서는 데이터 파일을 DataFrame으로 불러오는 방식을 주로 사용한다. california_housing_dataframe = pd.read_csv("F:\AI\tmp\california_housing_train.csv", sep=",") california_housing_dataframe.describe() |
· DataFrame.describe는 DataFrame에 대한 통계를 보여준다. · DataFrame.head는 상단 레코드 몇 개(기본은 5개)를 보여준다. california_housing_dataframe.head() |
· DataFrame.hist는 특정 열의 분포를 그래프로 보여준다. import matplotlib.pyplot as plt california_housing_dataframe.hist('housing_median_age') plt.show() |
○ 데이터 액세스 - dict/list operations을 이용해 데이터에 액세스를 한다. cities = pd.DataFrame({ 'City name': city_names, 'Population': population }) print(type(cities['City name'])) cities['City name'] |
print(type(cities['City name'][1])) cities['City name'][1] |
print(type(cities[0:2])) cities[0:2] |
○ 데이터 수정 - Series에 대하여 python이 지원하는 기본적인 연산을 수행할 수 있다. - numpy는 과학적인 연산에 유용한 도구이다. · pandas Series는 대부분의 numpy 함수에 인수로 사용할 수 있다. import numpy as np np.log(population) |
- 더 복잡한 단일 열 변환에는 Series.apply를 사용할 수 있다. Python의 map 함수처럼 Series.apply는 lambda 함수를 인수로 사용할 수 있다. · lambda 함수는 함수 명을 정하지 않고 사용하기에 익명함수라고도 한다. 1회성 함수 구현 시 유용하다. - 아래에서는 인구가 백만 명을 초과하는지 나타내는 새 Series를 만든다. population.apply(lambda val: val > 1000000) |
- DataFrames 수정은 직관적으로 수행할 수 있다. - 다음 코드는 DataFrame에 두 개의 Series를 추가한다. cities['Area square miles'] = pd.Series([46.87, 176.53, 97.92]) cities['Population density'] = cities['Population'] / cities['Area square miles'] cities |
○ indexes - Series와 DataFrame을 생성할 때 python은 Series의 각 항목과 DataFrame의 각 행에 index 속성을 할당한다. 이 값들은 향후 데이터의 순서가 바뀌더라도 변하지 않는다. city_names.index # RangeIndex(start=0, stop=3, step=1) |
cities.index # RangeIndex(start=0, stop=3, step=1) |
- DataFrame.reindex를 호출하여 수동으로 행의 순서를 다시 정렬한다. 아래는 city name을 기준으로 정렬시키는 것과 효과가 같다. cities.reindex([2, 0, 1]) |
- reindexing은 DataFrame을 임의로 섞기에 유용한 방법이다. 아래는 먼저 index를 numpy의 random.permutation 함수에 전달하여 섞은 후 reindex를 호출하면 DataFrame 행들도 같은 순서로 섞인다. 코드를 여러 번 실행해 결과를 확인한다. cities.reindex(np.random.permutation(cities.index)) |
○ 참고사항 - single quotes(‘)와 double quotes(“)는 차이가 없다. - 단일 column을 선택할 때, []은 Series를 반환하고 [[]]은 DataFrame을 반환한다. 따라서 두 개 이상의 columns을 선택할 때는 열 리스트이므로 [[]]을 사용해야 한다. - curly {} brackets: · dictionaries 또는 sets에 사용 - square [] brackets: · lists (변경가능)에 사용: list = [ 1, 2, 3 ] · array indexing: ages[3] = 29 - round () brackets: · tuples (변경 불가능)에 사용: retval = ( x, y, z ) · operator precedence: result = (x + y) * z · class/function 정의 또는 호출: def func(x, y) or func(3,7) type({}) # <class 'dict'> type({1, 2}) # <class 'set'> type([]) # <class 'list'> type({1: 2}) # <class 'dict'> type([1, 2]) # <class 'list'> |
- 함수(function)와 메서드(method)의 차이 · 함수: function_name(input) 형태, 즉, print(), type() 등과 같음 · 메소드: object.method_name( ) 형태, 즉, list.append(...), list.extend(...) 등과 같음 · 메소드는 함수와 거의 유사하지만, 반드시 객체(object)와 함께 한다. - WARNING: The TensorFlow contrib module will not be included in TensorFlow 2.0.
· tf.contrib.estimator.clip_gradients_by_norm는 다른 방식으로 구현되어야 한다. |