Новичок в Python здесь. Недавно подключился к API моего TD Ameritrade и попытался извлечь информацию о позиции моей учетной записи для дальнейшего анализа. Однако у меня возникли проблемы с преобразованием вывода JSON API в фрейм данных Pandas, любые рекомендации будут высоко оценены.
Вот код:
import pprint
import pandas as pd
from config import consumer_key, redirect_uri, credentials_path
from td.client import TDClient
# Create a new instance of the client
td_client = TDClient(client_id = consumer_key, redirect_uri = redirect_uri, credentials_path = credentials_path)
# Login to a new session
td_client.login()
# Positions and Orders for an account or account(s)
positions = td_client.get_accounts(account = 'all', fields = ['positions'])
pprint.pprint(positions)
Вот фрагмент вывода:
{'securitiesAccount': {'accountId': 'xxxx',
'currentBalances': {'accruedInterest': 0.0,
'bondValue': 0.0,
'cashAvailableForTrading': xxx,
'cashAvailableForWithdrawal': xxx,
'cashBalance': 0.0,
'cashCall': 0.0,
'cashDebitCallValue': 0.0,
'cashReceipts': 0.0,
'liquidationValue': xxx,
'longMarketValue': xxx,
'longNonMarginableMarketValue': xxx,
'longOptionMarketValue': 0.0,
'moneyMarketFund': xxx,
'mutualFundValue': 0.0,
'pendingDeposits': 0.0,
'savings': 0.0,
'shortMarketValue': 0.0,
'shortOptionMarketValue': 0.0,
'totalCash': 0.0,
'unsettledCash': 0.0},
'initialBalances': {'accountValue': xxx,
'accruedInterest': 0.0,
'bondValue': 0.0,
'cashAvailableForTrading': xxx,
'cashAvailableForWithdrawal': xxx,
'cashBalance': 0.0,
'cashDebitCallValue': 0.0,
'cashReceipts': 0.0,
'isInCall': False,
'liquidationValue': xxx,
'longOptionMarketValue': 0.0,
'longStockValue': xxx,
'moneyMarketFund': xxx,
'mutualFundValue': 0.0,
'pendingDeposits': 0.0,
'shortOptionMarketValue': 0.0,
'shortStockValue': 0.0,
'unsettledCash': 0.0},
'isClosingOnlyRestricted': False,
'isDayTrader': False,
'positions': [
{'averagePrice': 46.14,
'currentDayProfitLoss': -8.4,
'currentDayProfitLossPercentage': -1.92,
'instrument': {'assetType': 'EQUITY',
'cusip': '02209S103',
'symbol': 'MO'},
'longQuantity': 10.0,
'maintenanceRequirement': 0.0,
'marketValue': 429.4,
'settledLongQuantity': 10.0,
'settledShortQuantity': 0.0,
'shortQuantity': 0.0},
{'averagePrice': 152.14,
'currentDayProfitLoss': -1.52,
'currentDayProfitLossPercentage': -0.43,
'instrument': {'assetType': 'EQUITY',
'cusip': '88579Y101',
'symbol': 'MMM'},
'longQuantity': 2.0,
'maintenanceRequirement': 0.0,
'marketValue': 351.32,
'settledLongQuantity': 2.0,
'settledShortQuantity': 0.0,
'shortQuantity': 0.0},
],
'projectedBalances': {'cashAvailableForTrading': xxx,
'cashAvailableForWithdrawal': xxx},
'roundTrips': 0,
'type': 'CASH'}}
Как я могу преобразовать это в фрейм данных только с информацией о позициях? (Например, фрейм данных с каждой акцией, которой я владею, в виде отдельной строки).
Я пробовал следующий код, но он не возвращает желаемых результатов:
df = pd.json_normalize(positions)
print(positions)
Спасибо за ваше время!
Вы всегда можете разделить свои данные, создав файл new_dict.
new_dict = (словарь['securitiesAccount']['positions'])
Может показаться запутанным назвать ваш ответ «позициями», а затем искать этот ключ, но, тем не менее, вам нужно использовать полный путь к ключу позиций.
pd.json_normalize(positions['securitiesAccount']['positions'])
Выход
averagePrice currentDayProfitLoss currentDayProfitLossPercentage longQuantity maintenanceRequirement marketValue settledLongQuantity settledShortQuantity shortQuantity instrument.assetType instrument.cusip instrument.symbol
0 46.140 -8.400 -1.920 10.000 0.000 429.400 10.000 0.000 0.000 EQUITY 02209S103 MO
1 152.140 -1.520 -0.430 2.000 0.000 351.320 2.000 0.000 0.000 EQUITY 88579Y101 MMM