サイトアイコン たーちゃんの「ゼロよりはいくらかましな」

【python】【json】データ差分圧縮・復元

jsonを扱うときに前提条件が揃ってさえいれば、

容量をガツッと圧縮することができることを教えていただいたので、

それを実装して圧縮〜復元とやってみたのでメモ。

 

 

 

差分化圧縮

この圧縮方式をするための前提がいくつかあります。

・各行データが同じ構造ですべて数値であること

・ソート済みであること(これは圧縮効率に関係します)

 

圧縮の理屈としては、

自身の前の行のデータとの差分をデータとして出力することで、

元のデータ容量より小さく保存するというものです。

 

本記事のやり方では、pandasとnumpyを使用します。

 

コード

import pandas as pd
import numpy as np
import json

# テスト用データ作成
test_df = pd.DataFrame({
    "col1": np.arange(1, 10),
    "col2": np.arange(11, 20),
    "col3": np.arange(21, 30),
    "col4": np.arange(31, 40),
})

print(test_df)

"""
out

   col1  col2  col3  col4
0     1    11    21    31
1     2    12    22    32
2     3    13    23    33
3     4    14    24    34
4     5    15    25    35
5     6    16    26    36
6     7    17    27    37
7     8    18    28    38
8     9    19    29    39
"""

# データ差分化圧縮させるため、先頭行に基準値として値が0のデータを用意
zero_data = [{"col1": 0, "col2": 0, "col3": 0, "col4": 0}]
test_df = pd.concat(
	[pd.DataFrame(zero_data), test_df], ignore_index=False
)

# データ差分化圧縮
test_df = test_df.diff().dropna()

# 差分のint型変換
test_df["col1"] = test_df["col1"].astype(int)
test_df["col2"] = test_df["col2"].astype(int)
test_df["col3"] = test_df["col3"].astype(int)
test_df["col4"] = test_df["col4"].astype(int)

print(test_df)

"""
out

   col1  col2  col3  col4
0     1    11    21    31
1     1     1     1     1
2     1     1     1     1
3     1     1     1     1
4     1     1     1     1
5     1     1     1     1
6     1     1     1     1
7     1     1     1     1
8     1     1     1     1
"""

# json変換
test_json = test_df.to_json(orient="values")

print(test_json)

"""
out

[[1,11,21,31],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]
"""


# データ復元
test_json = np.array(json.loads(test_json)).cumsum(axis=0)

print(test_json)

"""
out

[[ 1 11 21 31]
 [ 2 12 22 32]
 [ 3 13 23 33]
 [ 4 14 24 34]
 [ 5 15 25 35]
 [ 6 16 26 36]
 [ 7 17 27 37]
 [ 8 18 28 38]
 [ 9 19 29 39]]
"""

 

 

 


にほんブログ村


人気ブログランキング

モバイルバージョンを終了