在本地机器中合并Python中的大数据

问题描述 投票:-1回答:1

我有140个csv文件。每个文件有3个变量,大约750 GB。观察数量从6千万到9千万不等。

我还有另一个小文件,treatment_data - 138000行(每个唯一ID)和21列(ID的01列和1和0的20列,表明ID是否给予特定处理。

变量是,

  • ID_FROM:数字ID
  • ID_TO:数字ID
  • DISTANCEID_FROMID_TO之间物理距离的数值变量

(总的来说,我有138000 * 138000(= 19亿以上)行 - 对于每个可能的双向组合所有ID,分为140个文件。

研究问题:给定距离,ID有多少邻居(每种治疗类型)。

所以我需要一个系统的帮助(最好是在Pandas中)

  • 研究人员将输入一个距离
  • 该程序将查看所有文件并过滤掉DISTANCEID_FROM之间的ID_TO小于给定距离的行
  • 输出单个数据帧。 (此时可以放弃DISTANCE
  • 通过匹配ID_TOID将数据框架与treatment_data合并。 (此时可以放弃ID_TO
  • 通过ID_FROM(group_by)将数据折叠起来,并将20与治疗变量相加。

(在最终输出数据集中,我将拥有138000行和21列.01列为ID。每列不同的处理类型为20列。因此,例如,我将能够回答问题,“在'2000'米内, '500'(ID)的多少个邻居在'treatment_media'类别中?“

重要注意事项:

  • DISTANCE变量的范围在0到大致平均大小的美国州的半径(以米为单位)。研究人员最感兴趣的是看5000米内发生了什么。这通常会减少98%的观察结果。但有时,他/她会检查更长的距离 衡量。所以我必须保持所有观察结果。否则,我可以简单地从原始输入文件中过滤出超过5000的DISTANCE,让我的生活更轻松。我认为这很重要的原因是,数据基于ID_FROM在140个文件中进行排序。如果我能够以某种方式重新排列这些基于DISTANCE的19亿行并且关联它们有某种字典系统,那么该程序不需要遍历所有140个文件。大多数时候,研究人员只会研究DISTANCE范围的2%。我需要循环140个文件似乎是一个巨大的浪费时间。但这是次要的想法。即使您不能使用这个额外的附注,请提供答案。
  • 我尝试在Stata中循环超过140个文件特定距离,完成任务需要11个多小时。这是不可接受的,因为研究人员希望在0到5000范围内改变距离。但是,大部分计算时间都浪费在读取内存上的每个数据集上(这就是Stata的工作方式)。这就是我在Python中寻求帮助的原因。
python merge large-data
1个回答
0
投票

是否有一个特殊的原因需要在Python中完成整个事情?这似乎是SQL数据库非常擅长的东西。我认为像以下这样的基本概要可以起作用:

TABLE Distances {
  Integer PrimaryKey,
  String IdFrom,
  String IdTo,
  Integer Distance
}

INDEX ON Distances(IdFrom, Distance);

TABLE TreatmentData {
  Integer PrimaryKey,
  String Id,
  String TreatmentType
}

INDEX ON TreatmentData(Id, TreatmentType);

-- How many neighbors of ID 500 are within 2000 meters and have gotten
-- the "treatment_media" treatment?
SELECT
  d.IdFrom AS Id,
  td.Treatment,
  COUNT(*) AS Total
FROM Distances d
JOIN TreatmentData td ON d.IdTo = td.Id
WHERE d.IdFrom = "500"
  AND d.Distance <= 2000
  AND td.TreatmentType = "treatment_media"
GROUP BY 1, 2;

可能还有其他一些索引组合可以提供更好的性能,但这似乎至少可以回答你的例子问题。

© www.soinside.com 2019 - 2024. All rights reserved.