Исключить ключи из списка dict python

#python #list #api #dictionary #request

#python #Список #API #словарь #запрос

Вопрос:

я извлекаю информацию из этого API веб-сайтов:https://financialmodelingprep.com /

если быть точным, мне нужны данные из отчетов о доходах:

https://financialmodelingprep.com/developer/docs/#Company-Financial-Statements

то, что я получаю обратно от API, — это список, который содержит 36 словарей со следующими данными:

 [ {
  "date" : "2019-09-28",
  "symbol" : "AAPL",
  "fillingDate" : "2019-10-31 00:00:00",
  "acceptedDate" : "2019-10-30 18:12:36",
  "period" : "FY",
  "revenue" : 260174000000,
  "costOfRevenue" : 161782000000,
  "grossProfit" : 98392000000,
  "grossProfitRatio" : 0.378178,
  "researchAndDevelopmentExpenses" : 16217000000,
  "generalAndAdministrativeExpenses" : 18245000000,
  "sellingAndMarketingExpenses" : 0.0,
  "otherExpenses" : 1807000000,
  "operatingExpenses" : 34462000000,
  "costAndExpenses" : 196244000000,
  "interestExpense" : 3576000000,
  "depreciationAndAmortization" : 12547000000,
  "ebitda" : 81860000000,
  "ebitdaratio" : 0.314636,
  "operatingIncome" : 63930000000,
  "operatingIncomeRatio" : 0.24572,
  "totalOtherIncomeExpensesNet" : 422000000,
  "incomeBeforeTax" : 65737000000,
  "incomeBeforeTaxRatio" : 0.252666,
  "incomeTaxExpense" : 10481000000,
  "netIncome" : 55256000000,
  "netIncomeRatio" : 0.212381,
  "eps" : 2.97145,
  "epsdiluted" : 2.97145,
  "weightedAverageShsOut" : 18595652000,
  "weightedAverageShsOutDil" : 18595652000,
  "link" : "https://www.sec.gov/Archives/edgar/data/320193/000032019319000119/0000320193-19-000119-index.html",
  "finalLink" : "https://www.sec.gov/Archives/edgar/data/320193/000032019319000119/a10-k20199282019.htm"
}, ...
]
  

Что мне не нужно в словаре, так это ключи:
Дата заполнения, принятая дата, ссылка, конечная ссылка

Мне удалось их удалить, но моя проблема в том, что теперь этот фрагмент кода, который я написал, слишком часто выдает эти словари, и я не могу понять, почему…

Вот что я пробовал:

 import requests
import json

url = "https://financialmodelingprep.com/api/v3/income-statement/AAPL?apikey=b60bb3d1967bb15bfb9daaa4426e77dc"
response = requests.get(url)
data = response.text
dataList = json.loads(data)
entriesToRemove = {
    'fillingDate' : 0,
    'acceptedDate' : 0,
    'link' : 0,
    'finalLink' : 0
}
removedEntries = []
newDict = {}

for index in range(len(dataList)):
    for key in dataList[index]:
        newDict[key] = dataList[index].get(key)                 
        if key in entriesToRemove:                              
            removedEntries = newDict.pop(key)                   
        print(json.dumps(newDict, indent=4))

  

Заранее спасибо

Комментарии:

1. <курсив>теперь тот фрагмент кода, который я написал, слишком часто выплевывает эти словари</italic> Что это значит?

2. для каждого ключа в словаре словарь печатается в новое время. Например, «weightedAverageShsOutDil»: 3410000000 является ключом в первом dict, и весь dict печатается. Затем я получаю новый dict с единственным измененным значением, которое является «weightedAverageShsOutDil»: 3353000000, но остальное идентично, и печатается весь dict.

3. Пожалуйста, проверьте, что я опубликовал, посмотрите, поможет ли это.

Ответ №1:

OP:

для каждого ключа в словаре словарь печатается новое время.

Причина:

 for index in range(len(dataList)):
for key in dataList[index]:
    newDict[key] = dataList[index].get(key)                 
    if key in entriesToRemove:                              
        removedEntries = newDict.pop(key)                   
    print(json.dumps(newDict, indent=4))    # notice this line
  

Причина, по которой словарь печатается для каждого ключа, заключается в том, что у вас есть print(json.dumps(newDict, indent=4)) оператор внутри цикла для каждой key-val итерации по словарю.

Чтобы удалить выделенные ключи из списка dict, вы можете выполнить итерацию по списку и создать другой список dict без ненужных ключей:

 s = [ {
  "date" : "2019-09-28",
  "symbol" : "AAPL",
  "fillingDate" : "2019-10-31 00:00:00",
  "acceptedDate" : "2019-10-30 18:12:36",
  "period" : "FY",
  "revenue" : 260174000000,
  "costOfRevenue" : 161782000000,
  "grossProfit" : 98392000000,
  "grossProfitRatio" : 0.378178,
  "researchAndDevelopmentExpenses" : 16217000000,
  "generalAndAdministrativeExpenses" : 18245000000,
  "sellingAndMarketingExpenses" : 0.0,
  "otherExpenses" : 1807000000,
  "operatingExpenses" : 34462000000,
  "costAndExpenses" : 196244000000,
  "interestExpense" : 3576000000,
  "depreciationAndAmortization" : 12547000000,
  "ebitda" : 81860000000,
  "ebitdaratio" : 0.314636,
  "operatingIncome" : 63930000000,
  "operatingIncomeRatio" : 0.24572,
  "totalOtherIncomeExpensesNet" : 422000000,
  "incomeBeforeTax" : 65737000000,
  "incomeBeforeTaxRatio" : 0.252666,
  "incomeTaxExpense" : 10481000000,
  "netIncome" : 55256000000,
  "netIncomeRatio" : 0.212381,
  "eps" : 2.97145,
  "epsdiluted" : 2.97145,
  "weightedAverageShsOut" : 18595652000,
  "weightedAverageShsOutDil" : 18595652000,
  "link" : "https://www.sec.gov/Archives/edgar/data/320193/000032019319000119/0000320193-19-000119-index.html",
  "finalLink" : "https://www.sec.gov/Archives/edgar/data/320193/000032019319000119/a10-k20199282019.htm"
}
]


res = []
ignored_keys = ['fillingDate', 'acceptedDate', 'link', 'finalLink']
for dd in s:
    for k,v in dd.items():
        if k not in ignored_keys:
            res.append({k: v})      
print(res)
  

Редактировать:

однострочный:

 print({k:v for dd in s for k,v in dd.items() if k not in ignored_keys})
  

Комментарии:

1. идеально, это было бы решением, которое я искал. :)) Но есть ли способ получить словари в виде блока, как будто они доступны из API?

2. @user8775221 вы могли бы использовать orderedDict , если порядок имеет значение.

3. честно говоря, речь идет не о порядке, а о дате выпуска, мне нужен блок данных, выпущенный на определенную дату

4. @user8775221 это следует задать в качестве нового вопроса. поскольку теперь он запрашивает сравнение дат.

5. хорошо, я могу сделать это здесь или мне нужно открыть новый поток?