itsource

Panda 데이터 프레임을 디스크에 역방향으로 저장하고 디스크에서 로드하는 방법

mycopycode 2022. 9. 13. 22:14
반응형

Panda 데이터 프레임을 디스크에 역방향으로 저장하고 디스크에서 로드하는 방법

지금 꽤 큰의 는는 a a right right right a a a a a a a a a a a a a a a a를 하고 있습니다.CSV스크립트를 실행할 때마다 데이터 프레임으로 사용됩니다.스크립트가 실행되기를 기다리는 데 많은 시간을 할애할 필요가 없도록 데이터 프레임을 실행 사이에 항상 사용할 수 있도록 하기 위한 좋은 솔루션이 있습니까?

가장 쉬운 방법은 다음과 같이 절이는 입니다.

df.to_pickle(file_name)  # where to save it, usually as a .pkl

그런 다음 다음을 사용하여 다시 로드할 수 있습니다.

df = pd.read_pickle(file_name)

0.: 0.11.1save ★★★★★★★★★★★★★★★★★」load).to_pickle ★★★★★★★★★★★★★★★★★」read_pickle★★★★★★★★★★★★★★★★★★★★★」


또 다른 인기 있는 선택은 대규모 데이터셋에 매우 빠른 액세스 시간을 제공하는 HDF5(피테이블)를 사용하는 것입니다.

import pandas as pd
store = pd.HDFStore('store.h5')

store['df'] = df  # save it
store['df']  # load it

더 발전된 전략은 요리책에서 논의된다.


0.13 이후부터는 JSON의 빠른 대안 또는 python 객체/텍스트 헤비 데이터가 있는 경우 상호 운용성을 위해 더 나은 msgpack도 있습니다( 질문 참조).

이미 몇 가지 답변이 있기는 하지만 판다 데이터 프레임: 효율적인 저장 판다 데이터 프레임이라는 여러 가지 방법을 연재하려고 시도했던 멋진 비교 결과를 발견했습니다.

비교:

  • 피클: 원래 ASCII 데이터 형식
  • cPickle, C 라이브러리
  • Pickle-p2: 새로운 이진 형식을 사용한다.
  • json:standardlibjson 도서관
  • Json-no-index:json지만 색인도 없다.
  • msgpack:이진 JSON대안
  • CSV
  • hdfstore:HDF5 저장 장치

그들의 실험에서, 그들은 DataFrame 100만줄의 이 두 열의 별도로 시험과:한 텍스트 데이터가 나온 숫자들이랑 다른 serialize 합니다.그들의 면책 조항을 말한다.

당신은 무엇 당신의 데이터에 generalizes 다음을 신뢰하지 마십시오.당신은 당신만의 자료를 직접 보고, 벤치 마크 업신여겨 가야 한다.

그들은으로 부르는 시험용 소스 코드 온라인 이용할 수 있다.이후 이 코드를 직접 일하지는 않았지만 여기서 얻을 수 있일부 작은 변경들,:serialize.py저는 다음과 같은 결과를 얻었습니다: 만들었다.

시간 비교 결과

그들은 또한 텍스트 데이터의 유목 자료로의 전향에 대한 serialization은 훨씬 빠르다고 언급한다.그들의 시험에서 약 10배 빠른(또한 시험 코드를 참조하십시오).

Edit:피클을 위해 CSV보다 높을수록번 데이터 형식에서 사용하는 설명될 수 있다.기본 피클은 더 큰 데이터 세트를 생성할 수 있는 ASCII표현을 사용합니다.이 그래프에서 하지만, 피클 더 새로운 이진 데이터 형식(버전 2사용하는 것을 볼 수 있다.pickle-p2 시간이 짧습니다는 로드 시간이 훨씬 짧습니다.

기타 참고 자료:

pandas.read_csv()스크립트를 편집할 때마다 파일을 로드할 필요가 없도록 개발 프로세스를 가속화하고 싶습니다.할 것이 .

  1. 에는 CSV 파일을 할 수 .pandas.read_csv(..., nrows=1000)

  2. 인터랙티브 세션에 ipython을 사용하여 스크립트를 편집하고 새로고침할 때 팬더 테이블을 기억합니다.

  3. csv를 HDF5 테이블로 변환하다

  4. 갱신된 용도DataFrame.to_feather() ★★★★★★★★★★★★★★★★★」pd.read_feather()R 호환 깃털 바이너리 포맷으로 데이터를 저장하는 것은 매우 빠릅니다(내 손 안에 있는 데이터보다 약간 빠릅니다).pandas.to_pickle()숫자 데이터 및 문자열 데이터에서는 훨씬 더 빠릅니다).

