판다 시리즈와 기억 소모

판다 시리즈는numpy 그룹으로 항목마다 색인이 있습니다.이것도pandas 데이터 프레임의 구축 블록 대상입니다. 아래와 같습니다.

수열은numpy수조로 구성되어 있기 때문에numpy의 벡터화 계산으로 인해 한 수열이나 여러 수열 사이의 계산 속도가 더욱 빨라서 수열에 추가적인 이익을 가져왔다.기본python 목록은 목록의 요소에 대한 계산을 실행하기 위해 순환을 사용해야 하며, 색인을 천천히 검사하고 모든 요소의 데이터 형식을 확인해야 하며,numpy는 미리 컴파일된 C 코드에서 이 작업을 처리하여 더욱 빠른 계산 속도를 얻을 수 있다.
우리는 모든 열에 하나의 시리즈를 구축하고 값의 데이터 형식을 어떻게 바꾸는지 탐색하여 상술한 데이터 구조를 구축할 것이다.이 열의 길이는 매우 작지만 대량의 데이터를 처리하고 더 복잡한 계산을 실행할 때 정확한 데이터 형식을 선택함으로써 코드의 효율을 최대한 높이는 방법을 아는 것이 매우 중요하다.
우리는 먼저 연도 칼럼을 위해 시리즈를 만들 것이다.우리는'years'라는 변수를 초기화함으로써 이 점을 실현할 수 있다. 이 변수는 지난 8년간의 연도를 채운 기본python 목록을 포함하고 있다.그리고 우리는 판다.Series() 방법을 사용할 것이다.우리는 또한 name = 키워드 매개 변수에 문자열을 전달해서 이 시리즈의 이름을 붙일 것이다.데이터 프레임에 추가할 때, 이 정렬 이름은 이 값에 열 이름을 제공합니다.

수입 팬더


import pandas as pd

시리즈 1-년


years = [2021, 2020, 2019, 2018, 2017, 2016, 2015, 2014]
year_series = pd.Series(data=years, name='year')
year_series
[출력]
0    2021
1    2020
2    2019
3    2018
4    2017
5    2016
6    2015
7    2014
Name: year, dtype: int64
보시다시피,pandas는 자동으로 저희 시리즈에 디지털 인덱스를 생성하고, 저희가 전달한 데이터에 따라 저희 값에 'int64' 데이터 형식을 사용하기로 결정했습니다.이 시리즈가 무엇으로 구성되었는지 속성과 방법을 사용해 봅시다..values 속성은 우리가 최초로 판다에게 준 연도 목록을 보여 주지만, 여기서 볼 수 있듯이 판다는 이미numpy 수조로 변했다.
print(type(year_series.values))
year_series.values
[출력]
<class 'numpy.ndarray'>
array([2021, 2020, 2019, 2018, 2017, 2016, 2015, 2014])

메모리 사용


