2009-11-30 7 views
1

나는 주식 시장 데이터를 어쨌든 압축하는 작업을하고 있습니다 ... 데이터는 파일에 저장되어있어 매일의 주가가 한 줄로 표시되는 등 매우 큰 파일입니다.데이터 압축


123.45 234.75

345.678
889.56
..... 지금


질문 허프만 같은 표준 알고리즘을 이용하여 데이터를 압축 (일명 리던던시를 감소)하는 방법은 또는 산술 코딩 또는 LZ 코딩 ... 이러한 종류의 데이터에 가장 적합한 코딩은 무엇입니까? ...

나는 첫 데이터를 취한 다음 각각의 연속적인 데이터 사이의 차이를 고려해 볼 때, 차이 값에 많은 반복이 있습니다 ... 이것은 처음에는 이러한 차이를 취하고, 따라서 빈도를 찾고 따라서 probality를 찾은 다음 허프만 코딩을 사용하는 것이 방법 일까?

내가 맞습니까? ... 아무도 나에게 몇 가지 제안을 줄 수 있습니까?

+0

왜 비교하지 않습니까? – jldupont

+0

http://mathoverflow.com/ – jldupont

답변

2

귀하의 문제는 단순히 주가를 빼는 것보다 더 복잡하다고 생각합니다. 또한 파일 이름에서 추측 할 수있는 일관된 시간 범위가 아닌 경우 날짜를 저장해야합니다.

데이터 양은 그리 크지 않습니다.300 년 동안 매년 30 년 동안 매일 매일 데이터를 보관하고 있더라도 상급 가정용 컴퓨터 (예 : MAC Pro)에이 모든 데이터를 저장할 수 있습니다. 즉, 5Tb로 제한되지 않습니다. .

나는 매일 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 
+0

재고 사전에 대한 내 코멘트는 실제로 시작일이 1978 일 때 "2009"라고 표시되므로 IBM의 30 년간의 일일 재고 데이터를 추적 중입니다. – Escualo

+0

안녕하세요 많이 고맙습니다.이게 정말 도움이됩니다 ... 지금은 날짜가 실제로 중요하지 않습니다 ... 내 주요 초점은 가능한 한 많이 주식 인덱스 데이터를 압축하는 것입니다 ... 그리고 나는 (코드) 압축 코드 자신은 미리 작성된 소프트웨어를 사용할 수 없습니다. 단지 하나의 알고리즘 만 사용하게 될 것입니다 ... 그래서 내 문제는 허프만 코딩에 대한이 '차이'값의 확률 분포를 얻고 지금은 해독 할 것입니다 (압축 해제) 또한. – sfactor

2

요즘 많은 압축 도구는 다양한 데이터에서 우수한 비율을 제공하기 위해 이러한 기술의 조합을 사용합니다. 꽤 많은 일반적이고 현대적인 무언가로 시작하는 가치가 있을지도 모른다. 다양한 종류의 리던던시 (다양한 구현에 대한 링크를 포함하고있다)를 이끌어 내기 위해 데이터를 뒤섞는 다양한 트릭과 결합 된 허프만 코딩을 사용하는 bzip2과 같은 것이다.

0

실 길이 인코딩이 적합 할 수 있습니까? 그것을 확인하십시오 here.

 
9H7E8L6O 
: 그것이 작동하는 방법의 극단적 인 간단한 예제를 제공하기 위해, 여기

 
HHHHHHHHEEEEEEELLLLLLLLOOOOOO 

그것에 RLE를 적용하고 8 바이트에이를 수 30 바이트 아스키 코드의 데이터 라인은 ...입니다

  • 나인 H의
  • 세븐 E의
  • 여덟 L의
  • 여섯 O의

당신은 어떻게 생각

(8/30 인 예 라인에 대한 압축 비율) 결과 약 27 %의 감소?

호프가 도움이 되었으면 안녕하세요, 탐.

0

연속 데이터의 차이를 계산 한 다음 Run Length Encoding (RLE)을 사용하십시오.

그리고 데이터를 정수로 변환 한 다음 그 차이를 caculate해야합니다.

0

은 (적응 차등 압축 될 것이다 나는 정확한 이름을 잊는다). 매일 차이점을 파악할뿐만 아니라 예측자를 계산할 수 있고 실제로 차이를 계산할 수 있습니다. 일반적으로 정상 선형 예측자를 능가합니다.

만약 당신이 할 수있는 일이 무엇인지 궁금하다면 주식 시장 전체적으로 그것이 압축에 대한 더 좋은 예언자를 고르는 데 사용되는 자신의 경향이있는 크로스 adapative입니다.

0

메인 파일을 세그먼트 화 된 차단 된 형식으로 분해 한 다음 개별 세그먼트를 개별적으로 압축하는 것이 좋습니다. 이것은 최대의 최적화 된 압축을 가져와야합니다. 압축 해제 측에서 이러한 개별 세그먼트를 개별적으로 압축 해제 한 다음 원래 텍스트 파일을 재구성해야합니다.