سؤال

لدي مهمة لضغط بيانات سوق الأسهم بطريقة أو بأخرى...البيانات في ملف حيث قيمة الأسهم عن كل يوم تعطى في سطر واحد وهلم جرا...حتى انها كبيرة حقا الملف.

على سبيل المثال ،
123.45
234.75
345.678
889.56
.....

والسؤال المطروح الآن هو كيفية ضغط البيانات (الملقب تقليل التكرار) باستخدام معيار خوارزميات مثل هوفمان أو الترميز الحسابي أو LZ الترميز...وهذا الترميز هو الأفضل لهذا النوع من البيانات??...

وقد لاحظت أنه إذا كنت تأخذ البيانات الأولى ومن ثم النظر في الفرق بين كل متتالية البيانات ، هناك الكثير من التكرار في الفرق القيم...هذا يجعلني أتساءل عما إذا كان أول من أخذ هذه الاختلافات العثور على التردد وبالتالي probalility ثم باستخدام ترميز هوفمان أن يكون وسيلة??...

هل أنا على حق ؟ ...يمكن لأي شخص أن تعطيني بعض الاقتراحات.

هل كانت مفيدة؟

المحلول

وأعتقد أن مشكلتك هي أكثر تعقيدا من مجرد طرح أسعار الأسهم. تحتاج أيضا إلى تخزين التاريخ (إلا إذا كان لديك فترة زمنية يتفق التي يمكن استنتاجها من اسم الملف).

وكمية البيانات ليست كبيرة جدا، على الرغم من. حتى إذا كان لديك البيانات كل ثانية لكل يوم عن كل سنة للسنوات ال 30 الماضية 300 stockd، هل يمكن أن لا تزال إدارة لتخزين كل ما في كمبيوتر العالي نهاية البيت (يقول، MAC برو)، لأن ذلك يرقى إلى 5TB غير مضغوط .

وكتبت السيناريو سريعة وقذرة والتي سوف مطاردة الأسهم IBM في ياهو عن كل يوم، وتخزينه "عادة" (فقط تعديل وثيقة) واستخدام "طريقة الفرق" أذكر لكم، ثم ضغط عليها باستخدام غزيب. يمكنك القيام الحصول على وفورات: 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
  • تسعة H
  • سبعة ه
  • ثمانية L
  • ست س

انخفاضا من حوالي 27% نتيجة (نسبة ضغط على سبيل المثال خط 8/30)

ماذا تعتقد ؟

ويساعد هذا الأمل ، أطيب التحيات ، توم.

وcaculate والاختلاف في البيانات التوالي، ومن ثم استخدام تشغيل ترميز طول (RLE) .

وتحتاج أيضا إلى تحويل البيانات إلى عدد صحيح ومن ثم caculate والفرق.

وماذا سيكون أفضل سيكون الضغط التفاضلي التكيف (أنسى الاسم الصحيح). حيث ليس فقط هل تأخذ فقط الاختلافات كل يوم، يمكنك حساب مؤشرا وفعلا يفرق الخاص الخروج من ذلك. يتفوق عادة تنبؤ خطي العادية.

وإذا كنت ترغب في الحصول على الهوى ما يمكن أن تفعله هو عبر adapative، الذي سوق الأسهم بشكل عام قد حان الاتجاه الخاص الذي قصب استخدامها لاختيار تنبؤ أفضل للضغط.

وأود أن أقترح عليك لكسر الملف الرئيسي في إلى تنسيق منعت مجزأة ثم ضغط شرائح فردية على حدة؛ هذا ينبغي أن يؤدي إلى أقصى ضغط الأمثل. في الجانب الضغط سيكون لديك لضغط هذه الشرائح الفردية بشكل منفصل ومن ثم إعادة بناء ملف النص الأصلي.

scroll top