이제 .memory_usage() 방법으로 are 시리즈가 얼마나 많은 메모리를 사용했는지 확인하고, 이 방법은 바이트 단위로 사용하는 공간량을 출력합니다.새로 고침의 경우 바이트당 8비트입니다.우리의 서열은 8개의 값을 포함하기 때문에, 수조에서 사용하는 바이트의 총수는 수조에서 모든 요소가 사용하는 비트와 같다.
우리의 데이터 형식은'int64'이기 때문에 비트 단위로 우리는 8개의 값이 있다. 우리는 우리의 시리즈가 64비트 x 8값 = 512비트를 사용한다고 가정할 수 있다.이것을 바이트로 변환합니다. .memory_usage() 방법은 64바이트의 출력을 제공합니다.
print(year_series.memory_usage(), 'bytes')
[출력]
192 bytes
흥미로운 것은 사실이 결코 그렇지 않다는 것이다.다른 128바이트의 출처를 사방으로 찾아보자..nbytes 속성은 우리에게numpy 그룹의 메모리 소모를 제공할 것이다.Series 객체의 .values.index 속성을 결합하여 이 두 속성의 사용 상황을 확인합니다.
print(
f'''
values consumption: {year_series.values.nbytes} bytes
index consumption:  {year_series.index.nbytes} bytes
''')
[출력]
values consumption: 64 bytes
index consumption:  128 bytes
인덱스는 그 값을 실제 데이터의 두 배의 메모리에 저장합니다!색인의 데이터 형식을 검사한 결과를 고려할 때, 이것은 색인이 사용하는 것이 'int64' 라는 것을 나타내는 더 이상한 행동이다.
year_series.index.dtype
[출력]
dtype('int64')
이것은 pd.DatFrame() 방법을 사용하여 데이터 프레임을 구축할 때의 인덱스 행위와 같다.색인에 사용되는 메모리를 줄이기 위해pandas.Index() 방법으로 색인을 만들어 보겠습니다.그리고 우리는 새로운 사용자 정의 인덱스를 index= 키워드 파라미터에 전달해서 시리즈를 다시 만들 수 있습니다.더 높은 메모리 효율을 얻기 위해서, 우리는 시리즈에서 밑바닥 데이터에 사용되는 데이터 형식을 변경할 수 있다.판다는 "int64"를 사용하기로 결정했습니다. - 922337272036854775807에서 9223372036854775807 사이의 값을 저장할 수 있습니다.이것은 우리가 필요로 하는 공간보다 훨씬 크다.값의 데이터 형식을 "uint16"으로 낮추겠습니다.'u'는 부호가 없음을 나타낸다. 이는 1년처럼 마이너스가 되지 않는 값에 적용되고,'int16'은 16자리를 나타내며 0에서 65535 사이의 숫자를 저장할 수 있다.이것은python과pandas 라이브러리 버전의 연대를 대표하기에 충분하다.
index = pd.Index(list(range(len(years))))
year_series2 = pd.Series(years, index=index, dtype='uint16', name='year')
year_series2
[출력]
0    2021
1    2020
2    2019
3    2018
4    2017
5    2016
6    2015
7    2014
Name: year, dtype: uint16
열거된 데이터 길이 범위의 사용자 정의 인덱스를 사용하면 이전과 같은 인덱스를 제공할 수 있을 것 같습니다.그것의 메모리 소모가 같은지 봅시다.
print(
f'''
total consumption:  {year_series2.memory_usage()} bytes
values consumption: {year_series2.values.nbytes} bytes
index consumption:  {year_series2.index.nbytes} bytes
''')
[출력]
total consumption:  80 bytes
values consumption: 16 bytes
index consumption:  64 bytes
좋습니다. 인덱스의 메모리 소모를 128바이트에서 64바이트로 줄이고, 값의 메모리 소모를 64바이트에서 16바이트로 줄입니다.

시리즈 2-python 버전


현재, 우리는 시리즈를 만들고 사용하는 데이터 형식을 변경할 수 있으며, 위의DatFrame를 계속 구축할 수 있으며, 우리의 첫 번째 시리즈에서python 버전 열에 매년 시리즈를 만들 수 있습니다.사용자 정의 색인을 만들었기 때문에 새 시리즈에 전달하기만 하면 됩니다.베이스 데이터에 대해 말하자면, 우리의 버전 번호는 부동점 값이기 때문에, 이 시리즈의 데이터 형식은 기본적으로'float64'로 설정됩니다. 예를 들어 우리가 연도를 포함하는 시리즈는 기본적으로'int64'로 설정됩니다.계속해서'float32'로 강등합시다.
python_versions = [3.9, 3.9, 3.8, 3.7, 3.6, 3.6, 3, 3]
python_series = pd.Series(python_versions, index=index, dtype='float32', name='python_version')
python_series
[출력]
0    3.9
1    3.9
2    3.8
3    3.7
4    3.6
5    3.6
6    3.0
7    3.0
Name: python_version, dtype: float32

메모리 소모


