1

どういうわけか株式市場のデータを圧縮するタスクがあります...データは、毎日の株価が1行で示されるファイルにあります...したがって、これは非常に大きなファイルです。

例 :
123.45
234.75
345.678889.56
....。

ここで問題となるのは、ハフマンまたは算術コーディングやLZコーディングなどの標準アルゴリズムを使用してデータを圧縮する(冗長性を減らす)方法です...この種のデータにはどちらのコーディングが最も適していますか?? ...

最初のデータを取得してから、連続する各データ間の差を考慮すると、差の値に多くの繰り返しがあることに気付きました...これは、最初にこれらの差を取得し、それらの頻度、したがって確率を見つけてから、ハフマンコーディングを使用するのが方法でしょうか??...

私は正しいですか?...誰かが私にいくつかの提案をすることができますか?

4

6 に答える 6

2

最近の多くの圧縮ツールは、これらの手法を組み合わせて使用​​し、さまざまなデータに適切な比率を適用しています。ハフマンコーディングを使用し、さまざまな種類の冗長性を引き出すためにデータをシャッフルするさまざまなトリックを組み合わせたbzip2のような、かなり一般的で最新のものから始める価値があるかもしれません(ページにはさまざまな実装へのリンクが含まれています)。

于 2009-11-30T01:49:53.730 に答える
2

あなたの問題は、単に株価を差し引くよりも複雑だと思います。日付も保存する必要があります (ファイル名から推測できる一貫した期間がない場合)。

ただし、データ量はそれほど多くありません。過去 30 年間、毎日、毎秒、毎秒、300 ストックのデータがあるとしても、5Tb の非圧縮データに相当するため、ハイエンドの家庭用コンピューター (MAC Pro など) にすべてを保存することができます。 .

毎日YahooでIBM株を追跡し、それを「通常」(調整された終値のみ)に保存し、あなたが言及した「差分法」を使用してから、gzipを使用してそれらを圧縮する、迅速で汚いスクリプトを作成しました。節約できます: 16K 対 10K。問題は、日付を保存しなかったことです。どの値がどの日付に対応しているかわかりません。もちろん、これを含める必要があります。

幸運を。

import urllib as ul
import binascii as ba

# root URL
url = 'http://ichart.finance.yahoo.com/table.csv?%s'

# dictionary of options appended to URL (encoded)
opt = ul.urlencode({
    's':'IBM',       # Stock symbol or ticker; IBM
    'a':'00',        # Month January; index starts at zero
    'b':'2',         # Day 2
    'c':'1978',      # Year 2009
    'd':'10',        # Month November; index starts at zero
    'e':'30',        # Day 30
    'f':'2009',      # Year 2009
    'g':'d',         # Get daily prices
    'ignore':'.csv', # CSV format
    })

# get the data
data = ul.urlopen(url % opt)

# get only the "Adjusted Close" (last column of every row; the 7th)

close = []

for entry in data:
    close.append(entry.strip().split(',')[6])

# get rid of the first element (it is only the string 'Adj Close') 
close.pop(0)

# write to file
f1 = open('raw.dat','w')
for element in close:
    f1.write(element+'\n')
f1.close()

# simple function to convert string to scaled number
def scale(x):
    return int(float(x)*100)

# apply the previously defined function to the list
close = map(scale,close)

# it is important to store the first element (it is the base scale)
base = close[0]

# normalize all data (difference from nom)
close = [ close[k+1] - close[k] for k in range(len(close)-1)]

# introduce the base to the data
close.insert(0,base)



# define a simple function to convert the list to a single string
def l2str(list):
    out = ''
    for item in list:
        if item>=0:
            out += '+'+str(item)
        else:
            out += str(item)
    return out

# convert the list to a string
close = l2str(close)

f2 = open('comp.dat','w')
f2.write(close)
f2.close()

次に、「生データ」(raw.dat)と提案する「圧縮形式」(comp.dat)を比較します。

:sandbox jarrieta$ ls -lh
total 152
-rw-r--r--  1 jarrieta  staff    23K Nov 30 09:28 comp.dat
-rw-r--r--  1 jarrieta  staff    47K Nov 30 09:28 raw.dat
-rw-r--r--  1 jarrieta  staff   1.7K Nov 30 09:13 stock.py
:sandbox jarrieta$ gzip --best *.dat
:sandbox jarrieta$ ls -lh
total 64
-rw-r--r--  1 jarrieta  staff    10K Nov 30 09:28 comp.dat.gz
-rw-r--r--  1 jarrieta  staff    16K Nov 30 09:28 raw.dat.gz
-rw-r--r--  1 jarrieta  staff   1.7K Nov 30 09:13 stock.py
于 2009-11-30T17:31:08.937 に答える
0

ランレングスエンコーディングは適切でしょうか? ここでチェックしてください。それがどのように機能するかの非常に簡単な例を示すために、これはASCIIコードのデータ行です...長さ30バイト

HHHHHHHEEEEEEELLLLLLLLLOOOOOOOOOOOOOOO

これに RLE を適用すると、次の 8 バイトが得られます。

9H7E8L6O
  • 9つのH
  • セブンE
  • 8 つの L
  • シックス オー

結果として約27%の削減(例の回線の圧縮率は8/30)

どう思いますか?

これがお役に立てば幸いです。よろしくお願いします、トム。

于 2009-11-30T02:15:13.477 に答える
0

連続するデータの差分を計算し、Run Length Encoding (RLE)を使用します。

また、データを整数に変換してから、差を計算する必要もあります。

于 2009-11-30T02:28:57.953 に答える
0

最適なのは、適応差分圧縮です (正しい名前を忘れてしまいました)。毎日の違いを取るだけでなく、予測変数を計算し、実際にそれから差分をとることもできます。通常、通常の線形予測子よりも優れています。

あなたができることは、クロスアダプティブです。株式市場全体には、圧縮のより良い予測因子を選択するために使用できる独自の傾向があります。

于 2011-05-26T07:05:38.957 に答える
0

メイン ファイルをセグメント化されたブロック形式に分割してから、個々のセグメントを個別に圧縮することをお勧めします。これにより、最適化された圧縮が最大になります。解凍側では、これらの個々のセグメントを個別に解凍してから、元のテキスト ファイルを再構築する必要があります。

于 2012-01-12T16:13:45.573 に答える