我正在尝试自动化JMP所做的一个过程(分析-〉分布,输入列A作为“Y值”,使用后续列作为“权重”值)。在JMP中,您必须一次一列地执行此操作--我想使用Python循环遍历所有列,并创建一个数组,显示每列的中值。
例如,如果mass数组是[0,10,20,30],第1列的权重数组是[30,191,9,0],则mass数组的加权中值应该是10。但是,我不确定如何得出这个答案。
到目前为止我已经
1.导入了csv,将权重显示为数组,掩码值为0,
1.我创建了一个“Y值”数组,其形状和大小与权重数组(113 x32)相同。我不完全确定是否需要这样做,但我认为这比用于权重的for循环更容易。
我不确定接下来该怎么做。基本上,“Y值”是一个质量数范围,数组中的所有列都表示每个质量数的数据点数目。我需要根据报告的频率来找到中值质量数。
我不是Python或统计学方面的Maven,所以如果我遗漏了任何有用的细节,请让我知道!
更新:下面是我目前所做的一些代码:
# 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()
4条答案
按热度按时间vnzz0bqm1#
如果我没理解错你的问题,我们能做的是,把观测值加起来,除以2,给予对应于中位数的观测值,然后我们需要计算出这个观测值是什么。
这里的一个技巧是用np.cumsum来计算观测和,它会给我们一个连续的累积和。
示例:
np.cumsum([1,2,3,4]) -> [ 1, 3, 6, 10]
每个元素是所有先前元素和它本身的总和。我们在这里有10个观测值。所以平均值将是第5个观测值。(我们通过将最后一个元素除以2得到5)。
现在看一下累积和结果,我们可以很容易地看到,这一定是第二个和第三个元素之间的观察结果(观察结果3和6)。
所以我们需要做的就是计算出中值(5)的指数。
np.searchsorted做的正是我们所需要的。它会找到索引来将元素插入数组中,这样它就保持了排序。
代码是这样做的:
输出将为:
xjreopfe2#
wquantiles是一个小的Python包,它将完全满足您的需要,它只是在引擎盖下面使用了np.cumsum()和np.interp()。
6fe3ivhb3#
由于这是NumPy中Google上最热门的加权中值,我将添加我的minimal函数,在不改变两个数组内容的情况下计算加权中值,并且不对值的顺序进行任何假设(如果有人来这里寻找相同前提条件的快速方法,那就太不可能了)。
使用
argsort
可以保持两个数组之间的对齐,而不需要改变或复制它们的内容。更新
因为乍一看,扩展到任意分位数的难度可能并不十分明显,所以代码如下:
默认值为median,但可以传入任何分位数或分位数列表。返回值类型与传入的分位数类型相同,列表提升为NumPy数组。如果有足够多的均匀分布值,实际上可以很好地近似输入:
kx1ctssn4#
分享一些我得到的代码。这可以让你在Excel电子表格的每一列上运行统计数据。