2013-12-16 3 views
3

JMP에서 수행하는 프로세스를 자동화하려고합니다 (Analyze-> Distribution, A 열을 "Y 값"으로 입력하고 후속 열을 "가중치"값으로 사용). JMP에서는 한 번에 하나의 열을 사용해야합니다. 파이썬을 사용하여 모든 열을 반복하고 각 열의 중앙값을 보여주는 배열을 만들고 싶습니다.NumPy 또는 SciPy 가중치 중앙값 계산

예를 들어, 질량 배열이 [0, 10, 20, 30]이고 1 열의 가중치 배열이 [30, 191, 9, 0]이면 질량 배열의 가중치는 10 그러나 나는이 대답에 도달하는 방법을 모르겠습니다.

지금까지 제가

  1. 0의 값을 마스킹 배열로 가중치를 나타내는 CSV를 가져온 및
  2. 는 "Y 값"는 동일한 형상 및 크기의 배열을 만들어 가중치 배열 (113x32). 나는 이것을 할 필요가 있다고 확신하지는 않지만, 가중치를 취하기 위해 for 루프보다 쉬울 것이라고 생각했다.

정확히 어디로 가야할 지 모르겠습니다. 기본적으로 "Y 값"은 질량 범위이며, 배열의 모든 열은 각 질량에서 발견 된 데이터 요소 수를 나타냅니다. 보고 된 빈도를 기준으로 중간 질량을 찾아야합니다.

저는 파이썬이나 통계 전문가가 아니므로 유용한 정보를 생략하면 알려주세요!

업데이트 : 여기에 내가 지금까지 한 일에 대한 몇 가지 코드가있다 : 내가 정확하게 문제를 이해 우리가 할 수있는 일, 경우

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

일부 예제 입력/출력 데이터가 유용 할뿐만 아니라 지금까지 얼마나 멀리 왔는지 코드를 보여 주려고합니다. – M4rtini

답변

3

. 관측치를 합산하여 2로 나눈 값은 중앙값에 해당하는 관측 번호를줍니다. 거기에서 우리는이 숫자가 어떤 관찰인지 알아 내야합니다.

여기서 하나의 트릭은 np.cumsum으로 관측 된 합계를 계산하는 것입니다. 그럼 우리는 누적 합계를 제공합니다.

예 :
np.cumsum([1,2,3,4]) -> [ 1, 3, 6, 10]
각 요소는 모든 이전 요소 자체의 합이다. 우리는 여기서 10 번의 관찰을했습니다. 그래서 평균은 다섯 번째 관찰 일 것입니다. (마지막 요소를 2로 나눔으로써 5를 얻습니다.)
이제 cumsum 결과를 살펴보면 두 번째 요소와 세 번째 요소 (관찰 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]] 
+0

설명에 감사드립니다. 나는 가까워지고 있지만 꽤 아직은 아닙니다. 나는 나의 문제를 아주 분명하게 표현했다고 생각하지 않는다 - 기본적으로, 중앙값은 항상 질량 범위 내의 수이어야한다. [30, 191, 9, 0]의 빈도는 질량 [0, 10, 20, 30 ] (각각 0-10 범위의 질량은 30 배, 10-20의 질량은 191 배 등). 위의 답변을 통해 대신 빈도의 중앙값을 얻는 것처럼 보입니다. 맞습니까? – Car

+0

예, 빈도 개수의 중앙값을 찾아 질량과 관련시킵니다. 이를 사용하여 질량 범위는 빈도 카운트의 요소와 직접적으로 관련됩니다. 진정한 중앙값 또는 중간 값을 포함하는 범위를 파악하는 데 필요합니까? 중앙값을 포함한 범위를 찾습니다. – M4rtini

+0

입력, 출력의 예를 더 제공 할 수 있습니까? 또는 내가 사용한 "테스트 데이터"를 확인하고 그 결과물이 무엇인지 말해보십시오. – M4rtini

1

내가 함께 손을 가지고 몇 가지 코드를 공유. 이렇게하면 Excel 스프레드 시트의 각 열에 대해 통계를 실행할 수 있습니다.

import xlrd 
import sys 
import csv 
import numpy as np 
import itertools 
from itertools import chain 

book = xlrd.open_workbook('/filepath/workbook.xlsx') 
sh = book.sheet_by_name("Sheet1") 
ofile = '/outputfilepath/workbook.csv' 

masses = sh.col_values(0, start_rowx=1) # first column has mass 
age = sh.row_values(0, start_colx=1) # first row has age ranges 

count = 1 
mass = [] 
for a in ages: 
    age.append(sh.col_values(count, start_rowx=1)) 
    count += 1 

stats = [] 
count = 0  
for a in ages: 
    expanded = [] 
    # create a tuple with the mass vector 

    age_mass = zip(masses, age[count]) 
    count += 1 
    # replicate element[0] for element[1] times 
    expanded = list(list(itertools.repeat(am[0], int(am[1]))) for am in age_mass) 

    # separate into one big list 
    medianlist = [x for t in expanded for x in t] 

    # convert to array and mask out zeroes 
    npa = np.array(medianlist) 
    npa = np.ma.masked_equal(npa,0) 

    median = np.median(npa) 
    meanMass = np.average(npa) 
    maxMass = np.max(npa) 
    minMass = np.min(npa) 
    stdev = np.std(npa) 

    stats1 = [median, meanMass, maxMass, minMass, stdev] 
    print stats1 

    stats.append(stats1) 

np.savetxt(ofile, (stats), fmt="%d")