我正在尝试将 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 并冻结计算机。
任何关于为什么会发生这种情况的想法表示赞赏。
我们有一个类似的数据框
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在这种情况下是如何工作的.
谢谢!
假设我有下表,其中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中执行此操作.
有任何想法吗?