pandas 合并两个dataframe形成一个multiindex

pandas merge two dataframe to form a multiindex

我正在尝试 Pandas 看看我是否可以比其他工具进行一些股票计算 better/faster。如果我有一只股票,很容易创建每日计算 L

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

如果我下载的不仅仅是一个自动收报机,它就会变得复杂:

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

如果我想使用前一天 "Close" 它对我来说太复杂了。我想我可能会回去取一个股票代码,用 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_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

这并不完全相同,但它 returns 您可以像 a_g 案例中那样使用多索引

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)