Преобразование списка объектов в логическую таблицу для расчета различных сумм - PullRequest
0 голосов
/ 28 августа 2018

Ввод что-то вроде этого -

P1,OVR4447,01/15/2033,-25385.58
P2,OVR4447,01/15/2024,-24391.41
P3,OVR4447,01/15/2024,24215.21
P4,OVR4447,01/15/2033,25125.31  

Я создал структуру данных, которая содержит отдельные поля для всех этих. Это называется Позиция.

class position
{
    public string type;
    public string strategy;

    [FieldConverter(ConverterKind.Date, "MM/dd/yyyy")]
    public DateTime AddedDate;

    public float dv01;
}

Затем я нахожу все комбинации всех объектов из входных данных, которые выглядят как -

P1 -25385.58 1/15/2033 12:00:00 AM
P2 -24391.41 1/15/2024 12:00:00 AM
P3 24215.21 1/15/2024 12:00:00 AM
P4 25125.31 1/15/2033 12:00:00 AM
P1 -25385.58 1/15/2033 12:00:00 AM,P2 -24391.41 1/15/2024 12:00:00 AM
P1 -25385.58 1/15/2033 12:00:00 AM,P3 24215.21 1/15/2024 12:00:00 AM
P1 -25385.58 1/15/2033 12:00:00 AM,P4 25125.31 1/15/2033 12:00:00 AM
P2 -24391.41 1/15/2024 12:00:00 AM,P3 24215.21 1/15/2024 12:00:00 AM
P2 -24391.41 1/15/2024 12:00:00 AM,P4 25125.31 1/15/2033 12:00:00 AM
P3 24215.21 1/15/2024 12:00:00 AM,P4 25125.31 1/15/2033 12:00:00 AM
P1 -25385.58 1/15/2033 12:00:00 AM,P2 -24391.41 1/15/2024 12:00:00 AM,P3 24215.21 1/15/2024 12:00:00 AM
P1 -25385.58 1/15/2033 12:00:00 AM,P2 -24391.41 1/15/2024 12:00:00 AM,P4 25125.31 1/15/2033 12:00:00 AM
P1 -25385.58 1/15/2033 12:00:00 AM,P3 24215.21 1/15/2024 12:00:00 AM,P4 25125.31 1/15/2033 12:00:00 AM
P2 -24391.41 1/15/2024 12:00:00 AM,P3 24215.21 1/15/2024 12:00:00 AM,P4 25125.31 1/15/2033 12:00:00 AM
P1 -25385.58 1/15/2033 12:00:00 AM,P2 -24391.41 1/15/2024 12:00:00 AM,P3 24215.21 1/15/2024 12:00:00 AM,P4 25125.31 1/15/2033 12:00:00 AM

Я также создал отдельную матрицу для вычисления сумм всех 4-х полей ввода каждой отдельной строки в приведенном выше выводе. Например,

P1 -25385.58 1/15/2033 12:00:00 AM,P2 -24391.41 1/15/2024 12:00:00 AM

будет хранить сумму (25385.58 + -24391.41) и т. Д.

Затем я отсортировал все строки на основе сумм и пришел к этому (взяв только верхние 3/4 структуры.

Key = 340.426421271519, Value = 2
P2 -24391.41 1/15/2024 12:00:00 AM
P3 24215.21 1/15/2024 12:00:00 AM

Key = 510.651516323145, Value = 2
P1 -25385.58 1/15/2033 12:00:00 AM
P4 25125.31 1/15/2033 12:00:00 AM

Key = 644.600957023994, Value = 4
P1 -25385.58 1/15/2033 12:00:00 AM
P2 -24391.41 1/15/2024 12:00:00 AM
P3 24215.21 1/15/2024 12:00:00 AM
P4 25125.31 1/15/2033 12:00:00 AM

Key = 3073.72909353198, Value = 2
P2 -24391.41 1/15/2024 12:00:00 AM
P4 25125.31 1/15/2033 12:00:00 AM

Key = 3922.143619398, Value = 2
P1 -25385.58 1/15/2033 12:00:00 AM
P3 24215.21 1/15/2024 12:00:00 AM 

Теперь моя главная цель - сгруппировать ВСЕ строки во входных данных и отобразить их пользователю. Для этого примера, как мне сгруппировать

Key = 340.426421271519, Value = 2
P2 -24391.41 1/15/2024 12:00:00 AM
P3 24215.21 1/15/2024 12:00:00 AM

Key = 510.651516323145, Value = 2
P1 -25385.58 1/15/2033 12:00:00 AM
P4 25125.31 1/15/2033 12:00:00 AM

вместе и

Key = 644.600957023994, Value = 4
P1 -25385.58 1/15/2033 12:00:00 AM
P2 -24391.41 1/15/2024 12:00:00 AM
P3 24215.21 1/15/2024 12:00:00 AM
P4 25125.31 1/15/2033 12:00:00 AM

остается как есть (потому что он содержит все это) и

Key = 3073.72909353198, Value = 2
P2 -24391.41 1/15/2024 12:00:00 AM
P4 25125.31 1/15/2033 12:00:00 AM

Key = 3922.143619398, Value = 2
P1 -25385.58 1/15/2033 12:00:00 AM
P3 24215.21 1/15/2024 12:00:00 AM 

вместе и отобразить это пользователю?

Я видел что-то подобное в другом вопросе, так что интересно, будет ли это работать?

L = [[v] + [i in k for i in df['Name'].values] for k, v in d.items()]

res_df = pd.DataFrame(L, columns=['Score'] + df['Name'].tolist())
res_df = res_df.iloc[np.argsort(res_df['Score'].abs())].astype(int)

print(res_df.head())

    Score  Person1  Person2  Person3  Person4  Person5  Person6  Person7
2       0        0        0        1        0        0        0        0
98      0        1        1        1        1        1        0        0
67      0        1        1        0        1        1        0        0
85      5        0        1        1        1        0        0        1
76      5        1        0        1        0        1        1        0

где вместо Person1, Person2 и так далее ... Я могу получить свои строки, а затем выписать все суммы и взять строки со всеми 1 и наименьшей суммой?

...