Python: используйте pyts для преобразования одномерных временных рядов в двумерные изображения.

Python

В предыдущем блоге -Преобразование одномерного временного ряда в двумерное изображениеВ , я перевел статью о преобразовании сигнала временного ряда в двухмерную картинку:

img

Затем в конце статьи разместилGithubКод, этот код является исходным авторским кодом, некоторые люди реагируют, что код не может работать.

Здесь я использую стороннюю библиотеку pyts из Python, обращаюсь к официальной документации и переписываю ее. Протестировал его, и он может успешно работать на Python 3.7. Официально заявлено, что версия Python должна быть не ниже 3.5, и код выложен наGitHub.

1/ Установите библиотеку pyts

Примечание:В предыдущей версии кода использовалась версия библиотеки pyts.Версия библиотеки pyts 0.7.1.В настоящее время последняя версия библиотеки pyts сильно изменилась, и будетcannot import name 'GASF' from 'pyts.image'ошибка. Эта проблема была переписана с последней версией кода pyts в последней версии на GitHub.Если вы хотите использовать старую версию кода, вам нужно указать версию pyts при установке, а затем использовать старую версию код в этой статье.

Чтобы установить определенную версию пакета Python, откройте командную строку и установите ее с помощью команды pip:pip install pyts==0.7.1

2/ Подготовьте временной ряд 1D

Я использовал MATLAB для создания графика временного ряда sin x, и график получился таким:

在这里插入图片描述

Всего 512 очков, это максимум, который можно сгенерировать.512×512512\times 512картинка.

Чтобы сохранить сгенерированное изображение в виде файла .csv:

在这里插入图片描述

3/ Преобразовать в изображение

Следующий шаг — просто преобразовать его в двухмерное изображение, сначала вставив код, или вы можете поместить его в мойGitHubЗагрузите его, который содержит код для пакетной обработки и сохранения изображений GAF:

Используйте новую версию pyts, версия следующая, которая также является текущей версией кода в GitHub:

import numpy as np
import matplotlib.pyplot as plt
from pyts.image import GramianAngularField

sin_data = np.loadtxt('sinx.csv', delimiter=",", skiprows=0).reshape(1, -1)
image_size = 28

gasf = GramianAngularField(image_size=image_size, method='summation')
sin_gasf = gasf.fit_transform(sin_data)
gadf = GramianAngularField(image_size=image_size, method='difference')
sin_gadf = gadf.fit_transform(sin_data)
images = [sin_gasf[0], sin_gadf[0]]
titles = ['Summation', 'Difference']

fig, axs = plt.subplots(1, 2, constrained_layout=True)
for image, title, ax in zip(images, titles, axs):
    ax.imshow(image)
    ax.set_title(title)
fig.suptitle('GramianAngularField', y=0.94, fontsize=16)
plt.margins(0, 0)
plt.savefig("GramianAngularField.pdf", pad_inches=0)
plt.show()

Если вы используете версию 0.7.1 или более раннюю, вы можете использовать следующий код:

import numpy as np
import matplotlib.pyplot as plt
from pyts.image import GASF, GADF

x = np.loadtxt(open("sinx.csv","rb"),delimiter=",",skiprows=0).T
# print(type(x),x.shape)

X = x[0:]
X = X.reshape(1, -1)
print(type(X),X.shape)
image_size = 28
gasf = GASF(image_size)
X_gasf = gasf.fit_transform(X)
print(X_gasf.shape)
print(X_gasf[0,4,2],X_gasf[0,2,4])
gadf = GADF(image_size)
X_gadf = gadf.fit_transform(X)
print(X_gadf[0,1,2],X_gadf[0,2,1])

# Show the results for the first time series
plt.figure(figsize=(16, 8))
plt.subplot(121)
plt.imshow(X_gasf[0], cmap='rainbow', origin='lower')
plt.title("GASF", fontsize=16)
plt.subplot(122)
plt.imshow(X_gadf[0], cmap='rainbow', origin='lower')
plt.title("GADF", fontsize=16)
plt.savefig('sinx.jpg')
plt.show()

Запустив, эффект такой:在这里插入图片描述

Файлы .csv и коды в этой статье размещены в моем репозитории, если они вам будут полезны, вы можете перейти наGitHubПодарите мне Звезду, это будет для меня ободрением и подтверждением!