小编mou*_*hio的帖子

在pandas中重新索引和填充层级索引的一个级别

我有一个带有两级分层索引('item_id'和'date')的pandas数据帧.每行都有列,用于特定月份中特定项目的各种指标.这是一个示例:

                    total_annotations  unique_tags
date       item_id
2007-04-01 2                       30           14
2007-05-01 2                       32           16
2007-06-01 2                       36           19
2008-07-01 2                       81           33
2008-11-01 2                       82           34
2009-04-01 2                       84           35
2010-03-01 2                       90           35
2010-04-01 2                      100           36
2010-11-01 2                      105           40
2011-05-01 2                      106           40
2011-07-01 2                      108           42
2005-08-01 3                      479          200
2005-09-01 3                      707          269
2005-10-01 3                      980          327
2005-11-01 3                     1176          373
2005-12-01 3                     1536          438
2006-01-01 3                     1854          497
2006-02-01 3                     2206          560
2006-03-01 3                     2558 …
Run Code Online (Sandbox Code Playgroud)

python pandas

6
推荐指数
1
解决办法
2248
查看次数

了解mesos上的spark作业的资源分配

我正在开发一个Spark项目,最近从使用Spark Standalone转向Mesos进行集群管理.我现在发现自己在如何在新系统下提交作业时分配资源时感到困惑.

