10

JMPが行うプロセスを自動化しようとしています(分析->分布、列Aを「Y値」として入力し、後続の列を「重み」値として使用します)。JMP では、一度に 1 列ずつ実行する必要があります。Python を使用してすべての列をループ処理し、各列の中央値などを示す配列を作成したいと考えています。

たとえば、質量配列が [0, 10, 20, 30] で、列 1 の重み配列が [30, 191, 9, 0] の場合、質量配列の加重中央値は 10 になります。この答えにたどり着く方法がわかりません。

これまでのところ

  1. 重みを配列として表示する csv をインポートし、値を 0 にマスキングし、
  2. ウェイト配列と同じ形状とサイズの「Y 値」の配列を作成しました (113x32)。これを行う必要があるかどうかは完全にはわかりませんが、重み付けの目的で 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()
4

3 に答える 3

7

私があなたの問題を正しく理解していれば、私たちに何ができるでしょうか。観測値を合計することです。2 で割ると、中央値に対応する観測数が得られます。そこから、この数値がどのような観測値であったかを理解する必要があります。

ここでのトリックの 1 つは、np.cumsum を使用して観測値の合計を計算することです。これにより、実行中の累積合計が得られます。

例:
np.cumsum([1,2,3,4]) -> [ 1, 3, 6, 10]
各要素は、以前のすべての要素とそれ自体の合計です。ここには 10 個の観測があります。したがって、平均は 5 番目の観測値になります。(最後の要素を 2 で割ると 5 になります)。
cumsum の結果を見ると、それが 2 番目と 3 番目の要素の間の観測であることが容易にわかります (観測 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]]  
于 2013-12-16T02:01:46.253 に答える
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") 
于 2014-03-24T09:11:13.193 に答える