小编Zel*_*ny7的帖子

使用熊猫的"大数据"工作流程

在学习大熊猫的过程中,我试图解决这个问题的答案已有好几个月了.我使用SAS进行日常工作,这非常适合它的核心支持.然而,由于其他许多原因,SAS作为一款软件非常糟糕.

有一天,我希望用python和pandas替换我对SAS的使用,但我目前缺乏大型数据集的核心工作流程.我不是在谈论需要分布式网络的"大数据",而是说文件太大而无法容纳在内存中,但又足够小以适应硬盘驱动器.

我的第一个想法是用于HDFStore在磁盘上保存大型数据集,并仅将我需要的部分拉入数据帧进行分析.其他人提到MongoDB是一种更容易使用的替代品.我的问题是:

有哪些最佳实践工作流程可用于完成以下任务:

  1. 将平面文件加载到永久的磁盘数据库结构中
  2. 查询该数据库以检索数据以提供给pandas数据结构
  3. 在操作pandas中的片段后更新数据库

真实世界的例子将非常受欢迎,尤其是那些在"大数据"上使用熊猫的人.

编辑 - 我希望如何工作的示例:

  1. 迭代导入大型平面文件并将其存储在永久的磁盘数据库结构中.这些文件通常太大而无法放入内存中.
  2. 为了使用Pandas,我想读取这些数据的子集(通常一次只有几列),它们可以适合内存.
  3. 我将通过对所选列执行各种操作来创建新列.
  4. 然后我必须将这些新列附加到数据库结构中.

我正在尝试找到执行这些步骤的最佳实践方法.阅读关于pandas和pytables的链接似乎附加一个新列可能是个问题.

编辑 - 特别回应杰夫的问题:

  1. 我正在构建消费者信用风险模型.数据种类包括电话,SSN和地址特征; 财产价值; 犯罪记录,破产等贬损信息......我每天使用的数据集平均有近1,000到2,000个字段的混合数据类型:数字和字符数据的连续,名义和序数变量.我很少附加行,但我会执行许多创建新列的操作.
  2. 典型操作涉及使用条件逻辑将多个列组合到新的复合列中.例如,if var1 > 2 then newvar = 'A' elif var2 = 4 then newvar = 'B'.这些操作的结果是我的数据集中每条记录的新列.
  3. 最后,我想将这些新列附加到磁盘上的数据结构中.我将重复第2步,使用交叉表和描述性统计数据探索数据,试图找到有趣,直观的模型关系.
  4. 典型的项目文件通常约为1GB.文件被组织成一种行,其中一行包括消费者数据的记录.每行对每条记录都有相同的列数.情况总是如此.
  5. 在创建新列时,我很少会按行进行子集化.但是,在创建报告或生成描述性统计信息时,对行进行子集化非常常见.例如,我可能想为特定的业务线创建一个简单的频率,比如零售信用卡.要做到这一点,除了我要报告的列之外,我只会选择那些业务线=零售的记录.但是,在创建新列时,我会提取所有数据行,只提取操作所需的列.
  6. 建模过程要求我分析每一列,寻找与某些结果变量的有趣关系,并创建描述这些关系的新化合物列.我探索的列通常以小集合完成.例如,我将专注于一组20个列,只处理属性值并观察它们与贷款违约的关系.一旦探索了这些并创建了新的列,我就转到另一组列,比如大学教育,然后重复这个过程.我正在做的是创建候选变量来解释我的数据和某些结果之间的关系.在这个过程的最后,我应用了一些学习技术,从这些复合列中创建一个方程式.

我很少会在数据集中添加行.我几乎总是会创建新的列(统计/机器学习用语中的变量或特征).

python hdf5 large-data mongodb pandas

913
推荐指数
14
解决办法
27万
查看次数

pandas中的大型持久性DataFrame

我正在探索作为长期SAS用户切换到python和pandas.

但是,今天运行一些测试时,我很惊讶python在尝试pandas.read_csv()128mb csv文件时内存不足.它有大约200,000行和200列主要是数字数据.

使用SAS,我可以将csv文件导入SAS数据集,它可以和我的硬盘一样大.

有类似的东西pandas吗?

我经常处理大型文件,无法访问分布式计算网络.

python sas pandas

88
推荐指数
4
解决办法
6万
查看次数

从pandas.HDFStore表中选择列

