我正在尝试自动化JMP所做的过程(“分析”->“分布”,将列A输入为“Y值”,并使用后续列​​作为“权重”值)。在JMP中,您必须一次完成一列-我想使用Python遍历所有列并创建一个数组,例如显示每列的中位数。

例如,如果质量数组为[0、10、20、30],列1的权重数组为[30、191、9、0],则质量数组的加权中位数应为10。我不确定如何得出这个答案。

到目前为止,我已经

  • 导入了将权重显示为数组,掩码值为0以及
  • 的csv
  • 创建了一个与权重数组(113x32)相同形状和大小的“Y值”数组。我不确定是否需要执行此操作,但是出于加权的目的,我认为它比for循环更容易。

  • 我不确定从这里到底要去哪里。基本上,“Y值”是一个质量范围,并且数组中的所有列都代表为每个质量找到的数据点的数量。我需要根据报告的频率找到中位质量。

    我不是Python或统计专家,因此,如果我省略了任何有用的细节,请告诉我!

    更新:这是到目前为止我所做的一些代码:
    #Boilerplate & Import files
    import csv
    import scipy as sp
    from scipy import stats
    from scipy.stats import norm
    import numpy as np
    from numpy import genfromtxt
    import pandas as pd
    import matplotlib.pyplot as plt
    
    inputFile = '/Users/cl/prov.csv'
    origArray = genfromtxt(inputFile, delimiter = ",")
    nArray = np.array(origArray)
    dimensions = nArray.shape
    shape = np.asarray(dimensions)
    
    #Mask values ==0
    maTest = np.ma.masked_equal(nArray,0)
    
    #Create array of masses the same shape as the weights (nArray)
    fieldLength = shape[0]
    rowLength = shape[1]
    
    for i in range (rowLength):
        createArr = np.arange(0, fieldLength*10, 10)
        nCreateArr = np.array(createArr)
        massArr.append(nCreateArr)
        nCreateArr = np.array(massArr)
    nmassArr = nCreateArr.transpose()
    

    最佳答案

    如果我正确理解您的问题,我们可以做些什么。是对观察值进行汇总,将其除以2便得到对应于中位数的观察值。从那里我们需要找出这个数字是什么观测值。

    这里的一个技巧是用np.cumsum计算观测值之和。这给了我们连续的累计和。

    例子:
    np.cumsum([1,2,3,4]) -> [ 1, 3, 6, 10]每个元素都是所有先前元素及其本身的总和。我们在这里有10个观察结果。所以平均值将是第5个观察值。 (我们将最后一个元素除以2得到5)。
    现在查看累加结果,我们可以轻松地看到这必须是第二个元素和第三个元素之间的观察值(观察值3和6)。

    因此,我们要做的就是找出中位数(5)适合的位置的索引。
    np.searchsorted完全满足我们的需求。它将找到将元素插入数组的索引,以便它保持排序。

    这样做的代码如下:

    import numpy as np
    #my test data
    freq_count = np.array([[30, 191, 9, 0], [10, 20, 300, 10], [10,20,30,40], [100,10,10,10], [1,1,1,100]])
    
    c = np.cumsum(freq_count, axis=1)
    indices = [np.searchsorted(row, row[-1]/2.0) for row in c]
    masses = [i * 10 for i in indices] #Correct if the masses are indeed 0, 10, 20,...
    
    #This is just for explanation.
    print "median masses is:",  masses
    print freq_count
    print np.hstack((c, c[:, -1, np.newaxis]/2.0))
    

    输出将是:
    median masses is: [10 20 20  0 30]
    [[ 30 191   9   0]  <- The test data
     [ 10  20 300  10]
     [ 10  20  30  40]
     [100  10  10  10]
     [  1   1   1 100]]
    [[  30.   221.   230.   230.   115. ]  <- cumsum results with median added to the end.
     [  10.    30.   330.   340.   170. ]     you can see from this where they fit in.
     [  10.    30.    60.   100.    50. ]
     [ 100.   110.   120.   130.    65. ]
     [   1.     2.     3.   103.    51.5]]
    

    关于python - NumPy或SciPy以计算加权中位数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20601872/

    10-16 11:21