首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Python用于理论(条件)运行总计

将Python用于理论(条件)运行总计
EN

Stack Overflow用户
提问于 2022-09-27 23:41:48
回答 1查看 67关注 0票数 1

问题--如何使用规则复制最后一列“计算运行op股票”。必须能够解释多种产品。(编辑以尝试增加清晰度)

规则(基于示例数据的数字):

  • 行0如果库存已知-使用它(10)
  • 第1行(如果库存未知)-使用前几周的开盘库存(10)-前几周的销售(3)+前一周的生产(4)=(11)
  • 第2行,如果库存未知,而前一周的销售尚未完成或发生,则使用前一周的库存(11)-前一周的预测(3)+前一周的生产(2)= (10)

感觉应该很简单,但我对Python还不熟悉,所以无法理解。尝试了shift(1),但只对没有值的第一行工作。试过累积和不算零而没有运气。如果这是更好的实践,我很高兴我应该使用助手列,或者让数据水平运行而不是垂直运行?

代码语言:javascript
复制
df = pd.DataFrame({
'product':['A','A','A'],
'week':pd.date_range('9/12/2022', periods=3, freq='W'),
'sales':[3,0.5,0],
'forecast':[5,3,7],
'production':[4,2,3],
'opening stock':[10,np.nan,np.nan],
'calculated running op stock': [10,11,10] # This is what i want to calculate based on the criteria above
})

输入:

代码语言:javascript
复制
  product       week  sales  forecast  production  opening stock
0       A 2022-09-18    3.0         5           4           10.0
1       A 2022-09-25    0.5         3           2            NaN
2       A 2022-10-02    0.0         7           3            NaN

期望产出:

代码语言:javascript
复制
  product       week  sales  forecast  production  opening stock  calculated running op stock
0       A 2022-09-18    3.0         5           4           10.0                           10
1       A 2022-09-25    0.5         3           2            NaN                           11
2       A 2022-10-02    0.0         7           3            NaN                            10
EN

回答 1

Stack Overflow用户

发布于 2022-09-28 17:38:42

您可以简单地迭代这些行并根据上一行和当前行分配值:

代码语言:javascript
复制
import pandas as pd
import numpy as np

df = pd.DataFrame({
'product':['A','A','A'],
'week':pd.date_range('9/12/2022', periods=3, freq='W'),
'sales':[3,0.5,0],
'forecast':[5,3,7],
'production':[4,2,3],
'opening stock':[10,np.nan,np.nan]
})

df["calculated running op stock"] = df['opening stock']
prev_na = False
for idx in range(len(df)):
    row = df.iloc[idx]
    prev_row = df.iloc[idx-1] if idx>0 else None
    if pd.isna(row["calculated running op stock"]): # CASE 0
        if prev_na: # CASE 2
            df.loc[idx, "calculated running op stock"] = prev_row["calculated running op stock"] - prev_row["forecast"] + prev_row["production"]
        else: # CASE 1
            df.loc[idx, "calculated running op stock"] = prev_row["calculated running op stock"] - prev_row["sales"] + prev_row["production"]
        prev_na = True
    else:
        prev_na = False

输出:

代码语言:javascript
复制
  product       week  sales  forecast  production  opening stock  calculated running op stock 

0       A 2022-09-18    3.0         5           4           10.0                         10.0
1       A 2022-09-25    0.5         3           2            NaN                         11.0
2       A 2022-10-02    0.0         7           3            NaN                         10.0
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73874799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档