SORU
10 Ocak 2013, PERŞEMBE


"Büyük veri" iş akışı pandalar kullanarak

Pandalar öğrenirken aylardır bu sorunun cevabını çözmek için çalıştık. Benim günlük iş için SAS kullanıyorum ve çok çekirdekli destek için harika. Ancak, SAS sayısız diğer nedenlerle bir yazılım olarak berbat.

Bir gün python ve pandalar ile SAS benim kullanmak yerine umarım, ama ben şu anda büyük veri için temel bir iş akışı olmaması. "Dağıtılmış bir ağ, ancak bunun yerine dosya belleğe sığmayacak ama sabit disk. oturması için çok büyük yeterince küçük gerektiren "büyük veri bahsetmiyorum

İlk aklıma gelen HDFStore disk üzerinde büyük veri tutun ve analiz için dataframes içine ihtiyacım olan tek parça çekin. Diğerleri kullanmak için daha kolay bir alternatif olarak MongoDB bahsetmiş. Benim sorum şu:

En iyi uygulama bazıları şu şekilde gerçekleştirmek için çalışın

  1. Yükleme düz kalıcı, disk üzerinde bir veritabanı yapısı içine dosyaları
  2. Bu veritabanı pandalar bir veri yapısı içine beslemek için veri almak için sorgulama
  3. Pandalar manipülasyonu parçaları sonra veritabanı güncelleniyor

Örnekler çok, özellikle pandalar kullanan herkes mutluluk duyacağız gerçek dünya "büyük veri".

-- Bu çalışmak istiyorum nasıl bir örnek düzenleme:

  1. Yinelenen bir büyük düz dosya alma ve kalıcı, disk üzerinde bir veritabanı yapısı içinde saklayın. Bu dosyalar genellikle belleğe sığmayacak kadar büyük.
  2. Pandalar kullanmak için belleğe sığabilecek bu veri (genellikle bir seferde sadece bir kaç sütun) alt kümeleri okumak istiyorum.
  3. Seçili sütunlar üzerinde çeşitli işlemler uygulayarak yeni sütun oluşturmak istiyorum.
  4. O zaman veritabanı yapısı içine bu yeni sütunlar eklemek istiyorum.

Bu adımları gerçekleştirmek için en iyi uygulama bir yol bulmaya çalışıyorum. Pandalar ve pytables bu konuda bağlantılar okuma yeni bir sütun ekleme bir sorun olabilir gibi görünüyor.

Jeff sorularına özellikle cevap düzenleme:

  1. Tüketici kredi risk modelleri yapıyorum. Bu tür veri vardır telefon, SSN ve adres özellikleri; özellik değerleri; aşağılayıcı bilgi sabıka kaydı, iflas, vb... veri kullanıyorum her gün yaklaşık 1.000-2.000 alanları ortalama karışık veri türleri: sürekli, nominal ve sıralı değişkenler, hem sayı hem de karakter Verisi. Ben nadiren satır ekleme, ama yeni bir sütun oluşturmak birçok işlemleri gerçekleştirmek istiyorum.
  2. Normal işlemler birden fazla sütun yeni, bileşik bir sütuna koşullu mantık kullanarak birleştirerek içerir. Örnek olarak, if var1 > 2 then newvar = 'A' elif var2 = 4 then newvar = 'B' için. Bu işlemler sonucu benim kümesindeki her kayıt için yeni bir sütun.
  3. Son olarak, disk üzerinde veri yapısı içine bu yeni sütunlar eklemek istiyorum. Adım 2, çapraz tablolara ve tanımlayıcı istatistikler ile veriyi ilginç bulmaya keşfetmek, sezgisel ilişkiler modeli için tekrarlamak istiyorum.
  4. Tipik bir proje dosyası genellikle 1GB. Dosyaları bir satır tüketici veri kaydı oluşur böyle bir şekilde düzenlenir. Her satır, her kayıt için aynı sayıda sütun var. Bu her zaman böyle olacak.
  5. Yeni bir sütun oluştururken satır alt ederim Bu oldukça nadir görülür. Ancak, bana rapor oluşturma veya tanımlayıcı istatistikler oluşturulurken satırları alt etmek için oldukça yaygındır. Örneğin, işletmenin belirli bir satır için basit bir frekans oluşturmak istiyor olabilirim, bireysel kredi kartları demek. Bunu yapmak için, bu kayıtları iş hattı = rapor etmek istiyorum hangisi ek olarak perakende tek yeri seçmek istiyorum. Yeni bir sütun oluştururken, ancak veri her satır ve işlemleri için tek ihtiyacım olan sütunları çekmek istiyorum.
  6. Modelleme sürecinin her sütun analiz edip, bazı sonuç değişkeni ile ilginç ilişkileri arayın ve bu ilişkileri açıklayan yeni bileşik sütunlar oluşturmak gerekir. Ben keşfetmek sütunlar genellikle küçük ayarlar yapılır. Örneğin, diyelim ki 20 sütun sadece emlak değerleri ile ilgili bir dizi odaklanmak ve kredi varsaymak bunların nasıl varabilirim. O araştırdı ve yeni sütunlar oluşturulduktan sonra, ben daha sonra sütunların başka bir gruba taşımak, üniversite eğitimi demek, ve işlemi tekrarlayın. Ne yaptığımı verilerimi ve bazı sonuçlar arasındaki ilişkiyi açıklayan aday değişkenler yaratıyor. Bu sürecin sonunda, bu bileşik kolon denklem oluşturmak bazı öğrenme teknikleri uyguluyorum.

