Мне нужно переварить данные временных рядов из API в базу данных Synapse Analytics. API возвращает JSON, которое я хотел бы преобразовать в дату хранения таблицы, значение и имя времени ser ie. Я могу вернуть следующие JSON с Python:
import requests
from pandas.io.json import json_normalize
url = 'https://api.citivelocity.com/markets/analytics/chartingbe/rest/external/authed/data?client_id='+CitiClientId
payload = {'startDate': 20200705, 'endDate': 20200712, 'tags': ['FX.SPOT.EUR.CHF.CITI'],'frequency':'DAILY'}
headers = {'authorization': 'Bearer'+access_token}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
->
{"частота": "ЕЖЕДНЕВНО", "тело": {"FX.SPOT .EUR.CHF.CITI ": {" x ": [20200706,20200707,20200708,20200709,20200710]," c ": [1.06365,1.06255,1.06265,1.06155,1.06325]," type ":" SERIES " }}, "status": "OK"}
К сожалению, с Postman или Azure Data Factory я не получаю никаких данных. Вызов API успешно выполняется с помощью ADF и Postman, но я предполагаю, что в запросе что-то не так.
ADF был бы моим предпочтительным выбором, но использование блоков данных в порядке, если можно записывать данные непосредственно в Synapse.
-> Как преобразовать JSON в фрейм данных (дату, значение и имя временного ряда) в python? С датафрейма, думаю, мне удастся написать в Synapse. Я могу ограничить объемы данных, поэтому использование json_normalize должно быть в порядке?
Заманчивым вариантом было бы сначала сохранить json в базе данных и выполнить преобразования с помощью sql, но я полагаю, что это делается с python было бы более элегантным / надежным решением.
CREATE TABLE #SERIES WITH (DISTRIBUTION=ROUND_ROBIN) AS SELECT 'FX.SPOT.EUR.CHF.CITI' AS SERIES_NAME, '20200706, 20200707, 20200708, 20200709, 20200710' as dt, '1.06365, 1.06255, 1.06265, 1.06155, 1.06325' as cl
DECLARE @DT NVARCHAR(400)
DECLARE @CL NVARCHAR(400)
SELECT @DT=DT FROM #SERIES
SELECT @CL=CL FROM #SERIES
SELECT
DT.SERIES_NAME, DT.VALUE AS DT, CL.VALUE AS CL
FROM
(
SELECT row_number() OVER (ORDER BY (SELECT NULL)) AS RN, SERIES_NAME, LTRIM(dt.value) AS VALUE
FROM #SERIES
CROSS APPLY STRING_SPLIT(@DT, ',') dt
) DT
JOIN
(SELECT row_number() OVER (ORDER BY (SELECT NULL)) AS RN, SERIES_NAME, LTRIM(CL.value) AS VALUE
FROM #SERIES
CROSS APPLY STRING_SPLIT(@CL, ',') CL
) CL ON DT.SERIES_NAME = CL.SERIES_NAME AND DT.RN = CL.RN
->
SERIES_NAME DT CL
FX.SPOT.EUR.CHF.CITI 20200706 1.06365
FX.SPOT.EUR.CHF.CITI 20200707 1.06255
FX.SPOT.EUR.CHF.CITI 20200708 1.06265
FX.SPOT.EUR.CHF.CITI 20200709 1.06155
FX.SPOT.EUR.CHF.CITI 20200710 1.06325
Спасибо.