2017-12-15 7 views
1

比例可変の式をコード化するには(このpaperの式1)?比例可変のコード

私のコードは次のとおりです。

import pandas as pd 

l = pd.Series([1,2,3,4,5,6]) # any list of numbers 
n = len(l) 
if n > 1: 
    C = (n*(n-1))/2 

    D = [] 
    for i in l.index: 
     for j in l.index: 
      if i != j: 
       zi_zj = [l[i],l[j]] 
       D.append(1-((min(zi_zj))/(max(zi_zj)))) 

    PV = (1/C)*(np.sum(D)) 
else: 
    PV = 0 

私はすべての数字と同じリストを置く場合は、予想通り、私は、例えば、算術シーケンスでリストを置く場合、私は、しかし、PV = 0取得します[0,2,4,6,8],PV = 1.4、およびPV0との間にあるべきであり、算術配列はnとは無関係にPV = 0.5でなければならない。

私が試した別のオプションは以下のとおりであった:

l = pd.Series([1,2,3,4,5,6]) # any list of numbers 
n = len(l) 
if n > 1: 
    C = (n*(n-1))/2 

    i_s = set() 
    j_s = set() 
    D = [] 
    for i in l.index: 
     for j in l.index: 
      if i != j: 
       if i not in i_s: 
        if j not in j_s: 
         zi_zj = [l[i],l[j]] 
         D.append(1-((min(zi_zj))/(max(zi_zj)))) 
         i_s.add(i) 
         j_s.add(j) 

    PV = (1/C)*(np.sum(D)) 
else: 
    PV = 0 

しかし、どちらか動作しませんでした。

また、一連の数値の比例可変性を計算するPythonの関数が見つかりませんでした。

コード内で私が間違っていることを見つけたり、内蔵機能があれば教えてください。

答えて

1

私が行った計算に基づいて、0.5の値は大きな数値の場合にのみ有効です。n;私が間違いをしたかどうかを確認してください(詳細を確認していません)。

import pandas as pd 
from itertools import combinations 

l = pd.Series(list(range(3))) 

n = len(l) 
C = n * (n - 1)/2. 

# get all pairs in l 
pairs = list(combinations(l, 2)) 

次のように見えますペアだから:

[(0, 1), (0, 2), (1, 2)] 

我々は今、データフレームで既に後続の計算が非常に簡単になりパンダで動作するようことを保存することができます:

# store pairs in dataframe 
df_pairs = pd.DataFrame(pairs).rename(columns={0: 'zi', 1: 'zj'}) 

# get max/min for each pair 
max_val = df_pairs.max(axis=1) 
min_val = df_pairs.min(axis=1) 
df_pairs['max_z'] = max_val 
df_pairs['min_z'] = min_val 

# absolute difference between z 
df_pairs['diff_z_abs'] = (df_pairs['zi'] - df_pairs['zj']).abs() 

df_pairs['ratio_diff_max'] = df_pairs['diff_z_abs']/df_pairs['max_z'] 
df_pairs['one_minus_ratio'] = 1. - df_pairs['min_z']/df_pairs['max_z'] 

ことでデータフレームは次のようになります:

zi zj max_z min_z diff_z_abs ratio_diff_max one_minus_ratio 
0 0 1  1  0   1    1.0    1.0 
1 0 2  2  0   2    1.0    1.0 
2 1 2  2  1   1    0.5    0.5 

PVは単に次にある:

PV = df_pairs['ratio_diff_max'].sum()/C 

この例では、それは、それほど高い0.5より0.83333333あります。しかし、我々は今PVはその後0.5に近づき、より大きな値に

l = pd.Series(list(range(3))) 

を変更した場合。例えば、

l = pd.Series(list(range(5000))) 

のために私はそれはおそらく唯一の無限大に近づくnのために保持している

0.500199 

を得ます。

関連する問題