Sadržaj:

Eksperimenti u naprednom bilježenju podataka (pomoću Pythona): 11 koraka
Eksperimenti u naprednom bilježenju podataka (pomoću Pythona): 11 koraka

Video: Eksperimenti u naprednom bilježenju podataka (pomoću Pythona): 11 koraka

Video: Eksperimenti u naprednom bilježenju podataka (pomoću Pythona): 11 koraka
Video: RTX 3090 Ti vs RTX 3060 Ultimate Showdown for Stable Diffusion, ML, AI & Video Rendering Performance 2024, Srpanj
Anonim
Eksperimenti u naprednom bilježenju podataka (pomoću Pythona)
Eksperimenti u naprednom bilježenju podataka (pomoću Pythona)

Postoji mnogo instrukcija za bilježenje podataka, pa kad sam htio izgraditi vlastiti projekt zapisivanja, pogledao sam uokolo u hrpu. Neki su bili dobri, neki ne toliko, pa sam odlučio uzeti neke bolje ideje i podnijeti vlastitu aplikaciju. To je rezultiralo naprednijim i kompliciranijim projektom nego što sam isprva očekivao. Jedan dio toga postao je niz eksperimenata u obradi podataka senzora. Ova instrukcija omogućuje vam isprobavanje istih ili sličnih eksperimenata.

(Možete pogledati cijeli kôd i preuzeti ga na: Kôd na GitHubu Možete pristupiti pregledu, možda u drugom prozoru, sa samo 2 klika)

Zapisivanje podataka obično uključuje sljedeće:

  • Prikupljanje podataka: Pročitajte neke podatke sa senzora. Često je ovo samo čitanje analogno -digitalnog pretvarača (ADC) na uređaju poput Arduina.
  • Obrada podataka: Prilikom čitanja ADC vrijednosti izlaz pretvarača obično se mora skalirati na prave jedinice. Možda će također biti potrebno učiniti neke prilagodbe za kalibriranje vrijednosti kako bi se ispravile greške senzora.
  • Filtriranje: Podaci obično sadrže malo šuma, to se može filtrirati tako da tražite signal u svojim podacima, a ne šum.
  • Pohrana podataka: Podaci se spremaju, možda u tekstualnu datoteku, možda u oblak. Podaci bi trebali preživjeti čak i ako nestane struje. Lako je uštedjeti previše podataka, imamo mali trik za smanjenje prostora za pohranu podataka.
  • Prikaz podataka: Metode pregleda vaših podataka, a ne zapisivanja podataka, ali ako ne prikazujete podatke na neki način, zašto ih prikupljati?
  • Daljinski pristup: Nije potrebno, ali lijepo ga je imati.

Većina instrukcija uključuje neke, ali ne sve gore navedene, ili ih čini na vrlo jednostavan način. Ovo uputstvo će riješiti 2 od često preskakanih problema s bilježenjem i kao bonus će vam dati način grafičkog prikaza vaših podataka bez korištenja usluge u oblaku. Možete upotrijebiti cijelu stvar ili izvući komadiće i izmiješati ih u vlastiti projekt.

Korak 1: Alati i materijali

Alati i materijali
Alati i materijali

Ovaj primjer je sav u Pythonu pa će se raditi na njemu, a komponente se mogu koristiti na gotovo svakom OS -u, uključujući Mac, PC, Linux i Raspberry Pi.

Dakle, za korištenje ovog instruktora sve što trebate je pokrenuto okruženje Python 3.6 i preuzmite priloženi kod. Nakon pokretanja koda koji sam postavio, možete ga izmijeniti za vlastite eksperimente. Kao što je uobičajeno s Pythonom, možda ćete morati dodati neke pakete/module kako bi sve funkcioniralo. Moje okruženje Spyder dolazi s gotovo svim potrebnim dijelovima (vidi: Grafički prikaz instrukcija s Python ekranom za struganje). Kada prvi put pokrenete program Watch for any messages, obavijestit će vas o svim dijelovima koji nedostaju u vašem okruženju.

Sljedeća dva koraka reći će vam kako izgraditi i pokrenuti vlastiti eksperiment, ali vjerojatno je bolje pričekati dok ne pokrenete uključene eksperimente prije nego što pokušate sami.

Da biste razumjeli kôd, morat ćete imati malo iskustva s objektno orijentiranim Pythonom, objašnjavajući da to izlazi iz okvira ovog uputstva, ali Google bi vam trebao pružiti pomoć koja vam može zatrebati.

Obratite pažnju na kôd: (Kôd na GitHub -u Možete pristupiti gledanju, možda u drugom prozoru, sa samo 2 klika) sada je u Pythonu 3.6, pa bi 3.6 bilo najbolje. Starija verzija koda nalazi se ovdje na donjim vezama.

