В этом посте мы обсудим некоторые важные инструменты, которые действительно полезны для анализа данных временных рядов. Эти инструменты чрезвычайно полезны для трейдеров при разработке и тестировании торговых стратегий.
Трейдеры имеют дело со множеством исторических данных и должны поиграться с ними и провести анализ таких временных рядов. Данные инструменты используются для подготовки данных перед проведением анализа. Мы сконцентрируемся на том, как обращаться с датами и частотой временных рядов. Мы также обсудим операции индексирования и среза для временных рядов. Для этого поста мы будем широко использовать библиотеку «datetime».
Давайте начнем с импорта этой библиотеки в нашу программу.
# Импортируем требуемые модули from datetime import datetime from datetime import timedelta
Основные инструменты для работы с датами и временем
Для начала давайте сохраним текущую дату и время в переменной «current_time».
# Выводим текущую дату и время current_time = datetime.now() current_time
datetime.datetime(2020, 2, 22, 1, 18, 57, 478280)
Мы можем вычислить разницу между двумя датами, используя datetime.
# Расчет разницы между двумя датами (14/02/2018 и 01/01/2018 09:15AM) delta = datetime(2018,2,14)-datetime(2018,1,1,9,15) delta
Output: datetime.timedelta(43, 53100)
Мы можем преобразовать вывод в дни или секунды, используя команду:
# Конвертируем вывод в дни delta.days
Output: 43
# Конвертируем вывод в секунды delta.seconds
Output: 53100
Если мы хотим сдвинуть дату, мы можем использовать модуль timedelta, который мы уже импортировали.
# Сдвиг даты с помощью timedelta my_date = datetime(2018,2,10) # Сдвиг даты на 10 дней my_date + timedelta(10)
Output: datetime.datetime(2018, 2, 20, 0, 0)
Мы также можем использовать кратные функции timedelta.
# Использование функций, кратных timedelta my_date - 2*timedelta(10)
Output: datetime.datetime(2018, 1, 21, 0, 0)
Мы видели типы данных datetime и timedelta модуля datetime. Давайте кратко рассмотрим основные типы данных, которые очень полезны при анализе временных рядов.
Преобразование между строками и datetime
Мы можем преобразовать формат datetime в строку и сохранить его в строковой переменной. Точно так же можно сделать обратное, и строку, представляющую дату, можно преобразовать в тип данных datetime.
# Конвертируем datetime в строку
my_date1 = datetime(2018,2,14)
str(my_date1)
# Конвертируем строку в datetime
datestr = '2018-02-14'
datetime.strptime(datestr, '%Y-%m-%d')
Output:
'2018-02-14 00:00:00'
datetime.datetime(2018, 2, 14, 0, 0)
Мы также можем использовать pandas для обработки дат. Давайте сначала импортируем pandas.
#Импорт pandas
import pandas as pd
#Метод «to_datetime» в pandas используется для преобразования
#строк даты в даты.
#Использование pandas для парсинга дат
datestrs = ['1/14/2018', '2/14/2018']
pd.to_datetime(datestrs)
Output: DatetimeIndex(['2018-01-14', '2018-02-14'], dtype='datetime64[ns]', freq=None)
В pandas отсутствующее время или значения NA во времени представлены как NaT (не время).
Индексирование и нарезка временного ряда
Чтобы понять различные операции с временным рядом, давайте создадим временной ряд, используя случайные числа.
#Создаем временной ряд со случайными числами
import numpy as np
from random import random
dates = [datetime(2011, 1, 2), datetime(2011, 1, 5), datetime(2011, 1, 7), datetime(2011, 1, 8), datetime(2011, 1, 10), datetime(2011, 1, 12)]
ts = pd.Series(np.random.randn(6), index=dates)
ts
Output:
2011-01-02 0.888329
2011-01-05 -0.152267
2011-01-07 0.854689
2011-01-08 0.680432
2011-01-10 0.123229
2011-01-12 -1.503613
dtype: float64
Элементы этого временного ряда могут быть вызваны как любой другой ряд pandas с использованием индекса, как показано ниже.
ts[’01/02/2011′] или ts[‘20110102’] даст тот же результат 0,888329
Нарезка также похожа на то, что мы имеем для других рядов pandas.
# Нарезка временного ряда ts[datetime(2011,1,7):]
Output:
2011-01-07 0.854689
2011-01-08 0.680432
2011-01-10 0.123229
2011-01-12 -1.503613
dtype: float64
Дублирующиеся индексы во временных рядах
Иногда ваш временной ряд может содержать дублированные индексы. Рассмотрим следующие временные ряды.
#Создание временного ряда с дублирующимися индексами
datesdup = [datetime(2018, 1, 1), datetime(2018, 1, 2), datetime(2018, 1, 2), datetime(2018, 1, 2), datetime(2018, 1, 3)]
dup_ts = pd.Series(np.random.randn(5), index=datesdup)
dup_ts
Output:
2018-01-01 -0.471411
2018-01-02 0.667770
2018-01-02 -0.010174
2018-01-02 -0.699517
2018-01-03 -0.611886
dtype: float64
В приведенном выше временном ряду мы видим, что «2018-01-02» повторяется трижды. Мы можем проверить это, используя свойство «is_unique» функции «index».
dup_ts.index.is_unique
Output: False
Мы можем объединять записи с одним и тем же индексом, используя функциональность «groupby».
grouped=dup_ts.groupby(level=0)
Теперь мы можем использовать среднее значение, количество или сумму этих записей в соответствии с нашими требованиями.
grouped.mean()
Output:
2018-01-01 -0.471411
2018-01-02 -0.013973
2018-01-03 -0.611886
dtype: float64
grouped.count()
Output:
2018-01-01 1
2018-01-02 3
2018-01-03 1
dtype: int64
grouped.sum()
Output:
2018-01-01 -0.471411
2018-01-02 -0.041920
2018-01-03 -0.611886
dtype: float64
Сдвиг даты
Мы можем сдвинуть индекс временного ряда, используя функцию «shift».
# Сдвиг временного ряда ts.shift(2)
Output:
2011-01-02 NaN
2011-01-05 NaN
2011-01-07 0.888329
2011-01-08 -0.152267
2011-01-10 0.854689
2011-01-12 0.680432
dtype: float64
Заключение
В этом посте мы рассмотрели некоторые основные функции, которые очень полезны при анализе временных рядов. Мы увидели, как мы можем играть с датами, преобразовывая их из одного формата в другой. Мы также рассмотрели операции нарезки, индексации и сдвига временных рядов.
Комментариев нет:
Отправить комментарий