본문 바로가기
통계프로그램 비교 시리즈/프로그래밍비교(Oracle,Python,R,SAS)

[데이터 필터링 - 비상관 서브쿼리(Uncorrelated Subqueyr) 를 만족하는 데이터 추출 - 비교연산자] 테이블 데이터 전처리 비교 - 59

by 기서무나구물 2021. 8. 20.

포스팅 목차

    59. Display the employee names who are working in Chicago.

     

    * 시카고에서 근무하고 있는 직원의 정보를 출력하시오.


    • Oracle : 비상관 서브쿼리
    • 파이썬 Pandas : iloc[], type()
    • R 프로그래밍 : class()
    • R Dplyr Package : filter(), pull()
    • R sqldf Package : 비상관 서브쿼리
    • Python pandasql Package : 비상관 서브쿼리
    • R data.table Package : class()
    • SAS Proc SQL : 비상관 서브쿼리
    • SAS Data Step : 내부조인(Inner join), IF 조건문
    • Python Dfply Package : filter_by(), pipe (사용자정의 함수) - pull_fun
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    서브쿼리로 dept 테이블에서 시카고에 위치한 부서의 부서 번호를 선택 후 emp 테이블에서 시카고에 위치한 부서에서 근무하는 직원의 정보를 출력한다.

    Oracle Programming
    select ename 
    from   emp 
    where  deptno = (select deptno from dept where loc='CHICAGO');

     


    2. Python Pandas(파이썬)

     

    Python Programming
    print( type( dept[dept['loc'] == 'CHICAGO']['deptno'] ) )
    print( type( dept[dept['loc'] == 'CHICAGO']['deptno'].iloc[0] ) )

     

    <class 'pandas.core.series.Series'>
    <class 'numpy.int64'>

     


    dept 테이블에서 부서 위치가 시카고에 위치한 부서의 부서 번호를 선택하여서 emp 테이블에서 dept 테이블에서 선택된 부서 번호에 해당하는 부서를 선택한다.

    Python Programming
    emp[emp['deptno']== dept[dept['loc'] == 'CHICAGO']['deptno'].iloc[0] ]

     

    Results
      empno ename job mgr hiredate sal comm deptno
    1 7499 ALLEN SALESMAN 7698.0 1981/02/20 1600 300.0 30
    2 7521 WARD SALESMAN 7698.0 1981/02/22 1250 500.0 30
    4 7654 MARTIN SALESMAN 7698.0 1981/09/28 1250 1400.0 30
    5 7698 BLAKE MANAGER 7839.0 1981/03/01 2850 NaN 30
    9 7844 TURNER SALESMAN 7698.0 1981/09/08 1500 0.0 30
    11 7900 JAMES CLERK 7698.0 1981/12/03 950 NaN 30

     


    3. R Programming (R Package)

     

    R Programming
    %%R
    
    print( class(dept[dept$loc == 'CHICAGO', c("deptno") ]) )
    
    print( class(dept[dept$loc == 'CHICAGO', c("deptno") ]$deptno) )

     

    Results
    [1] "tbl_df"     "tbl"        "data.frame"
    [1] "numeric"

     


    dept 테이블에서 부서 위치가 시카고에 위치한 부서의 부서 번호를 선택하여서 emp 테이블에서 dept 테이블에서 선택된 부서 번호에 해당하는 부서를 선택한다.

    R Programming
    %%R
    
    emp[emp$deptno == dept[dept$loc == 'CHICAGO', c("deptno") ]$deptno,"ename"]

     

    Results
    # A tibble: 6 x 1
      ename 
      <chr> 
    1 ALLEN 
    2 WARD  
    3 MARTIN
    4 BLAKE 
    5 TURNER
    6 JAMES 

     


    4. R Dplyr Package

    dept 테이블에서 부서 위치가 시카고에 위치한 부서의 부서 번호를 선택하여서 emp 테이블에서 dept 테이블에서 선택된 부서 번호에 해당하는 부서를 선택한다.

    filter 함수를 사용하여서 emp 테이블의 부서번호(deptno)가 dept 테이블에서 선택된 부서코드에 존재하는지 검색한다.

    R Programming
    %%R
    
    emp %>% dplyr::filter( deptno == ( dept %>%
                                         dplyr::filter(loc == "CHICAGO") %>%
                                         dplyr::select(deptno) %>%
                                         pull(deptno)) )

     

    Results
    # A tibble: 6 x 8
      empno ename  job        mgr hiredate     sal  comm deptno
      <dbl> <chr>  <chr>    <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7499 ALLEN  SALESMAN  7698 1981-02-20  1600   300     30
    2  7521 WARD   SALESMAN  7698 1981-02-22  1250   500     30
    3  7654 MARTIN SALESMAN  7698 1981-09-28  1250  1400     30
    4  7698 BLAKE  MANAGER   7839 1981-03-01  2850    NA     30
    5  7844 TURNER SALESMAN  7698 1981-09-08  1500     0     30
    6  7900 JAMES  CLERK     7698 1981-12-03   950    NA     30

     


    5. R sqldf Package

    서브쿼리로 dept 테이블에서 시카고에 위치한 부서의 부서 번호를 선택 후 emp 테이블에서 시카고에 위치한 부서에서 근무하는 직원의 정보를 출력한다.

    R Programming
    %%R
    sqldf(" Select ename 
            from   emp  
            where  deptno=(select deptno from dept where loc='CHICAGO')")

     

    Results
       ename
    1  ALLEN
    2   WARD
    3 MARTIN
    4  BLAKE
    5 TURNER
    6  JAMES

     


    6. Python pandasql Package

     

    Python Programming
    ps.sqldf("Select ename from emp  where deptno=(select deptno from dept where loc='CHICAGO')")

     

    Results
      ename
    0 ALLEN
    1 WARD
    2 MARTIN
    3 BLAKE
    4 TURNER
    5 JAMES

     


    7. R data.table Package

     

    R Programming
    %%R
    dept_DT <- data.table(dept)
    
    print( class( dept_DT[loc == "CHICAGO", .(deptno)] ) )
    
    print( class( dept_DT[loc == "CHICAGO", .(deptno)]$deptno ) )

     

    Results
    [1] "data.table" "data.frame"
    [1] "numeric"

     


    dept 테이블에서 시카고에 위치한 부서 번호를 테이블로 선택 후 emp 테이블과 내부조인(DT syntax)을 수행하여서 시카고에 위치한 부서에서 근무하는 직원의 정보를 출력한다.

    %%R
    DT <- data.table(emp)
    dept_DT <- data.table(dept)
    
    DT[DT[,deptno == ( dept_DT[loc == "CHICAGO", .(deptno)]$deptno )]]

     

    Results
       empno  ename      job  mgr   hiredate  sal comm deptno
    1:  7499  ALLEN SALESMAN 7698 1981-02-20 1600  300     30
    2:  7521   WARD SALESMAN 7698 1981-02-22 1250  500     30
    3:  7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400     30
    4:  7698  BLAKE  MANAGER 7839 1981-03-01 2850   NA     30
    5:  7844 TURNER SALESMAN 7698 1981-09-08 1500    0     30
    6:  7900  JAMES    CLERK 7698 1981-12-03  950   NA     30

     


    8. SAS Proc SQL

     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        select ename 
        from   emp 
        where  deptno = (select deptno from dept where loc='CHICAGO');
    QUIT;
    PROC PRINT;RUN;

     

    Results
    OBS ename
    1 ALLEN
    2 WARD
    3 MARTIN
    4 BLAKE
    5 TURNER
    6 JAMES

     


    9. SAS Data Step

     

    SAS Programming
    %%SAS sas
    
    PROC SORT DATA=EMP OUT=EMP_1;
         BY deptno;
    RUN;
    
    DATA STATSAS_3; 
     MERGE EMP_1(IN=A) dept(where=(loc='CHICAGO') IN=B);
         BY deptno;
         IF A AND B;
    RUN;
    
    PROC PRINT;RUN;

     

    Results
    OBS empno ename job mgr hiredate sal comm deptno dname loc
    1 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 SALES CHICAGO
    2 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30 SALES CHICAGO
    3 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 SALES CHICAGO
    4 7698 BLAKE MANAGER 7839 1981-03-01 2850 . 30 SALES CHICAGO
    5 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30 SALES CHICAGO
    6 7900 JAMES CLERK 7698 1981-12-03 950 . 30 SALES CHICAGO

     


    10. Python Dfply Package

    • X.loc 로 변수명 지정하는 경우 에러 발생
      • 에러문 : AttributeError: 'NotImplementedType' object has no attribute 'dtype'
      • 관련이슈 : https://github.com/kieferk/dfply/issues/65
      • 조치사항 : 1) 변수명 사전 변경하여 처리 2) X['loc'] 로 변수 지정하는 방법
    • loc 변수 Rename
    Python Programming
    # [참고] 함수 사용. (52번 예제 참고)
    @pipe
    def pull_fun(df, column=-1):
        return df.loc[:, column].item()
    
    # dept >> rename(loc_var ='loc') >> filter_by( X.loc_var  == "CHICAGO") >> select(X['deptno']) >> pull_fun("deptno")
    
    emp >> filter_by( X.deptno == ( dept >> rename(loc_var ='loc') >> filter_by( X.loc_var  == "CHICAGO") >> select(X['deptno']) >> pull_fun("deptno") ))

     

    Results
      empno ename job mgr hiredate sal comm deptno
    1 7499 ALLEN SALESMAN 7698.0 1981/02/20 1600 300.0 30
    2 7521 WARD SALESMAN 7698.0 1981/02/22 1250 500.0 30
    4 7654 MARTIN SALESMAN 7698.0 1981/09/28 1250 1400.0 30
    5 7698 BLAKE MANAGER 7839.0 1981/03/01 2850 NaN 30
    9 7844 TURNER SALESMAN 7698.0 1981/09/08 1500 0.0 30
    11 7900 JAMES CLERK 7698.0 1981/12/03 950 NaN 30

     


    • X['loc']로 변수 지정하는 방법
    Python Programming
    # [참고] 함수 사용. (52번 예제 참고)
    @pipe
    def pull_fun(df, column=-1):
        return df.loc[:, column].item()
    
    emp >> filter_by( X.deptno == ( dept >> filter_by( X['loc']  == "CHICAGO") >> select(X.deptno) >> pull_fun("deptno") ))

     

    Results
      empno ename job mgr hiredate sal comm deptno
    1 7499 ALLEN SALESMAN 7698.0 1981/02/20 1600 300.0 30
    2 7521 WARD SALESMAN 7698.0 1981/02/22 1250 500.0 30
    4 7654 MARTIN SALESMAN 7698.0 1981/09/28 1250 1400.0 30
    5 7698 BLAKE MANAGER 7839.0 1981/03/01 2850 NaN 30
    9 7844 TURNER SALESMAN 7698.0 1981/09/08 1500 0.0 30
    11 7900 JAMES CLERK 7698.0 1981/12/03 950 NaN 30

     


    [SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE] SQL EMP 예제로 만나는 테이블 데이터 처리 방법 리스트

     

    반응형

    댓글