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)
我正在尝试 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)