Python 数据帧索引的itertools.permutations使用了太多内存
我正在尝试根据另一个数据帧的排列创建一个新的数据帧。这是原始数据帧。价格是指数Python 数据帧索引的itertools.permutations使用了太多内存,python,pandas,numpy,dataframe,itertools,Python,Pandas,Numpy,Dataframe,Itertools,我正在尝试根据另一个数据帧的排列创建一个新的数据帧。这是原始数据帧。价格是指数 df1 Price Bid Ask 1 .01 .05 2 .04 .08 3 .1 .15 . . . 130 2.50 3.00 第二个数据帧用于从df1获取索引,并创建一个数据帧(df2),该数据帧具有基于4个价格的df1索引排列,如下面的示例输出中所示 df2 # pr
df1
Price Bid Ask
1 .01 .05
2 .04 .08
3 .1 .15
. . .
130 2.50 3.00
第二个数据帧用于从df1获取索引,并创建一个数据帧(df2),该数据帧具有基于4个价格的df1索引排列,如下面的示例输出中所示
df2
# price1 price2 price 3 price 4
1 1 2 3 4
2 1 2 3 5
3 1 2 3 6
.. .. .. .. ..
为了实现这一点,我一直在使用itertools.permutation
,但我有内存问题,无法执行大量的排列。这是我用来做排列的代码
price_combos = list(x for x in itertools.permutations(df1.index, 4))
df2 = pd.DataFrame(price_combos , columns=('price1', 'price2', 'price3', 'price4'))
可能导致内存分配膨胀。d类型
是df1.index
Int64Index
- 对于您的场景,我发现最好的方法是将数据帧索引设置为具有
dtype的numpy数组。int16
的数值范围为-128到128。由于您的索引是0到130,int8
将不够int8
- 创建一个
变量,然后创建一个数据帧,将使用两倍的内存量,因此创建price\u组合
时不需要中间步骤df2
- 如果在创建数据帧时未指定
,则dtype
将为dtype
int64
- 在下面的实现中,将有一个对象,
,它将是2180905112字节df2
- 在最初的实现中,将有两个8GB的
对象,总共16GBint64
- 在最初的实现中,将有两个8GB的
- 如果您使用的是Jupyter,它的内存管理非常糟糕
- 也许增加虚拟内存量/交换文件大小,将为您提供所需的额外内存缓冲区。虚拟内存是Windows,交换文件是Linux。这很容易做到,只需谷歌一下
将numpy导入为np
输入一个pd
从itertools导入置换
#合成数据集和创建数据帧
np.random.seed(365)
数据={'Price':列表(范围(1131)),
'Bid':[np.random.randint(1,10)*0.1表示uu在(130)范围内]
df1=pd.DataFrame(数据)
df1['Ask']=df1.投标+0.15
df1.集合指数(“价格”,就地=真)
#将索引转换为int16数组
values=df1.index.to_numpy(dtype='int16')
#创建df2
%%时间
df2=pd.DataFrame(np.array(列表(排列(值,4))),列=('price1','price2','price3','price4'))
>>>壁时间:2分钟45秒
打印(df2.info())
范围索引:272613120个条目,0到272613119
数据列(共4列):
#列数据类型
--- ------ -----
0价格1 int16
1价格2国际16
2价格3国际16
3价格4国际16
数据类型:int16(4)
内存使用率:2.0 GB
df2.head()
价格1价格2价格3价格4
0 1 2 3 4
1 1 2 3 5
2 1 2 3 6
3 1 2 3 7
4 1 2 3 8
df2.tail()
价格1价格2价格3价格4
272613115 130 129 128 123
272613116 130 129 128 124
272613117 130 129 128 125
272613118 130 129 128 126
272613119 130 129 128 127
初始数据帧有多少行?大概130行,大约212m行。在这样的规模下,熊猫真的很紧张,即使你使用内存优化技术,比如显式数据类型。Numpy可能适用于纯矩阵数学。或者像Spark这样的大数据工具,这取决于您的需要。初始数据框架中有127行数据两种可能:1)将价格组合写入文件。然后,当您使用chunksize的df=pd.read\u csv
加载文件时,DataFrame df将是一个迭代器,不必立即装入内存。更多信息:,2)另一种选择是使用Python,它将大型数据集划分为相当于较小数据帧的部分,以便较小的数据帧可以放入内存中。我会尝试确保您确实需要所有这些排列127*126*125*124=248 031 000
很多。您需要同时提供所有这些服务吗?在你开始做奇思妙想之前,试着重新思考这个问题。。。