• 티스토리 홈
  • 프로필사진
    홀쑥
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
홀쑥
  • 프로필사진
    홀쑥
    • 분류 전체보기 (57)
      • Language & Framework (14)
        • Java (1)
        • Python (13)
      • DataBase (4)
        • NoSQL (1)
        • RDBMS (3)
      • Big Data & Ecosystem (9)
        • Hadoop (5)
        • Hive (2)
        • Sqoop (1)
        • Zeppelin (1)
      • Data Engineering (1)
        • Airflow (1)
      • Cloud & DevOps (1)
        • AWS (0)
        • GCP (1)
      • Monitoring & Logging (2)
        • ElasticSearch (2)
      • Infrastructure (12)
        • OS (12)
        • Docker (0)
        • Kubernetes (0)
      • Algorithm & CS (7)
        • 백준 알고리즘 (6)
      • Troubleshooting (5)
        • 오류 모음 (5)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # 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

         

        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바