基于Pandas实现库存数据按日迭代生成与合并的问题求助
解决Pandas库存预测的循环生成问题
原代码的核心问题有两个:
- 每次循环都从原始DataFrame复制,导致日期始终是原始日期+1天,无法实现逐日累加;
- 新行的
Open Stock始终取原始数据的Close Stock,没有用上一次循环的库存值更新。
另外注意:原数据列名是Open Stock(带空格),但代码里用了OpenStock,需要统一列名避免报错。
方式一:循环逐行生成(灵活适配后续逻辑变化)
适合后续可能调整每日销量、SKU等变量的场景:
import pandas as pd # 1. 初始化原始数据并处理日期格式 original_data = { 'SKU': ['AAA'], 'Date': ['4/01/23'], 'Open Stock': [100], 'Daily Sales': [-10], 'Close Stock': [90] } original_df = pd.DataFrame(original_data) # 转换日期列为datetime类型,确保可以正确加减天数 original_df['Date'] = pd.to_datetime(original_df['Date'], format='%d/%m/%y') # 2. 初始化存储列表,先加入原始数据 df_list = [original_df.copy()] # 3. 设置要生成的后续天数X(示例生成4天,最终共5行数据) X = 4 # 4. 保存上一行的关键数据(SKU和每日销量固定,直接复用) last_close = original_df['Close Stock'].iloc[0] last_date = original_df['Date'].iloc[0] fixed_sku = original_df['SKU'].iloc[0] fixed_sales = original_df['Daily Sales'].iloc[0] # 5. 循环生成后续每日数据 for _ in range(X): # 计算新日期 new_date = last_date + pd.Timedelta(days=1) # 新开盘库存 = 上一日收盘库存 new_open = last_close # 新收盘库存 = 新开盘库存 + 当日销量 new_close = new_open + fixed_sales # 生成当日DataFrame daily_df = pd.DataFrame({ 'SKU': [fixed_sku], 'Date': [new_date], 'Open Stock': [new_open], 'Daily Sales': [fixed_sales], 'Close Stock': [new_close] }) # 加入列表并更新上一行数据 df_list.append(daily_df) last_close = new_close last_date = new_date # 6. 合并所有DataFrame并重置索引 final_df = pd.concat(df_list, ignore_index=True) # 可选:将日期转回原格式(dd/mm/yy) final_df['Date'] = final_df['Date'].dt.strftime('%d/%m/%y') print(final_df)
方式二:批量生成(适合销量固定的场景,更高效)
如果每日销量固定,无需逐行循环,直接生成序列即可:
import pandas as pd original_data = { 'SKU': ['AAA'], 'Date': ['4/01/23'], 'Open Stock': [100], 'Daily Sales': [-10], 'Close Stock': [90] } original_df = pd.DataFrame(original_data) start_date = pd.to_datetime(original_df['Date'].iloc[0], format='%d/%m/%y') X = 4 # 后续要生成的天数 total_days = X + 1 # 包含原始数据的总天数 # 生成日期序列 date_seq = pd.date_range(start=start_date, periods=total_days, freq='D').strftime('%d/%m/%y') # 生成开盘库存序列:从100开始,每日减10(因为销量固定-10) open_seq = [100 + (-10)*i for i in range(total_days)] # 生成收盘库存序列:开盘库存+当日销量 close_seq = [os + (-10) for os in open_seq] # 构建最终DataFrame final_df = pd.DataFrame({ 'SKU': ['AAA']*total_days, 'Date': date_seq, 'Open Stock': open_seq, 'Daily Sales': [-10]*total_days, 'Close Stock': close_seq }) print(final_df)
两种方式运行后都会得到你需要的完整库存数据。
内容的提问来源于stack exchange,提问作者JLJC
相关产品推荐
相关产品推荐

