小编use*_*419的帖子

熊猫在 read_sql_table 中使用太多内存

我正在尝试将 Postgres 数据库中的表读入 Python。表大约有 800 万行和 17 列,在数据库中的大小为 622MB。

我可以使用 psql 将整个表导出到 csv,然后使用 pd.read_csv() 读取它。它工作得很好。Python 进程只使用大约 1GB 的内存,一切都很好。

现在,我们需要做的任务要求这个拉取是自动化的,所以我想我可以直接从数据库中使用 pd.read_sql_table() 读取表。使用以下代码

import sqlalchemy
engine = sqlalchemy.create_engine("postgresql://username:password@hostname:5432/db")
the_frame = pd.read_sql_table(table_name='table_name', con=engine,schema='schemaname') 
Run Code Online (Sandbox Code Playgroud)

这种方法开始使用大量内存。当我使用任务管理器跟踪内存使用情况时,我可以看到 Python 进程的内存使用情况不断攀升,直到达到 16GB 并冻结计算机。

任何关于为什么会发生这种情况的想法表示赞赏。

python postgresql sqlalchemy pandas

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

Pandas将随机字符串分配给每个组作为新列

我们有一个类似的数据框

Out[90]: 
   customer_id                 created_at
0     11492288 2017-03-15 10:20:18.280437
1      8953727 2017-03-16 12:51:00.145629
2     11492288 2017-03-15 10:20:18.284974
3     11473213 2017-03-09 14:15:22.712369
4      9526296 2017-03-14 18:56:04.665410
5      9526296 2017-03-14 18:56:04.662082
Run Code Online (Sandbox Code Playgroud)

我想在这里创建一个新列,基于customer_id组,分配给每个组的8个字符的随机字符串.

例如,输出看起来像

Out[90]: 
   customer_id                 created_at     code
0     11492288 2017-03-15 10:20:18.280437 nKAILfyV
1      8953727 2017-03-16 12:51:00.145629 785Vsw0b
2     11492288 2017-03-15 10:20:18.284974 nKAILfyV
3     11473213 2017-03-09 14:15:22.712369 dk6JXq3u
4      9526296 2017-03-14 18:56:04.665410 1WESdAsD
5      9526296 2017-03-14 18:56:04.662082 1WESdAsD
Run Code Online (Sandbox Code Playgroud)

我习惯了R和dplyr,使用它们编写这个转换非常容易.我在Pandas寻找类似的东西:

library(dplyr)
library(stringi)

df %>%
  group_by(customer_id) %>%
  mutate(code = stri_rand_strings(1, 8))
Run Code Online (Sandbox Code Playgroud)

我可以找出随机字符部分.只是好奇Pandas groupby在这种情况下是如何工作的.

谢谢!

python r pandas dplyr pandas-groupby

5
推荐指数
2
解决办法
878
查看次数

SQL:计算Postgres中引用其自己行的新列

假设我有下表,其中percent_leave是上一期间离开当前时期的人数百分比:

| Period | percent_leave  |
----------------------
| 1      | 0.05           |
| 2      | 0.05           | 
| 3      | 0.05           |
| 4      | 0.05           | 
Run Code Online (Sandbox Code Playgroud)

我想计算一个新列,其中包含该期间结束时剩余的人员百分比.例如,如果我们从100个人开始,在第一个时期就有5个人离开,因此我们剩下95个.在第二个时期,95%的人将离开,留下90.25人,等等.然后表格看起来像:

| Period | percent_leave  | percent_remaining
-----------------------------------------
| 1      | 0.05           | 0.95
| 2      | 0.05           | 0.9025
| 3      | 0.05           | 0.857375
| 4      | 0.05           | 0.81450625
Run Code Online (Sandbox Code Playgroud)

如您所见,percent_remaining中新行的计算是指percent_remaining中的上一行.通常我会将这些原始数据导出到Excel并在那里进行计算,但我想在SQL中自动执行此任务,因此我需要弄清楚如何在Postgres中执行此操作.

有任何想法吗?

sql postgresql

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

标签 统计

pandas ×2

postgresql ×2

python ×2

dplyr ×1

pandas-groupby ×1

r ×1

sql ×1

sqlalchemy ×1