相关疑难解决方法(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的大型HDFStore表提高查询性能

我有一个大的(约1.6亿行)数据帧,我已经存储到磁盘上,如下所示:

    def fillStore(store, tablename):
        files = glob.glob('201312*.csv')
        names = ["ts", "c_id", "f_id","resp_id","resp_len", "s_id"]
        for f in files:
            df = pd.read_csv(f, parse_dates=True, index_col=0, names=names)
            store.append(tablename, df, format='table', data_columns=['c_id','f_id'])
Run Code Online (Sandbox Code Playgroud)

该表有一个时间索引,我将使用c_idf_id除了时间(通过索引)查询.

我有另一个包含~18000个"事件"的数据帧.每个事件都包含一些(少至数百,多达数十万)个人记录.我需要为每个事件收集一些简单的统计信息并存储它们以收集一些汇总统计信息.目前我这样做:

def makeQueryString(c, f, start, stop):
    return "c_id == {} & f_id == {} & index >= Timestamp('{}') & index < Timestamp('{}')".format(c, f , str(pd.to_datetime(start)),str(pd.to_datetime(stop)))

def getIncidents(inc_times, store, tablename):
    incidents = pd.DataFrame(columns = ['c_id','f_id','resp_id','resp_len','s_id','incident_id'])
    for ind, row in inc_times.iterrows():
        incidents = incidents.append(store.select(tablename, 
                                                  makeQueryString(row.c_id, 
                                                                  row.f_id, 
                                                                  row.start, 
                                                                  row.stop))).fillna(ind)
    return incidents …
Run Code Online (Sandbox Code Playgroud)

python large-data hdfs pandas

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

许多巨大的csv文件的高效合并

我有一个脚本,它获取目录中的所有 csv 文件并使用外部联接将它们并排合并。问题是当我尝试在我需要加入的文件上使用它时,我的计算机窒息(MemoryError)(大约两打文件,每个 6-12 Gb)。我知道 itertools 可用于提高循环效率,但我不清楚它是否或如何应用于这种情况。我能想到的另一种选择是安装 mySQL,学习基础知识,然后在那里执行此操作。显然,如果可能的话,我宁愿在 Python 中执行此操作,因为我已经在学习它。基于 R 的解决方案也是可以接受的。

这是我的代码:

import os
import glob
import pandas as pd
os.chdir("\\path\\containing\\files")

files = glob.glob("*.csv")
sdf = pd.read_csv(files[0], sep=',')

for filename in files[1:]:
    df = pd.read_csv(filename, sep=',')
    sdf = pd.merge(sdf, df, how='outer', on=['Factor1', 'Factor2'])
Run Code Online (Sandbox Code Playgroud)

关于如何处理对于我的计算机内存来说太大的文件的任何建议将不胜感激。

python merge python-itertools large-files pandas

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

将字典的字典转换为 pandas DataFrame - 内存问题

我有一个由三级嵌套字典组成的数据结构,该字典保存三部分对象的出现次数。我想用它构建一个具有特定形状的 DataFrame,但我想不出一种不消耗大量工作内存的方法来实现它——因为表很大(几个完整的 GB)。

基本功能如下所示:

class SparseCubeTable:
    def __init__(self):
        self.table = {}
        self.dim1 = []
        self.dim2 = []
        self.dim3 = []

    def increment(self, dim1, dim2, dim3):
        if dim1 in self.table:
            if dim2 in self.table[dim1]:
                if dim3 in self.table[dim1][dim2]:
                    self.table[dim1][dim2][dim3] += 1
                else:
                    self.dim3.append(dim3)
                    self.table[dim1][dim2][dim3] = 1
            else:
                self.dim2.append(dim2)
                self.dim3.append(dim3)
                self.table[dim1][dim2] = {dim3:1}
        else:
            self.dim1.append(dim1)
            self.dim2.append(dim2)
            self.dim3.append(dim3)
            self.table[dim1] = {dim2:{dim3:1}}
Run Code Online (Sandbox Code Playgroud)

这样做的目的是为了让密钥求和等变得更容易。SparseCubeTable 的使用方式如下:

In [23]: example = SparseCubeTable()

In [24]: example.increment("thing1", "thing2", "thing3")

In [25]: example.increment("thing1", "thing2", "thing3")

In [26]: example.increment("thing4", "thing5", "thing6") …
Run Code Online (Sandbox Code Playgroud)

dictionary dataframe python-2.7 pandas

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

python Pandas 中分块文件上数百万个键的 grouby 问题

我有一个非常大的CSV文件(几十牡蛎)含有网络日志有以下的列:user_idtime_stampcategory_clicked。我必须建立一个评分器来确定用户喜欢和不喜欢的类别。请注意,我有超过 1000 万用户。

我第一次把它切成块,并把它们存储在一个HDFStore名为input.h5然后我用groupbyuser_id以下杰夫的方式

这是我的数据:大约 2 亿行,1000 万个唯一 user_id。

user id | timestamp | category_clicked
20140512081646222000004-927168801|20140722|7
20140512081714121000004-383009763|20140727|4
201405011348508050000041009490586|20140728|1
20140512081646222000004-927168801|20140724|1
20140501135024818000004-1623130763|20140728|3
Run Code Online (Sandbox Code Playgroud)

这是我的 pandas.show_version():

INSTALLED VERSIONS
------------------
commit: None
python: 2.7.6.final.0
python-bits: 64
OS: Windows
OS-release: 8
machine: AMD64
processor: AMD64 Family 21 Model 2 Stepping 0, AuthenticAMD
byteorder: little
LC_ALL: None
LANG: fr_FR

pandas: 0.13.1
Cython: 0.20.1
numpy: 1.8.1
scipy: 0.13.3
statsmodels: 0.5.0
IPython: 2.0.0 …
Run Code Online (Sandbox Code Playgroud)

python csv bigdata pandas

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