Python – finden Muster in einer Handlung

Bildbeschreibung hier eingeben

Diese Grafik wird durch das folgende gnuplot Skript generiert. Die Datei estimated.csv finden Sie in diesem Link: https://drive.google.com/open?id=0B2Iv8dfU4fTUaGRWMm9jWnBUbzg

 # ###### GNU Plot set style data lines set terminal postscript eps enhanced color "Times" 20 set output "cubic33_cwd_estimated.eps" set title "Estimated signal" set style line 99 linetype 1 linecolor rgb "#999999" lw 2 #set border 1 back ls 11 set key right top set key box linestyle 50 set key width -2 set xrange [0:10] set key spacing 1.2 #set nokey set grid xtics ytics mytics #set size 2 #set size ratio 0.4 #show timestamp set xlabel "Time [Seconds]" set ylabel "Segments" set style line 1 lc rgb "#ff0000" lt 1 pi 0 pt 4 lw 4 ps 0 # Congestion control send window plot "estimated.csv" using ($1):2 with lines title "Estimated"; 

Ich wollte das Muster des geschätzten Signals der vorherigen Handlung etwas in der Nähe der folgenden Handlung finden. Mein Grund Wahrheit (tatsächliches Signal wird in der folgenden Handlung gezeigt) Bildbeschreibung hier eingeben

Hier ist mein erster Ansatz

 #!/usr/bin/env python import sys import numpy as np from shapely.geometry import LineString #------------------------------------------------------------------------------- def load_data(fname): return LineString(np.genfromtxt(fname, delimiter = ',')) #------------------------------------------------------------------------------- lines = list(map(load_data, sys.argv[1:])) for g in lines[0].intersection(lines[1]): if g.geom_type != 'Point': continue print('%f,%f' % (gx, gy)) 

Dann rufe ich dieses Python-Skript in meinem gnuplot direkt wie im folgenden an:

 set terminal pngcairo set output 'fig.png' set datafile separator comma set yr [0:700] set xr [0:10] set xtics 0,2,10 set ytics 0,100,700 set grid set xlabel "Time [seconds]" set ylabel "Segments" plot \ 'estimated.csv' wl lc rgb 'dark-blue' t 'Estimated', \ 'actual.csv' wl lc rgb 'green' t 'Actual', \ '<python filter.py estimated.csv actual.csv' wp lc rgb 'red' ps 0.5 pt 7 t '' 

Was uns die folgende Handlung gibt. Aber das scheint mir nicht das richtige Muster zu geben, da Gnuplot nicht das beste Werkzeug für solche Aufgaben ist.

Bildbeschreibung hier eingeben

Gibt es irgendeinen Weg, wo wir das Muster des ersten Graphen ( estimated.csv ) finden können, indem wir die Peaks in eine Handlung unter Verwendung von Python bilden Wenn wir von vornherein sehen, scheint das Muster tatsächlich sichtbar zu sein. Jede Hilfe wäre willkommen.

  • Füge ein Feld in pandas dataframe mit MultiIndex Spalten hinzu
  • Matplotlib Entfernung Interpolation für fehlende Daten
  • Matplotlib / Pandas: Zoom Teil eines Plots mit Zeitreihe
  • Python reguliert unregelmäßige Zeitreihen mit linearer Interpolation
  • Pandas-Datenrahmen: Resample mit linearer Interpolation
  • TypeError: kann die Sequenz nicht durch Nicht-int des Typs 'float' multiplizieren (python 2.7)
  • Kombinieren von mehreren Zeitreihen-Daten zu einem 2d-Numpy-Array
  • Zeitreihe Plot Python
  • One Solution collect form web for “Python – finden Muster in einer Handlung”

    Ich denke, pandas.rolling_max() ist hier der richtige Ansatz. Wir laden die Daten in einen DataFrame und berechnen das Rolling Maximum über 8500 Werte. Danach sehen die Kurven ähnlich aus. Sie können mit dem Parameter ein wenig testen, um das Ergebnis zu optimieren.

     import numpy as np import matplotlib.pyplot as plt import pandas as pd plt.ion() names = ['actual.csv','estimated.csv'] #------------------------------------------------------------------------------- def load_data(fname): return np.genfromtxt(fname, delimiter = ',') #------------------------------------------------------------------------------- data = [load_data(name) for name in names] actual_data = data[0] estimated_data = data[1] df = pd.read_csv('estimated.csv', names=('x','y')) df['rolling_max'] = pd.rolling_max(df['y'],8500) plt.figure() plt.plot(actual_data[:,0],actual_data[:,1], label='actual') plt.plot(estimated_data[:,0],estimated_data[:,1], label='estimated') plt.plot(df['x'], df['rolling_max'], label = 'rolling') plt.legend() plt.title('Actual vs. Interpolated') plt.xlim(0,10) plt.ylim(0,500) plt.xlabel('Time [Seconds]') plt.ylabel('Segments') plt.grid() plt.show(block=True) 

    Bildbeschreibung hier eingeben

    Um die Frage aus den Kommentaren zu beantworten:

    Da pd.rolling() definierte Fenster Ihrer Daten erzeugt, sind die ersten Werte NaN für pd.rolling().max . Um diese NaN zu ersetzen, schlage ich vor, die ganze Serie umzudrehen und die Fenster rückwärts zu berechnen. Danach können wir alle NaN durch die Werte aus der Rückwärtsberechnung ersetzen. Ich habe die Fensterlänge für die Rückwärtsberechnung angepasst. Andernfalls bekommen wir fehlerhafte Daten.

    Dieser Code funktioniert:

     import numpy as np import matplotlib.pyplot as plt import pandas as pd plt.ion() df = pd.read_csv('estimated.csv', names=('x','y')) df['rolling_max'] = df['y'].rolling(8500).max() df['rolling_max_backwards'] = df['y'][::-1].rolling(850).max() df.rolling_max.fillna(df.rolling_max_backwards, inplace=True) plt.figure() plt.plot(df['x'], df['rolling_max'], label = 'rolling') plt.legend() plt.title('Actual vs. Interpolated') plt.xlim(0,10) plt.ylim(0,700) plt.xlabel('Time [Seconds]') plt.ylabel('Segments') plt.grid() plt.show(block=True) 

    Und wir erhalten folgendes Ergebnis:

    Bildbeschreibung hier eingeben

    Python ist die beste Programmiersprache der Welt.