重复将6个随机生成的数字与csv中的数据相乘

时间:2019-03-30 05:48:44

标签: python pandas

我想生成6个总是等于一个1000000次的随机数(权重),并将其乘以我从csv文件导入的数据的列。将总和存储在另一列(加权平均值)中,并找到新列(范围)的最大值和最小值之间的差。我想重复此过程1000000次,并得到最小的范围和生成的随机数(权重)集以找到该值。

这是我到目前为止所做的: 1.生成6个随机数 2.从csv导入数据 3.将数据随机数与csv文件中的数据相乘,得出平均值(加权平均值) 4.将加权平均值保存在新列F(x)中 5.找到范围 6.重复此1000000次,并获得使我的距离最小的随机数。

这是文件中的一些数据

     A    B      C    D      E    F    F(x)
 0  4.9  3.9    6.3  3.4    7.3  3.4    0.0
 1  4.1  3.7    7.7  2.8    5.5  3.9    0.0
 2  6.0  6.0    4.0  3.1    3.7  4.3    0.0
 3  5.6  6.3    6.6  4.6    8.3  4.6    0.0

当前所有F(x)的值都为0.0,而事实并非如此。

arr = np.array(np.random.dirichlet(np.ones(6), size=1))

arr=pd.DataFrame(arr)

ar=(arr.iloc[0])

df = pd.read_csv('weit.csv')

df['F(x)']=df.mul(ar).sum(1)
df

df['F(x)'].max() - df['F(x)'].min()

我的所有加权平均值都得到0。我需要获取加权平均值

我无法使代码循环运行1000000次,并获得最小的范围。

1 个答案:

答案 0 :(得分:0)

如果正确理解您的需求:

#data from file
print (df)
     A    B    C    D    E    F
0  4.9  3.9  6.3  3.4  7.3  3.4
1  4.1  3.7  7.7  2.8  5.5  3.9
2  6.0  6.0  4.0  3.1  3.7  4.3
3  5.6  6.3  6.6  4.6  8.3  4.6

np.random.seed(3434)

通过this生成由6个“列”和N个“行”填充的唯一随机数的二维数组:

N = 10
#in real data
#N = 1000000 
N = 10
arr = np.array(np.random.dirichlet(np.ones(6), size=N))
print (arr)
[[0.07077773 0.08042978 0.02589592 0.03457833 0.53804634 0.25027191]
 [0.22174594 0.22673581 0.26136526 0.04820957 0.00976747 0.23217594]
 [0.01202493 0.14247592 0.3411326  0.0239181  0.08448841 0.39596005]
 [0.09354759 0.54989312 0.08893737 0.22051801 0.03850101 0.00860291]
 [0.09418778 0.33345217 0.11721214 0.33480462 0.11894247 0.00140081]
 [0.04285476 0.04531546 0.38105815 0.04316535 0.46902838 0.0185779 ]
 [0.00441747 0.08044848 0.33383453 0.09476135 0.37568431 0.11085386]
 [0.14613552 0.11260451 0.10421495 0.27880266 0.28994218 0.06830019]
 [0.50747802 0.15704797 0.04410511 0.07552837 0.18744306 0.02839746]
 [0.00203448 0.13225783 0.43042505 0.33410145 0.08385366 0.01732753]]

然后将值从DataFrame转换为2d numpy数组:

b = df.values
#pandas 0.24+
#b = df.to_numpy()
print (b)
[[4.9 3.9 6.3 3.4 7.3 3.4]
 [4.1 3.7 7.7 2.8 5.5 3.9]
 [6.  6.  4.  3.1 3.7 4.3]
 [5.6 6.3 6.6 4.6 8.3 4.6]]

最后将两个数组都合并为3d数组,并按轴2求和,最后以最小使用量numpy.ptp减去最大值:

c = np.ptp((arr * b[:, None]).sum(axis=2), axis=1)
print (c)

[2.19787892 2.08476765 1.2654273  1.45134533]

使用numpy.einsum的另一种解决方案:

c = np.ptp(np.einsum('ik,jk->jik', arr, b).sum(axis=2), axis=1)
print (c)
[2.19787892 2.08476765 1.2654273  1.45134533]

用于比较的循环解决方案,但对于较大的N而言比较慢:

out = []
for row in df.values:
#    print (row)
    a = np.ptp((row * arr).sum(axis=1))
    out.append(a)
print (out)
[2.197878921892329, 2.0847676512823052, 1.2654272959079576, 1.4513453259898297]