2009-11-30 4 views
1

У меня есть задача сжать данные фондового рынка как-то ... данные находятся в файле, где значение запаса за каждый день указывается в одной строке и так далее ... так что это действительно большой файл.Сжатие данных

Например,
123,45
234,75
345,678
889,56
.....

теперь вопрос заключается в том, чтобы сжать данные (ака уменьшить избыточность), используя стандартные алгоритмы, такие как Хаффман или Арифметическое кодирование или кодирование LZ ... какое кодирование является наиболее предпочтительным для такого рода данных ...

Я заметил, что если я возьму первые данные, а затем рассмотрите разницу между каждым последовательным данным, есть много повторений в значениях разницы ... это заставляет меня задаться вопросом, если сначала принять эти различия, найти их частоту и, следовательно, вероятность, а затем использовать кодирование хаффмана будет способом ...

Am i right? ... может ли кто-нибудь дать мне несколько предложений.

+0

Почему вы не делаете сравнения? – jldupont

+0

http://mathoverflow.com/ – jldupont

ответ

2

Я думаю, что ваша проблема сложнее, чем просто вычесть цены на акции. Вам также необходимо сохранить дату (если у вас нет согласованного временного интервала, который может быть выведен из имени файла).

Объем данных не очень большой.Даже если у вас есть данные каждую секунду за каждый день за каждый год за последние 30 лет за 300 запасов, вы все равно сможете сохранить все это на домашнем компьютере с более высоким уровнем доступа (скажем, в MAC Pro), так как это составляет 5 Тб НЕКОМПРЕССЕД ,

Я написал быстрый и грязный сценарий, который будет отслеживать акции IBM в Yahoo за каждый день и хранить его «обычно» (только отрегулированное закрытие) и используя «метод разницы», который вы упомянули, а затем сжимаете их с помощью 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

Обратите внимание, что мой комментарий к биржевому словарю говорит «2009» для даты начала, когда на самом деле это 1978 ... поэтому я преследую 30 лет ежедневных данных о запасах для IBM. – Escualo

+0

эй, спасибо, много, это действительно полезно ... ну на данный момент дата на самом деле не важна ... моя основная задача - просто сжать данные индекса акций как можно больше ... и мне нужно разработать (код) сам код сжатия сам не может использовать готовое программное обеспечение ... я буду использовать только один алгоритм ... так что моя проблема будет заключаться в том, чтобы получить вероятностное распределение этих значений «разности» для кодирования Хаффмана, которые сейчас говорят, что нужно декодировать (декомпрессировать) это также. – sfactor

2

Многие инструменты сжатия в наши дни используют комбинацию этих методов, чтобы обеспечить хорошие отношения к различным данным. Возможно, стоит начать с чего-то довольно общего и современного, такого как bzip2, который использует кодировку Хаффмана в сочетании с различными трюками, которые перемешивают данные вокруг, чтобы выявить различные виды избыточности (страница содержит ссылки на различные реализации далее вниз).

0

Может использоваться кодировка длины пробега? Проверьте это here. Чтобы дать экстремальное простой пример того, как она работает, вот строка данных в ASCII-коде ... 30 байт длиной

 
HHHHHHHHEEEEEEELLLLLLLLOOOOOO 

Нанести РЛЭ на него, и вы получите это в 8 байт:

 
9H7E8L6O 
  • Девять Эйч
  • Семь Э
  • восемь единиц
  • Шесть выходов

Снижение примерно 27% в результате (коэффициент сжатия для примера линии 8/30)

Что вы думаете?

Надеюсь, это поможет, С уважением, Tom.

0

Caculate разность последовательных данных, а затем использовать Run Length Encoding (RLE).

И вам также нужно преобразовать данные в целое число, а затем сгладить разницу.

0

, что было бы лучше всего было бы адаптивной дифференциальной компрессии (я забыл правильное имя). Там, где вы не только делаете разницу каждый день, вы можете рассчитать предиктор и на самом деле сделать свое различие от этого. Обычно превосходит обычные линейные предиктора.

Если вы хотите получить представление о том, что вы можете сделать, это крест адаптивный, в котором фондовый рынок в целом имеет свою собственную тенденцию, что трость может использоваться для выбора лучших предикторов для сжатия.

0

Я предлагаю вам разбить основной файл на сегментированный заблокированный формат, а затем сжать отдельные сегменты отдельно; это должно привести к максимальному оптимизированному сжатию. На стороне декомпрессии вам придется разделить эти отдельные сегменты отдельно, а затем восстановить исходный текстовый файл.

Смежные вопросы