【问题标题】:Analysis of changes of categorical variables in the dataframe分析数据框中分类变量的变化
【发布时间】:2020-04-17 18:17:05
【问题描述】:

我有一个枢轴数据框,其中包含有关许多旅行者在世界各地旅行中所处区域的信息。 我的枢轴 df 看起来像这样:

     Name           Anna         Robert        James
Date               
2018-10-01        Bulgaria       Spain         Croatia
2018-10-02        Portugal       NaN           Portugal  
2018-10-03        Spain          USA           Spain
2018-10-04        USA            USA           Spain
2018-10-05        USA            Canada        USA

有 100 列(100 位旅行者)和 300 天。

根据这些数据,我该如何探索哪些路线最受欢迎? 乍一看,他们都是从西班牙来到美国的。罗伯特也从西班牙飞往美国,只是他的飞行持续了 2 天。三位游客中有两位从葡萄牙来到西班牙,因此这也是一条受欢迎的路线。

有没有办法使用 ML 算法显示热门路线?我将非常感谢任何提示。

编辑: 我们可以假设该路线有 2 个节点,因此基于这条 df 西班牙-美国是一条受欢迎的路线

【问题讨论】:

  • 我认为这个问题属于数据科学或统计堆栈交换,但它非常有趣。 V.很想知道您可以应用什么解决方案。
  • 如果用符号替换每个国家/地区名称,您的问题实际上将变成寻找最常见的子字符串(您没有指定公共路线的长度或其连续性的约束)。例如,您的数据变为:S1:BPSUUS2:SUUCS3:CPSSU。有关更多信息,请参阅链接的问题。
  • 考虑到编辑,这个问题实际上并不需要任何复杂的 ML 或非 ML 算法。正如问题的答案所暗示的那样,只需沿路线进行蛮力搜索并存储结果加上最终计数即可得出答案。

标签: python pandas algorithm machine-learning data-science


【解决方案1】:

您可以做的最简单的事情是通过压缩每个用户列及其移动的自身来创建起点-终点元组,然后将元组传递给 Counter 对象。

import pandas as pd
from collections import Counter

df.fillna(method='ffill', inplace=True)

# Create a counter object and pass it the origin-destination tuples
counter = Counter()
for col in df.columns:
    routes = list(zip(df[col].shift(1, fill_value=df[col][0]), df[col]))
    routes = [(k, v) for k, v in routes if k != v]
    counter.update(routes)
counter.most_common(3)

输出:

counter.most_common(3)
Out[76]: 
[(('Spain', 'USA'), 3),
 (('Portugal', 'Spain'), 2),
 (('Bulgaria', 'Portugal'), 1)]

【讨论】:

  • 由于 OP 没有真正指定 route 的含义,并且如果路线上有任何长度或其他限制,我认为我们不能只假设路线包含两个节点。如果最受欢迎的路线是:葡萄牙、西班牙、美国
  • 这是一个公平的评论,确实 OP 可能会修改他们的问题。但是,目前该问题将西班牙-美国和葡萄牙-西班牙作为热门航线进行讨论。因此,我目前的答案是基于每条路线的长度为两条的假设。
  • 感谢您的回复。我刚刚更新了我们可以假设路由有 2 个节点的 OP。 KRKirov,在将您的代码应用于原始 df 作为最受欢迎的路线后,我得到了相同国家/地区的对,例如美国-美国,葡萄牙-葡萄牙。你知道如何摆脱它吗?一般来说,您的解决方案很棒!谢谢!
  • 我编辑了答案,并在代码中添加了一个列表理解,只留下具有不同来源和目的地的元组。
猜你喜欢
  • 2014-06-20
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2021-07-11
  • 1970-01-01
  • 2019-05-05
相关资源
最近更新 更多