Korak 2: Izgradnja eksperimenta

Izgradnja eksperimenta
Izgradnja eksperimenta

Postoje tri programska koraka (i linije) u izgradnji eksperimenta. Svaki eksperiment je funkcija u objektu LoggingSim u datoteci simulate_logging.py. Pogledajmo eksperiment 1 (samo prvi grafikon) koji ćemo izvesti u sljedećem koraku:

def_eksperiment_s_uzorcima_smjera (sam):

print "" "Eksperimentirajte s uzorcima Stopa gledajući različite stope uzorkovanja promjenom delte T" "" self.start_plot (plot_title = "Uzorke - dio 1/3: Delta T = 1.0") self.add_sensor_data (name = "dt = 1. ", amplitude = 1., noise_amp =.0, delta_t = 1., max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot ()

Svaki eksperiment je napisan kao vlastita funkcija pa imamo redak koji definira funkciju (def eksperiment …..)

Sljedeći redak bez komentara, (start_plot (….)) Stvara objekt za eksperiment i daje mu ime.

Sljedeća linija bez komentara, (add_sensor_data (…) podijeljena je u nekoliko redaka. Simulira senzor koji mjeri signal s potencijalno šumom i određenom obradom. Argumenti funkcije su sljedeći:

  • name: naziv stavljen na završni grafikon za identifikaciju podataka
  • amplitude: koliko je signal velik, uvijek ćemo koristiti amplitudu 1. u ovom uputstvu.
  • noise_amp: kolika je buka, 0. nema buke, počet ćemo ovdje.
  • delta_t: vrijeme između mjerenja, kontrolira brzinu uzorkovanja.
  • max_t: maksimalno vrijeme prikupljanja podataka, uvijek ćemo koristiti 10 u ovom uputstvu.
  • run_ave: obrada pomoću tekućeg prosjeka, 0 znači da nema obrade.
  • trigger_value: obrada pomoću okidanja, 0 znači da nema obrade

posljednji redak bez komentara, (self.show_plot ……) prikazuje grafikon.

Kako bismo stvari učinili malo kompliciranijima, u eksperimentu možete imati više linija na grafikonu ili više grafikona, to bi trebalo biti jasno iz sljedećih eksperimenata.

Korak 3: Izvođenje eksperimenta

Ovo je kôd za izvođenje eksperimenta. Kao i obično u Pythonu, nalazi se na kraju datoteke.

sim_logging = LoggingSim ()

sim_logging.experiment_with_sample_rates ()

Ovo su samo 2 retka:

  • Izradite simulator zapisivanja (LoggingSim ())
  • Pokreni ga (sim_logging.experiment_with_sample_rates ())

U preuzetom kodu imam još nekoliko redaka i komentara, to bi trebalo biti lako shvatiti.

Korak 4: Eksperiment: Brzina uzorkovanja

Eksperiment: Brzina uzorkovanja
Eksperiment: Brzina uzorkovanja
Eksperiment: Brzina uzorkovanja
Eksperiment: Brzina uzorkovanja
Eksperiment: Brzina uzorkovanja
Eksperiment: Brzina uzorkovanja

Simulator, kako je ovdje postavljen, uvijek daje lijepi glatki sinusni val amplitude 1. Za ovaj eksperiment ćemo se petljati sa brzinom uzorkovanja, prilagođenom delta_t, vremenskom razlikom između uzoraka. Nećemo imati buku ili drugu obradu. Kod koristi 3 brzine uzorkovanja (delta_t = 1,0, 0,1 i 0,01.) Budući da grafovi padaju jedan na drugi, eksperiment je postavljen za stvaranje 3 različita grafikona. Dobiveni grafikoni su slike za ovaj korak.

def_eksperiment_s_uzorcima_smjera (sam):

print "" "Eksperimentirajte sa uzorkovnim stopama Gledajući različite stope uzorkovanja promjenom delte T" "" self.start_plot (plot_title = "Ogledne brzine eksperimenta 1/3: Delta T = 1.0") self.add_sensor_data (name = "dt = 1. ", amplitude = 1., noise_amp =.0, delta_t = 1., max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot () # ------------- ----------------------------------- self.start_plot (plot_title = "Stope uzorka eksperimenta 2/3: Delta T = 0.1 ") self.add_sensor_data (name =" dt = 1. ", amplitude = 1., noise_amp =.0, delta_t = 0.1, max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot () # ------------------------------------------------ sebe.start_plot (plot_title = "Omjeri uzorka eksperimenta 3/3: Delta T = 0,01") self.add_sensor_data (name = "dt = 1.", amplitude = 1., noise_amp =.0, delta_t = 0.01, max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot ()

Da biste ga pokrenuli, koristite redak: sim_logging.experiment_with_sample_rates ()

Mogući zaključci:

  • Preniska stopa uzorkovanja je jako loša.
  • Visoke stope su često bolje.

(Kod Python 3.6 na GitHub -u donja veza na uputama, 2.7)

Korak 5: Eksperiment: Pokazivanje buke

Eksperiment: Pokazivanje buke
Eksperiment: Pokazivanje buke

U ovom eksperimentu zadržavamo isti signal, koristimo srednju frekvenciju uzorkovanja i imamo različite količine šuma (noise_amp =.0,.1, 1.0.) Pokrenite ga sa: sim_logging.experiment_showing_noise (). Izlaz je jedan graf s 3 linije.

Mogući zaključak:

Buka otežava gledanje signala, smanjite ga ako možete

Kod:

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

def eksperiment_showing_noise (self): print "" "Eksperiment prikazuje šum Gledajući različite količine šuma promjenom amplitude šuma." "" self.start_plot (plot_title = "Eksperiment prikazuje šum") self.add_sensor_data (name = "noise = 0.0 ", amplitude = 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", amplitude = 1., noise_amp = 1., delta_t =.1, max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot ()

Korak 6: Eksperiment: Smanjite buku pokretnim prosjekom

Eksperiment: Smanjite buku pokretnim prosjekom
Eksperiment: Smanjite buku pokretnim prosjekom
Eksperiment: Smanjite buku pokretnim prosjekom
Eksperiment: Smanjite buku pokretnim prosjekom

Pokretni prosjek (na primjer s duljinom 8) uzima zadnjih 8 mjerenja i prosjekuje ih. Ako je buka slučajna, nadamo se da će biti u prosjeku blizu 0. Pokrenite eksperiment s: sim_logging.experiment_showing_noise (). Ispišite jedan grafikon.

Mogući zaključci:

  • Pokretni prosjek uklanja većinu buke
  • Što je dulji pokretni prosjek, to je smanjenje buke veće
  • Dulji pokretni prosjek može smanjiti i iskriviti signal

Kod:

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

def Experiment_with_moving_average (self): print "" "Eksperimentirajte s MovingAverage Gledajući različite MovingAverage promjenom duljine. Svi imaju istu buku." "" # ------------------ ------------------------------ self.start_plot (plot_title = "MovingAverage-Part 1/2: No Moving Average") self.add_sensor_data (name = "ave len = 0", amplitude = 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 and 32") self.add_sensor_data (name = "ave len = 8", amplitude = 1., noise_amp =.1, delta_t =.1, max_t = 10., run_ave = 8, trigger_value = 0) self.add_sensor_data (name = "ave len = 32", amplitude = 1., noise_amp =.1, delta_t =.1, max_t = 10., run_ave = 32, trigger_value = 0) self.show_plot ()

Korak 7: Eksperiment: pomični prosjek i brzina uzorkovanja

Eksperiment: pomični prosjek i brzina uzorkovanja
Eksperiment: pomični prosjek i brzina uzorkovanja

U ovom eksperimentu uspoređujemo sirovi signal sa šumom i 2 različite varijacije smanjenja šuma.

  1. Srednja stopa uzorkovanja i srednje tekući prosjek
  2. Velika stopa uzorkovanja i veliki prosječni trajanje

Pokrenite ga sa: sim_logging …… Ispis je jedan grafikon. Mislim da je jasno da #2 bolje radi na smanjenju buke pa bismo mogli zaključiti sljedeće:

Visoka stopa uzorkovanja i dugotrajni prosjek su dobri

Ali morate imati na umu da postoji trošak. #2 zahtijeva puno više obrade i rezultira spremanjem mnogo više podataka. Troškovi mogu, ali i ne moraju biti vrijedni. U sljedećem pokusu dodat ćemo okidač, uređaj za smanjenje količine pohranjenih podataka.

Kod:

def_eksperimenta_s_mjerljivim_srednjim_i_smjerom_smjera (samo):

print "" "Eksperimentirajte s pomičnim prosjekom i brzinom uzorkovanja, dt, mijenjajte prosjek" "" # ---------------------------- -------------------- self.start_plot (plot_title = "Pokretni prosjek i brzina uzorkovanja") self.add_sensor_data (name = "dt =.1 ra = 0 trig = 0 ", amplitude = 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 ", amplitude = 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", amplitude = 1., noise_amp =.1, delta_t =.01, max_t = 10., run_ave = 100, trigger_value = 0) self.show_plot ()

Korak 8: Eksperiment: Zapisivanje s okidačem

Eksperiment: Zapisivanje s okidačem
Eksperiment: Zapisivanje s okidačem

U ovom eksperimentu dodajemo okidač. Prvo, što mislim pod okidačem? Okidač je tehnika u kojoj prikupljamo podatke, ali ih spremamo samo nakon što se neka varijabla promijenila za značajnu količinu. U tim sam pokusima stavio okidač na varijablu vrijeme (os x). Korištenjem okidača mogu uzeti brzu količinu podataka iz brzog uzorkovanja i smanjiti je na razumniju količinu podataka. Posebnost je korisna s velikom stopom uzorkovanja i dugim prosjekom.

Uzeo sam liniju #2 iz prošlog eksperimenta koja je bila "dobra" i dodao okidač. Pokrenite ga sa: sim_logging …… Izlaz je jedan grafikon, x linija.

Što se događa? Dobivamo "dobru" plohu s razumnom količinom podataka (isto kao #1). Bilo je nekih troškova u višoj obradi. Sveukupno, međutim, rezultati su približno isti kao #1 niža stopa uzorkovanja s manje filtriranja. Možete zaključiti:

  • Dugotrajni prosjek s okidanjem može dati dobro smanjenje buke uz razumne količine podataka.
  • Dodatna obrada možda neće dati toliko bolje rezultate i dolazi s cijenom.

Kod:

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

def expert_with_trigger (self): print "" "Eksperimentirajte s okidanjem, dt, pokrenite prosjek i pokrenite sve varijacije" "" # ----------------------- ------------------------- self.start_plot (plot_title = "Trigger 1/1-Triggering On") self.add_sensor_data (name = "dt =.1 ra = 10, trig = 0 ", amplituda = 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 ", amplituda = 1., noise_amp =.1, delta_t =.01, max_t = 10., run_ave = 100, trigger_value =.1) self.show_plot ()

=

Korak 9: Eksperiment: Zapisivanje s okidačem - glasnija buka

Eksperiment: Zapisivanje s okidačem - glasnija buka
Eksperiment: Zapisivanje s okidačem - glasnija buka

Uzmimo isti eksperiment kao posljednji korak i pojačamo buku. Pokrenite ga sa: sim_logging …… Izlaz je jedan grafikon, 2 retka.

Sada se dodatna obrada više isplati. Razumni zaključak ovdje bi mogao biti:

Odabir količine i vrste obrade za smanjenje šuma ovisi o vašem signalu i šumu

Kod:

def eksperiment_s_trigger_louder_noise (self):

print "" "Jača buka od prethodnog eksperimenta" "" self.start_plot (plot_title = "Eksperiment s bukom jačom bukom") self.add_sensor_data (name = "… dt =.1 ra = 10", amplitude = 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", amplituda = 1., noise_amp =.5, delta_t =.01, max_t = 10., run_ave = 100, trigger_value =.1) self.show_plot ()

Korak 10: Napravite vlastite eksperimente

Napravite vlastite eksperimente
Napravite vlastite eksperimente

Nadam se da ćete u ovom trenutku vidjeti da tehnike u ovom uputstvu mogu biti korisne u bilježenju podataka, ali da se također moraju koristiti s malo razmišljanja. Eksperimentiranje s njima može pomoći u tom procesu.

Neke napomene o pokusima i stvarima na koje biste mogli obratiti pažnju:

  • Sinusni valovi nisu jedina zanimljiva vrsta signala, isprobajte druge, druge valove ili rampe ili…..
  • Za buku sam koristio normalnu distribuciju, postoji toliko mnogo vrsta buke; trebali biste uzeti u obzir druge
  • Trčanje prosjeka je jednostavna, ali ne i jedina metoda za promatranje buke

Napomena: bilježenje slika s Wikipedije.

Korak 11: Upotreba tehnika u vašem softveru za bilježenje

Korištenje tehnika u vašem softveru za bilježenje
Korištenje tehnika u vašem softveru za bilježenje

Moj kôd je objektno orijentiran, a obrada za trčanje prosjeka i okidač može se jednostavno kopirati u vaše Python okruženje i zatim koristiti. Objekti su:

  • DataTrigger u data_trigger.py
  • MovingAverage u moving_average.py

Moj glavni objekt LoggingSim u simulate_logging.py trebao bi vam dati dobar primjer kako ga koristiti. Ako koristite drugi jezik, možete pročitati moj kôd i implementirati ga na svom jeziku.

Ovaj kôd može vašem projektu omogućiti bolje bilježenje podataka, pokušajte.

Gornji grafikon je iz grafikona Vaše solarne energije od strane russ_hensel koji koristi isti objekt prosječnog trčanja.

Preporučeni: