相关疑难解决方法(0)

使用熊猫的"大数据"工作流程

在学习大熊猫的过程中,我试图解决这个问题的答案已有好几个月了.我使用SAS进行日常工作,这非常适合它的核心支持.然而,由于其他许多原因,SAS作为一款软件非常糟糕.

有一天,我希望用python和pandas替换我对SAS的使用,但我目前缺乏大型数据集的核心工作流程.我不是在谈论需要分布式网络的"大数据",而是说文件太大而无法容纳在内存中,但又足够小以适应硬盘驱动器.

我的第一个想法是用于HDFStore在磁盘上保存大型数据集,并仅将我需要的部分拉入数据帧进行分析.其他人提到MongoDB是一种更容易使用的替代品.我的问题是:

有哪些最佳实践工作流程可用于完成以下任务:

  1. 将平面文件加载到永久的磁盘数据库结构中
  2. 查询该数据库以检索数据以提供给pandas数据结构
  3. 在操作pandas中的片段后更新数据库

真实世界的例子将非常受欢迎,尤其是那些在"大数据"上使用熊猫的人.

编辑 - 我希望如何工作的示例:

  1. 迭代导入大型平面文件并将其存储在永久的磁盘数据库结构中.这些文件通常太大而无法放入内存中.
  2. 为了使用Pandas,我想读取这些数据的子集(通常一次只有几列),它们可以适合内存.
  3. 我将通过对所选列执行各种操作来创建新列.
  4. 然后我必须将这些新列附加到数据库结构中.

我正在尝试找到执行这些步骤的最佳实践方法.阅读关于pandas和pytables的链接似乎附加一个新列可能是个问题.

编辑 - 特别回应杰夫的问题:

  1. 我正在构建消费者信用风险模型.数据种类包括电话,SSN和地址特征; 财产价值; 犯罪记录,破产等贬损信息......我每天使用的数据集平均有近1,000到2,000个字段的混合数据类型:数字和字符数据的连续,名义和序数变量.我很少附加行,但我会执行许多创建新列的操作.
  2. 典型操作涉及使用条件逻辑将多个列组合到新的复合列中.例如,if var1 > 2 then newvar = 'A' elif var2 = 4 then newvar = 'B'.这些操作的结果是我的数据集中每条记录的新列.
  3. 最后,我想将这些新列附加到磁盘上的数据结构中.我将重复第2步,使用交叉表和描述性统计数据探索数据,试图找到有趣,直观的模型关系.
  4. 典型的项目文件通常约为1GB.文件被组织成一种行,其中一行包括消费者数据的记录.每行对每条记录都有相同的列数.情况总是如此.
  5. 在创建新列时,我很少会按行进行子集化.但是,在创建报告或生成描述性统计信息时,对行进行子集化非常常见.例如,我可能想为特定的业务线创建一个简单的频率,比如零售信用卡.要做到这一点,除了我要报告的列之外,我只会选择那些业务线=零售的记录.但是,在创建新列时,我会提取所有数据行,只提取操作所需的列.
  6. 建模过程要求我分析每一列,寻找与某些结果变量的有趣关系,并创建描述这些关系的新化合物列.我探索的列通常以小集合完成.例如,我将专注于一组20个列,只处理属性值并观察它们与贷款违约的关系.一旦探索了这些并创建了新的列,我就转到另一组列,比如大学教育,然后重复这个过程.我正在做的是创建候选变量来解释我的数据和某些结果之间的关系.在这个过程的最后,我应用了一些学习技术,从这些复合列中创建一个方程式.

我很少会在数据集中添加行.我几乎总是会创建新的列(统计/机器学习用语中的变量或特征).

python hdf5 large-data mongodb pandas

913
推荐指数
14
解决办法
27万
查看次数

pandas中的大型持久性DataFrame

我正在探索作为长期SAS用户切换到python和pandas.

但是,今天运行一些测试时,我很惊讶python在尝试pandas.read_csv()128mb csv文件时内存不足.它有大约200,000行和200列主要是数字数据.

使用SAS,我可以将csv文件导入SAS数据集,它可以和我的硬盘一样大.

有类似的东西pandas吗?

我经常处理大型文件,无法访问分布式计算网络.

python sas pandas

88
推荐指数
4
解决办法
6万
查看次数

Python Pandas read_csv跳过行但保留标题

