You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效计算Pandas DataFrame库存列?Python无循环处理大数据集

解决Pandas大数据集下高效计算库存列的问题

核心思路

你的库存计算规则可简化为递推公式:

当日库存 = max(前一日库存, 0) + (当日供应 - 当日需求)
首日初始库存为0,后续每日基于前一日结果计算,无需手动编写低效循环。

方法实现

首先构造示例数据集:

import pandas as pd
import numpy as np
from itertools import accumulate
import numba

df = pd.DataFrame({
    'day': [1,2,3,4,5,6,7],
    'demand': [11,11,11,11,11,11,11],
    'supply': [21,0,0,23,0,0,0]
})
# 先计算每日供需净变化
df['net'] = df['supply'] - df['demand']

方法1:Numba JIT加速(超大数据集首选)

利用Numba将循环编译为机器码,彻底消除Python循环的性能开销,百万级行数据也能快速处理:

@numba.jit(nopython=True)
def calculate_stock(net_arr):
    stock_arr = np.zeros_like(net_arr)
    prev_stock = 0
    for i in range(len(net_arr)):
        prev_stock = max(prev_stock, 0) + net_arr[i]
        stock_arr[i] = prev_stock
    return stock_arr

df['stock'] = calculate_stock(df['net'].values)

方法2:Itertools Accumulate(代码简洁,中小数据集首选)

用Python内置的itertools.accumulate实现自定义累积逻辑,底层为C实现,性能优于纯Python循环:

def stock_accumulator(prev_stock, current_net):
    return max(prev_stock, 0) + current_net

# initial=0指定首日初始库存,[1:]去掉初始值只保留每日结果
df['stock'] = list(accumulate(df['net'], stock_accumulator, initial=0))[1:]

方法3:Pandas Expanding Apply(逻辑直观)

利用Pandas的扩展窗口函数实现,适合快速验证逻辑,中小数据集可用:

def compute_daily_stock(net_series):
    if len(net_series) == 1:
        # 首日:初始库存0 + 当日净变化
        return max(0, 0) + net_series.iloc[0]
    # 非首日:前一日库存取max(前值,0) + 当日净变化
    return max(net_series.iloc[-2], 0) + net_series.iloc[-1]

df['stock'] = df['net'].expanding().apply(compute_daily_stock)

结果验证

运行任意方法后,df['stock']的结果将与示例完全一致:

0    10
1    -1
2   -11
3    12
4     1
5   -10
6   -11
Name: stock, dtype: int64

内容的提问来源于stack exchange,提问作者Shlim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 10:51:37