तरंग विश्लेषण। भाग 3

परिचय


जब PyWavelets पुस्तकालय (एमआईटी लाइसेंस के तहत जारी एक मुफ्त खुला स्रोत सॉफ्टवेयर) का उपयोग करके सीडब्ल्यूटी विश्लेषण का आयोजन किया जाता है, तो परिणाम की कल्पना करने में समस्याएं होती हैं। डेवलपर्स द्वारा प्रस्तावित विज़ुअलाइज़ेशन परीक्षण कार्यक्रम निम्नलिखित सूची में दिखाया गया है:

लिस्टिंग
import pywt import numpy as np import matplotlib.pyplot as plt t = np.linspace(-1, 1, 200, endpoint=False) sig = np.cos(2 * np.pi * 7 * t) + np.real(np.exp(-7*(t-0.4)**2)*np.exp(1j*2*np.pi*2*(t-0.4))) widths = np.arange(1, 31) cwtmatr, freqs = pywt.cwt(sig, widths, 'cmor1-1.5') plt.imshow(cwtmatr, extent=[-1, 1, 1, 31], cmap='PRGn', aspect='auto', vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max()) # doctest: +SKIP plt.show() # doctest: +SKIP 

जब जटिल तरंगों के साथ काम करते हैं, उदाहरण के लिए 'cmor1-1.5' के साथ, कार्यक्रम एक त्रुटि पैदा करता है:

 File"C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\image.py", line 642, in set_data raise TypeError("Image data cannot be converted to float") TypeError: Image data cannot be converted to float 

यह त्रुटि, साथ ही आवश्यक समय रिज़ॉल्यूशन प्रदान करने के लिए स्केल (चौड़ाई) चुनने के साथ कठिनाइयाँ, विशेष रूप से नौसिखिए उपयोगकर्ताओं के लिए, सीडब्ल्यूटी विश्लेषण का अध्ययन करना मुश्किल बना देती है, जिसने मुझे एक शैक्षिक प्रकृति के इस लेख को लिखने के लिए प्रेरित किया।

इस प्रकाशन का उद्देश्य सरल और विशेष संकेतों के विश्लेषण के लिए नए स्केलोग्राम विज़ुअलाइज़ेशन मॉड्यूल के उपयोग पर विचार करना है, साथ ही साथ सामान्यीकरण विधियों, लॉगरिदमिक स्केलिंग और संश्लेषण का उपयोग करना है, जो समय श्रृंखला के विश्लेषण में अतिरिक्त जानकारी प्रदान करते हैं।

लेख ने प्रकाशन से जानकारी का उपयोग किया "डेटा विश्लेषण के लिए तरंगिका के लिए एक सौम्य परिचय" । प्रकाशन में दिए गए उदाहरणों की सूचियों में, त्रुटियों को ठीक किया जाता है, और उदाहरण की प्रत्येक सूची को उसके समाप्त रूप में लाया जाता है, जो इसे पिछले वाले के साथ परिचित होने के बिना उपयोग करने की अनुमति देता है। विशेष संकेतों के तरंग विश्लेषण के लिए, PyWavelets नमूना डेटाबेस के डेटा का उपयोग किया गया था।

एक तरंगिका स्केलोग्राम एक आयामी डेटा का दो-आयामी प्रतिनिधित्व है। समय एक्स अक्ष पर प्लॉट किया जाता है, और वाई अक्ष पर एक स्केल दिखाया जाता है - समय पर सिग्नल आयाम के अनुरूप सिग्नल के तरंगिका परिवर्तन का परिणाम एक्स। सिग्नल के ऐसे ग्राफिक डिस्प्ले का विश्लेषणात्मक मूल्य यह है कि वाई अक्ष पर समय रिज़ॉल्यूशन प्रदर्शित होता है, जो अतिरिक्त जानकारी देता है। संकेत के गतिशील गुणों के बारे में।

वेवलेट - सिंपल सिग्नल स्कैग्लोग्राम्स


1. गॉसियन लिफाफे के साथ कोसाइन तरंग (रिप्लेसमेंट वेवलेट्स। आप पैमाने पर समय संकल्प की निर्भरता का अध्ययन कर सकते हैं):

लिस्टिंग
 from numpy import* from pylab import* import scaleogram as scg import pywt #  ,        #       'cmor1-1.5' #scg.set_default_wavelet('cmor1-1.5') #scg.set_default_wavelet('cgau5') #scg.set_default_wavelet('cgau1') #scg.set_default_wavelet('shan0.5-2') #scg.set_default_wavelet('mexh') #    1  /  ns = 1024 time =arange(ns) scales = scg.periods2scales( arange(1, 40) ) p1=10; periodic1 = cos(2*pi/p1*time) * exp(-((time-ns/2)/200)**2) fig1, ax1 = subplots(1, 1, figsize=(6.9,2.9)); lines = ax1.plot(periodic1); ax1.set_xlim(0, len(time)) ax1.set_title("   ") fig1.tight_layout() ax2 = scg.cws(periodic1, scales=scales, figsize=(6.9,2.9)); txt = ax2.annotate("p1=%s"%p1, xy=(100, 10), bbox=dict(boxstyle="round4", fc="w")) tight_layout() print("    :", scg.get_default_wavelet(), "(", pywt.ContinuousWavelet(scg.get_default_wavelet()).family_name, ")") show() 


