Обработка данных Pandas — игра с данными временных рядов

анализ данных
Обработка данных Pandas — игра с данными временных рядов

Публичный аккаунт WeChat: «Python Reading Finance»
Если у вас есть какие-либо вопросы или предложения, пожалуйста, оставьте сообщение в публичном аккаунте

При проведении анализа финансовых данных или количественных исследований невозможно избежать обработки данных временных рядов.Под временным рядом понимается последовательность значений переменной, измеренных в хронологическом порядке в течение определенного периода времени.Общие данные временных рядов изменяются с течением времени в течение дняпоследовательность температуры, или колеблется в течение торговых часовряд цен на акции. Pandas также широко используется в анализе финансовых данных из-за его мощных возможностей обработки временных рядов.В этой статье представлена ​​обработка временных рядов в Pandas.Используемые данные представляют собой рыночные данные индекса Шанхайской фондовой биржи в 2019 году.

数据.png

типы данных, зависящие от времени

Два наиболее распространенных типа данных в обработке временных рядов Pandas:datetimeиtimedelta. ОдинdatetimeЭто можно показать на следующем рисунке:

datetime.png

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Общие свойства, предоставляемые интерфейсом:

dt表.png

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

降采样.png

Весь процесс на самом деле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.

Отсканируйте код, чтобы подписаться на официальный аккаунт"Питон Чтение Финансов", получите галантерею в первый раз!

底部二维码.png