pandas - разбор MySql результатов - PullRequest
2 голосов
/ 20 марта 2020

Я использую python pandas для выполнения запроса на MySql. В пользовательском интерфейсе используется API-интерфейс Flot для представления данных MySql. Ниже приведена существующая реализация,

query2 = f"""select time, value from NWSTAT 
             where time > \'{from_date}\' 
             and time < \'{to_date}\'"""
result2 = pd.read_sql(query2, engine)
return result2.to_json(orient='records')

Получение результата в формате ниже

[{"time": 1581931200000, "value": 0.0}, {"time": 1581931200000, "value": 0.0}, 
 {"time": 1581931200000, "value": 0.0}, {"time": 1581931200000, "value": 0.0}]

Из этого ответа я создаю структуру belwo для Flot API на стороне пользовательского интерфейса Javascript,

[[1581931200000,0],[1581931200000,0],[1581931200000,0],[1581931200000,0]]

Есть ли способ сделать это на стороне python без каких-либо итераций? Прямо из результата запроса.

Использование Flask сервера. Сторона пользовательского интерфейса: JQuery, руль JS

РЕДАКТИРОВАТЬ: В принятом ответе второй подход занимает меньше времени .. Ниже приведено время, необходимое для обоих подходов для записей 240k

 First one: --- 1.6689300537109375e-06 seconds ---
 Second one: --- 0.5330650806427002 seconds ---

1 Ответ

1 голос
/ 20 марта 2020

Проблема в том, что если преобразовать оба столбца в numpy формат массива целых чисел изменяется на число с плавающей запятой.

print (json.dumps(result2.to_numpy().tolist()))

Первая идея - создать списки из .values() словарей и преобразовать в json:

import json

query2 = f"""select time, value from NWSTAT 
             where time > \'{from_date}\' 
             and time < \'{to_date}\'"""
result2 = pd.read_sql(query2, engine)
return json.dumps([list(x.values()) for x in result2.to_dict(orient='records')])

Или измените fomrat на DataFrame.to_dict с l для списков, а затем используйте zip со списками отображения, в последний раз преобразуйте в json:

import json

query2 = f"""select time, value from NWSTAT 
             where time > \'{from_date}\' 
             and time < \'{to_date}\'"""
result2 = pd.read_sql(query2, engine)
return json.dumps(list(map(list, zip(*result2.to_dict(orient='l').values()))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...