stackoverflow에 대한 이 답변에도 관심이 있을 수 있습니다.

피클은 효과가 좋다!

import pandas as pd
df.to_pickle('123.pkl')    #to save the dataframe, df to 123.pkl
df1 = pd.read_pickle('123.pkl') #to load 123.pkl back to the dataframe df

깃털 형식 파일을 사용할 수 있습니다.굉장히 빨라요.

df.to_feather('filename.ft')

앞서 설명한 바와 같이 데이터 프레임을 저장하기 위한 다양한 옵션과 파일 형식(HDF5, JSON, CSV, parquet, SQL)이 있습니다.하지만,pickle에 따라) 시민이 이유는 다음과 같습니다.을 사용하다

  1. pickle잠재적인 보안 리스크입니다.피클에 대한 Python 문서를 작성합니다.

경고:pickle모듈은 오류 또는 악의적으로 구성된 데이터로부터 안전하지 않습니다.신뢰할 수 없는 소스 또는 인증되지 않은 소스로부터 수신한 데이터를 절대로 제거하지 마십시오.

  1. pickle느리다.벤치마크에 대해서는 이쪽과 이쪽을 참조해 주세요.

두 가지 모두 , "/"는 .pickle팬더 데이터 프레임의 기본 지속성입니다.

Panda 는 Panda Data Frame을 .to_pickleData Frame data data data :

import pandas as pd

a = pd.DataFrame({'A':[0,1,0,1,0],'B':[True, True, False, False, False]})
print a
#    A      B
# 0  0   True
# 1  1   True
# 2  0  False
# 3  1  False
# 4  0  False

a.to_pickle('my_file.pkl')

b = pd.read_pickle('my_file.pkl')
print b
#    A      B
# 0  0   True
# 1  1   True
# 2  0  False
# 3  1  False
# 4  0  False

숫자 데이터에 대해 numpy 파일 형식이 매우 빠릅니다.

빠르고 작업하기 쉽기 때문에 numpy 파일을 사용하는 것을 선호합니다.다음은 데이터 프레임을 저장 및 로드하기 위한 간단한 벤치마크로, 1컬럼은 100만 포인트입니다.

import numpy as np
import pandas as pd

num_dict = {'voltage': np.random.rand(1000000)}
num_df = pd.DataFrame(num_dict)

ipython 사용%%timeit 함수

%%timeit
with open('num.npy', 'wb') as np_file:
    np.save(np_file, num_df)

출력은

100 loops, best of 3: 5.97 ms per loop

데이터를 데이터 프레임에 다시 로드하다

%%timeit
with open('num.npy', 'rb') as np_file:
    data = np.load(np_file)

data_df = pd.DataFrame(data)

출력은

100 loops, best of 3: 5.12 ms per loop

나쁘지 않아요!

단점