Hiç veri kümesi için bir satır eklemek isterim ki, bu nadirdir. Neredeyse her zaman yeni bir sütun (istatistik/makine öğrenme dilinde değişken veya özellikler) oluşturmak olacaktır.

CEVAP
10 Ocak 2013, PERŞEMBE


Ben düzenli olarak sadece bu şekilde veri gigabayt onlarca kullanın örneğin sorguları ile okudum, veri oluşturma ve geri Ekle o diskte saklamak için kullanabilirsiniz.

Verilerinizi saklamak için birkaç öneri the docs late in this thread okumaya değer.

Verilerinizi depolamak nasıl etkileyecek ayrıntılar gibi
Mümkün olduğunca fazla detay verin; ve eğer bir yapı geliştirmelerine yardımcı olabilirim.

  1. Veri boyutu, # satır, sütun, sütun çeşitleri; ekleme siz satır veya sütun sadece?
  2. Normal işlemler nasıl olacak. E. g. sütunlar üzerinde bir sorgu belirli satır ve sütun bir grup seçin, bir işlem (bellek), yeni sütunlar oluşturmak, bu kaydedin.
    (Oyuncak bir örnek vererek bize daha özel öneriler sunmak için izin verebilir.)
  3. Bu işlemden sonra, sonra ne yaparsınız? Adım 2 ad hoc, ya da tekrarlanabilir mi?
  4. Giriş düz dosyalar: Gb. kaç, kaba toplam boyutu Nasıl records tarafından düzenlenen bu örneğin? Her biri farklı alanları içerir, ya da tüm alanları ile bir dosya başına bazı kayıtlar var her dosyada mı?
  5. Hiç satır (kayıt) alt ölçütlere göre (örneğin alan satırları Bir ^ seçin . seçin musunuz 5)? ve o zaman bir şeyler yap, ya da sadece C kayıtları (ve sonra bir şeyler yapmak) tüm alanları A, B, seçmek mi?
  6. Musunuz 'iş' tüm sütunları (grup), ya da orada iyi bir oran bu olabilir yalnızca raporlar (örneğin senin almak istediğin verileri etrafında, ama gerek yok çekin o sütundaki explicity kadar kesin sonuçları saat)?

Çözüm

pandas at least 0.10.1 yüklü olduğundan emin olduğundan emin olun.

iterating files chunk-by-chunk multiple table queries okuyun.

