1
votes

Conversion de dictionnaires imbriqués dans la liste en DataFrame

J'essaie d'organiser les données dans un DataFrame, les données étaient à l'origine sous la forme:

    candles
0   {'open': 295.43, 'high': 295.47, 'low': 295.32, 'close': 295.4, 'volume': 15483, 'datetime': 1589972400000}
1   {'open': 295.35, 'high': 295.51, 'low': 295.35, 'close': 295.51, 'volume': 14187, 'datetime': 1589972460000}
2   {'open': 295.49, 'high': 295.49, 'low': 295.46, 'close': 295.46, 'volume': 3792, 'datetime': 1589972520000}
3   {'open': 295.44, 'high': 295.47, 'low': 295.39, 'close': 295.41, 'volume': 6121, 'datetime': 1589972580000}
4   {'open': 295.41, 'high': 295.46, 'low': 295.38, 'close': 295.38, 'volume': 10295, 'datetime': 1589972640000}

Je veux le formater afin que mon index soit la date (quotidienne) et mon seule la colonne est «close». Je suis novice en python et j'ai beaucoup de mal à le mettre en forme correctement, c'est ce que j'ai jusqu'à présent:

SPY_close=td_client.get_price_history('SPY')
SPY_close=pd.DataFrame(SPY_close)
SPY_close=pd.DataFrame.drop(SPY_close, columns=['empty', 'symbol'])

qui m'a donné:

XXX

J'ai aussi essayé:

SPYdf = pd.DataFrame (SPY ['candles']) SPYdf ['datetime'] = pd.to_datetime (SPYdf ['datetime'], unité = 'ms') SPYdf.head ()

J'obtiens KeyError: 'Candles' avec celui-ci

J'ai essayé plusieurs solutions à des problèmes similaires sur ici et aucun d'entre eux n'a fonctionné, mais je pense que cela devrait être assez simple à faire. J'apprécierais toute aide.


1 commentaires

SPY_close_df = pd.DataFrame (data = SPY_close ["bougies"]) ? J'obtiens KeyError: 'Candles' avec celui-ci D'après ce que vous avez partagé, cela ne devrait pas se produire. Veuillez fournir un exemple reproductible minimal , ainsi que la sortie d'erreur complète.


3 Réponses :


0
votes

Une méthode consiste à utiliser json_normalize ou from_dict:

df = pd.DataFrame.from_dict(d['candles'])

Or:

d = {'candles': [{'open': 295.43, 'high': 295.47, 'low': 295.32, 'close': 295.4, 'volume': 15483, 'datetime': 1589972400000}, {'open': 295.35, 'high': 295.51, 'low': 295.35, 'close': 295.51, 'volume': 14187, 'datetime': 1589972460000}, {'open': 295.49, 'high': 295.49, 'low': 295.46, 'close': 295.46, 'volume': 3792, 'datetime': 1589972520000}, {'open': 295.44, 'high': 295.47, 'low': 295.39, 'close': 295.41, 'volume': 6121, 'datetime': 1589972580000}]}
df = pd.json_normalize(d['candles'])
print(df)

    open    high     low   close  volume       datetime
0  295.43  295.47  295.32  295.40   15483  1589972400000
1  295.35  295.51  295.35  295.51   14187  1589972460000
2  295.49  295.49  295.46  295.46    3792  1589972520000
3  295.44  295.47  295.39  295.41    6121  1589972580000


2 commentaires

Avez-vous copié ce code exact sans aucune modification et l'avez-vous exécuté?


Je m'excuse, lorsque j'ai remplacé mon étiquette de données par d, j'ai utilisé la mauvaise, ce qui a entraîné l'erreur



0
votes

Vous pouvez utiliser:

     open    high     low   close  volume       datetime
0  295.43  295.47  295.32  295.40   15483  1589972400000
1  295.35  295.51  295.35  295.51   14187  1589972460000
2  295.49  295.49  295.46  295.46    3792  1589972520000
3  295.44  295.47  295.39  295.41    6121  1589972580000

Sortie:

d = {'candles': [{'open': 295.43, 'high': 295.47, 'low': 295.32, 
                  'close': 295.4, 'volume': 15483, 'datetime': 1589972400000}, 
                 {'open': 295.35, 'high': 295.51, 'low': 295.35, 
                  'close': 295.51, 'volume': 14187, 'datetime': 1589972460000}, 
                 {'open': 295.49, 'high': 295.49, 'low': 295.46,
                  'close': 295.46, 'volume': 3792, 'datetime': 1589972520000}, 
                 {'open': 295.44, 'high': 295.47, 'low': 295.39, 
                  'close': 295.41, 'volume': 6121, 'datetime': 1589972580000}]
    }
pd.DataFrame(d['candles'])


0 commentaires

0
votes

Comme ceci:

d = {'candles': [{'open': 295.43, 'high': 295.47, 'low': 295.32, 'close': 295.4, 'volume': 15483, 'datetime': 1589972400000}, {'open': 295.35, 'high': 295.51, 'low': 295.35, 'close': 295.51, 'volume': 14187, 'datetime': 1589972460000}, {'open': 295.49, 'high': 295.49, 'low': 295.46, 'close': 295.46, 'volume': 3792, 'datetime': 1589972520000}, {'open': 295.44, 'high': 295.47, 'low': 295.39, 'close': 295.41, 'volume': 6121, 'datetime': 1589972580000}

In [1864]: df = pd.DataFrame(d['candles']).set_index('datetime')    
In [1865]: df
Out[1865]: 
                open   high    low  close  volume
datetime                                         
1589972400000 295.43 295.47 295.32 295.40   15483
1589972460000 295.35 295.51 295.35 295.51   14187
1589972520000 295.49 295.49 295.46 295.46    3792
1589972580000 295.44 295.47 295.39 295.41    6121


2 commentaires

bougies est la clé principale du dictionnaire que vous avez partagé. Vérifiez ma réponse mise à jour.


Cela a très bien fonctionné, au départ, j'ai accidentellement saisi la mauvaise étiquette de données lorsque je l'ai remplacée par d. Merci pour l'aide.