반응형

Apache Spark

Spark란?

: 인 메모리 형의 고속 데이터 처리

대량의 메모리를 활용하여 고속화 실현이 가능하다. Spark는 *Hadoop을 대체하는 것이 아니라 Hadoop의 구성 요소 중 분산 데이터 처리에 사용되는 **MapReduce를 대체하는 존재다. (Hadoop과는 다른 독립된 프로젝트이다.)

Spark는 스크립트 언어(JAVA, Scala, Python, R)를 사용할 수 있다는 장점이 있다.

*Hadoop: 대표적인 빅데이터 처리 시스템으로 분산된 다수의 컴퓨터에서 대량의 데이터를 처리하기 위한 시스템

**MapReduce: 대량의 데이터를 배치 처리하기 위한 시스템 (Map과 Reduce 기능으로 구성)

 

 

Pandas DataFrame vs Spark DataFrame

Pandas DataFrame

numpy ndarray를 기반으로 데이터 분석을 쉽고 빠르게 처리하기 위해 많이 사용되고 있다. 병렬 처리가 안된다.

이전 포스팅) 현업에서 많이 사용하는 Python 모듈 | Pandas 참고

 

현업에서 많이 사용하는 Python 모듈 | Pandas (Series, DataFrame)

안녕하세요~ "현업에서 많이 사용하고 있는 Python 모듈 마스터하기!" 라는 시리즈를 포스팅하려고 합니다. 그 중 첫 번째편은 바로 Pandas 입니다! Pandas의 DataFrame의 형태가 데이터베이스의 테이블

everyday-deeplearning.tistory.com

 

Spark DataFrame

a.k.a SQL의 탈을 쓴 DataFrame

Spark는 SQL과 유사한 형태의 연산을 지원하는 API로 구성되어 있다.

병렬 CPU처리 및 분산 서버 데이터 처리가 가능하다.

Spark DataFrame의 경우 Pandas DataFrame과 달리 대부분 새로운 DataFrame 객체를 반환하는 형태로 구성되어있다.

 

예시)

table

gender age
M 31
F 27
M  
F 32

Query

SQL Pandas DataFrame Spark DataFrame
Select gender From table table['gender'] table.select('gender')
Select * From table Where gender='F' table[lambda x: x['gender'] == 'F'] table.filter(F.col('gender') == 'F')
Update age=age+1 From table table['age'] = table['age'].apply(lambda x: x+1) table.withColumn('age', F.col('age') + 1)
Select gender, count(*) From table Group By gender table.groupby('gender')['gender'].count().reset_index() table.groupBy('gender').count()

 

두 DataFrames간 변환이 가능하다.

spark_df = spark.createDataFrame(pandas_df)
pandas_df = spark.select('*').toPandas()

 

반응형
반응형

안녕하세요~



"현업에서 많이 사용하고 있는 Python 모듈 마스터하기!"


라는 시리즈를 포스팅하려고 합니다.



그 중 첫 번째편은 바로 Pandas 입니다!




Pandas의 DataFrame의 형태가 데이터베이스의 테이블과 유사하기 때문에 많이 사용되지 않을까요? :)


즉, Feature 엔지니어링 하여 데이터 분석을 할 때 유용합니다!



1. Series


그렇다면, 먼저 Pandas의 기본 자료구조인 Series에 대해 알아보겠습니다.



Series = value(값) + Index(인덱스)


Series는 1차원 배열과 같은 구조로 동일한 자료형만 담을 수 있습니다.




예) Series 생성

import pandas as pd


s = pd.Series([172, 160, 174, 183], index=["지수", "으니", "덕", "운동"])


# 딕셔너리 개체로 시리즈를 생성할 수 있다.

s2 = pd.Series({"지수": 172, "으니": 160, "덕": 174, "운동": 183})


# 순서를 정하고 싶다면 인덱스를 지정해야한다.

s3 = pd.Series({"지수": 172, "으니": 160, "덕": 174, "운동": 183}, index=["지수","으니","덕","운동"])

결과)



예2) Series 인덱싱

s["으니":"덕"]


# 위와 같은 결과

s[1:3]


# Series[conditions]: conditions 부분에 논리연산이 올 수 있다

s[(160 == s) | (174 == s)]

결과)



예3) Series 특징


시리즈 객체는 라벨 값에 의해 인덱싱이 가능하므로 딕셔너리 자료형과 같다고 할 수 있다.


# items(): dictionary method인 items함수는 key와 value의 쌍을 튜플로 묶은 값을 dict_items 객체로 돌려준다.

for k, v in s.items():

print("%s's 키는 %d cm 입니다." % (k,v))



예4) 데이터 갱신, 추가, 삭제

# 갱신

s["으니"] = 161


# 추가

s["다래"] = 179


# 삭제

del s["운동"]

결과) 갱신


결과) 추가


결과) 삭제




2. DataFrame


Series가 복수개 합쳐진 것

서로 다른 종류의 데이터 타입을 가질 수 있으며,

행렬의 열, 행에 인덱스 값을 부여한 것과 같습니다.



예) DataFrame 생성

import pandas as pd


