如何矢量化 Pandas DateTimeIndex

问题描述 投票:0回答:1

我试图避免使用 DateTimeIndex 的 for 循环。我有一个函数

get_latest
可以查找最新的工资指数值。当我遍历发薪日的日期时,查找工作正常。当我尝试对操作进行矢量化时,有人建议我
TypeError: 'numpy.ndarray' object is not callable
。我已经尝试了 dt、date、to_pydatetime 等各种方式,但均无济于事。

# %%
import pandas as pd
import datetime

# %%
def get_latest(date, series):
    return series.loc[max([x for x in series.index if x <= date])]

# %%
start_rate = 1000.0
start = '2025-08-01'
end = '2026-02-01'

raise_series = pd.Series ({
    datetime.date(2024, 10, 1) : 0.06,
    datetime.date(2025, 10, 1) : 0.05,
    datetime.date(2026, 1, 1) : 1.055,
    datetime.date(2026, 10, 1) : 0.04,
    datetime.date(2027, 10, 1) : 0.04,
    datetime.date(2028, 10, 1) : 0.04,
    datetime.date(2029, 10, 1) : 0.04
})

# %%
initial_index = pd.Series ({
    datetime.date(1, 1, 1): 0.00
})

index_series = pd.concat([initial_index, raise_series], axis=0)
index_series += 1
index_series = index_series.cumprod()

# %%
pay_days = pd.date_range(start=start, end=end, freq='2W')

# %%
gross = []
for row in pay_days:
    gross.append(get_latest(row.date(), index_series) * start_rate) 
pay_days_gross1 = pd.Series(gross)
# %%
pay_days_gross2 = get_latest(pay_days.date(), index_series) * start_rate
# %%```
python vectorization datetimeindex
1个回答
0
投票

这是一种方法:

pay_days_gross = (raise_series.add(1)
                  .cumprod()
                  .reindex(pay_days, 
                           method='ffill', 
                           fill_value=1)
                  .mul(start_rate)
                  )

输出:

2025-08-03    1060.000
2025-08-17    1060.000
2025-08-31    1060.000
2025-09-14    1060.000
2025-09-28    1060.000
2025-10-12    1113.000
2025-10-26    1113.000
2025-11-09    1113.000
2025-11-23    1113.000
2025-12-07    1113.000
2025-12-21    1113.000
2026-01-04    2287.215
2026-01-18    2287.215
2026-02-01    2287.215
Freq: 2W-SUN, dtype: float64

解释/中间体

  • 使用
    Series.add
    添加
    1
    ,将百分比转化为乘数,并使用
    Series.cumprod
    计算其随时间的累积效应。
raise_series.add(1).cumprod()

2024-10-01    1.060000
2025-10-01    1.113000
2026-01-01    2.287215
2026-10-01    2.378704
2027-10-01    2.473852
2028-10-01    2.572806
2029-10-01    2.675718
dtype: float64
  • Series.reindex
    pay_days
    一起使用,如果
    method='ffill'
    早于
    fill_value=1
    中的第一个日期,则使用
    1
    向前填充值,使用
    start
    将乘数设置为
    raise_series
  • 乘以
    start_rate
    Series.mul
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.