Pytables satır-bilge ameliyat için sorgu şeydir) optimize edilmiş olduğundan, alanların her grup için bir tablo oluşturacağız. Bu şekilde daha kolay seçmek için küçük bir grup alanları (hangi iş ile büyük bir tablo, ama daha verimli yapmak bu şekilde... bence ebilmek muktedir düzeltme bu sınırlama geleceği... bu daha çok sezgisel neyse):
(Aşağıdaki yarı kod.)

import numpy as np
import pandas as pd

# create a store
store = pd.HDFStore('mystore.h5')

# this is the key to your storage:
#    this maps your fields to a specific group, and defines 
#    what you want to have as data_columns.
#    you might want to create a nice class wrapping this
#    (as you will want to have this map and its inversion)  
group_map = dict(
    A = dict(fields = ['field_1','field_2'..... ], dc = ['field_1'....'field_5']),
    B = dict(fields = ['field_10'......         ], dc = ['field_10']),
    .....
    REPORTING_ONLY = dict(fields = ['field_1000','field_1001'...], dc = []),

)

group_map_inverted = dict()
for g, v in group_map.items():
    group_map_inverted.update(dict([ (f,g) for f in v['fields'] ]))

Dosyaları okuma ve depolama (append_to_multiple yapar aslında yapmak) oluşturmak:

for f in files:
   # read in the file, additional options hmay be necessary here
   # the chunksize is not strictly necessary, you may be able to slurp each 
   # file into memory in which case just eliminate this part of the loop 
   # (you can also change chunksize if necessary)
   for chunk in pd.read_table(f, chunksize=50000):
       # we are going to append to each table by group
       # we are not going to create indexes at this time
       # but we *ARE* going to create (some) data_columns

       # figure out the field groupings
       for g, v in group_map.items():
             # create the frame for this group
             frame = chunk.reindex(columns = v['fields', copy = False)    

             # append it
             store.append(g, frame, index=False, data_columns = v['dc'])

Şimdi tüm tablolar dosyası (aslında olabilir mağaza onları ayrı dosyalar Eğer isterseniz, ki prob var Ekle dosya group_map, ama muhtemelen buna gerek yok).

Bu sütunlar ve yenilerini oluşturmak nasıl:

frame = store.select(group_that_I_want)
# you can optionally specify:
# columns = a list of the columns IN THAT GROUP (if you wanted to
#     select only say 3 out of the 20 columns in this sub-table)
# and a where clause if you want a subset of the rows

# do calculations on this frame
new_frame = cool_function_on_frame(frame)

# to 'add columns', create a new group (you probably want to
# limit the columns in this new_group to be only NEW ones
# (e.g. so you don't overlap from the other tables)
# add this info to the group_map
store.append(new_group, new_frame.reindex(columns = new_columns_created, copy = False), data_columns = new_columns_created)

Post_processing için hazır olduğunuzda:

# This may be a bit tricky; and depends what you are actually doing.
# I may need to modify this function to be a bit more general:
report_data = store.select_as_multiple([ groups_1, groups_2.....etc ], where =['field_1>0', 'field_1000=foo'], selector = group_1)

Hakkında data_columns, aslında tanımlamak gerek yokHERHANGİ birdata_columns; alt satır seçmek sütun dayalı sağlar. E. g. gibi bir şey

store.select(group, where = [ 'field_1000=foo', 'field_1001>0' ])

Nihai rapor oluşturma aşamasında (aslında bir veri sütunu biraz çok tanımlarsanız verimliliği etkileyebilecek diğer sütunlar dan ayrılmış olduğunu) size ilginç olabilir.

Sen de istersen:

  • alanların bir listesini alır bir işlev oluşturmak arar bu seçer ve elde edilen çerçeve olsun diye sonuçları birleştirir groups_map, sonra (bu select_as_multiple yapar aslında) grupları.Bu şekilde yapısı oldukça şeffaf olurdu.
  • bazı veri sütunları dizinlerde (satır gömmeyi çok daha hızlı yapar).
  • sıkıştırma etkinleştirin.

Sorularınız olduğunda bana haber ver!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ryan Ha

    Ryan Ha

    9 NİSAN 2006
  • SegaAmerica

    SegaAmerica

    5 Mart 2008
  • SoundHound

    SoundHound

    8 Mart 2006