需要和提供 Python 算法 [关闭]

Posted

技术标签:

【中文标题】需要和提供 Python 算法 [关闭]【英文标题】:Need and Supply Python Algorithm [closed] 【发布时间】:2021-12-18 02:56:14 【问题描述】:

我正在从事一个从 SQL 转移到 Python 的分配项目,因为我认为这最好用 Python 来处理。所以我在下面有2张桌子。第一个 NEED TABLE 是我为每个合作伙伴、每个商店提供所需物品的地方,我根据他们需要的数量对它们进行了排名,目标是首先为最需要的商店提供服务。第二个表是我有可用供应数量的地方。

第三个输出表是我对 Python 代码的目标输出。如何在 python 上为此编写一个简短的代码循环以获取输出表? (考虑到有成千上万的合作伙伴 ID 和 ITEM_ID)。我正在考虑 while 语法,但如果您有其他建议,请随时提出!

NEED_TBL

PARTNER_ID ITEM_ID STORE NEED NEED_RANK
1 ID32 621 57 1
1 ID32 321 9 2
1 ID32 315 3 3
1 ID32 732 1 4
2 ID32 443 5 1
2 ID32 321 2 2

SUPPLY_TBL

PARTNER_ID ITEM_ID SUPPLY
1 ID32 57
2 ID32 6

输出表

PARTNER_ID ITEM_ID STORE NEED NEED_RANK RECEIVED_SUPPLY
1 ID32 621 57 1 57
1 ID32 321 9 2 0
1 ID32 315 3 3 0
1 ID32 732 1 4 0
2 ID32 443 5 1 5
2 ID32 321 2 2 1

【问题讨论】:

请附上您尝试过的代码。 所以我的代码是在 SQL 中的,我对如何在 python 上做到这一点不是很熟悉。在 SQL 上,我加入了 NEED 和 SUPPLY 表并创建了一个新表,其中包含比较 IF NEED 【参考方案1】:

您可以使用 pandas 来做到这一点:

import pandas as pd
import sqlite3
conn = sqlite3.connect('your_database.db')
df1 = pd.read_sql('SELECT * FROM table1', conn)
df2 = pd.read_sql('SELECT * FROM table2', conn)

df_final = df1.merge(df2, on = ["PARTNER_ID", "ITEM_ID"], how="left")

【讨论】:

是的,我已经这样做了,但我不确定如何计算 RECEIVED_SUPPLY 列【参考方案2】:
    merge 数据框 groupbycumsum 获取每个 PARTNER_ID 和 ITEM_ID 所需的总数量。 计算供应量并使用clip 限制负值。
merged = need_tbl.merge(supply_tbl, on=["PARTNER_ID", "ITEM_ID"], how="left")
total_need = merged.groupby(["PARTNER_ID", "ITEM_ID"])["NEED"].transform("cumsum")
merged["RECEIVED_SUPPLY"] = (merged["NEED"]-(total_need-merged["SUPPLY"]).clip(0)).clip(0)
merged = merged.drop("SUPPLY", axis=1)

>>> merged

   PARTNER_ID ITEM_ID  STORE  NEED  NEED_RANK  RECEIVED_SUPPLY
0           1    ID32    621    57          1               57
1           1    ID32    321     9          2                0
2           1    ID32    315     3          3                0
3           1    ID32    732     1          4                0
4           2    ID32    443     5          1                5
5           2    ID32    321     2          2                1

【讨论】:

哇,谢谢!我之所以考虑做一个while循环是因为如果有一个额外的供应,我可以平均分配额外的供应。你知道我该如何调整它吗? 请不要在cmets中追问。如果需要,创建一个新帖子。当前问题(如最初发布的)已得到解答【参考方案3】:

我知道您要求提供 Python 代码,但如果我可以说服您使用 SQL,这里是使用 window function 的尝试

with cte as
(select n.*,
        s.supply,
        sum(n.need) over (partition by n.partner_id, n.item_id order by n.need_rank) as cumulative_need
from need n
join supply s on n.partner_id=s.partner_id and s.item_id=n.item_id)

select partner_id,
       item_id,
       store,
       need,
       need_rank,
       case when supply-cumulative_need >=0 then need
            when need+supply-cumulative_need > 0 then need+supply-cumulative_need 
            else 0 
       end as received_supply
from cte      
order by partner_id, item_id, need_rank asc;

【讨论】:

以上是关于需要和提供 Python 算法 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中测试 APriori 和 FP-growth 的实现 [关闭]

从python代码中提取算法/伪代码[关闭]

向现有 Python 应用程序添加 IPC 支持 [关闭]

在 C 中为所有可能的排列设计一个算法,包括零[关闭]

BLAST对齐算法的Python实现? [关闭]

Python中的基数排序[关闭]