Преобразование списка номеров деталей в двумерный массив ширины / длины для отображения в сетке - PullRequest
0 голосов
/ 19 января 2019

У меня есть список деталей, каждая из которых состоит из номера детали, ширины и длины.Я хочу закончить отображением этого списка в виде сетки с использованием различной ширины в качестве меток столбцов и различной длины в качестве меток строк.

       width1   width2   width3   width4
len1    no1       no2
len2    no3       no4      no5
len3    no6       no7      no8      no9

Обратите внимание, что детали доступны не во всех длинах и широтах и ​​что некоторые ячейкив сетке будет пусто.

Я начал с объединения всех этих данных в списки.Один для меток столбцов, один для меток строк и один для мышления данных. Я мог бы использовать panda для создания DataFrame.

columns = []
rows = []
li = []
for part in part_list:
    if part.width not in columns:
        columns.append(part.width)
    if part.length not in rows:
        rows.append(part.length)

    li.append([part.width, part.length, part.part_number])      

    data_dict = {
        'part_number': weld_stud.part_number,
        'diameter_pitch': weld_stud.thread,
        'length': weld_stud.fractional_length
    }

    grid_data.append(data_dict)

Затем, используя panda, я сделал:

numpy_array = np.array(li)
df = pd.DataFrame(
    data=numpy_array[1:,1:],    # values
    index=numpy_array[1:,0],    # 1st column as index
    columns=numpy_array[0,1:]   # 1st row as the column names
)

Этоочевидно, не выводит то, что мне нужно, но мне неясно, куда идти отсюда.

1 Ответ

0 голосов
/ 20 января 2019

Я повторял этот ответ много раз, поэтому я надеюсь, что это последний раз

Ответ состоит из двух вещей:

1) Подготовка данных: я не знаюВаш набор данных, но я буду угадывать

2) Отображение данных


1) а) Подготовка данных

Я знаю об одном простом решениикоторый может решить все ваши проблемы с подготовкой данных.Но одно условие должно быть выполнено, и это то, что ваши ширины и длины являются целыми числами.Если это так, тогда решение легко: допустим, максимальная ширина равна 10, а максимальная длина тоже равна 10.

Вы создаете сетку размером 11x11 в виде numpy (потому что от 0 до 10 - это 11 ячеек)

# chararray because you can initialize
# grid with being empty (empty string fields)
grid=np.chararray(shape=[11,11]) 

for part in part_list:
    grid[part.width,part.length] = str(part.part_number)
    #If you have 2 parts with same parameter you can sum up string so its flexible

Таким образом, вы можете использовать индексы массива в качестве фактической ширины и длины параметров

1) б) Подготовка данных

ваша проблемакак-то застрял в моей голове, пока я не нашел общее решение вашей проблемы (хотя я до сих пор не знаю ваш набор данных). На основе приведенного выше примера , если ваши параметры в любой форме (int, float, string), вы можете сделать это

# Lets say you have 3 types of widths and lengths and you index them 
# Key is your parameter, value is index position in grid
widths = {'7.2mm':0,'9.6mm':1,'11.4mm':2}
lengths = {'2.2mm':0,'4.8mm':1,'16.8mm':2}

header = [h for h in widths] # useless in this example
side = [s for s in lengths ] # but can serve for Data display part


grid=np.chararray(shape=[3,3])

for part in part_list:
    index_width = widths[part.width]
    index_lentgh = lengths[part.length]
    grid[index_width ,index_lentgh] = str(part.part_number)

# This way, you dont need to care about missing part numbers and grid can stay unfilled

2) Отображение данных

from prettytable import PrettyTable

def table(header,side,data):
    t = PrettyTable(['']+header)
    for i in range(len(data)):
        t.add_row([side[i]]+list(data[i]))
    print(t)

header = ['col1','col2','col3']
side =   ['row1','row2','row3']
data =   np.zeros(shape=[3,3])
>> table(header,side,data)

+------+------+------+------+
|      | col1 | col2 | col3 |
+------+------+------+------+
| row1 | 0.0  | 0.0  | 0.0  |
| row2 | 0.0  | 0.0  | 0.0  |
| row3 | 0.0  | 0.0  | 0.0  |
+------+------+------+------+

Вы можете кормить его чем угодно (например, классами)

data2 = [['','',PrettyTable],['World','',5],['','Hello','']]
table(header,side,data)
>>> table(header,side,data2)
+------+-------+-------+-----------------------------------+
|      |  col1 |  col2 |                col3               |
+------+-------+-------+-----------------------------------+
| row1 |       |       | <class 'prettytable.PrettyTable'> |
| row2 | World |       |                 5                 |
| row3 |       | Hello |                                   |
+------+-------+-------+-----------------------------------+

РЕДАКТИРОВАТЬ: На основе данных выборки я смог сделать то, что требовалось:

import numpy as np
widths = {'#10-24':0, '#10-32':1, '1/4-20':2, '5/16-18':3, '3/8-16':4, '1/2-13':5, '5/8-11':6, '3/4-10':7} # My data dictionary looks like
lenghts = {'5/8':0,'3/4':1,'7/8':2}
part_list = [{'part_number': 'FTC19-62', 'width': '#10-24', 'length': '5/8'},
        {'part_number': 'FTC19-75', 'width': '#10-32', 'length': '3/4'},
        {'part_number': 'FTC19-87', 'width': '#10-24', 'length': '7/8'}]

grid=np.chararray(shape=[len(lenghts),len(widths)]).astype('|S8')
grid[:,:] = ''

for part in part_list:
    index_width = widths[part['width']]
    index_lentgh = lenghts[part['length']]
    grid[index_lentgh,index_width] = str(part['part_number'])

header = sorted(widths, key=lambda k: widths[k])
side = sorted(lenghts, key=lambda k: lenghts[k])
from prettytable import PrettyTable

def table(header,side,data):
    t = PrettyTable(['']+header)
    for i in range(len(data)):
        t.add_row([side[i]]+list(data[i]))
print(t)


table(header,side,grid)


+-----+----------+----------+--------+---------+--------+--------+--------+--------+
|     |  #10-24  |  #10-32  | 1/4-20 | 5/16-18 | 3/8-16 | 1/2-13 | 5/8-11 | 3/4-10 |
+-----+----------+----------+--------+---------+--------+--------+--------+--------+
| 5/8 | FTC19-62 |          |        |         |        |        |        |        |
| 3/4 |          | FTC19-75 |        |         |        |        |        |        |
| 7/8 | FTC19-87 |          |        |         |        |        |        |        |
+-----+----------+----------+--------+---------+--------+--------+--------+--------+
>>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...