सिग्नल रूपांतरण के लिए वेवलेट फ़ंक्शन: cmor1-1.5 (कॉम्प्लेक्स मोरलेट वेवलेट्स)





आवधिक संकेत अब बिंदु Y = p1 पर एक क्षैतिज निरंतर पट्टी के रूप में प्रकट होता है, जिसकी तीव्रता आवधिक संकेत के आयाम के आधार पर भिन्न होती है।

पता लगाने में कुछ फ़िज़नेस है, चूंकि बैंडविड्थ शून्य के बराबर नहीं है, यह इस तथ्य के कारण है कि तरंगिका एक आवृत्ति का पता नहीं लगाती है, बल्कि एक बैंड है। यह प्रभाव तरंगिका बैंडविड्थ के साथ जुड़ा हुआ है।

2. तीन दालों को एक बढ़ती हुई अवधि के साथ क्रमिक रूप से जोड़ा जाता है (विभिन्न पैमानों पर समय-समय पर बदलाव पर विचार करने के लिए: बहु-रिज़ॉल्यूशन विश्लेषण)

लिस्टिंग
 from numpy import* import pandas as pd from pylab import* import scaleogram as scg #          #       'cmor1-1.5' #scg.set_default_wavelet('cmor1-1.5') #scg.set_default_wavelet('cgau5') #scg.set_default_wavelet('cgau1') #scg.set_default_wavelet('shan0.5-2') #scg.set_default_wavelet('mexh') ##    1  /  ns = 1024 time = arange(ns) scales = scg.periods2scales(arange(1, 40)) pulses = zeros(ns, dtype=float32) steps = linspace(0, ns, 8) periods = [10, 20, 40] for i in range(0,3): step_mask = (time > steps[i*2+1]) & (time < steps[i*2+2]) pulses += cos(2*pi/periods[i]*time) * step_mask fig1, ax1 = subplots(1, 1, figsize=(7,3)); lines = ax1.plot(pulses); ax1.set_xlim(0, len(time)); ax1.set_title("     "); ax1.set_xlabel("Time") fig1.tight_layout() ax2 = scg.cws(pulses, scales=scales, figsize=(7,3)) for i in range(0, 3): txt = ax2.annotate("p%d=%ds"%(i+1,periods[i]), xy=(steps[i*2]+20, periods[i]), bbox=dict(boxstyle="round4", fc="w")) ax2.plot(steps[i*2+1]*np.ones(2), ax2.get_ylim(), '-w', alpha=0.5) ax2.plot(steps[i*2+2]*np.ones(2), ax2.get_ylim(), '-w', alpha=0.5) tight_layout() show() 






आवेग उनकी आवधिकता के अनुरूप अपेक्षित स्थान Y में दिखाई देते हैं, वे आवृत्ति और समय में स्थानीय होते हैं। पट्टी की शुरुआत और अंत गति के अनुरूप हैं।
अवधि की लंबाई के साथ बैंडविड्थ तराजू। यह तरंगिका परिवर्तन की एक प्रसिद्ध संपत्ति है: जब पैमाने बढ़ता है, तो समय संकल्प कम हो जाता है। यह समय और आवृत्ति के बीच व्यापार बंद के रूप में भी जाना जाता है। जब आप इस प्रकार के स्पेक्ट्रोग्राम को देखते हैं, तो आप बहुत अधिक रिज़ॉल्यूशन विश्लेषण करते हैं।

3. एक ही समय में विभिन्न आवृत्तियों के तीन आवधिक दोलन (वेवलेट - विश्लेषण आवृत्ति के संकेत के घटकों को अलग करने में सक्षम है, यदि उनके अंतर महत्वपूर्ण हैं):

लिस्टिंग
 from numpy import* import pandas as pd from pylab import* import scaleogram as scg scg.set_default_wavelet('cmor1-1.5') #          #scg.set_default_wavelet('cgau5') #scg.set_default_wavelet('cgau1') #scg.set_default_wavelet('shan0.5-2') #scg.set_default_wavelet('mexh') ##    1  /  ns = 1024 time = arange(ns) scales = scg.periods2scales(arange(1, 40)) allwaves = np.zeros(ns, dtype=np.float32) periods = [10, 20, 40] for i in range(0,3): allwaves += cos(2*np.pi/periods[i]*time) fig1, ax1 = subplots(1, 1, figsize=(6.5,2)); lines = ax1.plot(allwaves); ax1.set_title("  ") ax1.set_xlim(0, len(time)); ax1.set_xlabel("") fig1.tight_layout() ax2 = scg.cws(allwaves, scales=scales, figsize=(7,2)) tight_layout() show() 






4. एक गैर-साइनसॉइडल आवधिक संकेत (पहले से माना जाता है कि 30 सेकंड की अवधि के साथ एक त्रिकोणीय लहर संकेत के तरंग परिवर्तनों में अंतर):

