İçindekiler:

Gelişmiş Veri Günlüğü Deneyleri (Python Kullanarak): 11 Adım
Gelişmiş Veri Günlüğü Deneyleri (Python Kullanarak): 11 Adım

Video: Gelişmiş Veri Günlüğü Deneyleri (Python Kullanarak): 11 Adım

Video: Gelişmiş Veri Günlüğü Deneyleri (Python Kullanarak): 11 Adım
Video: 56 - Veri Temizleme Nedir ve Nasıl Yapılır? 2024, Kasım
Anonim
Gelişmiş Veri Günlüğü Denemeleri (Python Kullanarak)
Gelişmiş Veri Günlüğü Denemeleri (Python Kullanarak)

Çok sayıda veri kaydı talimatı var, bu yüzden kendime ait bir kayıt projesi oluşturmak istediğimde etrafa baktım. Bazıları iyiydi, bazıları pek değil, bu yüzden daha iyi fikirlerden bazılarını alıp kendi başvurumu yapmaya karar verdim. Bu, ilk başta beklediğimden hem daha gelişmiş hem de daha karmaşık bir projeyle sonuçlandı. Bunun bir kısmı, sensör verilerinin işlenmesinde bir dizi deney haline geldi. Bu talimat, aynı veya benzer deneyleri denemenizi sağlar.

