2017-03-20 174 views
0

如果你有一個包含來自兩個國家在一年中每天氣溫的兩列數據幀,很容易使用熊貓科爾,例如計算這些列的相關性:創建相關的熊貓系列

Country A Country B 
10   20 
11   20 
10   22 
9   23 

df.corr() 

有沒有辦法以某種方式基於初始列生成熊貓系列,該列將具有指定的相關性?換句話說,如果我只有從一個國家下的一個名單,我想生成具有0.8相關的第一列表的第二列表,如:

Country A Country B 
10   
11   
10   
9   

創建基於溫度的第二列表A國相關係數爲0.8。也許有一些方法使用numpy或Python統計軟件包來做到這一點。

回答

1

這當然是可能的。 corr方法默認使用Pearsons r。您可以插入方程式一列,並找到導致所需相關性的另一列的一些值。問題是,有很多解決方案,你可能不喜歡你得到的。

import pandas as pd 
import numpy as np 
from scipy.stats import pearsonr 
from scipy.optimize import minimize 

data = pd.DataFrame({'Country A': [10, 11, 10, 9]}) 

data['Country B'] = minimize(lambda x: abs(0.8 - pearsonr(data['Country A'], x)[0]), 
          np.random.rand(len(data['Country A']))).x 

我使用scipy.optimize.minimize函數最小化的(0.8 - 相關性)的絕對值。要達到最小值0,相關性必須等於0.8。

您說過您要生成類似溫度的值。您提供的目標函數也可能更復雜。比如說,你想產生溫度,這個溫度沒有大於5的標準偏差,它可能只在5和25之間。後者可以作爲最小化函數的邊界。前者你必須在目標函數中考慮。

from random import randint 

def fun(x): 
    if np.std(x) >= 5: 
     return np.std(x) 
    return abs(0.8 - pearsonr(data['Country A'], x)[0]) 

data['Country B'] = minimize(fun, [randint(5, 25) for _ in range(365)], 
          method = 'SLSQP', bounds = [(5, 25) for _ in range(365)]).x 

該方法確保生成的系列的值遵循一定的分佈。