如何从pandas HDFStore中检索特定列?我经常处理非常大的数据集,这些数据集太大而无法在内存中操作.我想迭代地读取一个csv文件,将每个块附加到HDFStore对象中,然后处理数据的子集.我已经阅读了一个简单的csv文件,并使用以下代码将其加载到HDFStore中:

tmp = pd.HDFStore('test.h5')
chunker = pd.read_csv('cars.csv', iterator=True, chunksize=10, names=['make','model','drop'])
tmp.append('df', pd.concat([chunk for chunk in chunker], ignore_index=True))
Run Code Online (Sandbox Code Playgroud)

并输出:

In [97]: tmp
Out[97]:
<class 'pandas.io.pytables.HDFStore'>
File path: test.h5
/df     frame_table (typ->appendable,nrows->1930,indexers->[index])
Run Code Online (Sandbox Code Playgroud)

我的问题是如何从中访问特定列tmp['df']?该文档提到了一种select()方法和一些Term对象.提供的示例适用于小组数据; 然而,我太过新手,无法将其扩展到更简单的数据框案例.我的猜测是我必须以某种方式创建列的索引.谢谢!

python hdfs pandas

18
推荐指数
2
解决办法
2万
查看次数

pandas python中没有列名

关于熊猫数据框的基本问题.我有一个带数据点的1x1数据帧,并且没有列标题(当前). df[0,0]不起作用,因为我认为它期待列名.另外,df.0不工作也不df[0,'']. df.ix[0,0]确实有效.

一般来说,我是否需要有一个列名?将列名与pandas数据帧一起使用是最佳做法吗?如果我的sql查询没有列标题,那么最好在那时添加它们吗?

谢谢您的帮助.

python pandas

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

将R对象传递给Rust程序需要哪些步骤?

R和Rust都可以与C代码接口,所以我认为这很有可能.但是,我对如何继续有点不清楚.

我已阅读这些部分寻找答案:

  1. R-extensions系统和外语接口
  2. Rust外部函数接口指南

但是,虽然我精通,R但我不是一个系统程序员,并且对构建链看起来像这样的努力感到困惑.

使用Rinternals.h将是理想的,但我也会满足于更简单的.C界面.

r rust

9
推荐指数
2
解决办法
673
查看次数

R模式修改传递给泛型函数的参数

我有一个名为的泛型函数foo.它在类上的操作方式不同bar,baz但有一些共享预处理只需要执行一次.什么是惯用的R方式来实现这一目标?

在我下面的愚蠢示例中,我希望将传递给对象的对象乘以10.然而,当调用该方法时,原始值将打印到控制台.我已阅读语言定义并知道以下模式不起作用.我的问题是:在调用方法之前,我应该在何处或如何处理泛型参数的共享处理?

a <- structure(1:5, class="bar")
b <- structure(6:10, class="baz")

foo <- function(x) {
  x <- x * 10 # where should shared preprocessing go?
  UseMethod("foo")
}

foo.bar <- function(x) {
  cat("Foo!", x)
}

foo.baz <- function(x) {
  cat("Baz!", x)
}

# does not propagate the operations carried out `foo`
foo(a)
foo(b)
Run Code Online (Sandbox Code Playgroud)

oop r

9
推荐指数
1
解决办法
260
查看次数

在保持位置的同时更新Shiny DataTable的行

我正在创建一个Shiny应用程序,它在屏幕顶部显示data.frame信息,在底部显示特定的变量统计信息.用户可以通过与DT::datatable对象交互来导航data.frame列.

当用户点击变量时,会显示可以编辑的详细信息.我希望这些信息能够更新并反映在数据表中.我的问题是,当我更新表时,它会从一开始就呈现并显示.如何在编辑后保留数据表的页面和行选择?

这是一个最小的工作示例,显示了a中的mtcars数据集DT::datatable.我有一些控制更新字段.请注意,数据表重新渲染回第一页.

library(shiny)

runApp(shinyApp(

  ui = fluidPage(
    title = "minimal-working-example",
    fluidRow(
      column(3, inputPanel(
        selectInput("field", "Field", choices = names(mtcars)),
        numericInput("value", "Value", 0),
        actionButton("submit", "Submit")
      )),

      column(9,
        DT::dataTableOutput("table")
      )
    )
  ),

  server = function(input, output) {

    v <- reactiveValues(mtcars=mtcars)

    observeEvent(input$submit, {
      v$mtcars[input$field] <- input$value
    })

    output$table <- DT::renderDataTable({
      DT::datatable(
        v$mtcars,
        selection = "single",
        options = list(pageLength = 5))
    })
  }
))
Run Code Online (Sandbox Code Playgroud)

