比例变异性代码
Code for Proportional Variability
如何编写比例变异性方程(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
,根据论文,PV
应该在0
和1
之间,等差数列应该有一个PV = 0.5
与样本量无关 n
.
我尝试的另一个选项是:
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 中没有找到计算数字序列的比例变异性的函数。
谁能发现我在代码中做错了什么,或者让我知道是否有内置函数?
根据我所做的计算,值 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)]
我们现在可以将其存储在数据框中,因为您已经在使用 pandas,这使得后续计算非常容易:
# 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.83333333
,比 0.5
高得多。但是,如果我们现在改变
l = pd.Series(list(range(3)))
到更大的值,PV
然后接近0.5
。例如,对于
l = pd.Series(list(range(5000)))
我得到
0.500199
所以它可能只适用于 n
到无穷大。
如何编写比例变异性方程(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
,根据论文,PV
应该在0
和1
之间,等差数列应该有一个PV = 0.5
与样本量无关 n
.
我尝试的另一个选项是:
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 中没有找到计算数字序列的比例变异性的函数。
谁能发现我在代码中做错了什么,或者让我知道是否有内置函数?
根据我所做的计算,值 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)]
我们现在可以将其存储在数据框中,因为您已经在使用 pandas,这使得后续计算非常容易:
# 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.83333333
,比 0.5
高得多。但是,如果我们现在改变
l = pd.Series(list(range(3)))
到更大的值,PV
然后接近0.5
。例如,对于
l = pd.Series(list(range(5000)))
我得到
0.500199
所以它可能只适用于 n
到无穷大。