我尝试比较两个 Dataframe ,但遇到了卷问题。
我将一个新商品描述的一行传递到一个450万行的库存列表中,然后计算相似度,我只需要前x个推荐,我意识到我目前的方法很快就会被大量的数据淹没,并导致内核崩溃。
我以前没有处理过这种数据大小,所以我不确定如何调整我的代码。
任何建议都是非常感谢的,目前的方法是先将数据放入dataframe(holding_df),然后groupby来收集最好的建议,但是一旦这个过程扩展到数据的完整大小,它就会崩溃。
> df.head()
item_desc
0 paintbrush
1 mop #2
2 red bucket
3 o-light flashlight
> df_inventory.head()
item_desc
0 broom
1 mop
2 bucket
3 flashlight
import pandas as pd
from fuzzywuzzy import fuzz
def calculate_similarity(x, y):
sample_list.append(
{
"New Item": x,
"Inventory Item": y,
"Similarity": fuzz.ratio(str(x).lower(), str(y).lower()),
}
)
return
sample_list = []
df = pd.DataFrame(
{"ITEM_DESC": ["paintbrush", "mop #2", "red bucket", "o-light flashlight"]}
)
df_inventory = pd.DataFrame({"ITEM_DESC": ["broom", "mop", "bucket", "flashlight"]})
temp = df["ITEM_DESC"].apply(
lambda x: df_inventory["ITEM_DESC"].apply(lambda y: calculate_similarity(x, y))
)
holding_df = pd.DataFrame(sample_list)
1条答案
按热度按时间szqfcxe21#
我用普通Python实现了一些不会破坏内核的东西,但它不会很快。
将一个新产品与整个库存进行比较需要6-7秒,对于3.5k个条目来说可能太慢了(如果在我的机器上运行的话,大约需要6小时20分钟),不过通过一些工作,它可以并行化。
主要的内存节省器是
FixedSizeLeaderboard
类,我实现了该类来跟踪新产品中前n个最相似的项,由于该任务现在是CPU受限的,而不是真正的内存受限的,因此您可以稍微重写它以使用多处理模块。我决定只生成一些测试数据,这些数据可能代表实际性能,也可能不代表实际性能,我在插入数据的地方添加了一些注解。
如果我们执行它,我们会得到这样的结果: