-
08-07-2019 - |
質問
私のインターン圧縮、株式市場データかに---データファイルの株式価値のそれぞれの日は一線で...でも非常に大きなファイルです。
例えば、
123.45
234.75
345.678
889.56
.....
現在の問題は、これらの圧縮データ(通称減の冗長性)を標準アルゴリズムのようなハフマンは算術符号化またはLZ符号化る---符号化に最も適しているこのようなデータ??...
っていった場合には最初のデータを検討しの連続データが何度も繰り返されたり、差値が---こっているかどうかが最初にこれらの差異は、その周波数がprobalility用ハフマン符号化する方法??...
ょうか?...誰でもできるのでいご提案します。
解決
あなたの問題は、単に株価を引くことよりも複雑だと思います。日付も保存する必要があります(ファイル名から推測できる一貫した期間がない場合)。
ただし、データの量はそれほど多くありません。 300株の過去30年間、毎日毎日1秒ごとにデータがある場合でも、5Tb UNCOMPRESSEDに相当するため、すべてをハイエンドのホームコンピューター(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
他のヒント
多くの圧縮ツールこれらの日の組み合わせを使用これらの技術について比率のさまざまなデータです。あじかかなり一般に現代のように bzip2 用ハフマン符号化のさまざまな仕掛けがシャッフルのデータに様々な種類の冗長化ページへのリンクが含まれて様々な実装の更なる。
ランレングスエンコーディングは適切ですか? こちらをご覧ください。それがどのように機能するかの極端な簡単な例を与えるために、ここにASCIIコードのデータの行があります... 30バイト長
HHHHHHHHEEEEEEELLLLLLLLOOOOOO
RLEを適用すると、8バイトでこれを取得できます:
9H7E8L6O
- Nine H's
- 7つのE
- 8つのL
- 6つのO
結果として約27%の削減(例の行の圧縮率は8/30です)
あなたはどう思いますか
これが役立つことを願って、 宜しくお願いします、 トム。
連続データの差を計算してから、実行長エンコード(RLE)。
また、データを整数に変換してから、差を計算する必要があります。
最適なのは、適応差分圧縮です(正しい名前を忘れてしまいます)。毎日違いをとるだけでなく、予測変数を計算し、それから実際に差分を取ることができます。通常、通常の線形予測よりも優れています。
クロスアダプティブを使用したい場合は、株式市場全体に独自の傾向があり、圧縮に適した予測変数を選択することができます。
メインファイルをセグメント化されたブロック形式に分割し、個々のセグメントを個別に圧縮することをお勧めします。これにより、最適化された最大の圧縮が得られます。 解凍側では、これらの個々のセグメントを個別に解凍し、元のテキストファイルを再構築する必要があります。