【发布时间】:2021-06-13 09:49:41
【问题描述】:
我有一个代码读取 CSV 文件中的一列,该文件包含 3 列:区域、离线呼叫和流量。
样本数据:
Zone Offnet calls Traffic
zone0 0 0
zone1 421 30167
zone2 667 23172
zone3 12146 215033
zone4 7163 126514
zone5 5211 130045
zone6 1374 75357
zone7 3702 257846
zone8 1129 77677
zone9 2679 79331
我需要“离线电话”和“流量”来创建列表。例如,第 2 行将是 [421, 30167] 并从包含相同参数列表的列表中搜索最佳匹配/最接近的值。 看代码就更清楚了:
tp_usp15 = [10, 200]
tp_usp23 = [15, 250]
tp_usp27 = [20, 300]
list_usp = [tp_usp15,tp_usp23, tp_usp27]
tp_bsnspls_s = [1,30]
tp_bsnspls_steel = [13,250]
tp_bsnspls_chrome = [18,350]
list_bsnspls = [tp_bsnspls_s,tp_bsnspls_steel,tp_bsnspls_chrome]
tp_bsnsrshn10 = [10,200]
tp_bsnsrshn15 = [15,300]
tp_bsnsrshn20 = [20,400]
list_bsnsrshn = [tp_bsnsrshn10,tp_bsnsrshn15,tp_bsnsrshn20]
common_list = list_usp + list_bsnspls + list_bsnsrshn
例如,从代码中提供的这个列表中,第 2 行 = [421, 30167] 的最接近值/最佳匹配是 [20, 400] = tp_bsnsrshn20。我需要一个代码来对 CSV 文件中的所有值进行相同的操作。需要将最接近的值/最佳匹配记录到下一列(应在“流量”列旁边创建一个名为“最佳匹配”的新列)。我有一个适用于输入的代码。 2 个用户输入创建一个列表,并从列表列表中完成搜索。
client_traffic = int(input("Enter the expected monthly traffic: "))
client_offnet = int(input("Enter monthly offnet calls: "))
list_client = [client_payment, client_offnet]
from functools import partial
def distance_squared(x, y):
return (x[0] - y[0])**2 + (x[1] - y[1])**2
best_match_overall = min(common_list, key=partial(distance_squared, list_client))
name_best_match_overall = [k for k,v in locals().items() if v == best_match_overall][0]
如何将此代码应用于整个 CSV 文件。顺便说一句,它还给出了值的名称。我想高级用户应该不难创建一些循环,这些循环将按照我在上一个代码中提供的相同概念工作,但适用于整个文件。在这一点上我真的很挣扎。提前谢谢各位!
【问题讨论】:
-
注意:应避免在您的问题中使用 CSV 数据的 Excel 屏幕截图,因为它使我们无法复制/粘贴数据进行测试。原始逗号分隔文本更好。此外,您真的不应该依赖变量名称(以及您对
locals()的使用),将名称作为数据结构的一部分包含在内要好得多。您甚至可以将其作为不同的 CSV 文件读入 -
@MartinEvans 如果您需要复制/粘贴,请添加前十行。有什么代码想法吗?