함수형으로 데이터 과학 #3 : 입력한 데이터를 집약하는 ①

14474 단어 ElixirPhoenix
(이 기사는 「fukuoka.ex x 자키켄 Advent Calendar 2017」의 14 일째입니다)

어제는 @ 코바타코GraphQL for Elixir # 2 요청 및 응답 값을 생각해보십시오.이었습니다.

fukuoka.ex 대표의 piacere 입니다
이번에도 방문해 주셔서 감사합니다

이 연재의, 전회까지의 기사는, 이하가 됩니다
 |> 함수형으로 데이터 과학 #1: 다양한 데이터 입력
 |> 함수형으로 데이터 과학 #2: 입력된 데이터 변환

이번에는, 「데이터 전처리」의 계속으로서 「인풋 한 데이터의 집계」에 대해 해설합니다

Elixir의 Enum 중에서는 다소 다루기 어려운 Enum.group_by()를 SQL의 GROUP BY와 같이 사용하는 샘플로도 활용할 수 있는 칼럼입니다.

샘플 데이터 등은 지난번 과 같은 것을 사용합니다

이제 Phoenix 서버를 시작하고 브라우저에서 "http://localhost:4000"의 웹 페이지를 볼 수 있다면 다음을 시도해 봅시다.

답례:6/22의 fukuoka.ex#11, 덕분에 분위기가 고조되었습니다

fukuoka.ex 설립으로부터 1주년 기념이 되는, fukuoka.ex#11 「DB/데이터 사이언스에 커넥트 하는 Elixir」



데이터 집계



데이터 집계로는 다음이 인기입니다.
  • 그룹화
  • 카운트
  • 합계
  • 최대값
  • 최소값
  • 평균값
  • 중앙값
  • 백분위 타일
  • 분산값
  • 표준 편차
  • 최빈값

  • 그룹화



    동일한 키 값을 가진 데이터를 나열하려면 먼저 Enum.group_by()에서 "키 값"과 "데이터 목록"형식으로 그룹화하고 키 값과 데이터 목록 각각에 열 이름을 다시 지정하는 작업 합니다

    lib/sample_db_web/templates/page/index.html.eex
    
    datas = result
      |> Enum.group_by( &( &1[ "Profession" ] ), &( &1[ "ApplicantIncome" ] ) ) 
      |> Enum.map( &( 
        %{ "Profession" => elem( &1, 0 ), "ApplicantIncome" => elem( &1, 1 ) |> Lst.to_csv } ) )
    
    

    카운트



    카운트는, 그룹핑 후의 키 값과 데이터 리스트의 각각에 열명을 다시 붙일 때, 데이터 리스트에 Enum.count() 하는 것으로 취득할 수 있습니다

    lib/sample_db_web/templates/page/index.html.eex
    
    datas = result
      |> Enum.group_by( &( &1[ "Profession" ] ), &( &1[ "ApplicantIncome" ] ) ) 
      |> Enum.map( &( 
        %{ "Profession" => elem( &1, 0 ), "ApplicantIncome" => elem( &1, 1 ) |> Enum.count } ) )
    

    합계



    합계는, 그룹핑 후의 키치와 데이터 리스트의 각각에 열명을 재붙이는 조작시, 데이터 리스트를 Enum.reduce()로 더해 가면 취득할 수 있습니다

    lib/sample_db_web/templates/page/index.html.eex
    
    datas = result
      |> Enum.group_by( &( &1[ "Profession" ] ), &( &1[ "ApplicantIncome" ] ) ) 
      |> Enum.map( &( 
        %{ "Profession" => elem( &1, 0 ), "ApplicantIncome" => elem( &1, 1 ) 
          |> Enum.reduce( 0, fn( n, acc ) -> acc + String.to_integer( n ) end ) } ) )
    
    

    최대값・최소값



    최대치·최소치는, 그룹핑 후의 키값과 데이터 리스트의 각각에 열명을 다시 붙이는 조작시, 데이터 리스트에 Enum.max() 혹은 Enum.max()를 실시하는 것으로 취득할 수 있습니다

    lib/sample_db_web/templates/page/index.html.eex
    
    datas = result
      |> Enum.group_by( &( &1[ "Profession" ] ), &( &1[ "ApplicantIncome" ] ) ) 
      |> Enum.map( &( 
        %{ "Profession" => elem( &1, 0 ), "ApplicantIncome" => elem( &1, 1 ) 
          |> Enum.map( fn( n ) -> String.to_integer( n ) end ) |> Enum.max } ) )
    
    

    lib/sample_db_web/templates/page/index.html.eex
    
    datas = result
      |> Enum.group_by( &( &1[ "Profession" ] ), &( &1[ "ApplicantIncome" ] ) ) 
      |> Enum.map( &( 
        %{ "Profession" => elem( &1, 0 ), "ApplicantIncome" => elem( &1, 1 ) 
          |> Enum.map( fn( n ) -> String.to_integer( n ) end ) |> Enum.min} ) )
    
    

    평균값, 중앙값, 백분위수, 분산 값, 표준 편차, 최빈값



    이러한 통계계는, Elixir의 Enum가, 표준으로 계산하는 기능을 갖고 있지 않기 때문에, 다음 번, 자전에서 함수를 만들면서, 대응해 보겠습니다



    이번에는 '데이터 전처리'에 이어 '입력 한 데이터 집계'의 전반에 대해 다루었습니다.

    다음 번에는 '입력한 데이터 집계' 후반

    내일은 @yukq16 님의 「2차원 리스트 가산 함수」입니다

    p.s.「좋아요」 잘 부탁드립니다



    원한다면 페이지 왼쪽 상단의 또는 을 클릭하십시오.
    여기의 숫자가 늘어나면, 필자로서는 「우케하고 있다」라고 하는 감각을 얻을 수 있어 연재를 더욱 진화시켜 나가는 동기 부여가 되기 때문에, 보다 Elixir 재료를 보고 싶다고 하는 당신, 우리와 함께 북돋워 제발!

    좋은 웹페이지 즐겨찾기