沿主要(时间序列)轴扩展pandas面板框架
我有一些时间序列数据,这些数据存储的格式有点奇怪。我想把它解析成一个 pandas.Panel
。
这些数据来自不同的“地点”。每个地点的数据在文件中是连续的,但每个地点的时间序列被分成了几个“块”。同一个地点的时间块之间是没有重叠的。
我一直在用以下方式把每个地点的时间块读入 pandas.Panel
:
Item axis = location
(项目轴是地点)Major axis = DatetimeIndex
(主要轴是时间索引)
我想扩展 Panel
的轴,以便能容纳任何新的时间块。
import numpy as np
import pandas as pd
# we'll get data like this from the file
time_chunk_1 = pd.date_range(start='2010-10-01T00:00:00', periods=20,
freq='10S')
fake_data = np.cumsum(np.random.randn(len(time_chunk_1)))
mars_data_1 = pd.DataFrame(data=fake_data, index=time_chunk_1,
columns=['X'])
pluto_data_1 = pd.DataFrame(data=fake_data, index=time_chunk_1,
columns=['X'])
# gather the data in a panel
planet_data = pd.Panel(data={'Mars': mars_data_1, 'Pluto': pluto_data_1})
# further down the file we'll encounter data like this
time_chunk_2 = pd.date_range(start='2010-10-01T00:03:20', periods=20,
freq='10S')
mars_data_2 = pd.DataFrame(data=fake_data[::-1], index=time_chunk_2,
columns=['X'])
# I can make a DataFrame of the whole Mars time-series
mars_data_all = planet_data['Mars'].append(mars_data_2)
# but setting a frame of the panel doesn't extend the major axis
planet_data['Mars'] = mars_data_all
在我收集完这些块之后,我希望以下条件成立:
planet_data.Mars.index is mars_data_all.index
我尝试过以下几种方法:
在面板中设置一个新的框架(
planet_data['AllMars'] = mars_data_all
)pandas.Panel.reindex
pandas.Panel.replace
看起来我可能在底层数据和对它的视图之间搞混了。我查看了这些相关问题(1, 2),但仍然卡住了。感觉我可能遗漏了一些显而易见的东西。
1 个回答
0
我发现下面的代码可以用,虽然“可以用”的意思可能因人而异。我当时没有足够的声望来快速回答自己的问题,所以这个答案最开始是作为评论出现的。
这个代码是可以用的:
planet_data = planet_data.reindex(major_axis=mars_data_all.index)
planet_data['Mars'] = mars_data_all
也就是说,它能够通过:
assert(0 is all(planet_data.Mars.X - mars_data_all.X))
assert(planet_data.Mars.index is mars_data_all.index)
对于一个比较大的数据集,我怀疑我们会遇到一个问题,就是哈希表没有被垃圾回收,这个问题在这个回答中提到过。可能还有更好的方法来处理这个问题。
实际上,数据比我示例代码中的要大得多,复杂得多,而且对齐得也不好。复杂到连reindex
都无法正常工作。
我可能最终会使用一个dict
来存放DataFrames
,而不是用Panel
作为我的外部数据结构。