相关疑难解决方法(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万
查看次数

将数组或DataFrame与其他信息一起保存在文件中

统计软件Stata允许将短文本片段保存在数据集中.这可以使用notes和/或完成characteristics.

这对我来说是一个很有价值的功能,因为它允许我保存各种信息,从提醒和待办事项列表到有关我如何生成数据的信息,甚至是特定变量的估算方法.

我现在正试图在Python 3.6中提出类似的功能.到目前为止,我已经在线查看了一些帖子,但这些帖子并没有完全解决我想做的事情.

一些参考文章包括:

对于小型NumPy数组,我得出结论,函数numpy.savez()和a 的组合dictionary可以在单个文件中充分存储所有相关信息.

例如:

a = np.array([[2,4],[6,8],[10,12]])
d = {"first": 1, "second": "two", "third": 3}

np.savez(whatever_name.npz, a=a, d=d)
data = np.load(whatever_name.npz)

arr = data['a']
dic = data['d'].tolist()
Run Code Online (Sandbox Code Playgroud)

但问题仍然存在:

是否有更好的方法可以将其他信息包含在包含NumPy数组或(大)的文件中Pandas DataFrame

我在听到有关特定特别感兴趣的优点缺点,你可能有例子的任何建议.依赖性越少越好.

python numpy hdf5 stata pandas

56
推荐指数
3
解决办法
9919
查看次数

HDF5比CSV占用更多空间?

请考虑以下示例:

准备数据:

import string
import random
import pandas as pd

matrix = np.random.random((100, 3000))
my_cols = [random.choice(string.ascii_uppercase) for x in range(matrix.shape[1])]
mydf = pd.DataFrame(matrix, columns=my_cols)
mydf['something'] = 'hello_world'
Run Code Online (Sandbox Code Playgroud)

设置HDF5可能的最高压缩:

store = pd.HDFStore('myfile.h5',complevel=9, complib='bzip2')
store['mydf'] = mydf
store.close()
Run Code Online (Sandbox Code Playgroud)

另外还保存为CSV:

mydf.to_csv('myfile.csv', sep=':')
Run Code Online (Sandbox Code Playgroud)

结果是:

  • myfile.csv 是5.6 MB大
  • myfile.h5 是11 MB大

随着数据集变大,差异越来越大.

我尝试过其他压缩方法和级别.这是一个错误吗?(我正在使用Pandas 0.11和HDF5和Python的最新稳定版本).

python hdf5 pytables pandas

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

加载速度更快:python中的pickle或hdf5

给出了1.5 Gb的pandas数据帧列表.

我想知道哪个是更好的方法来处理加载这些数据:pickle(通过cPickle),hdf5,或python中的其他东西?

首先,"倾销"数据可以花很长时间,我只做一次.

也不关心磁盘上的文件大小.

问: 我关心的是尽快将数据加载到内存中的速度.

python numpy hdf5 dataframe pandas

31
推荐指数
1
解决办法
3万
查看次数

在Pandas中解析大型CSV文件的最快方法

我在这里使用熊猫来分析大数据文件:http://www.nielda.co.uk/betfair/data/它们的大小约为100兆.

来自csv的每个负载需要几秒钟,然后有更多时间来转换日期.

我已经尝试加载文件,将日期从字符串转换为日期时间,然后将它们重新保存为pickle文件.但加载它们也需要几秒钟.

我可以使用哪些快速方法从磁盘加载/保存数据?

python pandas

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

将GZIP压缩应用于Python Pandas中的CSV

我正在尝试使用以下内容将数据帧写入python pandas中的gzip压缩包:

import pandas as pd
import datetime
import csv
import gzip

# Get data (with previous connection and script variables)
df = pd.read_sql_query(script, conn)

# Create today's date, to append to file
todaysdatestring = str(datetime.datetime.today().strftime('%Y%m%d'))
print todaysdatestring

# Create csv with gzip compression
df.to_csv('foo-%s.csv.gz' % todaysdatestring,
      sep='|',
      header=True,
      index=False,
      quoting=csv.QUOTE_ALL,
      compression='gzip',
      quotechar='"',
      doublequote=True,
      line_terminator='\n')
Run Code Online (Sandbox Code Playgroud)

这只是创建了一个名为'foo-YYYYMMDD.csv.gz'的csv,而不是一个真正的gzip存档.

我也试过添加这个:

#Turn to_csv statement into a variable
d = df.to_csv('foo-%s.csv.gz' % todaysdatestring,
      sep='|',
      header=True,
      index=False,
      quoting=csv.QUOTE_ALL,
      compression='gzip',
      quotechar='"',
      doublequote=True,
      line_terminator='\n')

# Write above variable …
Run Code Online (Sandbox Code Playgroud)

python csv gzip export-to-csv pandas

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

将pandas数据框保存为pickle和csv有什么区别?

我正在学习蟒蛇熊猫.我看到一个教程,它显示了两种保存pandas数据帧的方法.

  1. pd.to_csv('sub.csv') 并打开 pd.read_csv('sub.csv')

  2. pd.to_pickle('sub.pkl') 并打开 pd.read_pickle('sub.pkl')

该教程说to_pickle是将数据帧保存到磁盘.我很困惑.因为当我使用时to_csv,我确实看到文件夹中出现了一个csv文件,我假设它也保存到磁盘中了吗?

一般来说,为什么我们要使用保存数据框to_pickle而不是将其保存为csv或txt或其他格式?

python csv pickle pandas

11
推荐指数
2
解决办法
6889
查看次数

如何在python中传入和操作大型数据文件

我有一个相对较大(1 GB)的文本文件,我希望通过对各个类别求和来减小它们的大小:

Geography AgeGroup Gender Race Count
County1   1        M      1    12
County1   2        M      1    3
County1   2        M      2    0
Run Code Online (Sandbox Code Playgroud)

至:

Geography Count
County1   15
County2   23
Run Code Online (Sandbox Code Playgroud)

如果整个文件可以适合内存但使用pandas.read_csv()give,这将是一件简单的事情MemoryError.所以我一直在研究其他方法,似乎有很多选择 - HDF5?使用itertools(看起来很复杂 - 生成器?)或者只是使用标准文件方法读取第一个地理位置(70行),将count列相加,并在加载另外70行之前写出.

有没有人对最佳方法有任何建议?我特别喜欢流数据的想法,特别是因为我可以想到很多其他有用的地方.我对这种方法最感兴趣,或者类似地使用最基本功能的方法.

编辑:在这个小案例中,我只想要按地理位置计算的数量.但是,如果我可以读入一个块,指定任何函数(比如一起添加2列,或者按地理位置取一列的最大值),应用函数,并在读取新块之前写入输出,这将是理想的.

python python-itertools dataframe pandas

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

将数据帧腌制到磁盘时出现内存错误

我有一个 51K X 8.5K 数据帧,其中只有二进制(1 或 0)值。

我写了以下代码:

将数据pickle到磁盘

outfile=open("df_preference.p", "wb")
pickle.dump(df_preference,outfile)
outfile.close()
Run Code Online (Sandbox Code Playgroud)

它向我抛出内存错误,如下所示:

MemoryError                               Traceback (most recent call last)
<ipython-input-48-de66e880aacb> in <module>()
      2 
      3 outfile=open("df_preference.p", "wb")
----> 4 pickle.dump(df_preference,outfile)
      5 outfile.close()
Run Code Online (Sandbox Code Playgroud)

我假设这意味着这些数据很大并且无法腌制?但它只有二进制值。

在此之前,我从另一个具有正常计数和大量零的数据帧创建了这个数据集。使用以下代码:

df_preference=df_recommender.applymap(lambda x: np.where(x >0, 1, 0))
Run Code Online (Sandbox Code Playgroud)

创建 df_preference 本身就花费了一些时间。矩阵大小相同。

我担心的是,如果使用 applymap 创建数据帧需要时间,并且 ii) 由于内存错误甚至没有腌制数据帧,那么接下来我需要使用 SVD 和交替最小二乘法对此 df_prefence 进行矩阵分解。那么会更慢吗?如何解决这种运行缓慢并解决内存错误的问题?

