Как я могу выбрать конкретные значения из списка и построить коробчатый участок морской волны? - PullRequest
0 голосов
/ 31 мая 2019

У меня есть список (длина 300) списков (каждая длина 1000). Я хочу отсортировать список из 300 по медиане каждого списка из 1000, а затем нанести на график коробчатый участок морского ежа из топ-10 (то есть из 10 списков с наибольшим медианой).

Я могу построить весь список из 300, но не знаю, куда идти.

Я могу изобразить диапазон точек, но как мне изобразить, например: данные [3], данные [45], данные [129] - все на одном графике?

ax = sns.boxplot(data = data[0:50])

Я также могу определить, какие элементы в списке входят в топ-10, выполнив это (но я понимаю, что это не самый элегантный способ!)

array_median = np.median(data, axis=1)
np_sortedarray = np.sort(np.array(array_median))

sort_panda = pd.DataFrame(array_median)
TwoL = sort_panda.reset_index()
TwoL.sort_values(0)

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

Пример данных: список 300 х 1000 [[+1,236762285232544, +1,2303414344787598, +1,196462631225586, ... +1,1787045001983643, +1,1760116815567017, +1,1614983081817627, 1,1546586751937866], [+1,1349891424179077, +1,1338907480239868, +1,1239897012710571, +1,1173863410949707, ... +1,1015456914901733, +1,1005324125289917, 1,1005228757858276], [+1,0945734977722168, ... +1,091795563697815]]

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

Я немного изменил данные вашего примера, чтобы было проще.

import seaborn as sns
import pandas as pd
import numpy as np

data = [[1.236762285232544, 1.2303414344787598, 1.196462631225586, 1.1787045001983643, 1.1760116815567017, 1.1614983081817627, 1.1546586751937866], 
        [1.1349891424179077, 1.1338907480239868, 1.1239897012710571, 1.1173863410949707, 1.1015456914901733, 1.1005324125289917, 1.1005228757858276]]

Для сортировки ваших данных, поскольку они представлены в формате списка, а не numpy arrays, вы можете использовать функцию sorted с клавишей, чтобы сказать ей выполнить операцию с каждым списком в вашем списке, то есть как эта функция будет сортировать. Параметр reverse = True указывает сортировать по возрастанию.

sorted_data = sorted(data, key = lambda x: np.median(x), reverse = True)

Чтобы выбрать верхние списки n, добавьте [:n] в конец предыдущего оператора.

Чтобы построить в Seaborn, проще всего преобразовать ваши данные в pandas.DataFrame.

df = pd.DataFrame(data).T

Это создает DataFrame с 10 столбцами (или 2 в этом примере). Мы можем переименовать столбцы, чтобы сделать каждый набор данных более понятным.

df = df.rename(columns={k: f'Data{k+1}' for k in range(len(sorted_data))}).reset_index()

И чтобы построить 2 (или 10) прямоугольника на одном графике, вы можете изменить форму информационного кадра, чтобы иметь 2 столбца, один для данных и один для номера набора данных (ID) (кредит здесь ).

df = pd.wide_to_long(df, stubnames = ['Data'], i = 'index', j = 'ID').reset_index()[['ID', 'Data']]

И тогда вы можете построить его.

sns.boxplot(x='ID', y = 'Data', data = df)

enter image description here

0 голосов
/ 31 мая 2019

См. этот ответ для получения 10 лучших элементов

idx = (-median).argsort()[:10]
data[idx]

Кроме того, вы можете получить определенные элементы данных, как это

data[[3, 45, 129]]
...