В предыдущем блоге -Преобразование одномерного временного ряда в двумерное изображениеВ , я перевел статью о преобразовании сигнала временного ряда в двухмерную картинку:
Затем в конце статьи разместил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 очков, это максимум, который можно сгенерировать.картинка.
Чтобы сохранить сгенерированное изображение в виде файла .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Подарите мне Звезду, это будет для меня ободрением и подтверждением!