设置:我在 MS SQL Server 上有一个预处理数据集,大约有 500.000.000 行和 20 列,其中一个是相当长的文本列 (varchar(1300)),相当于 SQL 上大约 35GB 的数据空间数据库。我正在运行 MS SQL Server 的物理机上工作,因此不需要网络流量,并且它有 128GB RAM。MS SQL Server 设置为最多占用 40GB RAM。我想将数据集导入Python以进行进一步处理。假设进行一些深度学习实验,这很重要,因为我需要能够按原样传输文本列。
轶事:为了测试导入代码,我使用了大约 700.000 行的数据集的一个小子样本。运行大约需要 1 分钟,Python 的 RAM 使用量高达 700mb,导入后将变量保存到文件系统的文件大小约为 250mb。据推断,导入完整数据集大约需要 700 分钟,并生成一个 175GB 的文件。这是相当多的,特别是与在 SQL 中复制完整的 31GB 表相比,这最多需要几分钟。我让它运行一天,看看会发生什么,但没有结果。
替代方案:我尝试不使用pandasandsqlalchemy而是pyodbc直接使用,这让我相信问题在于 pyodbc 如何处理数据导入,因为它将查询的数据存储在 rows 对象中,我只能在循环中按行读取,这对我来说似乎效率很低。我不知道是否能以pandas不同sqlalchemy的方式做到这一点。我还尝试不使用单个 select 语句导入完整数据集,而是将其分成许多较小的数据集,这导致小型测试数据集需要 30 分钟而不是 1 分钟来加载。
问题:如何将这个大(但与其他数据库相比不是那么大)的数据集加载到 Python 中?另外,必须有一种方法可以有效地做到这一点?因为它不应该比在 SQL 中复制完整表花费更长的时间,并且它不应该比 SQL 数据库中的表占用更多的空间。我不明白为什么在此过程中数据大小会增加这么多。该解决方案不需要首先将表提取到除 Python 之外的任何其他介质(即没有.csv文件等),尽管使用任何其他 Python …
所以我目前在R中面临一个问题,我确切知道如何处理Stata,但是浪费了两个多小时来完成.
使用下面的data.frame,我想要的结果是准确地获得每组的第一个观察,而组由多个变量组成,并且必须由另一个变量排序,即通过以下方式获得的data.frame mydata:
id <- c(1,1,1,1,2,2,3,3,4,4,4)
day <- c(1,1,2,3,1,2,2,3,1,2,3)
value <- c(12,10,15,20,40,30,22,24,11,11,12)
mydata <- data.frame(id, day, value)
Run Code Online (Sandbox Code Playgroud)
应该转变为:
id day value
1 1 10
1 2 15
1 3 20
2 1 40
2 2 30
3 2 22
3 3 24
4 1 11
4 2 11
4 3 12
Run Code Online (Sandbox Code Playgroud)
通过仅保留其中一个行具有一个或多个重复的组标识符(此处仅为此row[1]: (id,day)=(1,1)),首先排序值(以便保留具有最低值的行).
在Stata中,这只是:
bys id day (value): keep if _n == 1
Run Code Online (Sandbox Code Playgroud)
我在网上找到了一段代码,如果我首先生成一个组标识符,它就会正确执行:
mydata$id1 <- paste(mydata$id,"000",mydata$day, sep="") ### the single group identifier
myid.uni …Run Code Online (Sandbox Code Playgroud) 假设我有一个data.frame:
x.a <- c(1,2,3,4,5)
y.b <- c(2,3,4,5,6)
y.c <- c(5,1,0,9,2)
y.d <- c(5,6,7,3,1)
x.e <- c(2,6,1,2,3)
df <- data.frame(x.a,y.b,y.c,y.d,x.e)
Run Code Online (Sandbox Code Playgroud)
假设我想对变量yb,yc,yd进行排名:
df[2:4] <- sapply(df[2:4], function(x) rank(x))
Run Code Online (Sandbox Code Playgroud)
有没有办法将函数应用于具有前缀的所有变量y.?例如:
df[y.*] <- sapply(df[y.*], function(x) rank(x))
Run Code Online (Sandbox Code Playgroud)