Вам нужно изменить форму DataFrame на stack
для Series
, затем преобразовать первый уровень MultiIndex
в строки формата YYYY-MM-DD
и перейти к словарю:
output_file("bars.html")
dates = pd.date_range('20190101', periods=100)
dfr = pd.DataFrame(np.random.randn(100, 6), index=dates, columns=list('ABCDEF'))
s = dfr.resample('M').sum().stack()
s.index = [s.index.get_level_values(0).strftime('%Y-%m-%d'),
s.index.get_level_values(1)]
x = s.index.values
print (x)
[('2019-01-31', 'A') ('2019-01-31', 'B') ('2019-01-31', 'C')
('2019-01-31', 'D') ('2019-01-31', 'E') ('2019-01-31', 'F')
('2019-02-28', 'A') ('2019-02-28', 'B') ('2019-02-28', 'C')
('2019-02-28', 'D') ('2019-02-28', 'E') ('2019-02-28', 'F')
('2019-03-31', 'A') ('2019-03-31', 'B') ('2019-03-31', 'C')
('2019-03-31', 'D') ('2019-03-31', 'E') ('2019-03-31', 'F')
('2019-04-30', 'A') ('2019-04-30', 'B') ('2019-04-30', 'C')
('2019-04-30', 'D') ('2019-04-30', 'E') ('2019-04-30', 'F')]
counts = s.values
print (counts)
[ 5.8759305 -7.52857928 2.74794675 9.91942791 1.49860961 0.16046735
0.15459667 3.86407105 0.79097565 -2.65899131 1.86548175 1.41251127
-3.67053891 13.90439142 2.80744458 2.51583516 -2.37587758 4.49826959
-0.7661524 -6.22533991 5.90391326 4.40654035 1.93598738 2.49407506]
source = ColumnDataSource(data=dict(x=x, counts=counts))
p = figure(x_range=FactorRange(*x), plot_height=250, title="Sums by Months",
toolbar_location=None, tools="")
p.vbar(x='x', top='counts', width=0.9, source=source)
p.y_range.start = 0
p.x_range.range_padding = 0.1
p.xaxis.major_label_orientation = 1
p.xgrid.grid_line_color = None
show(p)
Если вы действительно хотите сделать что-то подобное, вы можете просто назначить каждому узлу идентификатор и сохранить узлы в этом формате:
[значение идентификатора узла, идентификатор левого узла, идентификатор правого узла]
, а затем посещение дерева с помощью поиска в ширину.
Если вы хотите восстановить дерево, создайте узел карты id->, а затем прочтите назад файл: поэтому, когда вы читаете запись, создайте узел, зарегистрируйте его на карте и назначьте левый и правый узел выбирают узлы с карты.
Обычный метод для B-деревьев - убедиться, что размер узла равен размеру блока на диске, и разложить файл диска. Вы не указываете, на каком языке программирования вы работаете, поэтому это может быть так же просто, как приведение в C, или что-то более сложное, например создание легковесных объектов для обертывания java.nio.IntBuffer. В любом случае, большая часть преимуществ B-дерева заключается в том, что вам не нужно загружать его все сразу, но вы можете довольно эффективно обходить его.
Для каждого узла определите некоторую структуру данных, которая сохранит для вас ту же информацию, что и узел, и добавьте к этой структуре дополнительное поле, которое будет отмечать смещение в файле для следующего сына. И сделайте верхнее поле этой структуры фактического размера, поскольку вы не знаете, какое дерево вы сейчас смотрите. Теперь, перепрыгивая через файл, вы сможете восстановить свое дерево. Я уверен, что мое решение не окончательное, но надеюсь, что это может быть хорошей точкой для вас.
You might want to check out Protocol Buffers. They're compact, binary, extensible, easy to read and write, and available in C++, Java and Python (as well as third party implementations in other languages).
You can define a protocol buffer message for a BTree node, with file offsets for child nodes, and simply serialize it to disk in the obvious manner.