2017-12-15 5 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 

그러나 중 하나가 작동하지 않았다.

또한, 나는 숫자의 일련의 비례 변동성을 계산 파이썬에서 함수를 찾지 못했습니다.

는 아무도 내가 코드에서 잘못하고있는 무슨 자리 나 나가 내장 기능이 있으면 알려 수 있습니까? 내가 수행 한 계산을 바탕으로

답변

1

0.5은 큰 n에 대한 보유; 제가 실수를했는지 확인하십시오. (자세히 체크하지 않았습니다).

# 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'] 

으로 : 이미 팬더와 함께 작업 할

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

우리는 지금 아주 쉽게 다음 계산을하게 이는 dataframe에 그 저장할 수 있습니다 다음과 같이

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)) 

그래서 쌍은 보인다 이제 데이터 프레임은 다음과 같습니다.

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 
,451,515,

PV은 간단히이다 : 그것은 0.83333333입니다이 예를 들어

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

, 훨씬 더 높은 0.5보다. 그러나, 우리는 지금 PV0.5 접근, 더 큰 값으로

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

를 변경하는 경우. 예를 들어,

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

위해 나는

0.500199 

그래서 아마 단지 무한대에 가까워 n에 대한 보유 얻을 수 있습니다.