沿主要(时间序列)轴扩展pandas面板框架

0 投票
1 回答
826 浏览
提问于 2025-04-18 10:11

我有一些时间序列数据,这些数据存储的格式有点奇怪。我想把它解析成一个 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

我尝试过以下几种方法:

  1. 在面板中设置一个新的框架(planet_data['AllMars'] = mars_data_all

  2. pandas.Panel.reindex

  3. 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作为我的外部数据结构。

撰写回答