вторник, 14 июля 2020 г.

Анализ временных рядов: работа с данными Date-Time в Python


В этом посте мы обсудим некоторые важные инструменты, которые действительно полезны для анализа данных временных рядов. Эти инструменты чрезвычайно полезны для трейдеров при разработке и тестировании торговых стратегий.

Трейдеры имеют дело со множеством исторических данных и должны поиграться с ними и провести анализ таких временных рядов. Данные инструменты используются для подготовки данных перед проведением анализа. Мы сконцентрируемся на том, как обращаться с датами и частотой временных рядов. Мы также обсудим операции индексирования и среза для временных рядов. Для этого поста мы будем широко использовать библиотеку «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. Давайте кратко рассмотрим основные типы данных, которые очень полезны при анализе временных рядов.

Тип данных
Описание
date 
Сохраняет календарные даты (год, месяц и день) с использованием
григорианского календаря.
time 
Хранит время как часы, минуты, секунды и микросекунды
datetime 
Хранит дату и время (как уже обсуждалось в примерах)
timedelta 
Хранит разницу между двумя значениями даты и времени (как уже
обсуждалось в примерах)

Преобразование между строками и 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

Заключение

В этом посте мы рассмотрели некоторые основные функции, которые очень полезны при анализе временных рядов. Мы увидели, как мы можем играть с датами, преобразовывая их из одного формата в другой. Мы также рассмотрели операции нарезки, индексации и сдвига временных рядов.

Комментариев нет:

Отправить комментарий