लिस्टिंग
 from numpy import* from pylab import* import scipy.signal import scaleogram as scg scg.set_default_wavelet('cmor1-1.5') #          #scg.set_default_wavelet('cgau5') #scg.set_default_wavelet('cgau1') #scg.set_default_wavelet('shan0.5-2') #scg.set_default_wavelet('mexh') ##    1  /  ns = 1024 time = arange(ns) scales = scg.periods2scales(arange(1, 40)) ptri = 30.0 # period in samples raising = 0.8 # fraction of the period raising triangle = scipy.signal.sawtooth(time/ptri*2*pi, raising) # plot the signal fig1, ax1 = subplots(1, 1, figsize=(7,3)); lines = ax1.plot(triangle); ax1.set_xlim(0, len(time)) ax1.set_title("triangle wave increasing 80% of the time with a 30s period") fig1.tight_layout() # and the scaleogram ax2 = scg.cws(triangle, scales=scales, figsize=(7,3)); txt = ax2.annotate("first harmonic", xy=(100, 30), bbox=dict(boxstyle="round4", fc="w")) txt = ax2.annotate("second harmonic", xy=(100, 15), bbox=dict(boxstyle="round4", fc="w")) tight_layout() show() 






एक बड़ा बैंड पहला हार्मोनिक है। दूसरा हार्मोनिक पहले हार्मोनिक की अवधि के आधे मूल्य पर बिल्कुल दिखाई देता है। यह आवधिक गैर-साइनसॉइडल संकेतों के लिए अपेक्षित परिणाम है। फजी ऊर्ध्वाधर तत्व दूसरे हार्मोनिक के आसपास दिखाई देते हैं, जो कमजोर है और त्रिकोणीय तरंग के लिए पहले का 1/4 आयाम है।

5. चिकनी आवेग (गाऊसी) वास्तविक डेटा संरचनाओं के समान हैं। (यह उदाहरण दिखाता है कि समय के साथ स्थानीयकृत सिग्नल परिवर्तनों का पता लगाने के लिए तरंग विश्लेषण का उपयोग कैसे किया जाता है):

विभिन्न सिग्मा मूल्यों के साथ चिकनी दालों की एक श्रृंखला:

  • 2 cdot sigma1=2
  • 2 cdot sigma2=10
  • 2 cdot sigma3=$2

पल्स चौड़ाई:

  •  omega1=2
  •  omega2=$2
  •  omega3=$10

लिस्टिंग
 from numpy import* from pylab import* import scaleogram as scg scg.set_default_wavelet('cmor1-1.5') #          #scg.set_default_wavelet('cgau5') #scg.set_default_wavelet('cgau1') #scg.set_default_wavelet('shan0.5-2') #scg.set_default_wavelet('mexh') ##    1  /  ns = 1024 time = arange(ns) scales = scg.periods2scales(arange(1, 40)) #       s1=1; s2=5; s3=10 events = [ns*0.1, ns*0.3, ns*0.7] bumps = exp(-((time-events[0])/s1)**2) + exp(-((time-events[1])/s2)**2) + \ exp(-((time-events[2])/s3)**2) #      w1=1; w2=5; w3= 50 steps = ((time > events[0]-w1) & (time < events[0]+w1)) + \ ((time > events[1]-w2) & (time < events[1]+w2)) + \ ((time > events[2]-w3) & (time < events[2]+w3)) #   fig1, (ax1, ax2) = subplots(1, 2, figsize=(11, 2)); ax1.set_title("Bumps"); ax2.set_title("Steps") lines = ax1.plot(bumps); ax1.set_xlim(0, len(time)) lines = ax2.plot(steps); ax2.set_xlim(0, len(time)) fig1.tight_layout() #   scales_bumps = scg.periods2scales(arange(1, 120, 2) ) fig2, (ax3, ax4) = subplots(1, 2, figsize=(14,3)); ax3 = scg.cws(bumps, scales=scales_bumps, ax=ax3) ax4 = scg.cws(steps, scales=scales_bumps, ax=ax4) for bmpw, stepw in [(2*s1, 2*w1), (2*s2,2*w2), (2*s3, 2*w3)]: ax3.plot(ax3.get_xlim(), bmpw*ones(2), 'w-', alpha=0.5) ax4.plot(ax4.get_xlim(), stepw*ones(2), 'w-', alpha=0.5) fig2.tight_layout() show() 






असतत दालें सियालोग्राम पर शंक्वाकार संरचनाएं बनाती हैं, जिन्हें प्रभाव शंकु के रूप में भी जाना जाता है। चिकनी आवेग (गाऊसी) वास्तविक डेटा संरचनाओं के समान हैं और बड़े पैमाने पर शंकु का विस्तार करते हैं। क्षैतिज गाइड लाइनें लगभग समय अवधि (2 एस, 10 एस, 20 एस) के अनुरूप हैं। इसलिए, पल्स एक अवधि के साथ आवधिक संकेत के समान है।

6. शोर (सियालोग्राम पर प्रदर्शन शोर):

