Python – поиск шаблона в сюжете

введите описание изображения здесь

Этот график генерируется следующим скриптом gnuplot . Файл с estimated.csv CSV находится по этой ссылке: 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"; 

Я хотел найти шаблон оценочного сигнала предыдущего сюжета, близкий к следующему сюжету. Моя истинная истина (фактический сигнал показан на следующем рисунке) введите описание изображения здесь

Вот мой первоначальный подход

 #!/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)) 

Затем вызовите этот скрипт python в моем gnuplot напрямую, как gnuplot ниже:

 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 '' 

что дает нам следующий сюжет. Но это, похоже, не дает мне правильного шаблона, поскольку gnuplot не лучший инструмент для таких задач.

введите описание изображения здесь

Есть ли способ найти шаблон первого графика ( estimated.csv ) путем формирования пиков в сюжет с использованием python? Если мы увидим с конца, картина действительно кажется видимой. Любая помощь будет оценена по достоинству.

One Solution collect form web for “Python – поиск шаблона в сюжете”

Я думаю, что pandas.rolling_max() – правильный подход. Мы загружаем данные в DataFrame и вычисляем максимальную скорость прокачки более 8500 значений. После этого кривые выглядят одинаково. Вы можете немного проверить параметр, чтобы оптимизировать результат.

 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) 

введите описание изображения здесь

Чтобы ответить на вопрос из комментариев:

Поскольку pd.rolling() генерирует определенные окна ваших данных, первые значения будут NaN для pd.rolling().max . Чтобы заменить эти NaN , я предлагаю обойти всю серию и рассчитать окна назад. Впоследствии мы можем заменить все NaN s на значения из обратного расчета. Я скорректировал длину окна для обратного расчета. В противном случае мы получаем ошибочные данные.

Этот код работает:

 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) 

И мы получаем следующий результат:

введите описание изображения здесь

  • Получите матрицу U, Sigma, V * из усеченного SVD в scikit-learn
  • Python: слишком много индексов
  • Python - эффективный способ найти наибольшую площадь определенного значения в массиве 2D numpy
  • scipy.optimize.fmin_cg: «Желаемая ошибка не всегда достигается из-за потери точности».
  • Эффективное распределение многопоточных и плотных матриц Numpy / Scipy
  • Правильный способ получения доверительного интервала с помощью scipy
  • Python с Numpy / Scipy против чистого C ++ для анализа больших данных
  • Создание массива в numpy / scipy путем итерации в Python?
  • Как рассчитать корреляцию между всеми столбцами и удалить сильно коррелированные с помощью python или pandas
  • построение 3d-рассеяния в matplotlib
  • Объем выпуклого корпуса с QHull от SciPy
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.