Python Pandas: пределы достоверности начальной загрузки по строке, а не по всему фрейму данных

Что я пытаюсь сделать, так это получить доверительные интервалы начальной загрузки по строке независимо от количества строк и создать новый кадр данных из вывода. В настоящее время я могу сделать это для всего кадра данных, но не по строке. Данные, которые у меня есть в моей реальной программе, похожи на то, что у меня есть ниже:

    0   1   2
0   1   2   3
1   4   1   4
2   1   2   3
3   4   1   4

Я хочу, чтобы новый кадр данных выглядел примерно так с нижним и верхним доверительными пределами:

    0   1   
0   1   2   
1   1   5.5 
2   1   4.5 
3   1   4.2 

Текущий сгенерированный вывод выглядит следующим образом:

     0   1
 0  2.0 2.75

Приведенный ниже код Python 3 создает фиктивный фрейм данных и создает доверительные пределы начальной загрузки для всего фрейма данных. Результатом является новый кадр данных всего с двумя значениями, верхним и нижним доверительным пределом, а не с 4 наборами по 2 (по одному для каждой строки).

import pandas as pd
import numpy as np
import scikits.bootstrap as sci

zz = pd.DataFrame([[[1,2],[2,3],[3,6]],[[4,2],[1,4],[4,6]],
               [[1,2],[2,3],[3,6]],[[4,2],[1,4],[4,6]]])
print(zz)

x= zz.dtypes
print(x)

a = pd.DataFrame(np.array(zz.values.tolist())[:, :, 0],zz.index, zz.columns)
print(a)
b = sci.ci(a)
b = pd.DataFrame(b)
b = b.T
print(b)

Спасибо за любую помощь.


person Devon Oliver    schedule 18.01.2017    source источник


Ответы (2)


scikits.bootstrap работает, предполагая, что выборки данных расположены по строкам, а не по столбцам. Если вы хотите противоположное поведение, просто используйте транспонирование и statfunction, которое не объединяет столбцы.

import pandas as pd
import numpy as np
import scikits.bootstrap as sci

zz = pd.DataFrame([[[1,2],[2,3],[3,6]],[[4,2],[1,4],[4,6]],
               [[1,2],[2,3],[3,6]],[[4,2],[1,4],[4,6]]])
print(zz)

x= zz.dtypes
print(x)

a = pd.DataFrame(np.array(zz.values.tolist())[:, :, 0],zz.index, zz.columns)
print(a)
b = sci.ci(a.T, statfunction=lambda x: np.average(x, axis=0))
print(b.T)
person cge    schedule 15.08.2017

Ниже приведен ответ, который я придумал для создания начальной загрузки ci по строке.

import pandas as pd
import numpy as np
import numpy.random as npr

zz = pd.DataFrame([[[1,2],[2,3],[3,6]],[[4,2],[1,4],[4,6]],
                  [[1,2],[2,3],[3,6]],[[4,2],[1,4],[4,6]]])

x= zz.dtypes

a = pd.DataFrame(np.array(zz.values.tolist())[:, :, 0],zz.index, zz.columns)
print(a)

def bootstrap(data, num_samples, statistic, alpha):
    n = len(data)
    idx = npr.randint(0, n, (num_samples, n))
    samples = data[idx]
    stat = np.sort(statistic(samples, 1))
    return (stat[int((alpha/2.0)*num_samples)],
            stat[int((1-alpha/2.0)*num_samples)])

cc = list(a.index.values) # informs generator of the number of rows

def bootbyrow(cc):
    for xx in range(1):
            xx = list(a.index.values)
            for xx in range(len(cc)):
                k = a.apply(lambda y: y[xx])
                k = k.values
                for xx in range(1):
                    kk = list(bootstrap(k,10000,np.mean,0.05))   
                    yield list(kk)


abc = pd.DataFrame(list(bootbyrow(cc))) #bootstrap ci by row

# the next 4 just show that its working correctly
a0 = bootstrap((a.loc[0,].values),10000,np.mean,0.05)   
a1 = bootstrap((a.loc[1,].values),10000,np.mean,0.05)
a2 = bootstrap((a.loc[2,].values),10000,np.mean,0.05)  
a3 = bootstrap((a.loc[3,].values),10000,np.mean,0.05)  

print(abc)
print(a0)
print(a1)
print(a2)
print(a3)
person Devon Oliver    schedule 19.01.2017