लिस्टिंग
 from numpy import* from pylab import* import scaleogram as scg import random scg.set_default_wavelet('cmor1-1.5') #          #scg.set_default_wavelet('cgau5') #scg.set_default_wavelet('cgau1') #scg.set_default_wavelet('shan0.5-2') #scg.set_default_wavelet('mexh') #    1  /  ns = 1024 time =arange(ns) scales = scg.periods2scales( arange(1, 40) ) noise =random.sample(range(ns), ns) fig1, ax1 = plt.subplots(1, 1, figsize=(6.2,2)); ax1.set_title("  ") lines = ax1.plot(time, noise) ax1.set_xlim(0, ns) fig1.tight_layout() ax2 = scg.cws(noise, scales=scales, figsize=(7,2)) tight_layout() show() 






शोर को आमतौर पर तत्वों के एक सेट के रूप में प्रदर्शित किया जाता है, और कुछ अनियमितताएं वास्तविक डेटा की वस्तुओं की तरह दिख सकती हैं, इसलिए वास्तविक डेटा का उपयोग करते समय, आपको सावधान रहना चाहिए और यदि आवश्यक हो, तो शोर के स्तर की जांच करें। कार्यक्रम शुरू होने पर हर बार ऊपरी शेड्यूल अलग होगा।

विशेष सिग्नल के वेवलेट स्केग्लोग्राम्स


PyWavelets डेटाबेस में बीस विशेष तरंगिका परिवर्तन संकेत शामिल हैं जो अध्ययन और विकास दोनों के लिए उपयोगी होंगे। इसलिए, मैं एक सूची दूंगा जो आपको सभी बीस संकेतों का तरंगिका विश्लेषण करने की अनुमति देता है:

लिस्टिंग
 #!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np from pylab import* import scaleogram as scg import pywt signals = pywt.data.demo_signal('list') signal_length=1024 for signal in signals: if signal in ['Gabor', 'sineoneoverx']: x = pywt.data.demo_signal(signal) else: x = pywt.data.demo_signal(signal, signal_length) times=[] signals=[] for time, sig in enumerate(x.real): times.append(time) signals.append(sig) scg.set_default_wavelet('cmor1-1.5') scales = scg.periods2scales( arange(1, 40) ) fig1, ax1 = subplots(1, 1, figsize=(6.9,2.9)); lines = ax1.plot(signals); ax1.set_xlim(0, len(times)) ax1.set_title("%s"%signal) fig1.tight_layout() ax2 = scg.cws(signals, scales=scales, figsize=(6.9,2.9)); tight_layout() show() 


मैं डॉपलर सिग्नल के तरंगिका परिवर्तन का केवल एक परिणाम दूंगा:





सरल और विशेष संकेतों की सबसे आम किस्मों पर विचार किया जाता है, जो हमें समय श्रृंखला विश्लेषण की कुछ समस्याओं को हल करने के लिए स्केलोग्राम का उपयोग करने के लिए स्विच करने की अनुमति देता है।

वेवलेट टाइमलाइन स्केलोग्राम


1. यूएसए 1969-2008 में सीडीसी प्रजनन डेटा (प्रजनन डेटा में आवधिक विशेषताएं शामिल हैं, दोनों वार्षिक पैमाने पर और एक छोटे स्तर पर):

लिस्टिंग
 import pandas as pd import numpy as np from pylab import* import scaleogram as scg from pandas.plotting import register_matplotlib_converters register_matplotlib_converters() #          #    'cmor1-1.5' #scg.set_default_wavelet('cmor1-1.5') #scg.set_default_wavelet('cgau5') #scg.set_default_wavelet('cgau1') #scg.set_default_wavelet('shan0.5-2') #scg.set_default_wavelet('mexh') #   df = df[(df.day>=1) & (df.day<=31) & (df.births.values > 1000)] #   datetime = pd.to_datetime(df[['year', 'month', 'day']], errors='coerce') df.insert(0, 'datetime', datetime) datetime_lim = [ df.datetime.min(), df.datetime.max() ] years_lim = [ df.datetime.min().year, df.datetime.max().year ] births = df[['datetime', 'births']].groupby('datetime').sum().squeeze() def set_x_yearly(ax, days, start_year=1969): xlim = (np.round([0, days]) / 365).astype(np.int32) ticks = np.arange(xlim[0], xlim[1]) ax.set_xticks(ticks*365) ax.set_xticklabels(start_year + ticks) fig = figure(figsize=(12,2)) lines = plot(births.index, births.values/1000, '-') xlim(datetime_lim) ylabel("Nb of birthes [k]"); title("Total births per day in the US (CDC)"); xlim = xlim() ax = scg.cws(births, figsize=(13.2, 4), xlabel="Year", ylabel="Nb of Day") set_x_yearly(ax, len(births)) show() 






एक क्षैतिज रेखा लगभग 7 दिनों की आवृत्ति के साथ दिखाई देती है। उच्च मान पैमाने की सीमाओं के पास दिखाई देते हैं, जो तरंग प्रसंस्करण का सामान्य व्यवहार है। इन प्रभावों को अच्छी तरह से प्रभाव के शंकु के रूप में जाना जाता है, यही वजह है कि एक (वैकल्पिक) मुखौटा इस क्षेत्र को ओवरले करता है।

