需要和提供 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
数据框
groupby
和 cumsum
获取每个 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 算法 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章