Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据帧索引的itertools.permutations使用了太多内存_Python_Pandas_Numpy_Dataframe_Itertools - Fatal编程技术网

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
    • 对于您的场景,我发现最好的方法是将数据帧索引设置为具有
      int16
      dtype的numpy数组。
      • int8
        的数值范围为-128到128。由于您的索引是0到130,
        int8
        将不够
    • 创建一个
      price\u组合
      变量,然后创建一个数据帧,将使用两倍的内存量,因此创建
      df2
      时不需要中间步骤
    • 如果在创建数据帧时未指定
      dtype
      ,则
      dtype
      将为
      int64
    • 在下面的实现中,将有一个对象,
      df2
      ,它将是2180905112字节
      • 在最初的实现中,将有两个8GB的
        int64
        对象,总共16GB
  • 如果您使用的是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
很多。您需要同时提供所有这些服务吗?在你开始做奇思妙想之前,试着重新思考这个问题。。。