2. सामान्यीकरण (औसत मान को हटाते हुए - जन्मों_नमूर्त = जन्मों-जन्मों का) () अनिवार्य है, अन्यथा डेटा सीमाओं को चरणों के रूप में माना जाता है जो बहुत सारे झूठे शंकु के आकार के निरोध बनाते हैं):

लिस्टिंग
 import pandas as pd import numpy as np from pylab import* import scaleogram as scg from pandas.plotting import register_matplotlib_converters register_matplotlib_converters() #          #    'cmor1-1.5' #scg.set_default_wavelet('cmor1-1.5') #scg.set_default_wavelet('cgau5') #scg.set_default_wavelet('cgau1') #scg.set_default_wavelet('shan0.5-2') #scg.set_default_wavelet('mexh') df = pd.read_csv("births.csv") #   df = df[(df.day>=1) & (df.day<=31) & (df.births.values > 1000)] #   datetime = pd.to_datetime(df[['year', 'month', 'day']], errors='coerce') df.insert(0, 'datetime', datetime) datetime_lim = [ df.datetime.min(), df.datetime.max() ] years_lim = [ df.datetime.min().year, df.datetime.max().year ] births = df[['datetime', 'births']].groupby('datetime').sum().squeeze() def set_x_yearly(ax, days, start_year=1969): xlim = (np.round([0, days]) / 365).astype(np.int32) ticks = np.arange(xlim[0], xlim[1]) ax.set_xticks(ticks*365) ax.set_xticklabels(start_year + ticks) births_normed = births-births.mean() ax = scg.cws(births_normed, figsize=(13.2, 4), xlabel="Year", ylabel="Nb of Day") set_x_yearly(ax, len(births)) show() 




3. आयाम में पैमाने में परिवर्तन (वार्षिक वस्तुओं को देखने के लिए, पी 2 अक्ष का उपयोग करके ) ( Y अक्ष निर्दिष्ट किया गया है)।

लिस्टिंग
 import pandas as pd import numpy as np from pylab import* import scaleogram as scg from pandas.plotting import register_matplotlib_converters register_matplotlib_converters() #          #    'cmor1-1.5' #scg.set_default_wavelet('cmor1-1.5') #scg.set_default_wavelet('cgau5') #scg.set_default_wavelet('cgau1') #scg.set_default_wavelet('shan0.5-2') #scg.set_default_wavelet('mexh') df = pd.read_csv("births.csv") #   df = df[(df.day>=1) & (df.day<=31) & (df.births.values > 1000)] #   datetime = pd.to_datetime(df[['year', 'month', 'day']], errors='coerce') df.insert(0, 'datetime', datetime) datetime_lim = [ df.datetime.min(), df.datetime.max() ] years_lim = [ df.datetime.min().year, df.datetime.max().year ] births = df[['datetime', 'births']].groupby('datetime').sum().squeeze() def set_x_yearly(ax, days, start_year=1969): xlim = (np.round([0, days]) / 365).astype(np.int32) ticks = np.arange(xlim[0], xlim[1]) ax.set_xticks(ticks*365) ax.set_xticklabels(start_year + ticks) births_normed = births-births.mean() scales = scg.periods2scales(np.arange(1, 365+100, 3)) ax = scg.cws(births_normed, scales=scales, figsize=(13.2, 5), xlabel="Year", ylabel="Nb of Day", clim=(0, 2500)) set_x_yearly(ax, len(births)) show() 




रंग मानचित्र (Y अक्ष) की आयाम सीमा अब चढ़ाई = (0.2500) से निर्धारित होती है। दोलनों के आयाम के लिए सटीक मान तरंग पर निर्भर करता है, लेकिन वास्तविक मूल्य के क्रम के करीब रहेगा। यह बहुत बेहतर है, अब हम बहुत अच्छी तरह से वार्षिक भिन्नता, साथ ही लगभग 6 महीने देखते हैं!

4. लघुगणक पैमाने का उपयोग करना (एक ही समय में छोटे और बड़े समय को देखने में सक्षम होने के लिए, वाई अक्ष पर लघुगणकीय पैमाने का उपयोग करना बेहतर होता है। यह xscale = log विकल्प का उपयोग करके प्राप्त किया जाता है।)

