我正在学习 numpy,我有一个资产价格的数据框架,我认为最好在 numpy 中进行计算,然后在完成后将数据放回到数据框架中。我有一个工作程序可以做到这一点,但想知道如果数据集很大,是否有一种更有效的方法,而不是逐行迭代 CPU 和内存?
我还想知道如果有某种方法可以将最终数组的元素直接复制到现有数据帧 df1 而不是创建 df2,然后将其复制到 df1,那么使用两个数据帧的代码中的最后一步是否会更有效地占用内存,然后删除 df2?
这是给出我正在寻求的输出的代码: 但我希望它能够高效地处理大型数据集。
import pandas as pd
data = [[2,2,2],[2,2.1,2.2],[4,4,4]]
columns = ['N1','N2','N3']
index = ['yaba','daba','doo']
df1 = pd.DataFrame(data, columns=columns, index=index)
print(df1,'\n')
import numpy as np
A = df1.to_numpy()
print('A',A,'\n')
B = np.ones((3,3),dtype=float)
# iterate down rows to get factors
for i in range(1,A.shape[1]):
B[i,:] = A[i,:] / A[i-1,:]
print('B',B,'\n')
# iterate down rows to refactor values
for i in range(1,A.shape[1]):
B[i,:] = B[i-1,:] * B[i,:]
print('B',B,'\n')
# move B back into df1
df2 = pd.DataFrame(np.matrix(B),columns = df1.columns, index = df1.index)
df1 = df2.copy()
print(df1,'\n')
del df2 # free up memory
输出:
> N1 N2 N3
> yaba 2 2.0 2.0
> daba 2 2.1 2.2
> doo 4 4.0 4.0
>
> A [[2. 2. 2. ]
> [2. 2.1 2.2]
> [4. 4. 4. ]]
>
> B [[1. 1. 1. ]
> [1. 1.05 1.1 ]
> [2. 1.9047619 1.81818182]]
>
> B [[1. 1. 1. ]
> [1. 1.05 1.1 ]
> [2. 2. 2. ]]
>
> N1 N2 N3
> yaba 1.0 1.00 1.0
> daba 1.0 1.05 1.1
> doo 2.0 2.00 2.0
>
您可以按照以下方式进行:
import pandas as pd
data = [[2,2,2],[2,2.1,2.2],[4,4,4]]
columns = ['N1','N2','N3']
index = ['yaba','daba','doo']
df1 = pd.DataFrame(data, columns=columns, index=index)
print(df1,'\n')
# import numpy as np
A = df1
# print(A)
B = A.div(A.shift(1))
B.iloc[0,:] = 1
print(B)
C = B.shift(1).mul(B)
C.iloc[0,:] = B.iloc[0,:]
print(C)