s = pd.Series([4, 7, -5, 3])
s

s.values

type(s.values)

s.index

type(s.index)

"""
Explanation: pandas 패키지의 소개
pandas 패키지


Index를 가진 자료형인 R의 data.frame 자료형을 Python에서 구현


참고 자료

http://pandas.pydata.org/
http://pandas.pydata.org/pandas-docs/stable/10min.html
http://pandas.pydata.org/pandas-docs/stable/tutorials.html

pandas 자료형

Series
시계열 데이터

Index를 가지는 1차원 NumPy Array


DataFrame

복수 필드 시계열 데이터 또는 테이블 데이터

Index를 가지는 2차원 NumPy Array


Index

Label: 각각의 Row/Column에 대한 이름 
Name: 인덱스 자체에 대한 이름

<img src="https://docs.google.com/drawings/d/12FKb94RlpNp7hZNndpnLxmdMJn3FoLfGwkUAh33OmOw/pub?w=602&h=446" style="width:60%; margin:0 auto 0 auto;">
Series


Row Index를 가지는 자료열


생성

추가/삭제
Indexing

명시적인 Index를 가지지 않는 Series
End of explanation
"""


s * 2

np.exp(s)

"""
Explanation: Vectorized Operation
End of explanation
"""


s2 = pd.Series([4, 7, -5, 3], index=["d", "b", "a", "c"])
s2

s2.index

"""
Explanation: 명시적인 Index를 가지는 Series

생성시 index 인수로 Index 지정
Index 원소는 각 데이터에 대한 key 역할을 하는 Label
dict
End of explanation
"""


s2['a']

s2["b":"c"]

s2[['a', 'b']]

"""
Explanation: Series Indexing 1: Label Indexing

Single Label
Label Slicing
마지막 원소 포함
Label을 원소로 가지는 Label (Label을 사용한 List Fancy Indexing)
주어진 순서대로 재배열
End of explanation
"""


s2[2]

s2[1:4]

s2[[2, 1]]

s2[s2 > 0]

"""
Explanation: Series Indexing 2: Integer Indexing

Single Integer
Integer Slicing
마지막 원소를 포함하지 않는 일반적인 Slicing
Integer List Indexing (List Fancy Indexing)
Boolearn Fancy Indexing
End of explanation
"""


"a" in s2, "e" in s2

for k, v in s2.iteritems():
    print(k, v)

s2["d":"a"]

"""
Explanation: dict 연산
End of explanation
"""


sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
s3 = pd.Series(sdata)
s3

states = ['California', 'Ohio', 'Oregon', 'Texas']
s4 = pd.Series(sdata, index=states)
s4

pd.isnull(s4)

pd.notnull(s4)

s4.isnull()

s4.notnull()

"""
Explanation: dict 데이터를 이용한 Series 생성

별도의 index를 지정하면 지정한 자료만으로 생성
End of explanation
"""


print(s3.values, s4.values)
s3.values + s4.values

s3 + s4

"""
Explanation: Index 기준 연산
End of explanation
"""


s4

s4.name = "population"
s4

s4.index.name = "state"
s4

"""
Explanation: Index 이름
End of explanation
"""


s

s.index

s.index = ['Bob', 'Steve', 'Jeff', 'Ryan']
s

s.index

"""
Explanation: Index 변경
End of explanation
"""


data = {
    'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
    'year': [2000, 2001, 2002, 2001, 2002],
    'pop': [1.5, 1.7, 3.6, 2.4, 2.9]
}
df = pd.DataFrame(data)
df

pd.DataFrame(data, columns=['year', 'state', 'pop'])

df.dtypes

"""
Explanation: DataFrame

Multi-Series
동일한 Row 인덱스를 사용하는 복수 Series

Series를 value로 가지는 dict


2차원 행렬


DataFrame을 행렬로 생각하면 각 Series는 행렬의 Column의 역할


NumPy Array와 차이점 


각 Column(Series)마다 type이 달라도 된다.


Column Index

(Row) Index와  Column Index를 가진다.
각 Column(Series)에 Label 지정 가능
(Row) Index와 Column Label을 동시에 사용하여 자료 접근 가능
End of explanation
"""


df2 = pd.DataFrame(data, 
                   columns=['year', 'state', 'pop', 'debt'],
                   index=['one', 'two', 'three', 'four', 'five'])
df2

"""
Explanation: 명시적인 Column/Row Index를 가지는 DataFrame
End of explanation
"""


df["state"]

type(df["state"])

df.state

"""
Explanation: Single Column Access
End of explanation
"""


df2['debt'] = 16.5
df2

df2['debt'] = np.arange(5)
df2

df2['debt'] = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
df2

"""
Explanation: Cloumn Data Update
End of explanation
"""


df2['eastern'] = df2.state == 'Ohio'
df2

"""
Explanation: Add Column
End of explanation
"""


del df2['eastern']
df2

"""
Explanation: Delete Column
End of explanation
"""


x = [3, 6, 1, 4]
sorted(x)

x

x.sort()
x

"""
Explanation: inplace 옵션

함수/메소드는 두 가지 종류
그 객체 자체를 변형

해당 객체는 그대로 두고 변형된 새로운 객체를 출력


DataFrame 메소드 대부분은 inplace 옵션을 가짐

inplace=True이면 출력을 None으로 하고 객체 자체를 변형
inplace=False이면 객체 자체는 보존하고 변형된 새로운 객체를 출력
End of explanation
"""


s = pd.Series(np.arange(5.), index=['a', 'b', 'c', 'd', 'e'])
s

s2 = s.drop('c')
s2

s

s.drop(["b", "c"])

df = pd.DataFrame(np.arange(16).reshape((4, 4)),
                   index=['Ohio', 'Colorado', 'Utah', 'New York'],
                   columns=['one', 'two', 'three', 'four'])
df

df.drop(['Colorado', 'Ohio'])

df.drop('two', axis=1)

df.drop(['two', 'four'], axis=1)

"""
Explanation: drop 메소드를 사용한 Row/Column 삭제

del 함수 
inplace 연산
drop 메소드 
삭제된 Series/DataFrame 출력
Series는 Row 삭제
DataFrame은 axis 인수로 Row/Column 선택
axis=0(디폴트): Row
axis=1: Column
End of explanation
"""


pop = {
    'Nevada': {
        2001: 2.4, 
        2002: 2.9
    },
    'Ohio': {
        2000: 1.5, 
        2001: 1.7, 
        2002: 3.6
    }
}


df3 = pd.DataFrame(pop)
df3

"""
Explanation: Nested dict를 사용한 DataFrame 생성
End of explanation
"""


pdata = {
    'Ohio': df3['Ohio'][:-1],
    'Nevada': df3['Nevada'][:2]
}
pd.DataFrame(pdata)

"""
Explanation: Series dict를 사용한 DataFrame 생성
End of explanation
"""


df3.values

df2.values

"""
Explanation: NumPy array로 변환
End of explanation
"""


df2

df2["year"]

df2.year

df2[["state", "debt", "year"]]

df2[["year"]]

"""
Explanation: DataFrame의 Column Indexing

Single Label key
Single Label attribute
Label List Fancy Indexing
End of explanation
"""