लिस्टिंग
 import pandas as pd import numpy as np from pylab import* import scaleogram as scg from pandas.plotting import register_matplotlib_converters register_matplotlib_converters() #          #    'cmor1-1.5' #scg.set_default_wavelet('cmor1-1.5') #scg.set_default_wavelet('cgau5') #scg.set_default_wavelet('cgau1') #scg.set_default_wavelet('shan0.5-2') #scg.set_default_wavelet('mexh') df = pd.read_csv("births.csv") #   df = df[(df.day>=1) & (df.day<=31) & (df.births.values > 1000)] #   datetime = pd.to_datetime(df[['year', 'month', 'day']], errors='coerce') df.insert(0, 'datetime', datetime) datetime_lim = [ df.datetime.min(), df.datetime.max() ] years_lim = [ df.datetime.min().year, df.datetime.max().year ] births = df[['datetime', 'births']].groupby('datetime').sum().squeeze() def set_x_yearly(ax, days, start_year=1969): xlim = (np.round([0, days]) / 365).astype(np.int32) ticks = np.arange(xlim[0], xlim[1]) ax.set_xticks(ticks*365) ax.set_xticklabels(start_year + ticks) births_normed = births-births.mean() scales = scg.periods2scales(np.arange(1, 365+100, 3)) ax = scg.cws(births_normed, scales=scales, figsize=(13.2, 4), xlabel="Year", ylabel="Nb of Day", clim=(0,2500), yscale='log') set_x_yearly(ax, len(births)) print("Number of available days:", len(births_normed)) show() 




परिणाम बहुत बेहतर है, लेकिन अब पीरियड्स के कम मूल्यों पर पिक्सल वाई अक्ष के साथ बढ़े हुए हैं।

5. एक लघुगणकीय पैमाने पर एक समान वितरण (एक पैमाने पर एक समान वितरण प्राप्त करने के लिए, अवधि मान समान रूप से वितरित किए जाने चाहिए और फिर पैमाने मानों में परिवर्तित किए जाते हैं, जैसा कि नीचे दिखाया गया है :):

लिस्टिंग
 import pandas as pd import numpy as np from pylab import* import scaleogram as scg from pandas.plotting import register_matplotlib_converters register_matplotlib_converters() #          #    'cmor1-1.5' #scg.set_default_wavelet('cmor1-1.5') #scg.set_default_wavelet('cgau5') #scg.set_default_wavelet('cgau1') #scg.set_default_wavelet('shan0.5-2') #scg.set_default_wavelet('mexh') df = pd.read_csv("births.csv") #   df = df[(df.day>=1) & (df.day<=31) & (df.births.values > 1000)] #   datetime = pd.to_datetime(df[['year', 'month', 'day']], errors='coerce') df.insert(0, 'datetime', datetime) datetime_lim = [ df.datetime.min(), df.datetime.max() ] years_lim = [ df.datetime.min().year, df.datetime.max().year ] births = df[['datetime', 'births']].groupby('datetime').sum().squeeze() def set_x_yearly(ax, days, start_year=1969): xlim = (np.round([0, days]) / 365).astype(np.int32) ticks = np.arange(xlim[0], xlim[1]) ax.set_xticks(ticks*365) ax.set_xticklabels(start_year + ticks) births_normed = births-births.mean() #        log-Y-axis :-) scales = scg.periods2scales(np.logspace(np.log10(2), np.log10(365*3), 200)) #  CWT  ,       cwt = scg.CWT(births_normed, scales=scales) ax = scg.cws(cwt, figsize=(13.2, 4), xlabel="Year", ylabel="Nb of Day", clim=(0,2500), yscale='log') set_x_yearly(ax, len(births)) bboxf = dict(boxstyle="round", facecolor="y", edgecolor="0.5") arrowpropsf = dict(facecolor='yellow', shrink=0.05) text = ax.annotate("unusual\nfeature", xy=(365*6, 15), xytext=(365*3, 50), bbox=bboxf, arrowprops=arrowpropsf) show() 




हम सभी पैमानों पर संकेत परिवर्तन देख सकते हैं। सियालोग्राम प्रत्येक वर्ष समान अवधि में दिखाई देता है।

6. समयरेखा का हाइलाइटिंग हिस्सा (कलाकृतियों या लापता डेटा की खोज में टाइमलाइन के निशान के बीच मध्यवर्ती डेटा की जाँच करना।):

लिस्टिंग
 import pandas as pd import numpy as np from pylab import* import scaleogram as scg import pywt from pandas.plotting import register_matplotlib_converters register_matplotlib_converters() #          #    'cmor1-1.5' #scg.set_default_wavelet('cmor1-1.5') #scg.set_default_wavelet('cgau5') #scg.set_default_wavelet('cgau1') #scg.set_default_wavelet('shan0.5-2') #scg.set_default_wavelet('mexh') df = pd.read_csv("births.csv") #   df = df[(df.day>=1) & (df.day<=31) & (df.births.values > 1000)] #   datetime = pd.to_datetime(df[['year', 'month', 'day']], errors='coerce') df.insert(0, 'datetime', datetime) datetime_lim = [ df.datetime.min(), df.datetime.max() ] years_lim = [ df.datetime.min().year, df.datetime.max().year ] births = df[['datetime', 'births']].groupby('datetime').sum().squeeze() def set_x_yearly(ax, days, start_year=1969): xlim = (np.round([0, days]) / 365).astype(np.int32) ticks = np.arange(xlim[0], xlim[1]) ax.set_xticks(ticks*365) ax.set_xticklabels(start_year + ticks) births_normed = births-births.mean() #        log-Y-axis :-) scales = scg.periods2scales(np.logspace(np.log10(2), np.log10(365*3), 200)) #        log-Y-axis :-) cwt = scg.CWT(births_normed, scales=scales) #    : 1974-1976 fig = figure(figsize=(12,4)) lines =plot(births.index, births.values/1000, '-') xlim(pd.to_datetime("1974-01-01"), pd.to_datetime("1976-01-01")) ylabel("Nb of birthes [k]"); title("Total births per day bw 1974 and 1976"); #      ax = scg.cws(cwt, figsize=(13.2, 4), xlabel="Year", ylabel="Nb of Day", clim=(0,2500), yscale='log') set_x_yearly(ax, len(births)) xlim = ax.set_xlim( (1974-1969)*365, (1976-1969)*365 ) show() 





