在学习大熊猫的过程中,我试图解决这个问题的答案已有好几个月了.我使用SAS进行日常工作,这非常适合它的核心支持.然而,由于其他许多原因,SAS作为一款软件非常糟糕.
有一天,我希望用python和pandas替换我对SAS的使用,但我目前缺乏大型数据集的核心工作流程.我不是在谈论需要分布式网络的"大数据",而是说文件太大而无法容纳在内存中,但又足够小以适应硬盘驱动器.
我的第一个想法是用于HDFStore
在磁盘上保存大型数据集,并仅将我需要的部分拉入数据帧进行分析.其他人提到MongoDB是一种更容易使用的替代品.我的问题是:
有哪些最佳实践工作流程可用于完成以下任务:
真实世界的例子将非常受欢迎,尤其是那些在"大数据"上使用熊猫的人.
编辑 - 我希望如何工作的示例:
我正在尝试找到执行这些步骤的最佳实践方法.阅读关于pandas和pytables的链接似乎附加一个新列可能是个问题.
编辑 - 特别回应杰夫的问题:
if var1 > 2 then newvar = 'A' elif var2 = 4 then newvar = 'B'
.这些操作的结果是我的数据集中每条记录的新列.我很少会在数据集中添加行.我几乎总是会创建新的列(统计/机器学习用语中的变量或特征).
我有一个大的(约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_id
和f_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) 我有一个脚本,它获取目录中的所有 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)
关于如何处理对于我的计算机内存来说太大的文件的任何建议将不胜感激。
我有一个由三级嵌套字典组成的数据结构,该字典保存三部分对象的出现次数。我想用它构建一个具有特定形状的 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) 我有一个非常大的CSV文件(几十牡蛎)含有网络日志有以下的列:user_id
,time_stamp
,category_clicked
。我必须建立一个评分器来确定用户喜欢和不喜欢的类别。请注意,我有超过 1000 万用户。
我第一次把它切成块,并把它们存储在一个HDFStore
名为input.h5
然后我用groupby
在user_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) pandas ×5
python ×4
large-data ×2
bigdata ×1
csv ×1
dataframe ×1
dictionary ×1
hdf5 ×1
hdfs ×1
large-files ×1
merge ×1
mongodb ×1
python-2.7 ×1