[Python] NumPy or SciPy to calculate weighted median

Discussão em 'Python' iniciado por Stack, Abril 11, 2025.

  1. Stack

    Stack Membro Participativo

    I'm trying to automate a process that JMP does (Analyze->Distribution, entering column A as the "Y value", using subsequent columns as the "weight" value). In JMP you have to do this one column at a time - I'd like to use Python to loop through all of the columns and create an array showing, say, the median of each column.

    For example, if the mass array is [0, 10, 20, 30], and the weight array for column 1 is [30, 191, 9, 0], the weighted median of the mass array should be 10. However, I'm not sure how to arrive at this answer.

    So far I've

    1. imported the csv showing the weights as an array, masking values of 0, and
    2. created an array of the "Y value" the same shape and size as the weights array (113x32). I'm not entirely sure I need to do this, but thought it would be easier than a for loop for the purpose of weighting.

    I'm not sure exactly where to go from here. Basically the "Y value" is a range of masses, and all of the columns in the array represent the number of data points found for each mass. I need to find the median mass, based on the frequency with which they were reported.

    I'm not an expert in Python or statistics, so if I've omitted any details that would be useful let me know!

    Update: here's some code for what I've done so far:

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

    Continue reading...

Compartilhe esta Página