पहली नज़र में, साप्ताहिक पैटर्न बहुत अच्छे लगते हैं, लेकिन क्रिसमस के दिन कुछ होता है, आइए इस अवधि को फिर से देखें:

लिस्टिंग
 import pandas as pd import numpy as np from pylab import* import scaleogram as scg import pywt from pandas.plotting import register_matplotlib_converters register_matplotlib_converters() #          #    'cmor1-1.5' #scg.set_default_wavelet('cmor1-1.5') #scg.set_default_wavelet('cgau5') #scg.set_default_wavelet('cgau1') #scg.set_default_wavelet('shan0.5-2') #scg.set_default_wavelet('mexh') df = pd.read_csv("births.csv") #   df = df[(df.day>=1) & (df.day<=31) & (df.births.values > 1000)] #   datetime = pd.to_datetime(df[['year', 'month', 'day']], errors='coerce') df.insert(0, 'datetime', datetime) datetime_lim = [ df.datetime.min(), df.datetime.max() ] years_lim = [ df.datetime.min().year, df.datetime.max().year ] births = df[['datetime', 'births']].groupby('datetime').sum().squeeze() def set_x_yearly(ax, days, start_year=1969): xlim = (np.round([0, days]) / 365).astype(np.int32) ticks = np.arange(xlim[0], xlim[1]) ax.set_xticks(ticks*365) ax.set_xticklabels(start_year + ticks) births_normed = births-births.mean() #        log-Y-axis :-) scales = scg.periods2scales(np.logspace(np.log10(2), np.log10(365*3), 200)) #        log-Y-axis :-) cwt = scg.CWT(births_normed, scales=scales) # :  1975    1976  fig = figure(figsize=(12,4)) lines = plot(births.index, births.values/1000, '.-') xlim(pd.to_datetime("1974-12-01"), pd.to_datetime("1975-02-01")) ylabel("Nb of birthes [k]"); title("Total births per day : 2 monthes zoom"); #      ax = scg.cws(cwt, figsize=(13.2, 4), xlabel="Year", ylabel="Nb of Day", clim=(0,2500), yscale='log') set_x_yearly(ax, len(births)) xlim = ax.set_xlim( (1975-1969)*365-30, (1975-1969)*365+30 ) show() 






अब यह स्पष्ट है कि यह वर्ष के अंत का प्रभाव है:

  • क्रिसमस: दिसंबर 23/24/25 जन्मों की असामान्य रूप से कम संख्या दर्शाता है, और इन दिनों साप्ताहिक कार्यक्रम से विचलन होता है;
  • दिसंबर के लिए डेटा है, जो 1 और 2 जनवरी को प्रभावित तारीखों के लिए कुछ मूल्य की उपस्थिति के साथ संगत है, ये तिथियां आमतौर पर कई अन्य घटनाओं की तुलना में कम हैं

7. संश्लेषण (सभी आकार के लिए बेहतर पठनीयता के साथ सामान्य डेटा से एक सियालोग्राम बनाया गया है):

लिस्टिंग
 import pandas as pd import numpy as np from pylab import* import scaleogram as scg import pywt from pandas.plotting import register_matplotlib_converters register_matplotlib_converters() #          #    'cmor1-1.5' #scg.set_default_wavelet('cmor1-1.5') #scg.set_default_wavelet('cgau5') #scg.set_default_wavelet('cgau1') #scg.set_default_wavelet('shan0.5-2') #scg.set_default_wavelet('mexh') df = pd.read_csv("births.csv") #   df = df[(df.day>=1) & (df.day<=31) & (df.births.values > 1000)] #   datetime = pd.to_datetime(df[['year', 'month', 'day']], errors='coerce') df.insert(0, 'datetime', datetime) datetime_lim = [ df.datetime.min(), df.datetime.max() ] years_lim = [ df.datetime.min().year, df.datetime.max().year ] births = df[['datetime', 'births']].groupby('datetime').sum().squeeze() def set_x_yearly(ax, days, start_year=1969): xlim = (np.round([0, days]) / 365).astype(np.int32) ticks = np.arange(xlim[0], xlim[1]) ax.set_xticks(ticks*365) ax.set_xticklabels(start_year + ticks) births_normed = births-births.mean() #        log-Y-axis :-) scales = scg.periods2scales(np.logspace(np.log10(2), np.log10(365*3), 200)) #        log-Y-axis :-) cwt = scg.CWT(births_normed, scales=scales) ax = scg.cws(cwt, figsize=(13.2, 4), xlabel="Year", ylabel="Nb of Day", clim=(0,2500), yscale='log') set_x_yearly(ax, len(births)) bbox = dict(boxstyle="round", facecolor="w", edgecolor="0.5") bbox2 = dict(boxstyle="round", facecolor="y", edgecolor="0.5") arrowprops = dict(facecolor='white', shrink=0.05) arrowprops2 = dict(facecolor='yellow', shrink=0.05) for period, label in [ (3.5, "half a week"), (7, "one week"), (365/2, "half a year"), (365, "one year"), (365*2.8, "long trends")]: text = ax.annotate(label, xy=(365*5.5, period), xytext=(365*2, period), bbox=bbox, arrowprops=arrowprops) text = ax.annotate("end of year\neffect", xy=(365*6, 15), xytext=(365*3, 50), bbox=bbox2, arrowprops=arrowprops2) text = ax.annotate("increase in\nvariations *amplitude*", xy=(365*18.5, 7), xytext=(365*14, 50), bbox=bbox2, arrowprops=arrowprops2) show() 