data = {

"키": [172, 160, 174, 183],

"나이": [25, 24, 27, 26],

"성별" : ['F', 'F', 'M', 'M']

}

columns = ["키", "나이", "성별"]

index = ["지수", "으니", "덕", "운동"]

df = pd.DataFrame(data, index=index, columns=columns)

df.index.name = "이름"

결과)



예2) DataFrame 인덱싱

# 열 인덱싱

df["키"]


# 행 인덱싱1

df["으니":"덕"]


# 행 인덱싱2: 행단위로 인덱싱을 하고자 하면 항상 슬라이싱을 해야한다 df[1:3]


# .iloc[] 을 이용한 인덱싱: 행단위로 인덱싱 (without 슬라이싱) df.iloc[1]


# .loc[condition] 을 이용한 인덱싱

df.loc[df["키"] <= 160]

결과) 열 인덱싱


결과) 행 인덱싱




예3) Transpose

df.T # 대부분의 np 2차원 배열이 가지는 속성/메소드를 지원한다.

결과)



예4) 갱신, 삽입, 삭제

# 갱신

df.loc["으니","키"] = 161

# df["키"].loc["으니"] = 161 # warning


# 열 삽입1

df["학과"] = ["경영","경영정보","경영정보","도시 부동산"]


# 열 삽입2

df["학과"] = pd.Series(["경영","경영정보","경영정보","도시 부동산"], index=["지수","으니","덕","운동"])


# 행 삽입1

df.loc["다래"] = {"키": 179, "나이": 24, "성별": "F", "학과": "응급의학과"}


# 행 삽입2

df.loc["다래"] = pd.Series([179, 'F', '응급의학과'], index=["키","성별","학과"]) # 나이: NaN 발생


# 삭제: del, drop 키워드를 사용하면 열을 삭제할 수 있다.

결과) 갱신


결과) 열 삽입


결과) 행 삽입



예5) DataFrame 변형

df1 = pd.DataFrame({"키":[161,179], "이름":["으니","다래"], "나이":[24,24], "학과": ["경영정보","응급의학"]}, \

columns=["키","이름","학과"]) df2 = pd.DataFrame({"학과":["경영","경영정보","도시부동산"], "학과번호":[201,202,203]}, columns=["학과","학과번호"])


# merge()

df = pd.merge(df1,df2,on="학과") # inner join과 같은 결과, on : 기준 key 값

df = pd.merge(df1,df2, how='left') # left: df1 | right: df2 의 키값을 모두 보여준다

df = pd.merge(df1,df2, how='outer') # 키값이 한쪽에만 있어도 데이터를 보여준다.


# concat()

df1 = pd.DataFrame({"키":161, "이름":"으니", "나이":24, "학과": "경영정보"}, columns=["키","이름","학과"], \

index = [0]) df2 = pd.DataFrame({"키":[174,183], "이름":["덕","운동"], "나이":[27,26], "학과": ["경영정보","도시부동산"]}, \

columns=["키","이름","학과"], index = [1,2])

df = pd.concat([df1,df2], ignore_index=True)

결과) merge()


결과) concat()



※참고: merge()와 concat()의 차이점


.merge()는 두 데이터 프레임의 공통 열 또는 인덱스를 기준으로 두 테이블을 합친다.


이때 기준이 되는 열, 행의 데이터를 키(key)라고 한다.

(join을 사용할 수 있다)

 


.concat() 은 기준 열을 사용하지 않고 단순히 데이터를 연결(concatenate)한다.


출처: 데이터 사이언스 스쿨




3. Pandas 함수



예1) 데이터 분석용 함수

# sum, min, mean, var, ...

df[["키","나이"]].sum(axis=0) # axis = 0 : 행 | 1: 열


# corr(상관관계), cov(공분산) : 머신러닝에서 많이 사용되는 함수



예2) Na 처리하기

# Na값 대체하기 (최소값, 평균, 최대값,...)

age_min = df["나이"].min()

df["나이"] = df["나이"].fillna(value=age_min)


# Na값 제거하기

df=df.dropna(axis=0)



예3) 유용한 함수

# unique: 특정열을 중복없는 열로 만들어줌


# isin : 특정값 포함여부에 따른 Boolean 생성


# sort_index: 인덱스기반 정렬

df.sort_index(axis=0, ascending=False, by="키") # ascending=False 내림차순으로 정렬, by: 특정 열을 기준


# duplicated : 중복행 조회



추가)


pandas 데이터 타입은 총 3가지로


위에서 다룬


Series, DataFrame 이외에도


Panel(판넬)이라는 데이터 타입도 존재합니다. ( 단, Deprecated since version 0.20.0 )



오늘은 여기까지~


pandas가 손에 익으면 SQL보다 편하다네요~


여기서는 다루지 않았지만 pandas를 이용하여 다양한 방법으로 데이터를 로드할 수 있답니다!


csv, excel 등의 파일에서 데이터를 로드하는 부분은 제 이전의 포스팅을 보시면 굉장히 자주 등장합니다!



참고) numpy와 matplotlib은 이전 포스팅에서 다뤘답니다!


딥러닝에 필요한 파이썬 기본문법 | numpy & matplotlib



"백문이 불여일타!!"

반응형

+ Recent posts