pandas:在多索引数据帧上复制/广播单索引数据帧:HowTo和内存效率

2024-04-26 09:27:00 发布

您现在位置:Python中文网/ 问答频道 /正文

问题

证券交易数据准备。我有一个大数据帧上的三维多索引(可能是n=800000 x f=20)。一个索引维度是date,具有大约dt=1000水平,其他维度识别{}不同的股票(每个股票有20个特征,每个股票有单独的特征)。所以对于每个日期,有800 x 20个不同的值。在

现在我有了dt=1000 x g=30全球时间序列(比如道琼斯工业平均指数,货币汇率等),所以每个日期的30个值对每只股票来说都是相同的。这是一个只有日期作为索引的单索引数据帧。在

问题1

我如何合并这两个数据集,以便将30个系列广播到每个股票上,以得到形状(800000 x 50)?在

问题2

有没有一种方法可以做到这一点,而不是通过复制后30列的数据,而是通过查看原始数据来节省内存?对于我提到的数字,对于float64的精确度,我仍然在~300MB,这还可以。但我很好奇。在

示例

以下是我所得到的f=2g=1m=4和{}的最小示例:

import pandas as pd

data = {
    'x': [5,6,7,3,4,5,1,1,0,12,15,14],
    'y': [4,6,5,5,4,3,2,0,1,13,14,13]
}

dates = [pd.to_datetime('2018-01-01'), pd.to_datetime('2018-01-02'), pd.to_datetime('2018-01-03')]

index = pd.MultiIndex.from_arrays([
    ['alpha'] * 6 + ['beta'] * 6,
    ['A'] * 3 + ['B'] * 3 + ['C'] * 3 + ['D'] * 3,
    dates * 4,
])
df1 = pd.DataFrame(data, index=index)

df1.index.names = ['level', 'name', 'date']


df2 = pd.DataFrame([123,124,125], index=dates, columns=['z'])
df2.index.name = "date"

print (df1)
print (df2)
-------------------------------
                        x   y
level name date              
alpha A    2018-01-01   5   4
           2018-01-02   6   6
           2018-01-03   7   5
      B    2018-01-01   3   5
           2018-01-02   4   4
           2018-01-03   5   3
beta  C    2018-01-01   1   2
           2018-01-02   1   0
           2018-01-03   0   1
      D    2018-01-01  12  13
           2018-01-02  15  14
           2018-01-03  14  13

              z
date           
2018-01-01  123
2018-01-02  124
2018-01-03  125

我喜欢的是:

^{pr2}$

Tags: to数据name示例datadatetimedateindex
1条回答
网友
1楼 · 发布于 2024-04-26 09:27:00

我认为需要^{}在这两个DataFrame中为相同的索引名date对齐:

df = df1.join(df2)
print (df)
                        x   y    z
level name date                   
alpha A    2018-01-01   5   4  123
           2018-01-02   6   6  124
           2018-01-03   7   5  125
      B    2018-01-01   3   5  123
           2018-01-02   4   4  124
           2018-01-03   5   3  125
beta  C    2018-01-01   1   2  123
           2018-01-02   1   0  124
           2018-01-03   0   1  125
      D    2018-01-01  12  13  123
           2018-01-02  15  14  124
           2018-01-03  14  13  125

相关问题 更多 >