json 如何有效地将字符串类型的字段扩展为独立的字段?

9gm1akwq  于 2022-12-30  发布在  其他
关注(0)|答案(1)|浏览(140)

下面的数据是从一个CSV格式的tick数据文件中读取的。我有一个字符串类型的"quotes"列,如下所示:

in[]:df['quotes']
0        [{'bid_p': 0.0, 'bid_v': 0, 'ask_p': 0.0, 'ask...
1        [{'bid_p': 0.0, 'bid_v': 0, 'ask_p': 0.0, 'ask...
2        [{'bid_p': 0.0, 'bid_v': 0, 'ask_p': 0.0, 'ask...
                               ...                        
32998    [{'bid_p': 6.09, 'bid_v': 30800, 'ask_p': 6.1,...
32999    [{'bid_p': 6.09, 'bid_v': 30700, 'ask_p': 6.1,...
Name: quotes, Length: 33000, dtype: object

例如,字段"quotes"的值为:
一个二个一个一个
我在Python中提取这些项并展开为多个字段:

def quote(df_quotes):
    keys=('bid_p1','bid_p2','bid_p3','bid_p4','bid_p5','bid_v1', 'bid_v2',  'bid_v3','bid_v4', 'bid_v5','ask_p1','ask_p2','ask_p3','ask_p4', 'ask_p5','ask_v1','ask_v2','ask_v3',  'ask_v4','ask_v5')
    cd1 = eval(df_quotes)
    cd2=pd.DataFrame(cd1,index=range(0,len(cd1)))
    cd3=[c for c in np.nditer(np.array(cd2))]
    cd4=pd.DataFrame(data=cd3,index=keys).T
return cd4
cd = df.quotes.apply(lambda x: quote(x))
quotes = pd.concat(list(cd), ignore_index=True)

这是我希望得到的表:

但是这样处理一个字段要花很长时间,在DolphinDB中有没有高效的实现方法,还有,在Python中我使用了eval()函数来转换字符串,DolphinDB有没有类似的函数呢?

zmeyuzjn

zmeyuzjn1#

您可以使用等效的DolphinDB函数parseExpr,它可以用字符串构造对象。

parseExpr(quotes).eval()

具体来说,您可以按如下方式展开字段“quotes”:

def ff(val){
    f=def(r){
    p= parseExpr(r).eval()
    a=peach(d->table(d[`bid_p] as bid,d[`bid_v] as bidv,d[`ask_p] as ask,d[`ask_v] as askv),p)
    i=0
    res=NULL
    for (itb in a){
        itb_=itb
        itb_=itb_.rename!(colNames(itb)+string(i))
        if(isVoid(res)){
            res=itb_
            }
        else{
            res=res join itb_
            }
        i=i+1
    }
    return res
    }
    a=unionAll(ploop(f,val),0)
    return a.values()
}

a = "[{'bid_p': 20.28, 'bid_v': 6400, 'ask_p': 20.28, 'ask_v': 6400}, {'bid_v': 28600, 'bid_p': 0.0, 'ask_p': 0.0, 'ask_v': 0}, {'bid_p': 0.0, 'bid_v': 0, 'ask_p': 0.0, 'ask_v': 0}, {'bid_p': 0.0, 'bid_v': 0, 'ask_p': 0.0, 'ask_v': 0}, {'bid_p': 0.0, 'bid_v': 0, 'ask_p': 0.0, 'ask_v': 0}]"
select ff(val) as`bid_p0`bid_v0`ask_p0`ask_v0`bid_p1`bid_v1`ask_p1`ask_v1`bid_p2`bid_v2`ask_p2`ask_v2`bid_p3`bid_v3`ask_p3`ask_v3`bid_p4`bid_v4`ask_p4`ask_v4 from 
table(take(a,10) as val)

输出结果为:

相关问题