이제 메모리 소모량을 확인해 봅시다.
print(
f'''
total consumption:  {python_series.memory_usage()} bytes
values consumption: {python_series.values.nbytes} bytes
index consumption:  {python_series.index.nbytes} bytes
''')
[출력]
total consumption:  96 bytes
values consumption: 32 bytes
index consumption:  64 bytes
좋아, 이 칼럼은 우리의 다년간의 칼럼보다 더 많은 메모리를 차지하지만, 우리는 기본 데이터의 메모리 소모를 64바이트에서 32바이트로 줄일 수 있다.

시리즈 3 - 판다 윌리슨


이제 첫 번째 시리즈의 판다 버전을 포함하는 마지막 시리즈를 만듭니다.매년 여러 개의pandas 업데이트가 있기 때문에 이러한 업데이트는 해당 연도 버전의 업데이트 범위를 대표하는sting으로 저장된다.
pandas_versions = ['1.2->1.4', '1.0->1.1', '0.24->0.25', '0.23', '0.20->0.22', 
                    '0.18->0.19','0.16->0.17','0.13->0.15']
pandas_series = pd.Series(pandas_versions, index=index, name='pandas_version')
pandas_series
[출력]
0      1.2->1.4
1      1.0->1.1
2    0.24->0.25
3          0.23
4    0.20->0.22
5    0.18->0.19
6    0.16->0.17
7    0.13->0.15
Name: pandas_version, dtype: object
시퀀스에서numpy'object'데이터 형식으로 표시된 문자열을 볼 수 있습니다.

메모리 소모


지금은 메모리 소모입니다.
print(
f'''
total consumption:  {pandas_series.memory_usage()} bytes
values consumption: {pandas_series.values.nbytes} bytes
index consumption:  {pandas_series.index.nbytes} bytes
''')
[출력]
total consumption:  128 bytes
values consumption: 64 bytes
index consumption:  64 bytes
이 열의 'object' 데이터 형식은 총 64바이트, 또는 요소마다 8바이트/64바이트인 것을 볼 수 있습니다.수치와 달리 다운그레이드할 수 있는 객체 데이터 유형이 더 작지 않습니다.

데이터 프레임 만들기


현재, 우리는 최종적으로 pd.concat() 방법을 사용하여 그것들을 데이터 프레임에 놓을 것이다.
df = pd.concat([year_series2, python_series, pandas_series], axis = 1)
df
[출력]

메모리 소모


이 데이터 프레임의 메모리 소모는 사용한 시리즈와 같은 .memory_usage() 방법으로 검사할 수 있다.
print(df.memory_usage())
print()
print(f'total memory consumption: {df.memory_usage().sum()} bytes')
[출력]
Index             64
year              16
python_version    32
pandas_version    64
dtype: int64

total memory consumption: 176 bytes

비교 데이터 프레임


비교를 위해 나는 pd.DataFrame() 구조 함수 방법으로 값을 가진 사전을 전달하고 메모리 소모를 검사하여 같은 데이터 프레임을 만들었다.
data = {'year': years, 'python_versions': python_versions, 'pandas_versions': pandas_versions}
df2 = pd.DataFrame(data=data)
df2
[출력]

메모리 소모


이 데이터 프레임의 메모리 소모입니다.
print(df2.memory_usage())
print()
print(f'total memory consumption: {df2.memory_usage().sum()} bytes')
[출력]
Index              128
year                64
python_versions     64
pandas_versions     64
dtype: int64

total memory consumption: 320 bytes
우리의 데이터 프레임은 맞춤형 시리즈로 제작되어 총 176바이트이고 우리의 데이터 프레임은 pd.DatFrame() 방법으로 제작되어 맞춤형 없이 총 320바이트이다.메모리 소모가 45% 증가했습니다!
보시다시피 데이터 프레임에 사용되는 데이터 형식을 바꾸면 메모리 사용량을 대폭 줄일 수 있습니다.비교적 큰 데이터 집합에 대해 파일 크기와 계산 시간에 유용한 영향을 미칠 수 있다.

좋은 웹페이지 즐겨찾기