python – 稀疏矢量pyspark

python – 稀疏矢量pyspark,第1张

概述我想找到一种使用数据帧在PySpark中创建备用向量的有效方法. 让我们说给出交易输入: df = spark.createDataFrame([ (0, "a"), (1, "a"), (1, "b"), (1, "c"), (2, "a"), (2, "b"), (2, "b"), (2, "b"), (2, "c"), 我想找到一种使用数据帧在PySpark中创建备用向量的有效方法.

让我们说给出交易输入:

df = spark.createDataFrame([    (0,"a"),(1,"b"),"c"),(2,(0,"cc"),(3,(4,(5,"c")],["ID","category"])
+---+--------+| ID|category|+---+--------+|  0|       a||  1|       a||  1|       b||  1|       c||  2|       a||  2|       b||  2|       b||  2|       b||  2|       c||  0|       a||  1|       b||  1|       b||  2|      cc||  3|       a||  4|       a||  5|       c|+---+--------+

总结格式:

df.groupBy(df["ID"],df["category"]).count().show()
+---+--------+-----+| ID|category|count|+---+--------+-----+|  1|       b|    3||  1|       a|    1||  1|       c|    1||  2|      cc|    1||  2|       c|    1||  2|       a|    1||  1|       a|    1||  0|       a|    2|+---+--------+-----+

我的目标是通过ID得到这个输出:

+---+-----------------------------------------------+| ID|                                       feature |+---+-----------------------------------------------+|  2|SparseVector({a: 1.0,b: 3.0,c: 1.0,cc: 1.0})|

你能指点我正确的方向吗?使用Java中的mapreduce对我来说似乎更容易.

解决方法 使用pivot和VectorAssembler可以非常轻松地完成此 *** 作.用pivot替换聚合:

piVoted = df.groupBy("ID").pivot("category").count().na.fill(0)

和组装:

from pyspark.ml.feature import VectorAssemblerinput_cols = [x for x in piVoted.columns if x != ID]result = (VectorAssembler(inputCols=input_cols,outputCol="features")    .transform(piVoted)    .select("ID","features"))

结果如下.这将根据稀疏性选择更有效的表示:

+---+---------------------+|ID |features             |+---+---------------------+|0  |(5,[1],[2.0])        ||5  |(5,[0,3],[5.0,1.0])  ||1  |[1.0,1.0,3.0,0.0]||3  |(5,1],[3.0,1.0])  ||2  |[2.0,1.0]||4  |(5,[4.0,1.0])  |+---+---------------------+

但当然你仍然可以将它转换为单一的表示形式:

from pyspark.ml.linalg import SparseVector,VectorUDTimport numpy as npdef to_sparse(c):    def to_sparse_(v):        if isinstance(v,SparseVector):            return v        vs = v.toArray()        nonzero = np.nonzero(vs)[0]        return SparseVector(v.size,nonzero,vs[nonzero])    return udf(to_sparse_,VectorUDT())(c)
+---+-------------------------------------+|ID |features                             |+---+-------------------------------------+|0  |(5,[2.0])                        ||5  |(5,1.0])                  ||1  |(5,1,2,[1.0,1.0])      ||3  |(5,1.0])                  ||2  |(5,3,4],[2.0,1.0])||4  |(5,1.0])                  |+---+-------------------------------------+
总结

以上是内存溢出为你收集整理的python – 稀疏矢量pyspark全部内容,希望文章能够帮你解决python – 稀疏矢量pyspark所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1194376.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存