格式化数据框的字典数据

时间:2019-07-09 01:13:18

标签: python pandas dataframe dictionary

我要将股票数据从alpaca_trade_api转换为熊猫 python的数据框。

{'AAPL': [Bar({   'c': 204.25,'h': 205.08,'l': 202.9,'o': 203.35,'t': 1562299200,'v': 14933941}), 
Bar({   'c': 200.01,'h': 201.4,'l': 198.41,'o': 200.81,'t': 1562558400,'v': 21987224})]}

我可以使用第一个字典,并将数据仅保留到数据的Bar部分中,但是我不知道如何删除该部分。

import alpaca_trade_api as tradeapi
import pandas as pd

bar= api.get_barset('AAPL', 'day', limit=2)
df=pd.DataFrame.from_dict(bar)
print(df)

此过程的打印输出如下。我不确定如何从数据集中删除Bar(),以便可以公开下一个字典。我认为对于下一个字典,我只能使用DataFram.from_dict()删除它。

                                            AAPL
 0  Bar({   'c': 204.25,\n    'h': 205.08,\n    'l...
 1  Bar({   'c': 200.01,\n    'h': 201.4,\n    'l'...

我希望我的数据最后看起来像这样:

           c       h       l       o       t           v
bar1    204.25  205.08  202.9   203.35  1562299200  14933941
bar2    200.01  201.4   198.41  200.81  1562558400  21987224

任何人和所有帮助将不胜感激。 抱歉,如果缺少某些东西。这是第一号。 谢谢您的帮助!

2 个答案:

答案 0 :(得分:1)

这个问题有两个答案。

  1. 这将创建一个熊猫数据框
import alpaca_trade_api as tradeapi #see https://alpaca.markets/
import pandas as pd

api = tradeapi.REST(key_id, secret_key, base_url)

symbol = 'AAPL'

bar= api.get_barset(symbol, 'day', limit=60).df
  1. 这是一种更强力的方法,但功能相同。
import alpaca_trade_api as tradeapi #see https://alpaca.markets/
import pandas as pd

api = tradeapi.REST(key_id, secret_key, base_url)

symbol = 'AAPL'

bar= api.get_barset(symbol, 'day', limit=60)

c = []
h = []
l = []
o = []
t = []
v = []
idx = []

i = 0
for i in range(len(bar[symbol])):
    temp_c = c.append(bar[symbol][i].c) 
    temp_h = h.append(bar[symbol][i].h)
    temp_l = l.append(bar[symbol][i].l)
    temp_o = o.append(bar[symbol][i].o)
    temp_t = t.append(bar[symbol][i].t)
    temp_v = v.append(bar[symbol][i].v)
    temp_idx = idx.append(i)
    i = i + 1
df_bar_t = pd.DataFrame(t, idx,columns = ['Datetime'])
df_bar_c = pd.DataFrame(c, idx, columns = ['Close'])
df_bar_h = pd.DataFrame(h, idx, columns = ['High'])
df_bar_l = pd.DataFrame(l, idx, columns = ['Low'])
df_bar_o = pd.DataFrame(o, idx, columns = ['Open'])
df_bar_v = pd.DataFrame(v, idx, columns = ['Volume'])

mdf1 = pd.merge(df_bar_t,df_bar_c, left_index = True, right_index = True)
mdf2 = pd.merge(mdf1,df_bar_h, left_index = True, right_index = True )
mdf3 = pd.merge(mdf2,df_bar_l, left_index = True, right_index = True )
mdf4 = pd.merge(mdf3,df_bar_o, left_index = True, right_index = True )
mdf4 = pd.merge(mdf4,df_bar_v, left_index = True, right_index = True )

答案 1 :(得分:0)

羊驼还很新,很不幸,它没有最具解释性的文档。首先,alpaca_trade_api.get_barset的结果是BarSet .df的{​​{1}}属性,但是BarSet本身或BarSet都不能直接访问原始结果。

深入研究API df的源代码(可以在here找到),我们可以看到两件事:

  1. BarSetBarSet的子类
  2. dict具有BarSet属性

我们可以使用此_raw属性来访问原始数据,即_raw

dict

哪个输出:

symbol = "AAPL"
bar_set = api.get_barset(symbol, "day", limit=5)._raw

因此,如果要使用原始值创建{ 'AAPL': [ {'t': 1607317200, 'o': 122.31, 'h': 124.57, 'l': 122.25, 'c': 123.8, 'v': 72463180}, {'t': 1607403600, 'o': 124.37, 'h': 124.98, 'l': 123.09, 'c': 124.33, 'v': 69695298}, {'t': 1607490000, 'o': 124.53, 'h': 125.95, 'l': 121, 'c': 121.67, 'v': 99218318}, {'t': 1607576400, 'o': 120.5, 'h': 123.87, 'l': 120.15, 'c': 123.22, 'v': 70011939}, {'t': 1607662800, 'o': 122.43, 'h': 122.76, 'l': 120.55, 'c': 122.49, 'v': 75289233} ] } ,则可以执行以下操作:

pandas.DataFrame

这给我们:

import pandas as pd

symbol = "AAPL"
bar_set = api.get_barset(symbol, "day", limit=5)[symbol]._raw
df = pd.DataFrame(data=bar_set)