我无法弄清楚如何跳过csv文件中的n行,但保留标题为1行.

我想要做的是迭代,但保持第一行的标题. skiprows使标题成为跳过行之后的第一行.这样做的最佳方式是什么?

data = pd.read_csv('test.csv', sep='|', header=0, skiprows=10, nrows=10)
Run Code Online (Sandbox Code Playgroud)

python csv pandas

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

如何使用Pool.map()进行多处理时解决内存问题?

我已将程序(如下)写入:

  • 读取一个巨大的文本文件 pandas dataframe
  • 然后groupby使用特定列值拆分数据并存储为数据帧列表.
  • 然后管道数据以multiprocess Pool.map()并行处理每个数据帧.

一切都很好,该程序在我的小测试数据集上运行良好.但是,当我输入大数据(大约14 GB)时,内存消耗呈指数级增长,然后冻结计算机或被杀死(在HPC群集中).

一旦数据/变量无效,我就添加了代码来清除内存.一旦完成,我也正在关闭游泳池.仍然有14 GB的输入我只期望2*14 GB的内存负担,但似乎很多正在进行.我也尝试使用调整,chunkSize and maxTaskPerChild, etc但我没有看到测试与大文件的优化有任何区别.

我认为,当我开始时,在此代码位置需要对此代码进行改进multiprocessing.

p = Pool(3) # number of pool to run at once; default at 1 result = p.map(matrix_to_vcf, list(gen_matrix_df_list.values())) 但是,我发布了整个代码.

测试示例:我创建了一个高达250 mb的测试文件("genome_matrix_final-chr1234-1mb.txt")并运行该程序.当我检查系统监视器时,我可以看到内存消耗增加了大约6 GB.我不太清楚为什么250 mb文件加上一些输出需要这么大的内存空间.如果它有助于查看真正的问题,我通过下拉框共享该文件.https://www.dropbox.com/sh/coihujii38t5prd/AABDXv8ACGIYczeMtzKBo0eea?dl=0

有人可以建议,我怎么能摆脱这个问题?

我的python脚本:

#!/home/bin/python3

import pandas as pd
import collections
from multiprocessing import Pool
import io
import time
import resource

print()
print('Checking required modules')
print()