python 2를 사용하여 numpy 파일을 저장한 후 python 3을 사용하여 열려고 하면 문제가 발생합니다(또는 그 반대도 마찬가지입니다.

하나 꽤 입니다.to_pickle().

25개 있습니다. .csv 및 인 「」의 파일.dataframe대략 200만 개의 아이템으로 구성되어 있습니다.

(주의: .csv 파일을 로드하는 것 외에 일부 데이터를 조작하여 데이터 프레임을 새로운 열로 확장합니다.)

25개 모두 검토 .csv are arround.14 sec.

를 로딩하다pkl이 "" 작다"1 sec

https://docs.python.org/3/library/pickle.html

피클 프로토콜 형식은 다음과 같습니다.

프로토콜 버전 0은 원래 "사람이 읽을 수 있는" 프로토콜이며 이전 버전의 Python과 하위 호환됩니다.

프로토콜 버전 1은 이전 버전의 Python과도 호환되는 오래된 바이너리 형식입니다.

프로토콜 버전 2는 Python 2.3에서 도입되었습니다.그것은 훨씬 더 효율적인 새로운 스타일의 수업을 제공한다.프로토콜 2에서 가져온 개선 사항에 대한 내용은 PEP 307을 참조하십시오.

프로토콜 버전 3은 Python 3.0에 추가되었습니다.바이트 개체를 명시적으로 지원하며 Python 2.x에서 압축을 풀 수 없습니다.이것은 기본 프로토콜이며 다른 Python 3 버전과의 호환성이 필요할 때 권장되는 프로토콜입니다.

프로토콜 버전 4는 Python 3.4에 추가되었습니다.또한 매우 큰 개체, 더 많은 종류의 개체 절임 및 일부 데이터 형식 최적화에 대한 지원을 추가합니다.프로토콜 4에서 가져온 개선 사항에 대한 내용은 PEP 3154를 참조하십시오.

북극은 판다, 숫자 및 기타 수치 데이터를 위한 고성능 데이터 저장소입니다.MongoDB 위에 있습니다.작전에는 과잉 살상일지도 모르지만, 이 포스트를 우연히 접한 다른 사람들에 대해서는 언급할 가치가 있다.

버전 간 pyarrow 호환성

전체적인 움직임은 pyarrow/feather(판다/msgpack의 폐기 경고)였다.그러나 사양이 과도적인 pyarrow에 문제가 있습니다. pyarrow 0.15.1로 직렬화된 데이터는 0.16.0 ARROW-7961로 직렬화할 수 없습니다.redis를 사용하기 위해 직렬화를 사용하고 있기 때문에 바이너리 인코딩을 사용해야 합니다.

다양한 옵션을 재테스트했습니다(주피터 노트북 사용).

import sys, pickle, zlib, warnings, io
class foocls:
    def pyarrow(out): return pa.serialize(out).to_buffer().to_pybytes()
    def msgpack(out): return out.to_msgpack()
    def pickle(out): return pickle.dumps(out)
    def feather(out): return out.to_feather(io.BytesIO())
    def parquet(out): return out.to_parquet(io.BytesIO())

warnings.filterwarnings("ignore")
for c in foocls.__dict__.values():
    sbreak = True
    try:
        c(out)
        print(c.__name__, "before serialization", sys.getsizeof(out))
        print(c.__name__, sys.getsizeof(c(out)))
        %timeit -n 50 c(out)
        print(c.__name__, "zlib", sys.getsizeof(zlib.compress(c(out))))
        %timeit -n 50 zlib.compress(c(out))
    except TypeError as e:
        if "not callable" in str(e): sbreak = False
        else: raise
    except (ValueError) as e: print(c.__name__, "ERROR", e)
    finally: 
        if sbreak: print("=+=" * 30)        
warnings.filterwarnings("default")

프레임에 대한 )out★★★★★★★★★★★★★★★★」

pyarrow before serialization 533366
pyarrow 120805
1.03 ms ± 43.9 µs per loop (mean ± std. dev. of 7 runs, 50 loops each)
pyarrow zlib 20517
2.78 ms ± 81.8 µs per loop (mean ± std. dev. of 7 runs, 50 loops each)
=+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+=
msgpack before serialization 533366
msgpack 109039
1.74 ms ± 72.8 µs per loop (mean ± std. dev. of 7 runs, 50 loops each)
msgpack zlib 16639
3.05 ms ± 71.7 µs per loop (mean ± std. dev. of 7 runs, 50 loops each)
=+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+=
pickle before serialization 533366
pickle 142121
733 µs ± 38.3 µs per loop (mean ± std. dev. of 7 runs, 50 loops each)
pickle zlib 29477
3.81 ms ± 60.4 µs per loop (mean ± std. dev. of 7 runs, 50 loops each)
=+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+=
feather ERROR feather does not support serializing a non-default index for the index; you can .reset_index() to make the index into column(s)
=+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+=
parquet ERROR Nested column branch had multiple children: struct<x: double, y: double>
=+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+=

feather와 parquet은 데이터 프레임에 적합하지 않습니다.저는 계속 파이로우를 사용할 거예요.단, 피클(압축 없음)로 보충합니다.캐시 스토어 pyarrow 및 피클 일련 양식을 작성할 때.pyarrow deserialization이 실패했을 경우 캐시 폴백에서 피클을 읽을 때.

여기에는 훌륭하고 충분한 답변이 많이 있습니다.하지만 저는 Kaggle에서 사용한 테스트를 발표하려고 합니다.큰 df는 다른 판다 호환 포맷으로 저장되고 읽힙니다.

https://www.kaggle.com/pedrocouto39/fast-reading-w-pickle-feather-parquet-jay

난 이 책의 저자나 저자의 친구가 아니야, 호버. 내가 이 질문을 읽을 때 언급할 가치가 있다고 생각해.

CSV: 1분 42초 피클: 4.45초 깃털: 4.35초 파켓: 8.31초 Jay: 8.12ms 또는 0.0812초 (광택이 빠릅니다!)

언급URL : https://stackoverflow.com/questions/17098654/how-to-reversibly-store-and-load-a-pandas-dataframe-to-from-disk

반응형