Публичный аккаунт WeChat: «Python Reading Finance»
Если у вас есть какие-либо вопросы или предложения, пожалуйста, оставьте сообщение в публичном аккаунте
При проведении анализа финансовых данных или количественных исследований невозможно избежать обработки данных временных рядов.Под временным рядом понимается последовательность значений переменной, измеренных в хронологическом порядке в течение определенного периода времени.Общие данные временных рядов изменяются с течением времени в течение дняпоследовательность температуры, или колеблется в течение торговых часовряд цен на акции. Pandas также широко используется в анализе финансовых данных из-за его мощных возможностей обработки временных рядов.В этой статье представлена обработка временных рядов в Pandas.Используемые данные представляют собой рыночные данные индекса Шанхайской фондовой биржи в 2019 году.
типы данных, зависящие от времени
Два наиболее распространенных типа данных в обработке временных рядов Pandas:datetime
иtimedelta
. Одинdatetime
Это можно показать на следующем рисунке:
datetime
Как следует из названия, есть датаdate
также есть времяtime
, представляющий конкретный момент времени (отметка времени).timedelta
представляет собой разницу между двумя моментами времени, такими как2020-01-01
и2020-01-02
междуtimedelta
То есть в один прекрасный день, я считаю, это не трудно понять.
Преобразование столбца времени в формат времени
Чаще всего мы изcsv
данные импорта файлов, на данный моментDataframe
Соответствующий столбец времени внитьв виде:
In [5]: data.trade_date.head()
Out[5]:
0 20190102
1 20190103
2 20190104
3 20190107
4 20190108
Name: trade_date, dtype: object
использоватьpd.to_datetime()
, вы можете преобразовать соответствующий столбец в Pandasdatetime64
тип для легкой постобработки
In [11]: data["trade_date"] = pd.to_datetime(data.trade_date)
In [12]: data.trade_date.head()
Out[12]:
0 2019-01-02
1 2019-01-03
2 2019-01-04
3 2019-01-07
4 2019-01-08
Name: trade_date, dtype: datetime64[ns]
индекс временного ряда
Индекс во временном ряду подобен обычному индексу в Pandas, и чаще всего он называется.loc[index,columns]
Выполните соответствующий индекс, перейдите непосредственно к коду, чтобы увидеть
In [20]: data1 = data.set_index("trade_date")
# 2019年6月的数据
In [21]: data1.loc["2019-06"].head()
Out[21]:
close open high low
trade_date
2019-06-03 2890.0809 2901.7424 2920.8292 2875.9019
2019-06-04 2862.2803 2887.6405 2888.3861 2851.9728
2019-06-05 2861.4181 2882.9369 2888.7676 2858.5719
2019-06-06 2827.7978 2862.3327 2862.3327 2822.1853
2019-06-10 2852.1302 2833.0145 2861.1310 2824.3554
# 2019年6月-2019年8月的数据
In [22]: data1.loc["2019-06":"2019-08"].tail()
Out[22]:
close open high low
trade_date
2019-08-26 2863.5673 2851.0158 2870.4939 2849.2381
2019-08-27 2902.1932 2879.5154 2919.6444 2879.4060
2019-08-28 2893.7564 2901.6267 2905.4354 2887.0115
2019-08-29 2890.9192 2895.9991 2898.6046 2878.5878
2019-08-30 2886.2365 2907.3825 2914.5767 2874.1028
Извлечь атрибуты времени/даты
В процессе обработки данных временных рядов часто необходимо реализовать следующие требования:
- Найдите количество недель, соответствующих дате (2019-06-05 — это неделя)
- Определить дату как день недели (2020-01-01 — это день недели)
- Определить, к какому кварталу относится дата (к какому кварталу относится 2019-07-08)
...
Когда столбец времени в ваших данных (в этих данныхtrade_date
столбец) был преобразован вdatetime64
формат, звоните.dt
интерфейс, вы можете быстро получить желаемые результаты, перечисленные в следующей таблице.dt
Общие свойства, предоставляемые интерфейсом:
Продемонстрируем это подробно (ниже показана информация только за 2019-01-02):
# 一年中的第几天
In [13]: data.trade_date.dt.dayofweek[0]
Out[13]: 2
# 返回对应日期
In [14]: data.trade_date.dt.date[0]
Out[14]: datetime.date(2019, 1, 2)
# 返回周数
In [15]: data.trade_date.dt.weekofyear[0]
Out[15]: 1
# 返回周几
In [16]: data.trade_date.dt.weekday_name[0]
Out[16]: 'Wednesday'
resample
resample
Перевод означает ресемплинг, который описан в официальной документацииresample
из
resample()
is a time-based groupby
переведи это наоснованный на времениизgroupby
Операции, которые я лично считаю наиболее важной функцией в обработке временных рядов Pandas и главным приоритетом этой статьи.
По выборке естьОт низкой частоты к высокой частотевсе ещеОт высокой частоты к низкой частотеЕго можно разделитьповышающая дискретизацияипонижение частоты дискретизацииЕсть два способа, сначала давайте посмотрим, что такое субдискретизация.
- понижение частоты дискретизации
В качестве примера мы используем данные Шанхайского сводного индекса 2019 года.дневной уровеньданные, если вы хотитеежеквартальныйСредняя цена закрытия, что делать?
Чтобы найти данные квартального уровня из данных дневного уровня, это извысокая частота к низкой частотеизполимеризацияоперация, похожая наgroupby
Делайте это ежеквартально, сresample
писать вот так
In [32]: data.resample('Q',on='trade_date')["close"].mean()
Out[32]:
trade_date
2019-03-31 2792.941622
2019-06-30 3010.354672
2019-09-30 2923.136748
2019-12-31 2946.752270
Freq: Q-DEC, Name: close, dtype: float64
в'Q'
отбирается ежеквартально,on
уточнитьdatetime列
(если индексDatetimeindex
,ноon
Указывать не нужно, по умолчанию даунсэмплинг по индексу). Весь процесс иллюстрируется следующим образом:
Весь процесс на самом делеgroupby
процесс:
- Исходные данные разделяются в соответствии с заданной частотой и делятся на разные
group
середина - к разным
group
выполнить действие - Интеграция операционных результатов
Среди них частота сегментации может быть любой временной частотой, может быть ежеквартальной.Q
, ежемесячноM
,НеделюW
, N днейND
, так же может бытьH
,минутаT
, конечно, если разделенная частота меньше, чем исходная временная частота, то это и есть апсемплинг, о котором мы поговорим ниже.
- повышающая дискретизация
при частоте дискретизацииниже чемКогда используется исходная частота, происходит повышающая дискретизация. Повышение частоты дискретизации — это более мелкое разделение исходной детализации времени, поэтому при повышении частоты дискретизации будет генерироватьсяпропущенное значение. Возьмите следующее2019-01-02
к2019-01-03
данные согласно6H
Покажите частоту:
In [24]: example
Out[24]:
close
trade_date
2019-01-02 2465.2910
2019-01-03 2464.3628
In [25]: example.resample('6H').asfreq()
Out[25]:
close
trade_date
2019-01-02 00:00:00 2465.2910
2019-01-02 06:00:00 NaN
2019-01-02 12:00:00 NaN
2019-01-02 18:00:00 NaN
2019-01-03 00:00:00 2464.3628
правильноresample
После применения результата.asfreq()
возвращаются результаты на новой частоте. Вы можете видеть, что после повышения частоты дискретизации отсутствуют значения. Если вы хотите заполнить пропущенные значения, вы можете использовать обратное заполнение.bfill()
или заполнить вперед.ffill()
Путь:
# 向前填充,缺失值取2465.2910进行填充
In [29]: example.resample('6H').ffill()
Out[29]:
close
trade_date
2019-01-02 00:00:00 2465.2910
2019-01-02 06:00:00 2465.2910
2019-01-02 12:00:00 2465.2910
2019-01-02 18:00:00 2465.2910
2019-01-03 00:00:00 2464.3628
# 向后填充,缺失值取2464.3628进行填充
In [30]: example.resample('6H').bfill()
Out[30]:
close
trade_date
2019-01-02 00:00:00 2465.2910
2019-01-02 06:00:00 2464.3628
2019-01-02 12:00:00 2464.3628
2019-01-02 18:00:00 2464.3628
2019-01-03 00:00:00 2464.3628
в заключенииresample
,resample
Любая частота может быть выполнена на исходном временном рядуfreq
Если выборка от низкой частоты к высокой частоте является повышающей, а от высокой частоты к низкой частоте - понижающей. всю операцию иgroupby
в принципе так жеresample
объект послеapply
иtransform
Дождитесь операции, конкретная операция и принцип здесь объясняться не будут, аналогия сgroupby
Да, смотрите эту статьюАнализ данных Pandas - подробное объяснение очень простого в использовании Groupby.
Отсканируйте код, чтобы подписаться на официальный аккаунт"Питон Чтение Финансов", получите галантерею в первый раз!