【Stove AI】Машинное обучение 043-Pandas Манипулирование данными временных рядов
(Библиотеки Python и номера версий, используемые в этой статье: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2)
Анализ данных временных рядов — важная область в области машинного обучения.Данные временных рядов — это данные, которые меняются во времени.Наиболее типичным примером являются данные о ценах на акции, которые меняются в зависимости от даты и четырех сезонов года. Изменения температуры, траектория тайфуна и т. д. Важным моментом в этой области является то, что собранные выборочные данные связаны во времени, и мы не можем нарушить порядок между выборочными данными, как раньше, поэтому эта область требует специальных методов исследования.
1. Подготовьте данные временных рядов
Данные временных рядов, используемые в этой главе, взяты из файла data_timeseries.txt, Первый столбец в этом файле — это год с 1940 по 2015 год, второй столбец — это месяц, а третий и четвертый столбцы — это данные.
1.1 Преобразование данных в формат временных рядов
Мы можем объединить первый столбец и второй столбец, а затем использовать функцию для преобразования объединенной строки в тип Date, но данные здесь очень регулярны, и нет пропусков во времени, поэтому мы можем использовать date_range() панд () функция для построения временного ряда и использования временного ряда в качестве индекса набора данных DataFrame.
Шаг 1: Загрузите набор данных с пандами
# 加载数据集
data_path='E:\PyProjects\DataSet\FireAI/data_timeseries.txt'
df=pd.read_csv(data_path,header=None)
print(df.info()) # 查看数据信息,确保没有错误
print(df.head())
print(df.tail())
Шаг 2: Создайте данные временных рядов с помощью pd.date_range()
start=str(df.iloc[0,0])+'-'+str(df.iloc[0,1]) # 1940-1
if df.iloc[-1,1] %12 ==0: # 如果是12月结尾,需要转为第二年1月
end=str(int(df.iloc[-1,0])+1)+'-01'
else:
end=str(df.iloc[-1,0])+'-'+str(int(df.iloc[-1,1])+1)
print(end)
dates=pd.date_range(start,end,freq='M') # 构建以月为间隔的日期数据
print(dates[0])
print(dates[-1]) # 最后一个是2015-12 没有错误
print(len(dates))
Обратите внимание, что выше есть суждение о том, является ли последний месяц декабрем, потому что результат, полученный date_range, когда freq равен месяцу, не включает месяц, в котором находится конец, поэтому здесь нам нужно добавить месяц, чтобы получить количество окончательных дат. то же.
------------------------------------- потерять-- ------------------------------
2016-01 1940-01-31 00:00:00 2015-12-31 00:00:00 912
--------------------------------------------Заканчивать----- --------------------------------
Шаг 3: Установите данные временного ряда в качестве индекса df
df.set_axis(dates)
print(df.info())
print(df.head())
Как видно из результатов, данные о датах, полученные выше, стали индексом набора данных df.
1.2 Построение данных временных рядов
Pandas интегрировала различные функции рисования функции matplotlib, поэтому мы можем рисовать напрямую, например, рисовать все данные второго столбца, код:
# 画图
df.iloc[:,2].plot() # 画出第2列的时序数据
Объем данных на приведенном выше рисунке слишком велик, что затрудняет его просмотр.Поэтому нам нужно нарисовать только часть изображения, чтобы увидеть тенденцию данных за определенный период времени.Мы можем использовать следующие методы :
# 上面的图中数据太密集了,我们需要查看部分时间段的数据
start='2008-2'
end='2010-3'
df.iloc[:,2][start:end].plot()
# 注意这种写法,先获取第二列数据为Series,然后对Series进行时间范围切片即可
Вы также можете выбрать данные за определенные годы для построения графика.
start='2008' # 给定年份来获取数据
end='2010'
df.iloc[:,2][start:end].plot()
Вышеупомянутое рисует только один столбец данных за раз, на самом деле несколько столбцов данных могут быть отрисованы одновременно, как показано ниже:
# 上面每次只绘制一列数据,下面同时绘制两列数据
start='2008' # 给定年份来获取数据
end='2010'
df.iloc[:,2:4][start:end].plot() # 同时绘制第二列和第三列的数据
Вы также можете построить график разности, или суммы, или минимума, максимума и т. д. между этими двумя столбцами данных следующим образом:
# 也可以绘制两列数据的差异
start='2008' # 给定年份来获取数据
end='2010'
temp_df=df.iloc[:,2][start:end]-df.iloc[:,3][start:end]
temp_df.plot()
Вы также можете построить часть данных, где один столбец больше определенного значения, а другой столбец меньше определенного значения.
# 还可以筛选出第一个大于某个值,同时第二列小于某个值的数据来绘图
temp_df2=df[df.iloc[:,2]>60][df.iloc[:,3]<20].iloc[:,2:4]
temp_df2.plot()
1.3 Получить статистику
1.3.1 Получение максимального, минимального, среднего значения и т. д.
# 获取数据集的统计数据
part_df=df.iloc[:,2:4] # 只取第二和第三列进行统计
print('Max: \n{}'.format(part_df.max()))
print('Min: \n{}'.format(part_df.min()))
print('Mean: \n{}'.format(part_df.mean()))
# 上面这个方法虽然可以获取Max,Min,Mean值,但是还不如下面这个函数好用
print(part_df.describe()) # 这个可以从整体上看出数据的分布情况
Вышеуказанные функции очень просты, поэтому результаты печати не будут опубликованы.
1.3.2 Расчет скользящего среднего
Значение скользящего среднего в основном заключается в устранении шума и придании сигналу более гладкого вида.Метод расчета заключается в вычислении среднего значения предыдущих данных N, а затем перемещении на один бит, чтобы всегда вычислять среднее значение последних данных N. Если вы торгуете акциями, вы должны быть знакомы со значением и методом расчета скользящих средних.
# 计算移动平均值MAn
N=20
MAn=part_df.rolling(N).mean()
MAn.plot()
1.3.3 Расчет коэффициента корреляции скользящего среднего
Коэффициент корреляции скользящего среднего можно понимать как: корреляцию между двумя столбцами данных. Если корреляция сильная, то два столбца данных имеют сильную корреляцию. Если для иллюстрации используются биржевые данные, корреляция скользящее среднее - это две тенденции цен на акции только акции коррелируют. Если корреляция очень сильна, то две акции будут показывать синхронный тренд "подъем и падение вместе". Если корреляция мала, это означает, что ценовые тенденции из двух акций имеют мало общего друг с другом.
# 计算移动平均值MAn的相关系数
N=20
MAn=part_df.rolling(N).mean()
corr=MAn.iloc[:,0].rolling(window=40).corr(MAn.iloc[:,1])
corr.plot()
########################резюме########################## ######
1. Многие из этой части являются основными методами модуля Pandas, поэтому объяснять особо нечего.
#################################################################
Примечание. Эта часть кода была загружена в (мой гитхаб), добро пожаловать на скачивание.
Использованная литература:
1. Классические примеры машинного обучения Python, Пратик Джоши, перевод Тао Цзюньцзе и Чена Сяоли.