谢谢

python numpy pandas

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

如何将Pandas DataFrame存储为HDF5 PyTables表(或CArray,EArray等)?

我有以下熊猫数据框:

import pandas as pd
df = pd.read_csv(filename.csv)
Run Code Online (Sandbox Code Playgroud)

现在,我可以HDFStore用来将df对象写入文件(例如将键值对添加到Python字典中):

store = HDFStore('store.h5')
store['df'] = df
Run Code Online (Sandbox Code Playgroud)

http://pandas.pydata.org/pandas-docs/stable/io.html

当我查看内容时,此对象是一个frame

store 
Run Code Online (Sandbox Code Playgroud)

输出

<class 'pandas.io.pytables.HDFStore'>
File path: store.h5
/df            frame        (shape->[552,23252])
Run Code Online (Sandbox Code Playgroud)

但是,为了使用索引,应该将其存储为table对象。

我的方法是尝试HDFStore.put(),即

HDFStore.put(key="store.h", value=df, format=Table)
Run Code Online (Sandbox Code Playgroud)

但是,此操作失败并显示以下错误:

TypeError: put() missing 1 required positional argument: 'self'
Run Code Online (Sandbox Code Playgroud)

如何将Pandas Dataframe保存为PyTables表?

python hdf5 pytables pandas hdfstore

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