Панды для цикла с MySQL запрос и переменные параметры - PullRequest
0 голосов
/ 17 октября 2018

Я загружал свои данные из отдельных CSV-файлов в кадр данных, используя

df = pd.read_csv('data.csv', names=col_names, sep=',', skiprows=1)
col_names = ['created_date', 'latitude', 'longitude']

Это позволило бы аккуратно разделить мои данные на фреймы столбцов и пропустить первую строку с метками строк

Однако я хотел автоматизировать процесс, используя цикл for, который делал одинаковые запросы для каждого пользователя.Моя функция выглядит следующим образом:

sql = "select distinct mobile_user_id from score where speed_range_id > 1"
distance_query = """SELECT created_date, latitude, longitude FROM score s where s.mobile_user_id = %(mobile_user_id)s and speed_range_id > 1 group by latitude, longitude order by id asc"""
cursor1.execute(sql)
result = cursor1.fetchall()

for rowdict in result:
    distance = cursor3.execute(distance_query, rowdict)
    distance_result = cursor3.fetchall()
    df = pd.read_sql_query(distance_query, rdsConn, params={rowdict})

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

Я пытался использовать pd.read_sql_query, но мне не удалось передать в запрос параметр мобильного пользователя, равный rowdict.

Как мне поступить, чтобы яможно передать эту переменную с помощью панд?Как мне организовать свои данные так, как они у меня были раньше?

образец data.csv:

created_date,          latitude,    longitude
"2018-05-24 17:46:25", 20.61844841, -100.40813424
"2018-05-24 21:03:02", 20.58469452, -100.39204018
"2018-05-25 10:29:57", 20.61180308, -100.40826959
"2018-05-25 21:02:43", 20.59868518, -100.37825344

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 17 октября 2018

Подумайте о запуске чистого SQL, объединяющего оба запроса, добавив в ваш агрегированный запрос предложение WHERE.

В настоящее время вы пытаетесь использовать предложение WHERE, сравнивающее одно значение в строке со многими значениями: where mobile_user_id = %(mobile_user_id)sкоторый никогда не будет равным.Кроме того, ваше подготовленное утверждение не имеет того же количества заполнителей, что и значения параметров.Возможно, вы имели в виду where mobile_user_id IN (?, ?, ?, ?, ?, ...), который включает в себя динамическую установку заполнителей, ?.

Тем не менее, просто запустите агрегированный запрос.Затем импортируйте набор результатов в панды.В частности, добавьте mobile_user_id в качестве группировки в запросе:

sql = """select mobile_user_id, created_date, latitude, longitude
         from score
         where speed_range_id > 1
         group by mobile_user_id, created_date, latitude, longitude 
         order by id asc
      """

df = pd.read_sql_query(sql, rdsConn)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...