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

如何将字典保存到文件?

我有更改dict值并将dict保存到文本文件(格式必须相同)的问题,我只想更改member_phone字段.

我的文本文件格式如下:

memberID:member_name:member_email:member_phone
Run Code Online (Sandbox Code Playgroud)

我将文本文件拆分为:

mdict={}
for line in file:
    x=line.split(':')
    a=x[0]
    b=x[1]
    c=x[2]
    d=x[3]
    e=b+':'+c+':'+d

    mdict[a]=e
Run Code Online (Sandbox Code Playgroud)

当我尝试更改member_phone存储的时d,值已经改变而不是按键流动,

def change(mdict,b,c,d,e):
    a=input('ID')
    if a in mdict:
        d= str(input('phone'))
        mdict[a]=b+':'+c+':'+d
    else:
        print('not')
Run Code Online (Sandbox Code Playgroud)

以及如何将dict保存为具有相同格式的文本文件?

python dictionary file python-3.x

114
推荐指数
7
解决办法
23万
查看次数

HDF5 - 并发,压缩和I/O性能

我有关于HDF5性能和并发性的以下问题:

  1. HDF5是否支持并发写访问?
  2. 除了并发性考虑外,HDF5在I/O性能方面的表现如何(压缩率是否会影响性能)?
  3. 由于我在Python中使用HDF5,它的性能与Sqlite相比如何?

参考文献:

python sqlite hdf5 pandas

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

在Python中更改文件权限

我正在尝试更改文件访问权限:

os.chmod(path, mode)
Run Code Online (Sandbox Code Playgroud)

我想把它变为只读:

os.chmod(path, 0444)
Run Code Online (Sandbox Code Playgroud)

有没有其他方法使文件只读?

python file-permissions

52
推荐指数
7
解决办法
12万
查看次数

Python:预加载内存

我有一个 python 程序,我需要在其中加载和反序列化 1GB 的 pickle 文件。这需要 20 秒,我想要一种机制,可以随时使用泡菜的内容。我看过shared_memory但它的所有使用示例似乎都涉及 numpy 而我的项目不使用 numpy。使用shared_memory或以其他方式实现这一目标的最简单和最干净的方法是什么?

这就是我现在加载数据的方式(每次运行):

def load_pickle(pickle_name):
    return pickle.load(open(DATA_ROOT + pickle_name, 'rb'))
Run Code Online (Sandbox Code Playgroud)

我希望能够在两次运行之间编辑模拟代码而无需重新加载泡菜。我一直在搞乱,importlib.reload但对于包含许多文件的大型 Python 程序来说,它似乎真的不太好用:

def main():
    data_manager.load_data()
    run_simulation()
    while True:
        try:
            importlib.reload(simulation)
            run_simulation()
        except:
        print(traceback.format_exc())
        print('Press enter to re-run main.py, CTRL-C to exit')
        sys.stdin.readline()
Run Code Online (Sandbox Code Playgroud)

python shared-memory

26
推荐指数
2
解决办法
707
查看次数

Pandas msgpack vs pickle

msgpack在熊猫应该是一个替代品pickle.

根据msgpack上Pandas文档:

这是一种轻量级的可移植二进制格式,类似于二进制JSON,具有很高的空间效率,并且在写入(序列化)和读取(反序列化)方面都提供了良好的性能.

然而,我发现它的性能似乎与咸菜不相上下.

df = pd.DataFrame(np.random.randn(10000, 100))

>>> %timeit df.to_pickle('test.p')
10 loops, best of 3: 22.4 ms per loop

>>> %timeit df.to_msgpack('test.msg')
10 loops, best of 3: 36.4 ms per loop

>>> %timeit pd.read_pickle('test.p')
100 loops, best of 3: 10.5 ms per loop

>>> %timeit pd.read_msgpack('test.msg')
10 loops, best of 3: 24.6 ms per loop
Run Code Online (Sandbox Code Playgroud)

问题: 除了泡菜的潜在安全问题,msgpack对pickle有什么好处?pickle仍然是序列化数据的首选方法,还是目前存在更好的替代方案?

python msgpack pandas

21
推荐指数
1
解决办法
9365
查看次数

将包含长列表的熊猫df保存为csv文件

我正在尝试将熊猫数据框另存为.csv文件。目前,我的代码如下所示:

with open('File.csv', 'a') as f:
        df.to_csv(f, header=False)
Run Code Online (Sandbox Code Playgroud)

保存有效,但问题是我的数据框中的列表只是压缩为[first,second,...,last],而中间的所有条目都被丢弃了。如果仅查看原始数据框,则所有条目都在那里。有什么方法可以将列表转换为包含所有元素的字符串(str(df)也丢弃中间元素),或者如何将完整的numpy数组保存在csv表的单元格中?

谢谢您的帮助,薇薇安

python csv pandas

7
推荐指数
2
解决办法
2486
查看次数

不一致的pandas read_csv dtype推断大型TSV文件中的大部分整数字符串列

我有一个制表符分隔文件,其中一列应该被解释为一个字符串,但许多条目都是整数.使用小文件read_csv在看到一些非整数值后正确地将列解释为字符串,但是对于较大的文件,这不起作用:

import pandas as pd
df = pd.DataFrame({'a':['1']*100000 + ['X']*100000 + ['1']*100000, 'b':['b']*300000})
df.to_csv('test', sep='\t', index=False, na_rep='NA')
df2 = pd.read_csv('test', sep='\t')
print df2['a'].unique()
for a in df2['a'][262140:262150]:
    print repr(a)
Run Code Online (Sandbox Code Playgroud)

输出:

['1' 'X' 1]
'1'
'1'
'1'
'1'
1
1
1
1
1
1
Run Code Online (Sandbox Code Playgroud)

有趣的是262144是2的幂,所以我认为推理和转换发生在块中,但是正在跳过一些块.

我相当肯定这是一个错误,但是想要一个可能使用引用的解决办法,尽管为读写添加quoting = csv.QUOTE_NONNUMERIC并不能解决问题.理想情况下,我可以通过引用我的字符串数据来解决这个问题,并以某种方式迫使pandas不对引用的数据进行任何推断.

使用pandas 0.12.0

python csv types type-inference pandas

6
推荐指数
2
解决办法
6342
查看次数

序列化包含pandas数据帧的字典(Python)

我有一个字典,其中包含几个熊猫数据框(由键标识),任何有效地序列化(并干净加载)的建议。这是结构(pprint显示输出)。dict ['method_x _'] ['meas_x_']中的每一个都是熊猫数据框。目的是保存数据框,以便使用某些特定的绘图选项进行进一步的绘图。

{'method1':

{'meas1':

                          config1   config2
                   0      0.193647  0.204673
                   1      0.251833  0.284560
                   2      0.227573  0.220327,
Run Code Online (Sandbox Code Playgroud)
'meas2':   
Run Code Online (Sandbox Code Playgroud)
                          config1   config2
                   0      0.172787  0.147287
                   1      0.061560  0.094000
                   2      0.045133  0.034760,
Run Code Online (Sandbox Code Playgroud)

'method2':

{'meas1':

                          congif1   config2
                   0      0.193647  0.204673
                   1      0.251833  0.284560
                   2      0.227573  0.220327,
Run Code Online (Sandbox Code Playgroud)

'meas2':

                          config1   config2
                   0      0.172787  0.147287
                   1      0.061560  0.094000
                   2      0.045133  0.034760}}
Run Code Online (Sandbox Code Playgroud)

python serialization dictionary dataframe pandas

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