创建相关的熊猫系列

时间:2017-03-20 11:54:52

标签: python pandas statistics

如果您有一个两列数据框,其中包含一年内两个国家/地区的日常温度,则很容易使用pandas corr计算这些列的相关性,例如:

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

df.corr()

有没有办法以某种方式根据具有指定相关性的初始列生成一个pandas系列?换句话说,如果我只有一个国家的温度列表,我想生成第二个与第一个列表具有0.8相关性的列表,例如:

Country A   Country B
10          
11          
10          
9           

根据国家A创建第二个温度列表,该列表将具有0.8相关性。也许有一些方法可以使用numpy或python统计软件包来实现这一点。

1 个答案:

答案 0 :(得分:2)

这当然是可能的。 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

此方法可确保生成的序列的值遵循特定的分布。