''' change this input file name and/or …
Run Code Online (Sandbox Code Playgroud)

python memory multiprocessing pandas python-multiprocessing

19
推荐指数
3
解决办法
5656
查看次数

如何在Python中将大型csv文件拆分为均匀大小的块?

在一个基础我有下一个过程.

import csv
reader = csv.reader(open('huge_file.csv', 'rb'))

for line in reader:
    process_line(line)
Run Code Online (Sandbox Code Playgroud)

看到这个相关的问题.我想每100行发送一次生产线,以实现批量分片.

实现相关答案的问题是csv对象是不可取消的,不能使用len.

>>> import csv
>>> reader = csv.reader(open('dataimport/tests/financial_sample.csv', 'rb'))
>>> len(reader)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type '_csv.reader' has no len()
>>> reader[10:]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '_csv.reader' object is unsubscriptable
>>> reader[10]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '_csv.reader' object is …
Run Code Online (Sandbox Code Playgroud)

python csv list chunks

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

dask:client.persist和client.compute之间的区别

我感到困惑的区别是什么之间client.persist()client.compute()双方似乎(在某些情况下),开始我的计算,都返回异步对象,但不是在我的简单的例子:

在这个例子中

from dask.distributed import Client
from dask import delayed
client = Client()

def f(*args):
    return args

result = [delayed(f(x)) for x in range(1000)]

x1 = client.compute(result)
x2 = client.persist(result)
Run Code Online (Sandbox Code Playgroud)

这里x1x2它们不同,但是在一个不那么简单的计算中,result也是一个Delayed对象列表,使用client.persist(result)开始计算就像client.compute(result)那样.

python dask

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

使用Pandas读取大型文本文件

我一直试图用Pandas读取一些大文本文件(大小约为1.4GB - 2GB),使用该read_csv功能,但没有用.以下是我使用的版本:

  • Python 2.7.6
  • Anaconda 1.9.2(64位)(默认,2013年11月11日,10:49:15)[MSC v.1500 64 bit(AMD64)]
  • IPython 1.1.0
  • 熊猫0.13.1

我尝试了以下方法:

df = pd.read_csv(data.txt')
Run Code Online (Sandbox Code Playgroud)

它用一条消息撞毁了Ipython : Kernel died, restarting.

然后我尝试使用迭代器:

tp = pd.read_csv('data.txt', iterator = True, chunksize=1000)
Run Code Online (Sandbox Code Playgroud)

再次,我得到了Kernel died, restarting错误.

有任何想法吗?或者以其他方式阅读大文本文件?

谢谢!

python csv ipython large-files pandas

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

蟒蛇.大熊猫.大数据.凌乱的TSV文件.如何纠缠数据?

所以.我们有一个混乱的数据存储在我需要分析的TSV文件中.这是它的外观

status=200  protocol=http   region_name=Podolsk datetime=2016-03-10 15:51:58    user_ip=0.120.81.243    user_agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36    user_id=7885299833141807155 user_vhost=tindex.ru    method=GET  page=/search/
Run Code Online (Sandbox Code Playgroud)

问题是一些行具有不同的列顺序/其中一些缺少值,我需要摆脱高性能(因为我正在使用的数据集高达100千兆字节).

Data = pd.read_table('data/data.tsv', sep='\t+',header=None,names=['status', 'protocol',\
                                                     'region_name', 'datetime',\
                                                     'user_ip', 'user_agent',\
                                                     'user_id', 'user_vhost',\
                                                     'method', 'page'], engine='python')
Clean_Data = (Data.dropna()).reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)

现在我摆脱了缺失值,但仍然存在一个问题!这是数据的外观: 在此输入图像描述

这就是问题的出现: 在此输入图像描述

正如您所看到的,一些列是偏移的.我做了一个非常低性能的解决方案

ids = Clean_Data.index.tolist()
for column in Clean_Data.columns:
    for row, i in zip(Clean_Data[column], ids):
        if np.logical_not(str(column) in row):
            Clean_Data.drop([i], inplace=True)
            ids.remove(i)
Run Code Online (Sandbox Code Playgroud)

所以现在数据看起来不错......至少我可以使用它! 但是我上面提到的方法的高性能替代方案是什么?

更新unutbu代码:traceback错误

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-52c9d76f9744> in <module>() …
Run Code Online (Sandbox Code Playgroud)

python numpy data-analysis bigdata pandas

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

从 pandas 转移到 dask 以利用所有本地 cpu 内核

最近我偶然发现了http://dask.pydata.org/en/latest/ 因为我有一些只能在单核上运行的 Pandas 代码,我想知道如何利用我的其他 CPU 核。dask 可以很好地使用所有(本地)CPU 内核吗?如果是,它与熊猫的兼容性如何?

我可以对 Pandas 使用多个 CPU 吗?到目前为止,我阅读了有关发布 GIL 的信息,但这一切似乎都相当复杂。

python cpu multicore pandas dask

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

为什么 Pandas 数据帧消耗的 RAM 比原始文本文件的大小多得多?

我正在尝试使用 pandas 将一个大的 tab/txt(大小 = 3 gb)文件导入 Python pd.read_csv("file.txt",sep="\t")。我加载的文件是一个“.tab”文件,我将其扩展名更改为“.txt”以将其导入read_csv()。它是一个包含 305 列和 +/- 1 000 000 行的文件。

当我执行代码时,一段时间后 Python 返回一个 MemoryError。我搜索了一些信息,这基本上意味着没有足够的可用 RAM。当我指定nrows = 20read_csv()它工作正常。

我使用的计算机有 46gb 的 RAM,其中大约 20gb 可用于 Python。

我的问题:3gb 的文件怎么可能需要超过 20gb 的 RAM 才能使用 pandas 导入 Python read_csv()?我做错了什么吗?

编辑:在执行df.dtypes该类型的混合objectfloat64以及int64

更新:我使用以下代码来解决这个问题并执行我的计算:

summed_cols=pd.DataFrame(columns=["sample","read sum"])
while x<352:
    x=x+1
    sample_col=pd.read_csv("file.txt",sep="\t",usecols=[x])
    summed_cols=summed_cols.append(pd.DataFrame({"sample":[sample_col.columns[0]],"read sum":sum(sample_col[sample_col.columns[0]])}))
    del sample_col
Run Code Online (Sandbox Code Playgroud)

它现在选择一列,执行计算,将结果存储在数据框中,删除当前列,然后移动到下一列

python pandas

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