如何修改Python代码实现两个CSV基于3个参数的最近值匹配
3参数欧氏距离匹配修改方案
核心改动说明
- 匹配维度从2维扩展为3维,套餐侧新增
common_Price字段,用户侧新增ARPU_AVERAGE字段,两者列顺序严格对应保证距离计算准确 - 修复原代码中欧氏距离计算行缺失右括号的语法错误
- 输出结果新增匹配套餐的价格字段,方便核对
完整可运行代码
import pandas as pd import numpy as np # 读取套餐数据库,生成[价格、网外通话、流量]三列匹配数组 common_list = pd.read_csv("common_list.csv") array_price = np.array(common_list["common_Price"]) array_offnet = np.array(common_list["common_Offnet"]) array_traffic = np.array(common_list["common_Traffic"]) array = np.column_stack((array_price, array_offnet, array_traffic)) # 读取用户数据,按相同顺序提取匹配维度 csv_data = pd.read_csv("By_ARPU.csv") data = csv_data[['ARPU_AVERAGE', 'Offnet Calls', 'Traffic (MB)']].to_numpy() # 批量计算最近邻匹配 sol = [] for target in data: dist = np.sqrt(np.sum(np.square(array[:, np.newaxis] - target), axis=2)) idx = np.argmin(dist) sol.append(idx) # 写入匹配结果并输出 csv_data["Suggested Plan [SP]"] = common_list['common_name'][sol].values csv_data["SP: Price"] = common_list['common_Price'][sol].values csv_data["SP: Offnet Minutes"] = common_list['common_Offnet'][sol].values csv_data["SP: Traffic"] = common_list['common_Traffic'][sol].values csv_data.to_csv('4.7 final.csv', index=False, header=True)
可选优化建议
如果三个维度数值量级差异较大(例如价格为几十元量级,流量为数千MB量级),可增加标准化逻辑,避免量级高的维度主导匹配结果:
# 插入位置:array数组生成后、data数组生成后 mean = np.mean(array, axis=0) std = np.std(array, axis=0) # 套餐数组标准化 array = (array - mean) / std # 用户数组用相同的均值和标准差做标准化,保证计算逻辑一致 data = (data - mean) / std
内容的提问来源于stack exchange,提问作者Thomas Cuisance
相关产品推荐
相关产品推荐

