Mục tiêu của tôi là nhận giá trị băm duy nhất cho một DataFrame. Tôi lấy nó ra khỏi tập tin .csv. Toàn bộ điểm là nhận được cùng một băm mỗi lần tôi gọi hàm băm() trên đó.Nhận giá trị băm giống nhau cho một khung dữ liệu Pandas mỗi lần
Ý tưởng của tôi là tôi tạo ra các chức năng
def _get_array_hash(arr):
arr_hashable = arr.values
arr_hashable.flags.writeable = False
hash_ = hash(arr_hashable.data)
return hash_
được gọi mảng NumPy cơ bản, đặt nó vào trạng thái bất biến và nhận được băm của bộ đệm.
UPD INLINE.
Kể từ ngày 8 tháng 11 năm 2016, phiên bản này của chức năng không hoạt động nữa. Thay vào đó, bạn nên sử dụng
hash(df.values.tobytes())
Xem nhận xét cho Most efficient property to hash for numpy array.
END OF UPD INLINE.
Nó hoạt động cho mảng gấu trúc thường xuyên:
In [12]: data = pd.DataFrame({'A': [0], 'B': [1]})
In [13]: _get_array_hash(data)
Out[13]: -5522125492475424165
In [14]: _get_array_hash(data)
Out[14]: -5522125492475424165
Nhưng sau đó tôi cố gắng để áp dụng nó vào DataFrame thu được từ một tập tin .csv:
In [15]: fpath = 'foo/bar.csv'
In [16]: data_from_file = pd.read_csv(fpath)
In [17]: _get_array_hash(data_from_file)
Out[17]: 6997017925422497085
In [18]: _get_array_hash(data_from_file)
Out[18]: -7524466731745902730
Ai đó có thể giải thích cho tôi, làm thế nào là có thể ?
tôi có thể tạo DataFrame mới ra khỏi nó, như
new_data = pd.DataFrame(data=data_from_file.values,
columns=data_from_file.columns,
index=data_from_file.index)
và nó hoạt động một lần nữa
In [25]: _get_array_hash(new_data)
Out[25]: -3546154109803008241
In [26]: _get_array_hash(new_data)
Out[26]: -3546154109803008241
Nhưng mục tiêu của tôi là để bảo tồn giá trị băm tương tự cho một dataframe qua ứng dụng khởi động theo thứ tự để lấy một số giá trị từ bộ nhớ cache.
Điều này có thể giúp: https://github.com/TomAugspurger/engarde/issues/3 –
Tôi đã thử cách tiếp cận với nhận giá trị băm của chỉ mục và cột và giá trị str (data_frame). Nó chậm và bị các vấn đề tương tự. – mkurnikov
Tôi cũng quan tâm đến việc này - tôi có thể hỏi tại sao bạn đưa vào "arr_hashable.flags.writeable = False" không? Bạn có mong đợi hàm băm() có thể sửa đổi mảng không? –