【问题标题】:pandas merge two dataframe to form a multiindex熊猫合并两个数据框以形成多索引
【发布时间】:2019-09-05 01:52:29
【问题描述】:

我正在玩 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_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

【问题讨论】:

  • concat 然后在 ('yahoo',start,end) 上进行分组呢?
  • 好吧,你不会得到相同的结果。我可以使用 concat({'AAPL':f...) 但它不像多索引
  • pd.concat(['AAPL':f1,'GOOG':f2},axis=1) 是我能够完成的最接近的事情
  • 这个想法是,如果您在两个数据框中都有相同的列,则您不关心 concat 中的多索引。多索引由组处理
  • this 帖子看起来你的行 f = web.DataReader(['AAPL','GOOG'], 'yahoo', start, end) 应该可以工作,你得到了什么?

标签: pandas pandas-datareader


【解决方案1】:

这并不完全相同,但它返回 Multiindex,您可以在 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)

【讨论】:

  • 谢谢!您解决了我的问题,但显然您的更新似乎是满足我需求的更好解决方案。我会尝试一些更复杂的移位和填充,但这似乎是正确的。
  • 我看到一个技巧是您没有先创建新列。我想创建一个新的,然后用我的计算填充它(比如第一行 = 100,第二行 = 第一个 xx,第三个=第二xx 等等。)可以通过复制一个并填充它来实现但我认为并不优雅
  • df3 = df3.shift().fillna(100) * df['Close'] / df['Close'].shift().fillna(df['Close'])我想做的事情。第一个值 = 100,第二个值取决于第一个 AND 计算
猜你喜欢
  • 1970-01-01
  • 2019-03-18
  • 2018-02-02
  • 2021-03-25
  • 2020-10-31
  • 1970-01-01
  • 2015-10-22
  • 2017-06-11
  • 2016-01-01
相关资源
最近更新 更多