NumPy或SciPy以计算加权中位数 - python

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

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

到目前为止,我已经

将显示权重的csv导入为数组,掩码值为0,并且
创建了一个与权重数组(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 sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

如何在Ubuntu 10.04上安装python软件包 - python

我想在Ubuntu 10.04上安装一些python软件包。我对openssl版本有问题,无法在此Ubuntu上对其进行升级。我也尝试过手动下载模块并运行python3 setup.py install,但是它说我没有setuptools,也无法在此Ubuntu上安装。是否有pythonhosted.org的替代品,它允许较旧的openssl版本以及如何进行…

python-docx应该在空单元格已满时返回空单元格 - python

我试图遍历文档中的所有表并从中提取文本。作为中间步骤,我只是尝试将文本打印到控制台。我在类似的帖子中已经看过scanny提供的其他代码,但是由于某种原因,它并没有提供我正在解析的文档的预期输出可以在https://www.ontario.ca/laws/regulation/140300中找到该文档from docx import Document from…

Python:集群作业管理 - python

我在具有两个阶段的计算群集(Slurm)上运行python脚本,它们是顺序的。我编写了两个python脚本,一个用于阶段1,另一个用于阶段2。每天早上,我检查所有第1阶段的工作是否都以视觉方式完成。只有这样,我才开始第二阶段。通过在单个python脚本中组合所有阶段和作业管理,是否有一种更优雅/自动化的方法?我如何知道工作是否完成?工作流程类似于以下内容:w…

Python-Excel导出 - python

我有以下代码:import pandas as pd import requests from bs4 import BeautifulSoup res = requests.get("https://www.bankier.pl/gielda/notowania/akcje") soup = BeautifulSoup(res.cont…