Я пытаюсь создать тензор из кадра данных, который содержит области последовательных данных.
Попытки, которые я придумал, используют groupby / aggregate, подобный команде типа df.groupby(groupcol)[aggcol].agg(list)
, которая легко получает список столбцов (aggcol) на основе группировки отдельного столбца (groupcol)
Вот пример двух входных фреймов данных (объекты и их метаданные) и результирующий фрейм данных (аннотированные объекты по метаданным и положению), которые должны быть обработаны:
Я работаю над объединением этих функций в список для каждого региона:
Но это должно быть дополнено определенной длиной для каждого региона (например, путем добавления строк к каждому уровню региона в кадре аннотированных объектов).
Другими словами, результирующий кадр данных после группировки по регионам будет:
Так, чтобы я мог вернуть массив значений в этом кадре данных в следующем формате:
array([[[2.965e+03, 4.800e-01],
[4.894e+03, 8.700e-01],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00]],
[[7.920e+02, 1.700e-01],
[3.029e+03, 8.100e-01],
[4.852e+03, 7.400e-01],
[9.548e+03, 6.000e-01],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00]],
[[2.469e+03, 3.600e-01],
[7.144e+03, 1.600e-01],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00]],
[[5.783e+03, 7.000e-01],
[7.068e+03, 6.000e-01],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00]],
[[2.965e+03, 9.800e-01],
[4.894e+03, 8.900e-01],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00]],
[[7.920e+02, 8.600e-01],
[3.029e+03, 8.600e-01],
[4.852e+03, 6.900e-01],
[9.548e+03, 5.900e-01],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00]],
[[2.469e+03, 6.700e-01],
[7.144e+03, 1.300e-01],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00]],
[[5.783e+03, 8.400e-01],
[7.068e+03, 9.900e-01],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00]],
[[2.965e+03, 8.000e-02],
[4.894e+03, 5.700e-01],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00]],
[[7.920e+02, 4.000e-01],
[3.029e+03, 1.100e-01],
[4.852e+03, 8.000e-01],
[9.548e+03, 3.400e-01],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00]],
[[2.469e+03, 1.800e-01],
[7.144e+03, 6.300e-01],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00]],
[[5.783e+03, 4.700e-01],
[7.068e+03, 3.200e-01],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00],
[0.000e+00, 0.000e+00]]])
Вот код для генерации входных таблиц:
import numpy as np
import pandas as pd
# DataFrame of Features in each document
num_features = 10
num_docs = 3
def calc_feats():
return np.random.randint(0, 100, num_features)/100
d = {'document_'+str(i): calc_feats() for i in range(0, num_docs)}
# Unique feature index
d['feat_index'] = np.arange(0, num_features)
docs = pd.DataFrame(d)\
.set_index('feat_index')
# DataFrame for metadata about features
regions_of_doc = ['mid', 'end', 'start', 'intro', 'title']
feature_regions = [np.random.choice(regions_of_doc) for i in range(0, num_features)]
feature_positions = np.random.randint(0, 10000, num_features)
feature_meta_info = pd.DataFrame({'feat_index': d['feat_index'],
'region': feature_regions,
'position_in_region': feature_positions,
'other_uninteresting_info': np.random.randint(0, 10000, num_times)})\
.set_index('feat_index')
# Join the two dataframes and set a multi-index to annotate the documents
combined_df = docs.join(feature_meta_info.drop('other_uninteresting_info', axis = 1))\
.reset_index()\
.set_index(['region', 'feat_index', 'position_in_region'])\
.sort_index(level = ['region', 'position_in_region'])
# add position features to each feature
pos = combined_df.index.get_level_values('position_in_region')
combined_df = combined_df.apply(lambda x: list(zip(pos, x)))
# display(multi_table([docs, feature_meta_info, ]))
display(HTML('<table><tr style="background-color:white;">' + \
'<td>' + docs._repr_html_() + '</td>' + \
'<td><img src = "https://upload.wikimedia.org/wikipedia/commons/9/9e/Plus_symbol.svg", width = "50", height = "50"></td>' + \
'<td>' + feature_meta_info._repr_html_() + '</td>' + \
'<td><img src = "https://upload.wikimedia.org/wikipedia/commons/thumb/7/71/Arrow_east.svg/800px-Arrow_east.svg.png", width = "50", height = "10"></td>' + \
'<td>' + combined_df._repr_html_() + '</td>' + \
'</tr></table>'))