• 티스토리 홈
  • 프로필사진
    홀쑥
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
홀쑥
  • 프로필사진
    홀쑥
    • 분류 전체보기 (55)
      • Language (14)
        • Java (1)
        • Python (13)
      • DataBase (4)
        • NoSQL (1)
        • RDBMS (3)
      • OS (12)
        • Linux (10)
      • Etc (5)
        • 오류 모음 (5)
      • hadoop ecosystem (9)
        • Hadoop (4)
        • Hive (2)
        • Sqoop (1)
        • Zeppelin (1)
      • Cloud Service (0)
      • ELK STACK (2)
        • ElasticSearch (2)
      • Airflow (0)
      • Infra (0)
        • Docker (0)
        • Kubernetes (0)
      • Algorithm & Data Structure (7)
        • 백준 알고리즘 (6)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • [Python] Polars의 데이터 타입과 구조
        2025년 04월 10일
        • 홀쑥
        • 작성자
        • 2025.04.10.:17

        Polars에서 Data Type과 Structure

        데이터 타입

        Polars는 다양한 데이터 타입을 지원하며 모든 결측값을 NaN이 아닌 null로 표현한다.

        숫자 데이터 타입

        • Signed Integers(부호가 있는 정수)
          • Int8, -128~127
          • Int16, -32768 ~ 32767
          • Int32, -2147483648 ~ 2147483647
          • Int64, -9223372036854775808 ~ 9223372036854775807
        • Unsigned Integers(부호가 없는 정수)
          • UInt8, 0 ~ 255
          • UInt16, 0 ~ 65535
          • UInt32, 0 ~ 4264967295
          • UInt64, 0 ~ 18446744073709551615
        • Floating point numbers(부동소수점)
          • Float32, 단정밀도
          • Float64, 배정밀도
        • decimals
          • 선택적 정밀도와 음수가 아닌 값을 표현하는 128-bit의 10진수로 Python의 decimal과 같음

        중첩 데이터 타입

        • List
          • 모든 요소의 데이터 타입이 같고 가변 길이의 1차원 리스트
        • Struct
          • Python의 Dictionary나 typing.TypedDict와 비슷하게 한 열에 여러 필드를 저장
        • Array
          • 고정된 길이를 가진, Numpy 배열과 유사한 배열

        시간에 관련된 데이터 타입

        • Date
          • 날짜를 표현
        • Datetime
          • 날짜와 시간을 표현
        • Time
          • 시간을 표현
        • Duration
          • 기간을 표현

        기타

        • String
          • 가변길이의 UTF-8 인코딩 된 문자열 데이터
        • Binary
          • 임의의 다양한 길이의 원시 바이너리 데이터
        • Boolean
          • boolean 타입
        • Categorical
          • 런타임에서 추론되는 문자열 분류들의 효율적이게 인코딩
        • Enum
          • 미리 정해진 문자열 분류 집합을 효율적이고 순서 있게 인코딩
        • Object
          • 임의의 Python 객체

        구조체

        Series

        Series는 모두 같은 데이터타입을 가진 1차원의 데이터 구조로 Polars는 값으로부터 데이터타입을 추론한다.

        특별한 데이터타입을 지정하는 것도 가능하다.

        import polars as pl
        
        s = pl.Series("ints", [1, 2, 3, 4, 5])
        print(s)

        print한 Series

        # dtype으로 데이터타입 선언
        s1 = pl.Series("ints", [1, 2, 3, 4, 5])
        s2 = pl.Series("uints", [1, 2, 3, 4, 5], dtype=pl.UInt64)
        print(s1.dtype, s2.dtype)

        dtype을 지정한 Series는 UInt로 변경

        DataFrame

        DataFrame은 고유한 이름을 가진 Series들이 포함된 데이터타입의 2차원 데이터구조이다.

        데이터를 DataFrame에 보관하면 Polars API를 사용하여 데이터를 조작하는 쿼리를 작성할 수 있다.

        Series와 같이 DataFrame을 만들 때 Schema를 추론하고, 필요하다면 덮어쓸 수 있다.

        from datetime import date
        
        df = pl.DataFrame(
            {
                "name": ["Alice Archer", "Ben Brown", "Chloe Cooper", "Daniel Donovan"],
                "birthdate": [
                    date(1997, 1, 10),
                    date(1985, 2, 15),
                    date(1983, 3, 22),
                    date(1981, 4, 30),
                ],
                "weight": [57.9, 72.5, 53.6, 83.1],  # (kg)
                "height": [1.56, 1.77, 1.65, 1.75],  # (m)
            }
        )
        
        print(df)

        Schema

        Schema는 Column 또는 Series의 이름과 그 컬럼의 데이터 타입의 매핑 정보이다.

        print(df.schema)

        출력값

         

        Python에선 Dictionary를 사용하여 컬럼명과 데이터타입을 정의할 수 있는데 schema 파라미터 사용 시 모든 컬럼을 입력해줘야 한다. 이때 데이터 타입에 None을 입력하면 해당 컬럼은 덮어쓰지 않는다.

         

        df = pl.DataFrame(
            {
                "name": ["Alice", "Ben", "Chloe", "Daniel"],
                "age": [27, 39, 41, 43],
            },
            schema={"name": None, "age": pl.UInt8},
        )
        
        print(df)

        name은 덮어쓰지 않은 경우
        모든 스키마를 지정하지 않으면 다음과 같은 에러가 발생

        모든 컬럼을 override 해야 하는 불편함이 있어 특정 컬럼의 schema만 변경할 땐 schema_overrides 파라미터에 원하는 컬럼과 데이터타입만을 매핑하여 사용하는 것이 편하다.

        df = pl.DataFrame(
            {
                "name": ["Alice", "Ben", "Chloe", "Daniel"],
                "age": [27, 39, 41, 43],
            },
            schema_overrides={"age": pl.UInt8},
        )
        
        print(df)

        schema 파라미터와 달리 ValueError가 발생하지 않음

        DataFrame 확인

        DataFrame을 빠르게 확인하기 위해 pandas와 비슷하게 몇 가지 함수를 지원한다.

        1. head
          • DataFrame.head(n)
          • 인자로 입력한 개수만큼 상위 N개의 row를 출력하며, default는 5개이다.
        2. tail
          • DataFrame.tail(n)
          • 인자로 입력한 개수만큼 하위 N개의 row를 출력하며, default는 5개이다.
        3. glimpse
          • DataFrame.glimpse(...)
          • 조금 다른 함수로, 각 컬럼 별 처음 몇 로우를 보여주지만 head와 포맷이 다르다.
          • 한 컬럼당 한 열씩 사용하며 컬럼당 N개의 로우 출력, defaulit는 10개이다.
          • return_as_string을 True로 준다면 stdout 대신 string으로 반환한다.
        4. sample
          • DataFrame.sample(n, ...)
          • 말 그대로 무작위 샘플 데이터 추출이다.
          • seed 파라미터를 통해 무작위가 아닌 일정 샘플 추출이 가능하다.
        5. describe
          • DataFrame.describe(...)
          • 모든 컬럼에 대한 요약 통계를 볼 수 있다.
        from datetime import date
        
        df = pl.DataFrame(
            {
                "name": ["Alice Archer", "Ben Brown", "Chloe Cooper", "Daniel Donovan"],
                "birthdate": [
                    date(1997, 1, 10),
                    date(1985, 2, 15),
                    date(1983, 3, 22),
                    date(1981, 4, 30),
                ],
                "weight": [57.9, 72.5, 53.6, 83.1],  # (kg)
                "height": [1.56, 1.77, 1.65, 1.75],  # (m)
            }
        )
        
        print(df.head(3))
        print(df.tail(3))
        print(df.glimpse(return_as_string=True))
        print(df.glimpse())
        print(df.sample(2, seed=42))
        print(df.sample(2))
        print(df.describe())

        head
        tail
        sample, seed가 없다면 매번 다른 데이터가 나온다.
        glimpse
        glimpse(string 반환)
        describe

        마무리

        이번엔 Polars의 데이터 타입 및 구조체들, 간단히 DataFrame을 확인하는 방법에 대해 알아보았다.

        다음번엔 Polars의 표현식과 Context에 대해 알아보겠다.

        참고자료

        • https://docs.pola.rs/user-guide/concepts/data-types-and-structures

         

        'Language > Python' 카테고리의 다른 글

        [Python] Polars Lazy API로 효율적인 데이터 처리  (0) 2025.04.21
        [Python] Polars, 빠른 속도와 낮은 메모리의 DataFrame 라이브러리  (1) 2025.04.04
        [Python] JSON 직렬화와 역직렬화(json, ujson, orjson, msgspec)  (0) 2025.03.22
        [Python] Python 3.11 cchardet fatal error: longintrepr.h: No such file or directory  (0) 2025.03.12
        Rocky Linux에 pyenv 설치  (0) 2024.12.02
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바