问题描述
数据在(orderbook = pd.DataFrame(orderbook_data):之后的3列中出现:
timestamp bids asks
UNIX timestamp [bidprice,bidvolume] [askprice,askvolume]
list has 100 values of each. timestamp is the same
问题是我不知道如何访问/索引每一列的每个行列表[价格,数量]中的值
我知道,通过运行---> bids = orderbook [“ bids”]
我得到100个列表的列表---> [bidprice,bidvolume]
我希望避免循环。...必须有一种方法可以绘制数据
我希望有人能理解我的问题。我只想在x上绘制价格,在y上绘制数量。目标是让它变得生动
解决方法
因为您没有显示输入文件,所以我自己准备了它:
timestamp;bids
1579082401;[123.12,300]
1579082461;[135.40,220]
1579082736;[130.76,20]
1579082801;[123.12,180]
我曾经用它来阅读它:
orderbook = pd.read_csv('Input.csv',sep=';')
orderbook.timestamp = pd.to_datetime(orderbook.timestamp,unit='s')
其内容为:
timestamp bids
0 2020-01-15 10:00:01 [123.12,300]
1 2020-01-15 10:01:13 [135.40,220]
2 2020-01-15 10:05:36 [130.76,20]
3 2020-01-15 10:06:41 [123.12,180]
现在:
- timestamp 已转换为 datetime 的本机 pandasonic 类型,
- 但是出价是 object 类型(实际上是 string )。
而且,正如我想的那样,从您的输入文件中读取时也是一样。
现在是主要任务:第一步是从出价中提取两个数字, 将它们转换为 float 和 int 并保存在相应的列中:
orderbook = orderbook.join(orderbook.bids.str.extract(
r'\[(?P<bidprice>\d+\.\d+),(?P<bidvolume>\d+)]'))
orderbook.bidprice = orderbook.bidprice.astype(float)
orderbook.bidvolume = orderbook.bidvolume.astype(int)
现在订单簿包含:
timestamp bids bidprice bidvolume
0 2020-01-15 10:00:01 [123.12,300] 123.12 300
1 2020-01-15 10:01:01 [135.40,220] 135.40 220
2 2020-01-15 10:05:36 [130.76,20] 130.76 20
3 2020-01-15 10:06:41 [123.12,180] 123.12 180
,您可以生成例如散点图,调用:
orderbook.plot.scatter('bidprice','bidvolume');
或其他绘图功能。
另一种可能性
或者您的 orderbook_data 是字典?像这样:
orderbook_data = {
'timestamp': [1579082401,1579082461,1579082736,1579082801],'bids': [[123.12,300],[135.40,220],[130.76,20],[123.12,180]] }
在这种情况下,当您从中创建DataFrame时,列类型 最初是:
- 时间戳- int64 ,
- 出价-也是 object ,但是这次每个单元格都包含一个纯文本 pythonic 列表。
然后,您还可以将 timestamp 列转换为 datetime ,就像 以上。
但是要将出价(列表的列的一列)分为2个单独的列, 您应该运行:
orderbook[['bidprice','bidvolume']] = pd.DataFrame(orderbook.bids.tolist())
然后您将有2个新列,其中包含 源列,您可以像上面一样创建图形。