小编yts*_*aig的帖子

将数据帧转换为data.table而不复制

我有一个大型数据框(大约几GB),我想转换为data.table.使用as.data.table创建数据框的副本,这意味着我需要的可用内存至少是数据大小的两倍.有没有办法在没有副本的情况下进行转换?

这是一个简单的示例来演示:

library(data.table)
N <- 1e6
K <- 1e2
data <- as.data.frame(rep(data.frame(rnorm(N)), K))

gc(reset=TRUE)
tracemem(data)
data <- as.data.table(data)
gc()
Run Code Online (Sandbox Code Playgroud)

随着输出:

library(data.table)
# data.table 1.8.10  For help type: help("data.table")
N <- 1e6
K <- 1e2
data <- as.data.frame(rep(data.frame(rnorm(N)), K))

gc(reset=TRUE)
# used  (Mb) gc trigger   (Mb)  max used  (Mb)
# Ncells    303759  16.3     597831   32.0    303759  16.3
# Vcells 100442572 766.4  402928632 3074.2 100442572 766.4
tracemem(data)
# [1] "<0x363fda0>"
data <- as.data.table(data)
# tracemem[0x363fda0 -> 0x31e4260]: copy …
Run Code Online (Sandbox Code Playgroud)

r reference dataframe data.table

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

在大型pandas DataFrame中按组移除异常值的更快方法

我有一个相对较大的DataFrame对象(大约一百万行,数百列),我想按组剪切每列中的异常值.通过"按组分组每个列的异常值"我的意思是 - 计算组中每列的5%和95%分位数,并剪切该分位数范围之外的值.

这是我目前正在使用的设置:

def winsorize_series(s):
    q = s.quantile([0.05, 0.95])
    if isinstance(q, pd.Series) and len(q) == 2:
        s[s < q.iloc[0]] = q.iloc[0]
        s[s > q.iloc[1]] = q.iloc[1]
    return s

def winsorize_df(df):
    return df.apply(winsorize_series, axis=0)
Run Code Online (Sandbox Code Playgroud)

然后,通过我的DataFrame调用features和索引DATE,我可以做到

grouped = features.groupby(level='DATE')
result = grouped.apply(winsorize_df)
Run Code Online (Sandbox Code Playgroud)

这是有效的,除了它非常慢,可能是由于嵌套apply调用:每个组一个,然后每个组中的每个列一个.我试图apply通过一次计算所有列的分位数来摆脱第二个,但是试图将每个列的阈值设置为不同的值.有没有更快的方法来完成此过程?

python pandas

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

R - 评估环境中的嵌套函数

我试图通过将所有必要的依赖项(函数和数据)加载到新环境中并在该环境中评估表达式,以沙盒方式运行一大块R代码.但是,我在调用环境中的其他函数时遇到了麻烦.这是一个简单的例子:

jobenv <- new.env(parent=globalenv())
assign("f1", function(x) x*2, envir=jobenv)
assign("f2", function(y) f1(y) + 1, envir=jobenv)
expr <- quote(f2(3))
Run Code Online (Sandbox Code Playgroud)

使用evalon expr失败,因为f2找不到f1

> eval(expr, envir=jobenv)
Error in f2(3) : could not find function "f1"
Run Code Online (Sandbox Code Playgroud)

而明确附加环境是有效的

> attach(jobenv)
> eval(expr)
[1] 7
Run Code Online (Sandbox Code Playgroud)

我可能错过了一些明显的东西,但我找不到任何有效的eval呼叫排列.有没有办法在不附加环境的情况下获得相同的效果?

eval r function

7
推荐指数
2
解决办法
1846
查看次数

data.table中的内存泄漏按引用分组分配

我在组中使用按组引用分配时看到奇数内存使用情况data.table.这是一个简单的示例(请原谅示例的无关紧要):

N <- 1e6
dt <- data.table(id=round(rnorm(N)), value=rnorm(N))

gc()
for (i in seq(100)) {
  dt[, value := value+1, by="id"]
}
gc()
tables()
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells  303909 16.3     597831 32.0   407500 21.8
Vcells 2442853 18.7    3260814 24.9  2689450 20.6
> for (i in seq(100)) {
  +   dt[, value := value+1, by="id"]
  + }
> gc()
used  (Mb) gc trigger  (Mb) max used  (Mb)
Ncells   315907  16.9     597831  32.0   407500  21.8 …
Run Code Online (Sandbox Code Playgroud)

r data.table

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

亚马逊Redshift的加权移动平均线

有没有办法在Amazon Redshift中计算具有固定窗口大小的加权移动平均线?更详细地,给定具有日期列和值列的表,对于每个日期,计算指定大小的窗口上的加权平均值,其中权重在辅助表中指定.

到目前为止,我的搜索尝试产生了大量的例子,用于简单平均(没有权重)的窗口函数,例如这里.对于postgres也有一些相关的建议,例如,这个SO问题,但是与postgres相比,Redshift的功能集非常稀疏,并且它不支持许多建议的高级功能.

amazon-redshift

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