会话信息:

Session info --------------------------
 setting  value                       
 version  R version 3.3.0 (2016-05-03)
 system   x86_64, mingw32             
 ui …
Run Code Online (Sandbox Code Playgroud)

r shiny dt

8
推荐指数
1
解决办法
2963
查看次数

使用chunksize迭代地获取推断的数据帧类型

如何使用pd.read_csv()迭代地浏览文件并保留dtype和其他元信息,就好像我一次读入整个数据集一样?

我需要读入一个太大而无法放入内存的数据集.我想使用pd.read_csv导入文件,然后立即将块附加到HDFStore中.但是,数据类型推断对后续块没有任何了解.

如果存储在表中的第一个块仅包含int,并且后续块包含float,则会引发异常.所以我需要首先使用read_csv遍历数据帧并保留最高的推断类型.另外,对于对象类型,我需要保留最大长度,因为它们将作为字符串存储在表中.

是否存在仅在不读取整个数据集的情况下仅保留此信息的Pandonic方式?

python type-conversion pandas hdfstore

7
推荐指数
1
解决办法
5732
查看次数

Rstudio Roxygen2 @importFrom解析函数头

我正在使用Rstudio与Rcpp构建一个包.一切都工作正常,直到我将文档的标记添加到我的函数文件.我希望我忽略了一些明显的东西.

这是我的R函数文件:

#' @useDynLib tablr
#' @importFrom Rcpp sourceCpp
#'
#' fast.table
#'
#' C++ implementation of the R table function. Only supports numeric
#' vectors. Does not currently handle NAs.
#'
#' @param x1 Variable 1
#' @param x2 Variable 2
#' @return A table object equal in every way to an R table object with the same
#' inputs
#'
#' @export fast.table
fast.table <- function(x1, x2) {
  nms <- c(deparse(substitute(x1)), deparse(substitute(x2)))
  cpp_table(as.numeric(x1), as.numeric(x2), as.character(nms))
}
Run Code Online (Sandbox Code Playgroud)

运行后,devtools::document() …

r rcpp rstudio roxygen2

7
推荐指数
1
解决办法
1809
查看次数

在R中加载链接到Rust库的共享库

这里跟进这个问题,我在使用dyn.load加载链接到Rust dylib的共享库时遇到问题.我怀疑它与R在哪里寻找Rust dylib有关,但我没有找到一种方法来指定另一个位置而不是默认值.

从R开始,我执行以下操作:

> dyn.load('src/test.so')
Run Code Online (Sandbox Code Playgroud)

并收到此错误消息:

Error in dyn.load("src/test.so") : 
  unable to load shared object '/Users/Zelazny7/r-dev/rustr/src/test.so':
  dlopen(/Users/Zelazny7/r-dev/rustr/src/test.so, 6): Library not loaded: libglue.dylib
  Referenced from: /Users/Zelazny7/r-dev/rustr/src/test.so
  Reason: image not found
Run Code Online (Sandbox Code Playgroud)

如何加载依赖于另一个共享库的共享库?

文件对于dyn.load没有规定如何做到这一点.

更新:

感谢shepmaster,我能够在R中成功构建和导入共享库.共享库是用C编译的,并且本身链接到Rust库.这些是我的步骤:

  1. 编译共享的Rust库
  2. 使用以下命令编译共享C库并链接到Rust库(在Windows中,因为我今天早上在工作)

我的目录内容:

C:\Users\gravesee\test>ls
rglue.dll  rglue.rs  rustr.c  treble.h
Run Code Online (Sandbox Code Playgroud)

编译最终的共享库:

gcc -shared -m64 -I"C:\Program Files\R\R-3.2.0\include" rustr.c -L"C:\Program Files\R\R-3.2.0\bin\x64" -lR -L. -lrglue -o test.dll
Run Code Online (Sandbox Code Playgroud)

在R中加载库:

> dyn.load("test.dll")
> is.loaded("triple")
[1] TRUE
> .Call("triple", as.integer(32))
The triple is 96
Run Code Online (Sandbox Code Playgroud)

r shared-libraries rust

7
推荐指数
1
解决办法
893
查看次数