在独立模式下,我使用的是这样的东西(遵循Cloudera博客文章中的一些建议:

/opt/spark/bin/spark-submit --executor-memory 16G --executor-cores 8 
    --total-executor-cores 240 myscript.py
Run Code Online (Sandbox Code Playgroud)

这是在一个集群上,每台机器有16个内核和~32 GB RAM.

有趣的是,我可以很好地控制运行的执行程序数量和分配给每个执行程序的资源.在上面的例子中,我知道我有240/8 = 30个执行器,每个执行器有16GB内存和8个内核.给定群集中每台计算机上的内存,这相当于每台计算机上运行的执行程序不超过两个.如果我想要更多执行者,我可以做类似的事情

/opt/spark/bin/spark-submit --executor-memory 10G --executor-cores 5 
    --total-executor-cores 240 myscript.py
Run Code Online (Sandbox Code Playgroud)

现在这将给我240/5 = 47个执行器,每个执行器具有5个内核和10GB内存,并且每台机器最多允许3个执行器.

但现在我正在使用mesos,我有点困惑.首先,我正在以粗粒度模式运行,以确保我可以修复和控制我的资源分配(这是我们想要预先分配资源的相当复杂模型的服务).

现在,我可以指定--total-executor-cores--executor-memory,但文档告诉我--exeuctor-cores仅适用于Spark独立和YARN,这使得指定分配给每个困难的执行程序和资源的总数.说我运行这个:

/opt/spark/bin/spark-submit --total-executor-cores 240 --executor-memory 16G --conf spark.mesos.coarse=true myscript.py
Run Code Online (Sandbox Code Playgroud)

当我在Mesos Web UI中检查这个工作时,事情开始变得混乱.所以,这是我的问题:

  1. 术语.Web UI列出了"框架",我假设它与独立UI中的"作业"相对应.但是当我点击给定框架的细节时,它会列出"任务".但这些不能是实际的Spark任务,对吗?据我所知,就任务而言,这里的"任务"实际上必须意味着"执行者".这与UI说我的框架(作业)具有以下内容是一致的:15个活动任务,240个CPU和264GB内存.

    264/15 = 17.6,这似乎与我指定的每个执行器的16GB内存一致(加上一些开销,我猜).我是否正确地解释了这一切?

  2. 假设是的,当我检查这些"任务"(执行程序)中的任何一个时,我看到每个都分配了16个核心.鉴于我们每台机器有16个核心,这似乎表明我基本上在16台机器上运行了一个执行器,并且每个执行器都获得了完整的16个核心,但只有16 GB的RAM.(请注意,即使我下降--executor-memory到4GB,mesos仍然只为每个节点运行一个执行程序,具有16个内核和4GB RAM).但我想要完成的事情就像我的前两个例子.也就是说,我希望每个节点运行多个执行程序,每个执行程序共享该节点的RAM和核心(即中等数量的核心预执行程序,5-8).考虑到我无法--executor-cores在Mesos中指定,我该如何做到这一点?或者我是否因为某种原因离开基地甚至想要完成这个?Mesos会不允许每个节点有多个执行器?

mesos apache-spark

6
推荐指数
1
解决办法
4392
查看次数

在最后一列中用逗号解析熊猫中的 CSV 文件

我遇到了一些格式错误的 CSV 数据,我需要将这些数据读入 Pandas 数据帧。我无法更改数据的记录方式(它来自其他地方),所以请不要提出任何解决方案。

大多数数据都很好,但有些行在最后一列中有逗号。一个简化的例子:

column1 is fine,column 2 is fine,column3, however, has commas in it!
Run Code Online (Sandbox Code Playgroud)

所有行都应该有相同的列数 (3),但是这个例子当然打破了 CSV 阅读器,因为逗号表明有 5 列,而实际上有 3 列。

请注意,没有引用可以让我使用标准的 CSV 阅读器工具来处理这个问题。

然而,我知道的是,额外的逗号总是出现在最后(最右边)列中。这意味着我可以使用归结为以下解决方案:

“始终假设有 3 列,从左侧开始计数,并将所有额外的逗号解释为第 3 列中的字符串内容”。或者,换种说法,“将前两个逗号解释为列分隔符,但假设任何后续逗号只是第 3 列中字符串的一部分。”

我可以想到很多笨拙的方法来实现这一点,但我的问题是:是否有任何优雅、简洁的方法来解决这个问题,最好是在我的调用中pandas.csv_reader(...)

python pandas

5
推荐指数
1
解决办法
2067
查看次数

重新采样'how = count'导致问题

我有一个简单的pandas数据帧,可以在不同的时间进行测量:

                     volume
t
2013-10-13 02:45:00      17
2013-10-13 05:40:00      38
2013-10-13 09:30:00      29
2013-10-13 11:40:00      25
2013-10-13 12:50:00      11
2013-10-13 15:00:00      17
2013-10-13 17:10:00      15
2013-10-13 18:20:00      12
2013-10-13 20:30:00      20
2013-10-14 03:45:00       9
2013-10-14 06:40:00      30
2013-10-14 09:40:00      43
2013-10-14 11:05:00      10
Run Code Online (Sandbox Code Playgroud)

我正在做一些基本的重新采样和绘图,例如每日总量,它工作正常:

df.resample('D',how='sum').head()   

            volume
t
2013-10-13     184
2013-10-14     209
2013-10-15     197
2013-10-16     309
2013-10-17     317
Run Code Online (Sandbox Code Playgroud)

但出于某些原因,当我尝试每天输入总数时,它会返回一个多索引系列而不是数据帧:

df.resample('D',how='count').head()

2013-10-13  volume     9
2013-10-14  volume     9
2013-10-15  volume     7
2013-10-16  volume     9
2013-10-17  volume    10
Run Code Online (Sandbox Code Playgroud)

我可以修复数据,因此可以通过一个简单的无堆栈调用轻松绘制,即df.resample('D',how='count').unstack()为什么调用resample与how='count'行为不同how='sum'

python pandas

4
推荐指数
1
解决办法
4473
查看次数

使用spark-csv重载方法错误

我正在使用Databricks spark-csv包(通过Scala API),并且在定义自定义模式时遇到问题.

用启动控制台后

spark-shell  --packages com.databricks:spark-csv_2.11:1.2.0
Run Code Online (Sandbox Code Playgroud)

我导入了我必要的类型

import org.apache.spark.sql.types.{StructType, StructField, StringType, IntegerType}
Run Code Online (Sandbox Code Playgroud)

然后只需尝试定义此架构:

val customSchema = StructType(
    StructField("user_id", IntegerType, true),
    StructField("item_id", IntegerType, true),
    StructField("artist_id", IntegerType, true),
    StructField("scrobble_time", StringType, true))
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

<console>:26: error: overloaded method value apply with alternatives:
  (fields: Array[org.apache.spark.sql.types.StructField])org.apache.spark.sql.types.StructType <and>
  (fields: java.util.List[org.apache.spark.sql.types.StructField])org.apache.spark.sql.types.StructType <and>
  (fields: Seq[org.apache.spark.sql.types.StructField])org.apache.spark.sql.types.StructType
 cannot be applied to (org.apache.spark.sql.types.StructField, org.apache.spark.sql.types.StructField, org.apache.spark.sql.types.StructField, org.apache.spark.sql.types.StructField)
       val customSchema = StructType(
Run Code Online (Sandbox Code Playgroud)

我对scala很新,所以解析这个问题很困难,但我在这里做错了什么?我在这里遵循这个非常简单的例子.

scala apache-spark apache-spark-sql

4
推荐指数
1
解决办法
2392
查看次数

访问csr_matrix中的特定行列

我有一个csr格式的稀疏矩阵(这对我的目的来说很有意义,因为它有很多行,但列数相对较少,约为8百万x 90).

我的问题是,在给定行,列元组的情况下,从矩阵中访问特定值的最有效方法是什么?我可以快速获取一行matrix.getrow(row),但这也返回1行稀疏矩阵,并且访问特定列的值似乎很笨拙.在给定行和列的情况下,我发现获得特定矩阵值的唯一可靠方法是:

matrix.getrow(row).todense().A1[column]
Run Code Online (Sandbox Code Playgroud)

但这似乎过于冗长和复杂.我缺少一个更简单/更快的方法吗?

python scipy

3
推荐指数
1
解决办法
3892
查看次数

计算MySQL中每个项目的平均行数

我很难找到一个明确的,通用的方法来表达这个问题,所以如果它是重复的话,我会道歉.情况如下:

我有一个记录协作标记数据的表,每行存储一个注释(即特定用户在特定时间用特定标记标记特定项目).为清晰起见,这是一个示例:

+---------+---------+--------+------------+
| user_id | item_id | tag_id | tag_month  |
+---------+---------+--------+------------+
| 1040740 |    2653 |   1344 | 2005-07-01 |
| 1040740 |    3602 |   1344 | 2005-07-01 |
| 1040740 |   17746 |    217 | 2005-07-01 |
| 1040740 |   21426 |   1344 | 2005-07-01 |
| 1040740 |   22224 |    180 | 2005-07-01 |
+---------+---------+--------+------------+
Run Code Online (Sandbox Code Playgroud)

...等等.我想要计算的是,按月计算所有项目中每个项目的平均注释数.换句话说,对于每个月,该月的每个唯一项目的平均行数是多少?我的数据集总共超过94个月,因此我想要的查询的输出应该是94行,每行包含该月的每个项目的平均注释数.请注意,"user_id"列与此完全无关.

mysql

2
推荐指数
1
解决办法
802
查看次数

pandas中不同列的不同填充方法

我正在以标准方式重新索引数据帧,即

df.reindex(newIndex,method='ffill')
Run Code Online (Sandbox Code Playgroud)

但意识到我需要逐列处理丢失的数据.也就是说,对于某些我希望填充的列,但对于其他列,我希望丢失记录为NA的值.

为简单起见,假设我想要填充的X列,以及我希望NA填充的Y列.我如何调用.reindex来完成此任务?

python pandas

2
推荐指数
1
解决办法
732
查看次数

将错误栏添加到pandas中的分组条形图中

我首先生成以下DataFrame,在pandas中生成一个图:

plotData=resultData.groupby(['student_model','lo_id']).describe().nShots.unstack().reset_index()
plotData['se'] = plotData['std']/np.sqrt(plotData['count'])
Run Code Online (Sandbox Code Playgroud)

结果数据框如下所示: 在此输入图像描述

然后我像这样转动和绘图:

plotData.pivot(index='student_model',columns='lo_id',values='mean').plot(kind='bar')
Run Code Online (Sandbox Code Playgroud)

导致以下结果:

在此输入图像描述

这一切都很好,但我需要将"se"列中的值作为错误栏添加到绘图中,并且无法使其工作.我知道我可以添加一个参数来调用plot(即...plot(kind='bar', yerr=???)),但我不知道如何正确格式化它以使其正常工作.有任何想法吗?

python matplotlib pandas

2
推荐指数
1
解决办法
2978
查看次数

报告 spark LDA 模型的对数似然/困惑(本地模型与分布式模型不同?)

给定一个训练语料库docsWithFeatures,我在 Spark(通过 Scala API)中训练了一个 LDA 模型,如下所示:

import org.apache.spark.mllib.clustering.{LDA, DistributedLDAModel, LocalLDAModel}
val n_topics = 10;
val lda = new LDA().setK(n_topics).setMaxIterations(20)
val ldaModel = lda.run(docsWithFeatures)

val distLDAModel = ldaModel.asInstanceOf[DistributedLDAModel]
Run Code Online (Sandbox Code Playgroud)

现在我想报告模型的对数似然和困惑度。

我可以像这样得到对数似然:

scala> distLDAModel.logLikelihood
res11: Double = -2600097.2875547716
Run Code Online (Sandbox Code Playgroud)

但这就是事情变得奇怪的地方。我也想要困惑,它只为本地模型实现,所以我运行:

val localModel  = distLDAModel.toLocal
Run Code Online (Sandbox Code Playgroud)

这让我得到这样的(日志)困惑:

scala> localModel.logPerplexity(docsWithFeatures)
res14: Double = 0.36729132682898674
Run Code Online (Sandbox Code Playgroud)

但是局部模型也支持对数似然计算,我是这样运行的:

scala> localModel.logLikelihood(docsWithFeatures)
res15: Double = -3672913.268234148
Run Code Online (Sandbox Code Playgroud)

那么这里发生了什么?两个对数似然值不应该相同吗?分布式模型的文档说

“logLikelihood:给定推断主题和文档主题分布的训练语料库的对数似然”

而对于本地模型,它说:

“logLikelihood(documents):根据推断的主题计算提供的文档的下限。”

我想这些是不同的,但我不清楚如何或为什么。我应该使用哪一种?也就是说,给定训练文档,哪一个是模型的“真实”似然?

总结一下,两个主要问题:

1 - 两个对数似然值如何以及为什么不同,我应该使用哪个?

2 - 在报告困惑时,我认为我应该使用 的指数是否正确logPerplexity result?(但为什么模型会给出日志困惑而不是简单的困惑?我错过了什么吗?)

scala lda apache-spark

2
推荐指数
1
解决办法
2783
查看次数