gpt4 book ai didi

python - Pandas 数据帧索引的 itertools.permutations 使用了太多内存

转载 作者:行者123 更新时间:2023-12-04 04:08:35 27 4
gpt4 key购买 nike

我正在尝试根据另一个 Dataframe 的排列创建一个新的 Dataframe。这是原始数据框。价格就是指标。

df1
Price Bid Ask
1 .01 .05
2 .04 .08
3 .1 .15
. . .
130 2.50 3.00

第二个 Dataframe 旨在从 df1 获取索引并创建一个 Dataframe (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'))

最佳答案

  • dtypes 可能导致内存分配激增。
    • df1.indexInt64Index
    • 对于您的场景,我发现的最好的方法是将数据帧索引设置为具有 int16 dtype 的 numpy 数组。
      • int8 的数值范围是 -128 到 128。由于您的索引是 0 到 130,int8 是不够的。
    • 创建一个 price_combos 变量,然后创建一个数据帧,将使用两倍的内存量,因此无需中间步骤即可创建 df2
    • 如果您在创建数据帧时未指定 dtype,那么 dtype 将为 int64
    • 通过以下实现,将有一个对象 df2,它将是 2,180,905,112 字节
      • 在最初的实现中,将有两个 int64 对象,每个 8GB,总共 16GB。
  • 如果您使用的是 Jupyter,它的内存管理很糟糕。
  • 也许增加虚拟内存的数量/交换文件的大小,会给你额外的缓冲区所需的内存。虚拟内存是Windows,交换文件是Linux。这很容易做到,只需谷歌一下。
import numpy as np
import pandas a pd
from itertools import permutations

# synthetic data set and create dataframe
np.random.seed(365)
data = {'Price': list(range(1, 131)),
'Bid': [np.random.randint(1, 10)*0.1 for _ in range(130)]}

df1 = pd.DataFrame(data)
df1['Ask'] = df1.Bid + 0.15
df1.set_index('Price', inplace=True)

# convert the index to an int16 array
values = df1.index.to_numpy(dtype='int16')

# create df2
%%time
df2 = pd.DataFrame(np.array(list(permutations(values, 4))), columns=('price1', 'price2', 'price3', 'price4'))
>>> Wall time: 2min 45s

print(df2.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 272613120 entries, 0 to 272613119
Data columns (total 4 columns):
# Column Dtype
--- ------ -----
0 price1 int16
1 price2 int16
2 price3 int16
3 price4 int16
dtypes: int16(4)
memory usage: 2.0 GB

df2.head()

   price1  price2  price3  price4
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()

           price1  price2  price3  price4
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

关于python - Pandas 数据帧索引的 itertools.permutations 使用了太多内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62119757/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com