【问题标题】:CSV: find best match/closest value by several parameters in 2 different CSV files?CSV:通过 2 个不同 CSV 文件中的多个参数找到最佳匹配/最接近的值?
【发布时间】:2021-09-03 18:40:08
【问题描述】:

我有一个代码可以在 2 个 CSV 文件之间搜索最接近的值。它读取一个名为“common_list”的 CSV 文件,其中包含一些如下所示的数据库:

common_name common_Price common_Offnet common_Traffic
name1 1300 250 13000
name2 1800 350 18000

代码将这些 CSV 行放入一个列表中,然后创建 NumPy 数组。

common_list = pd.read_csv("common_list.csv")
common_list_offnet = common_list["common_Offnet"].to_list()
common_list_traffic = common_list["common_Traffic"].to_list()

array_offnet = np.array(common_list_offnet)
array_traffic = np.array(common_list_traffic)
array = np.column_stack((array_offnet,array_traffic))

我们将此 CSV 文件用作可用手机套餐的数据库(套餐名称、价格、网外通话和互联网流量)。

然后,代码读取另一个名为“By_ARPU”的 CSV 文件,其中包含 100k+ 行的用户以及他们如何使用手机套餐(他们花了多少钱(套餐价格)、多少网外通话和流量)。此 CSV 文件的标题如下所示:

User ID ARPU_AVERAGE Offnet Calls Traffic (MB)

其中 ARPU_AVERAGE 对应于用户花费的金额(他们支付的价格)。该代码通过 2 个参数找到 CSV 文件之间最接近的值:Offnet callsTraffic (MB)

csv_data = pd.read_csv("By_ARPU.csv")

data = csv_data[['Offnet Calls', 'Traffic (MB)']]
data = data.to_numpy()

sol = []
for target in data:
    
    dist = np.sqrt((np.square(array[:,np.newaxis]-target).sum(axis=2))
    idx =  np.argmin(dist)
    sol.append(idx)

csv_data["Suggested Plan [SP]"] = common_list['common_name'][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)

它从数据库中找到最接近的值,并显示名称和相应的网外呼叫、流量。例如,如果在“By_ARPU”文件中,Offnet calls 和 Traffic (MB) 的值分别为 250 和 13000,它将显示与“common_list”最接近的值的名称,即 name1。

我想为相同的搜索创建额外的代码,但有 3 个参数。您可以看到第一个数据库“common_list”有 3 个参数:common_Pricecommon_Offnetcommon_Offnet。在前面的代码中,我们通过 2 个值找到了最接近的值。

在不同的 CSV 文件中,与其他列对应的是:common_list 中的“common_Offnet” - By_ARPU 中的“Offnet calls” AND common_list 中的“common_Traffic” - By_ARPU 中的“Traffic (MB)”。

我想要:

通过 3 个参数找到最接近的值:价格、离线通话和流量。 “By_ARPU”文件中与价格对应的列称为“AVERAGE_APRU”。

请帮助修改代码以通过按这 3 个参数而不是 2 个参数进行搜索来找到最接近的值。

【问题讨论】:

    标签: python pandas numpy csv


    【解决方案1】:

    输入数据:

    >>> plans
      common_name  common_Price  common_Offnet  common_Traffic
    0       plan1          1300            250           13000
    1       plan2          1800            350           18000
    
    >>> df
      User ID  ARPU_AVERAGE  Offnet Calls  Traffic (MB)
    0   Louis          1300           250         13000  # plan1 for sure (check 1)
    1    Paul          1800           350         18000  # plan2, same values (check 2)
    2    Alex          1500           260         14000  # plan1, probably
    

    创建匹配函数:

    def rmse(user, plans):
        u = user[['ARPU_AVERAGE', 'Offnet Calls', 'Traffic (MB)']].values.astype(float)
        p =  plans[['common_Price', 'common_Offnet', 'common_Traffic']].values
        plan = np.sqrt(np.square(np.subtract(p, u)).mean(axis=1)).argmin()
        return plans.iloc[plan]['common_name']
    
    
    df['Best Plan'] = df.apply(rmse, axis="columns", plans=plans)
    

    输出:

    >>> df
      User ID  ARPU_AVERAGE  Offnet Calls  Traffic (MB) Best Plan
    0   Louis          1300           250         13000     name1
    1    Paul          1800           350         18000     name2
    2    Alex          1500           260         14000     name1
    

    编辑:包含变量名的完整代码:

    common_list = pd.read_csv("common_list.csv")
    csv_data = pd.read_csv("By_ARPU.csv")
    
    find_the_best_plan = lambda target: np.sqrt(np.square(np.subtract(array, target)).mean(axis=1)).argmin()
    
    array = common_list[['common_Price', 'common_Offnet', 'common_Traffic']].values
    data = csv_data[['ARPU_AVERAGE', 'Offnet Calls', 'Traffic (MB)']].values
    
    sol = np.apply_along_axis(find_the_best_plan, 1, data)
    
    csv_data["Suggested Plan [SP]"] = common_list['common_name'].iloc[sol].values
    csv_data["SP: Offnet Minutes"] = common_list['common_Offnet'].iloc[sol].values
    csv_data["SP: Traffic"] = common_list['common_Traffic'].iloc[sol].values
    

    【讨论】:

    • 嗨!它显示:rmse() 缺少 1 个必需的位置参数:“计划”。我做错了一些以前的代码吗?能否请您在完整代码中展示它的样子
    • 检查输入数据:我的plans 是您的common_list 数据框,我的df 是您的csv_data 数据框。
    • 是的,我知道,我更新了这一刻,但仍然收到不同的错误。如果不难,你能用和我一样的名字更新它吗?对此感到抱歉
    • @ThomasCuisance。我用你的变量名更新了我的代码。这是完整的代码。
    • 看起来它工作正常,并且与我的概念相同,但执行需要 5-10 分钟,而我之前的代码在 30-40 秒内执行。速度可以提高吗?花费这么长时间的原因是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    相关资源
    最近更新 更多