2016-03-18 57 views
3

我試圖使用存儲在pandas DataFrame中的方法和標準偏差從正態分佈進行採樣。使用來自python熊貓數據幀的數據從正態分佈進行採樣

例如:

means= numpy.arange(10) 
means=means.reshape(5,2) 

生產:

0 1 
0 0 1 
1 2 3 
2 4 5 
3 6 7 
4 8 9 

和:

sts=numpy.arange(10,20) 
sts=sts.reshape(5,2) 

生產:

0 1 
0 10 11 
1 12 13 
2 14 15 
3 16 17 
4 18 19 

如何生成具有相同形狀的另一個熊貓數據框,但是使用相應的平均值和標準偏差從正態分佈採樣得到的值。

即該新數據幀的位置0,0將採用mean=0standard deviation=10等的正態分佈進行採樣。

我迄今爲止功能:

def make_distributions(self): 
     num_data_points,num_species= self.means.shape 
     samples=[] 
     for i,j in zip(self.means,self.stds): 
      for k,l in zip(self.means[i],self.stds[j]): 
       samples.append(numpy.random.normal(k,l,self.n)) 

會從我的分佈樣,但我有困難的把數據回同一形狀的數據幀的平均值和標準偏差DFS。有沒有人有任何建議如何做到這一點?

在此先感謝。

回答

4

可以使用numpy.random.normal從隨機正態分佈進行採樣。
IIUC,那麼這可能是最簡單的,採取的broadcasting優勢:

import numpy as np 
np.random.seed(1) # only for demonstration 
np.random.normal(means,sts) 

array([[ 16.24345364, -5.72932055], 
     [ -4.33806103, -10.94859209], 
     [ 16.11570681, -29.52308045], 
     [ 33.91698823, -5.94051732], 
     [ 13.74270373, 4.26196287]]) 

檢查它的工作原理:

np.random.seed(1) 
print np.random.normal(0,10) 
print np.random.normal(1,11) 

16.2434536366 
-5.72932055015 

如果你需要一個熊貓數據幀:

import pandas as pd 
pd.DataFrame(np.random.normal(means,sts)) 
+0

嗨凱文,這看起來不錯,但我可以檢查我的理解......你說的是,命令'np.random.normal(means,sts)'將需要兩個df(mean和sts)和sample來回在逐個元素基礎上的正態分佈?所以基本上,它的工作方式與如果means和sts是整數/浮點數完全相同?歡呼聲 – CiaranWelsh

+1

我認爲你的理解正確。如果您查看廣播鏈接,它會顯示一些非常簡單的示例,例如數組'a' *數組'b',以便您可以查看操作。這就是爲什麼我在第二個塊中包含打印語句,以便用ints複製行爲。我認爲你已經明白了!廣播是一個非常強大的內置numpy工具,可以提供戲劇性的性能升級並避免大數據集上的循環。 – Kevin

1

我將使用字典來構造這個數據框。假設指數和色譜柱是手段和性病一樣:

means= numpy.arange(10) 
means=pd.DataFrame(means.reshape(5,2)) 
stds=numpy.arange(10,20) 
stds=pd.DataFrame(sts.reshape(5,2)) 

samples={} 
for i in means.columns: 
    col={} 
    for j in means.index: 
     col[j]=numpy.random.normal(means.ix[j,i],stds.ix[j,i],2) 
    samples[i]=col 

print(pd.DataFrame(samples)) 

#         0        1 
#0 [0.0760974520154, 3.29439282825] [11.1292510583, 0.318246201796] 
#1 [-25.4518020981, 19.2176263823] [17.0826945017, 9.36179435872] 
#2 [14.5402484325, 8.33808246538] [6.96459947914, 26.5552235093] 
#3 [0.775891790613, -2.09168601369] [2.38723023677, 15.8099942902] 
#4 [-0.828518484847, 45.4592922652] [26.8088977308, 16.0818556353] 

或重置數據框的D型和重新分配值:

import itertools 
samples = means * 0 
samples = samples.astype(object) 

for i,j in itertools.product(means.index, means.columns): 
    samples.set_value(i,j,numpy.random.normal(means.ix[i,j],stds.ix[i,j],2))