सीडब्ल्यूटी ने बहुत कम समय में बहुत सी जानकारी का खुलासा किया है:

अस्पताल की आदतों को दिखाने वाला एक साप्ताहिक रूपांतर कई दशकों से मौजूद है;

80 के दशक में साप्ताहिक संकेतक में वृद्धि हुई थी, जो अस्पतालों की कामकाजी आदतों में बदलाव, प्रजनन क्षमता में बदलाव या जनसंख्या में साधारण बदलाव के कारण हो सकती है;

दूसरा छमाही वर्ष स्पष्ट रूप से दूसरा हार्मोनिक है। ज़ोन में फ़ज़ी पैटर्न 3 से 1 महीने तक दिखाई देते हैं, जो तीसरे हार्मोनिक के कारण हो सकता है, क्योंकि वार्षिक उतार-चढ़ाव बहुत मजबूत है। यह प्रजनन क्षमता पर छुट्टियों के प्रभाव के कारण भी हो सकता है और आगे के अध्ययन की आवश्यकता हो सकती है;

साल के अंत का प्रभाव क्रिसमस और 1 जनवरी को नोट किया गया था। यह एक और आवृत्ति विधि के साथ अदृश्य रह सकता है।

निष्कर्ष:


इस प्रकाशन में, हमने देखा कि कैसे संकेत रूपांतरों का मूल रूप स्केलोग्राम में बदल जाता है। एक समय-क्रमित डेटासेट का एक उदाहरण तब चरणबद्ध तरीके से प्रदर्शित करने के लिए उपयोग किया गया था कि मानक डेटा पर CWT कैसे लागू किया जाता है।

नेटवर्क तकनीक का विश्लेषण करने और वस्तुओं के असामान्य व्यवहार का पता लगाने के लिए उपरोक्त तकनीक का विस्तार किया जा सकता है। CWT एक शक्तिशाली उपकरण है जो तेजी से तंत्रिका नेटवर्क के इनपुट के रूप में उपयोग किया जा रहा है और इसका उपयोग विसंगतियों को वर्गीकृत या पता लगाने के लिए नए कार्यों को बनाने के लिए किया जा सकता है।

प्रत्येक उदाहरण को एक स्वतंत्र कार्यक्रम के रूप में लागू किया जाता है, जो आपको अपने कार्य के लिए एक उदाहरण चुनने की अनुमति देता है, बिना पिछले और बाद के उदाहरणों में। उपयोगकर्ता किसी भी वेवलेट की कोशिश कर सकता है - प्रत्येक कार्यक्रम की शुरुआत में दी गई सूची से कार्य करता है, उदाहरण के लिए, जैसे कि मेक्सिको या गौस 5। उदाहरण के लिए 1, क्रमशः:





पीएस लिस्टिंग के व्यावहारिक उपयोग के लिए, मैं उनमें इस्तेमाल किए गए मॉड्यूल के संस्करणों को दूंगा:

 >>> import scaleogram; print(scaleogram .__version__) 0.9.5 >>> import pandas; print(pandas .__version__) 0.24.1 >>> import numpy; print(numpy .__version__) 1.16.1 >>> import matplotlib; print(matplotlib .__version__) 3.0.2 

* .Csv फ़ाइल में डेटा के एक स्वतंत्र सेट के लिए, मैं डेटा संरचना (एक कॉलम में) लाता हूं:
वर्ष, महीना, दिन, लिंग, जन्म
1969,1,1, F, 4046
1969,1,1, M,
449 1969,1,2 , एफ, 4454
1969.1.2, एम, 4548
...
संस्करण 0.24.1 पांडा के लिए, आपको स्पष्ट रूप से matplotlib कन्वर्टर्स को पंजीकृत करने की आवश्यकता होगी।

कन्वर्टर्स रजिस्टर करने के लिए:

 from pandas.plotting import register_matplotlib_converters register_matplotlib_converters() 

Source: https://habr.com/ru/post/hi454240/


All Articles