熊猫将两个数据框合并以形成多索引

时间:2019-09-04 10:37:38

标签: pandas pandas-datareader

我正在和Pandas一起玩,看看是否可以比其他工具更好/更快地进行一些库存计算。如果我只有一只股票,则可以轻松创建每日计算L

df['mystuff'] = df['Close']+1

如果我下载的股票不止于股票,那么它会变得很复杂:

df = df.stack() 
df['mystuff'] = df['Close']+1
df = df.unstack()

如果我想使用“关闭”这一天,对我来说太复杂了。我以为我可能会回去获取单个报价器,使用iloc [i-1]或类似的东西(我还没有弄清楚)进行任何操作,然后合并数据帧。

如何合并两个带有单个报价的数据框以具有多索引? 这样:

f1 = web.DataReader('AAPL', 'yahoo', start, end)
f2 = web.DataReader('GOOG', 'yahoo', start, end)

就像

f = web.DataReader(['AAPL','GOOG'], 'yahoo', start, end)

编辑: 这是我可以创建的最接近的东西。它不完全相同,所以我不确定是否可以用它代替f。

f_f = pd.concat(['AAPL':f1,'GOOG':f2},axis=1)

也许我应该尝试对多索引进行操作,而不是对较简单的数据框进行拆分。

完整代码:

import pandas_datareader.data as web
import pandas as pd
from datetime import datetime

start = datetime(2001, 9, 1)
end = datetime(2019, 8, 31)
a = web.DataReader('AAPL', 'yahoo', start, end)
g = web.DataReader('GOOG', 'yahoo', start, end)
# here are shift/diff calculations that I don't knokw how to do with a multiindex
a_g = web.DataReader(['AAPL','GOOG'], 'yahoo', start, end)
merged = pd.concat({'AAPL':a,'GOOG':g},axis=1)

a_g.to_csv('ag.csv')
merged.to_csv('merged.csv')
import code; code.interact(local=locals())

旁注:我不知道如何比较两个csv

1 个答案:

答案 0 :(得分:1)

这并不完全相同,但是它会返回您可以在a_g情况下使用的Multiindex

import pandas_datareader.data as web
import pandas as pd
from datetime import datetime

start = datetime(2019, 7, 1)
end = datetime(2019, 8, 31)
out = []
for tick in ["AAPL", "GOOG"]:
    d = web.DataReader(tick, 'yahoo', start, end)
    cols = [(col, tick) for col in d.columns]
    d.columns = pd.MultiIndex\
                  .from_tuples(cols,
                               names=['Attributes', 'Symbols'] )
    out.append(d)

df = pd.concat(out, axis=1)

更新

如果您要计算并添加新列(如果您有多索引列),可以遵循此

import pandas_datareader.data as web
import pandas as pd
from datetime import datetime

start = datetime(2019, 7, 1)
end = datetime(2019, 8, 31)

ticks = ['AAPL','GOOG']
df = web.DataReader(ticks, 'yahoo', start, end)
names = list(df.columns.names)

df1 = df["Close"].shift() 
cols = [("New", col) for col in df1.columns]
df1.columns = pd.MultiIndex.from_tuples(cols,
                                        names=names)

df = df.join(df1)