(Kodların tamamını şuradan görüntüleyebilir ve indirebilirsiniz: Code at GitHub'da sadece 2 tıklama ile belki başka bir pencerede görüntülemeye başlayabilirsiniz)

Tipik olarak veri kaydı aşağıdakileri içerir:

  • Veri toplama: Bir sensörden bazı verileri okuyun. Genellikle bu, Arduino gibi bir cihazda analogdan dijitale dönüştürücüyü (ADC) okumaktır.
  • Veri işleme: Bir ADC değeri okunurken, dönüştürücü çıkışının normal olarak doğru birimlere ölçeklendirilmesi gerekir. Sensör hatalarını düzeltmek için değerleri kalibre etmek için bazı ayarlamalar yapılması da gerekebilir.
  • Filtreleme: Veriler genellikle bir miktar gürültü içerir, bu filtrelenebilir, böylece verilerinizdeki gürültüye değil sinyale bakabilirsiniz.
  • Veri depolama: Veriler, belki bir metin dosyasına, belki de buluta kaydedilir. Güç kesilse bile veriler hayatta kalmalıdır. Çok fazla veri kaydetmek kolaydır, veri depolama alanını azaltmak için küçük bir numaramız var.
  • Veri görüntüleme: Verilerinize bakma yöntemleri, gerçekten veri kaydı değil, ancak verilerin bir tür görüntüsünü yapmıyorsanız neden topluyorsunuz?
  • Uzaktan Erişim: Gerekli değil ama olması güzel.

Çoğu talimat, yukarıdakilerin tümünü değil, bazılarını içerir veya bunları çok basit bir şekilde yapar. Bu talimat, sıklıkla atlanan günlük kaydı sorunlarından 2'sini ele alacak ve bir bonus olarak, bir bulut hizmeti kullanmadan verilerinizin grafiğini çıkarmanın bir yolunu sağlayacaktır. Her şeyi kullanabilir ya da küçük parçaları çekip kendi projenize dönüştürebilirsiniz.

Adım 1: Araçlar ve Malzemeler

Araçlar ve Malzemeler
Araçlar ve Malzemeler

Bu örneğin tamamı Python'dadır, bu nedenle çalışır ve bileşenler Mac, PC, Linux ve Raspberry Pi dahil olmak üzere hemen hemen tüm işletim sistemlerinde kullanılabilir.

Bu nedenle, bu talimatı kullanmak için tek ihtiyacınız olan, çalışan bir Python 3.6 ortamı ve ekli kodu indirin. Kurduğum kodu çalıştırdıktan sonra kendi deneyleriniz için değiştirebilirsiniz. Python'da olduğu gibi, her şeyin çalışmasını sağlamak için bazı paketler/modüller eklemeniz gerekebilir. Spyder ortamım hemen hemen tüm gerekli parçalarla birlikte gelir (bkz: Python Ekran Kazıma ile Eğitilebilir Görünümleri Grafik). Herhangi bir hata mesajı için watch'u ilk çalıştırdığınızda, ortamınızdaki eksik parçalar hakkında size bilgi verirler.

Sonraki iki adım size kendi denemenizi nasıl oluşturup çalıştıracağınızı söyleyecektir, ancak kendi denemenizi denemeden önce dahil edilen denemeleri çalıştırmanızı beklemek muhtemelen daha iyidir.

Kodu anlamak için nesne yönelimli Python ile biraz deneyim sahibi olmanız gerekecek, bunun bu talimatın kapsamı dışında olduğunu açıklayın, ancak Google size ihtiyaç duyabileceğiniz her türlü yardımı sağlamalıdır.

Kodu not edin: (Kod GitHub'da, belki başka bir pencerede, sadece 2 tıklamayla görüntüleyebilirsiniz) şimdi Python 3.6'dadır, bu nedenle 3.6'ya sahip olmak en iyisidir. Kodun eski sürümü aşağıdaki bağlantılarda burada.

2. Adım: Bir Deney Oluşturma

Deney Oluşturma
Deney Oluşturma

Bir deney oluştururken üç programlama adımı (ve satırları) vardır. Her deney, simulate_logging.py dosyasındaki LoggingSim nesnesindeki bir işlevdir. Bir sonraki adımda çalıştıracağımız deney 1'e (sadece ilk grafik) bakalım:

def trial_with_sample_rates(self):

print """ Numune Oranları ile Deney Delta T'yi değiştirerek farklı numune oranlarına bakma self.start_plot(plot_title = "Örnek Oranları - Bölüm 1/3: Delta T = 1.0") self.add_sensor_data(name = "dt = 1.", genlik = 1., noise_amp =.0, delta_t = 1., max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot()

Her deney kendi fonksiyonu olarak yazılır, böylece fonksiyonu tanımlayan bir çizgimiz olur (def deney…..)

Sonraki, yorumsuz satır (start_plot(….), deney için nesneyi yaratır ve ona bir isim verir.

Sonraki, yorumsuz satır satırı, (add_sensor_data(…) birkaç satıra bölünmüştür. Potansiyel olarak gürültü ve bazı işlemlerle bir sinyali ölçen bir sensörü simüle eder. İşlev argümanları aşağıdaki gibidir:

  • isim: verileri tanımlamak için son grafiğe yazılan bir isim
  • genlik: sinyal ne kadar büyükse, bu talimatta her zaman 1 genliğini kullanacağız.
  • noise_amp: gürültü ne kadar büyük, 0. gürültü yok, buradan başlayacağız.
  • delta_t: ölçümler arasındaki süre, numune oranını kontrol eder.
  • max_t: veri topladığımız maksimum süre, bu talimatta her zaman 10 kullanacağız.
  • run_ave: çalışan bir ortalama kullanarak işleme, 0 işlem yok anlamına gelir.
  • trigger_value: tetikleme kullanılarak işlem yapılır, 0 işlem yapılmadığı anlamına gelir

son, yorumsuz satır (self.show_plot……) grafiği görüntüler.

İşleri biraz daha karmaşık hale getirmek için, bir grafikte birden çok çizgiye veya bir deneyde birden çok grafiğe sahip olabilirsiniz, bu, aşağıdaki deneylerden açıkça anlaşılmalıdır.

3. Adım: Bir Deneme Çalıştırma

Bu, bir deneme çalıştırmanın kodudur. Python'da olduğu gibi dosyanın sonuna yerleştirilir.

sim_logging = LoggingSim()

sim_logging.experiment_with_sample_rates()

Bu sadece 2 satır:

  • Bir günlük kaydı simülatörü oluşturun (LoggingSim())
  • Çalıştırın (sim_logging.experiment_with_sample_rates())

İndirilen kodda birkaç satır ve yorumum daha var, anlaması kolay olmalı.

Adım 4: Deney: Örnekleme Hızı

Deney: Örnek Oranı
Deney: Örnek Oranı
Deney: Örnek Oranı
Deney: Örnek Oranı
Deney: Örnek Oranı
Deney: Örnek Oranı

Simülatör, burada kurulduğu gibi, her zaman güzel bir düzgün sinüs dalgası genliği verir. Bu deney için, delta_t tarafından ayarlanan örnekleme hızıyla, örnekler arasındaki zaman farkıyla uğraşacağız. Gürültü veya başka bir işlemimiz olmayacak. Kod 3 örnek oranı kullanır (delta_t = 1.0, 0.1 ve 0.01.) Grafikler üst üste geldiğinden deney 3 farklı grafik üretecek şekilde ayarlanmıştır. Ortaya çıkan grafikler bu adımın görüntüleridir.

def trial_with_sample_rates(self):

print """ Numune Oranları ile Deney Delta T'yi değiştirerek farklı numune oranlarına bakma self.start_plot(plot_title = "Deney Numune Oranları 1/3: Delta T = 1.0") self.add_sensor_data(name = "dt = 1.", genlik = 1., noise_amp =.0, delta_t = 1., max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot() # ------------- ----------------------------------- self.start_plot(plot_title = "Deney Örnek Oranları 2/3: Delta T = 0.1") self.add_sensor_data(name = "dt = 1.", genlik = 1., noise_amp =.0, delta_t = 0.1, max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot() # ------------------------------------------------ öz.start_plot(plot_title = "Deney Örnek Oranları 3/3: Delta T = 0.01") self.add_sensor_data(name = "dt = 1.", genlik = 1., noise_amp =.0, delta_t = 0.01, max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot()

Çalıştırmak için şu satırı kullanın: sim_logging.experiment_with_sample_rates()

Olası sonuçlar:

  • Çok düşük bir örnekleme oranı gerçekten kötü.
  • Yüksek oranlar genellikle daha iyidir.

(GitHub'daki Python 3.6 Kodu aşağıdaki talimatlarda, 2.7'de)

Adım 5: Deney: Gürültü Gösterme

Deney: Gürültü Gösterme
Deney: Gürültü Gösterme

Bu deneyde aynı sinyali koruyoruz, orta örnekleme hızı kullanıyoruz ve farklı miktarlarda gürültüye sahibiz (noise_amp =.0,.1, 1.0.) Şununla çalıştırın: sim_logging.experiment_showing_noise(). Çıktı, 3 satırlı bir grafiktir.

Olası Sonuç:

Gürültü, sinyali görmeyi zorlaştırır, mümkünse azaltın

kod:

# ------------------------------------------------

def trial_showing_noise(self): print """ Gürültüyü gösteren deney Gürültü genliğini değiştirerek farklı gürültü miktarlarına bakarak. """ self.start_plot(plot_title = "Gürültü Gösteren Deney") self.add_sensor_data(name = "noise = 0.0 ", amplitüd = 1., noise_amp =.0, delta_t =.1, max_t = 10., run_ave = 0, trigger_value = 0) self.add_sensor_data(name = "noise = 0.1", amplitude = 1., noise_amp =. 1, delta_t =.1, max_t = 10., run_ave = 0, trigger_value = 0) self.add_sensor_data(name = "noise = 1.0", amplitüd = 1., noise_amp = 1., delta_t =.1, max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot()

Adım 6: Deney: Hareketli Ortalamayla Gürültüyü Azaltın

Deney: Hareketli Ortalamayla Gürültüyü Azaltın
Deney: Hareketli Ortalamayla Gürültüyü Azaltın
Deney: Hareketli Ortalamayla Gürültüyü Azaltın
Deney: Hareketli Ortalamayla Gürültüyü Azaltın

Hareketli bir ortalama (örneğin 8 uzunluklu) son 8 ölçümü alır ve bunların ortalamasını alır. Gürültü rastgele ise, ortalamanın 0'a yakın olacağını umuyoruz. Deneyi şu şekilde çalıştırın: sim_logging.experiment_showing_noise(). Bir grafik çıktısı alın.

Olası Sonuçlar:

  • Hareketli bir ortalama, gürültünün çoğunu ortadan kaldırır
  • Hareketli ortalama ne kadar uzun olursa, gürültü azaltma o kadar fazla olur
  • Daha uzun hareketli ortalama, sinyali azaltabilir ve bozabilir

kod:

# ------------------------------------------------

def trial_with_moving_average(self): print """ MovingAverage ile deneme Uzunluğu değiştirerek farklı MovingAverage'a bakma. Hepsinde aynı gürültü var. """ # ------------------ ------------------------------ self.start_plot(plot_title = "Hareketli Ortalama-Bölüm 1/2: Hareketli Ortalama Yok") self.add_sensor_data(name = "ave len=0", genlik = 1., noise_amp =.1, delta_t =.1, max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot() self.start_plot(plot_title = "MovingAverage-Part 2/2: Len 8 ve 32") self.add_sensor_data(name = "ave len=8", genlik = 1., noise_amp =.1, delta_t =.1, max_t = 10., run_ave = 8, trigger_value = 0) self.add_sensor_data(name = "ave len=32", genlik = 1., noise_amp =.1, delta_t =.1, max_t = 10., run_ave = 32, trigger_value = 0) self.show_plot ()

Adım 7: Deney: Hareketli Ortalama ve Örnekleme Hızı

Deney: Hareketli Ortalama ve Örnekleme Hızı
Deney: Hareketli Ortalama ve Örnekleme Hızı

Bu deneyde, ham sinyali gürültüyle ve gürültüyü azaltmada 2 farklı varyasyonu karşılaştırıyoruz.

  1. Orta örnekleme hızı ve orta çalışma ortalaması
  2. Yüksek örnekleme hızı ve yüksek uzunlukta çalışma ortalaması

Şununla çalıştırın: sim_logging…… Çıktı bir grafiktir. Sanırım #2'nin gürültüyü azaltmada daha iyi bir iş çıkardığı açık, bu yüzden şu sonuca varabiliriz:

Yüksek örnekleme hızı ve yüksek uzunluktaki çalışma ortalaması iyidir

Ancak bunun bir maliyeti olduğunu da unutmamalısınız. #2 çok daha fazla işlem gerektirir ve kaydedilecek çok daha fazla veriyle sonuçlanır. Maliyet buna değebilir veya değmeyebilir. Bir sonraki deneyde, depolanan veri miktarını azaltmak için bir tetikleyici, bir cihaz ekleyeceğiz.

kod:

def trial_with_moving_average_and_sample_rate(self):

print """ Hareketli Ortalama ve Örnekleme Hızı ile Deney, dt, çalışma ortalaması değişkendir """ # ---------------------------- -------------------- self.start_plot(plot_title = "Hareketli Ortalama ve Örnekleme Oranı") self.add_sensor_data(name = "dt=.1 ra=0 trig= 0", genlik = 1., noise_amp =.1, delta_t =.1, max_t = 10., run_ave = 0, trigger_value = 0) self.add_sensor_data(name = "dt=.1 ra=10 trig=0", genlik = 1., noise_amp =.1, delta_t =.1, max_t = 10., run_ave = 10, trigger_value = 0) self.add_sensor_data(name = "dt=.01 ra=100 trig=0", amplitüd = 1., noise_amp =.1, delta_t =.01, max_t = 10., run_ave = 100, trigger_value = 0) self.show_plot()

8. Adım: Deney: Tetikleyiciyle Günlüğe Kaydetme

Deney: Tetikleyiciyle Günlüğe Kaydetme
Deney: Tetikleyiciyle Günlüğe Kaydetme

Bu deneyde bir tetikleyici ekliyoruz. İlk olarak, bir tetikleyici ile ne demek istiyorum? Tetikleyici, verileri topladığımız ancak yalnızca bazı değişkenler önemli miktarda değiştikten sonra kaydettiğimiz bir tekniktir. Bu deneylerde zaman (x ekseni) değişkenine bir tetikleyici koydum. Tetikleyiciyi kullanarak hızlı örneklemeden yüksek miktarda veri alıp daha makul miktarda veriye indirebilirim. Yüksek örnekleme oranları ve uzun süreli bir ortalama ile özellikle yararlıdır.

"İyi" olan ve bir tetikleyici ekleyen son deneyden 2. satırı aldım. Şununla çalıştırın: sim_logging…… Çıktı bir grafik, x satırdır.

Ne oluyor? Makul miktarda veri içeren "iyi" bir arsa elde ederiz (1 numaralı ile aynı). Daha yüksek işlemede bir miktar maliyet olmuştur. Bununla birlikte, genel olarak, sonuçlar daha az filtreleme ile daha düşük örnekleme oranıyla 1 numara ile hemen hemen aynıdır. Şu sonuca varabilirsiniz:

  • Tetikleme ile uzun süreli ortalama, makul miktarda veri ile iyi bir gürültü azaltma sağlayabilir.
  • Ekstra işlem, o kadar iyi sonuçlar vermeyebilir ve bir maliyeti vardır.

kod:

# ------------------------------------------------

def trial_with_trigger(self): print """ Tetikleme, dt, ortalama çalıştırma ve tüm değişkenleri tetikleme ile deney yapın """ # ----------------------- ------------------------- self.start_plot(plot_title = "Trigger 1/1 - Triggering On") self.add_sensor_data(name = "dt=.1 ra=10, trig =0", genlik = 1., noise_amp =.1, delta_t =.1, max_t = 10., run_ave = 10, trigger_value = 0) self.add_sensor_data(name = "dt=.01 ra=100, trig =.1", genlik = 1., noise_amp =.1, delta_t =.01, max_t = 10., run_ave = 100, trigger_value =.1) self.show_plot()

=

9. Adım: Deney: Tetikle Günlüğe Kaydetme - Daha Yüksek Gürültü

Deney: Tetikle Günlüğe Kaydetme - Daha Yüksek Gürültü
Deney: Tetikle Günlüğe Kaydetme - Daha Yüksek Gürültü

Son adımla aynı deneyi yapalım ve gürültüyü artıralım. Şununla çalıştırın: sim_logging…… Çıktı bir grafik, 2 satırdır.

Şimdi ekstra işlem daha değerli görünüyor. Burada makul bir sonuç şu olabilir:

Gürültü azaltma için işleme miktarını ve türünü seçmek, sinyalinize ve gürültünüze bağlıdır

kod:

def trial_with_trigger_louder_noise(self):

print """ Önceki deneyden daha yüksek gürültü """ self.start_plot(plot_title = "Tetikleyici-Yüksek Gürültülü Bir Deney") self.add_sensor_data(name = "…dt=.1 ra=10", genlik = 1., noise_amp =.5, delta_t =.1, max_t = 10., run_ave = 10, trigger_value = 0) self.add_sensor_data(name = "..dt=.01 ra=100 tv =.1", genlik = 1., noise_amp =.5, delta_t =.01, max_t = 10., run_ave = 100, trigger_value =.1) self.show_plot()

Adım 10: Kendi Deneylerinizi Yapın

Kendi Deneylerinizi Yapın
Kendi Deneylerinizi Yapın

Bu noktada, bu talimattaki tekniklerin veri kaydında yararlı olabileceğini, ancak bunların da biraz düşünülerek kullanılması gerektiğini göreceğinizi umuyorum. Onlarla deney yapmak bu sürece yardımcı olabilir.

Deneyler ve inceleyebileceğiniz şeyler hakkında bazı açıklamalar:

  • Sinüs dalgaları tek ilginç sinyal türü değildir, başkalarını deneyin, diğer dalgaları veya rampaları veya …..
  • Gürültü için normal bir dağılım kullandım, o kadar çok gürültü var ki; başkalarını düşünmelisin
  • Koşu ortalamaları, gürültüye bakmak için basit bir yöntemdir ancak tek yöntem değildir.

Not: Wikipedia'dan resimleri günlüğe kaydetme.

Adım 11: Günlük Kayıt Yazılımınızda Teknikleri Kullanma

Günlük Yazılımınızdaki Teknikleri Kullanma
Günlük Yazılımınızdaki Teknikleri Kullanma

Kodum nesne yönelimli ve ortalama çalıştırma ve tetikleme işlemleri Python ortamınıza kopyalanabilir ve ardından kullanılabilir. Nesneler şunlardır:

  • data_trigger.py içindeki DataTrigger
  • move_average.py içinde MovingAverage

Simulate_logging.py'deki ana nesnem LoggingSim, nasıl kullanılacağına dair size iyi bir örnek vermelidir. Başka bir dil kullanıyorsanız kodumu okuyabilir ve kendi dilinizde uygulayabilirsiniz.

Bu kod, projenize daha iyi veri kaydı sağlayabilir, deneyin.

Yukarıdaki grafik, aynı çalışan ortalama nesneyi kullanan russ_hensel'in Graph Your Solar Power'ından alınmıştır.

Önerilen: