首页 > 解决方案 > 如何在熊猫矢量化中计算日期索引和未来一个月的日期之间的行以将它们添加为列?

问题描述

我有一个带有日期索引的数据框( df )。我想实现以下目标:

1.取 Dates 列并添加一个月 -> 例如nxt_dt = df.index + np.timedelta64(month=1) 并调用 df.index curr_dt

2.在 Dates 中找到 >= nxt_dt 的最近条目。

3计算curr_dtnxt_dt之间的行数,并将它们放入df的列中。

结果应该如下所示:

            px_volume  listed_sh  ...  iv_mid_6m      '30d'
Dates                             ...                               
2005-01-03     228805        NaN  ...   0.202625       21
2005-01-04     189983        NaN  ...   0.203465       22           
2005-01-05     224310        NaN  ...   0.202455       23
2005-01-06     221988        NaN  ...   0.202385       20
2005-01-07     322691        NaN  ...   0.201065       21

不用说, df中只有日期/行有观察结果。

我可以想出一些不同的方法来循环完成这项工作,但是由于我使用的数据非常大,我真的很想避免遍历行来填充它们。

pandas 有没有办法将这个完成矢量化?

标签: pythonpandastimedelta

解决方案


如果您可以重新索引这应该可以完成工作:

import numpy as np
import pandas as pd

df = pd.DataFrame({'date': ['2020-01-01', '2020-01-08', '2020-01-24', '2020-01-29', '2020-02-09', '2020-03-04']})

df['date'] = pd.to_datetime(df['date'])
df['value'] = 1

df = df.set_index('date')
df = df.reindex(pd.date_range('2020-01-01','2020-03-04')).fillna(0)

df = df.sort_index(ascending=False)
df['30d'] = df['value'].rolling(30).sum() - 1

df.sort_index().query("value == 1")

给出:

    value   30d
2020-01-01  1.0 3.0
2020-01-08  1.0 2.0
2020-01-24  1.0 2.0
2020-01-29  1.0 1.0
2020-02-09  1.0 NaN
2020-03-04  1.0 NaN

推荐阅读