Python - l oop через один и тот же запрос с разными переменными, объединить фреймы данных - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть запрос в SAS, где я использую макрос-переменную, чтобы повторить запрос к Teradata с другой переменной. У нас есть 5 баз данных, по одной для каждого состояния, где я выполняю один и тот же запрос, но использую переменную, чтобы обновить состояние, а затем исправить все наборы данных. Я ищу помощь в том, как я могу сделать это в python.

l oop через {состояние1, состояние2, состояние3, состояние4, состояние5} и сохранить каждый запрос как {stateX} _df, а затем объединить все

import teradata as td
import pandas as pd
from teradata import tdodbc

udaExec = td.UdaExec(appConfigFile="udaexec.ini")

with udaExec.connect("${dataSourceName}", LoginTimeout=120) as session:     

query1 = """database my_db_{state1};"""

     query2 = """  
                select  distinct
                {state1}, item_a, item_b
                from table

              """  
    session.execute(query1)
    session.execute(query2)

    {stateX}_df = pd.read_sql(query2), session)

Ответы [ 3 ]

1 голос
/ 19 февраля 2020

Не уверен, используете ли вы python 2 или python 3. Если вы можете использовать python 3.6 или более позднюю версию, возможно, что-то вроде следующего может работать?

import teradata as td
import pandas as pd

udaExec = td.UdaExec(appName="test", version="1.0", logConsole=False)
with udaExec.connect(
    method="odbc",
    system="host",
    username="username",
    password="password",
    driver="drivername"
    ) as conn: 

state_dataframes = []
STATES = ["state1", "state2", "state3", "state4", "state5"]

for state in STATES:
    sql = f"select distinct {state}, item_a, item_b from my_db_{state}.table;"
    state_dataframes.append(pd.read_sql(sql, conn))

combined_data = pd.concat(state_dataframes)

Это не ' t проверено, но, надеюсь, оно поможет вам в правильном направлении.

0 голосов
/ 23 февраля 2020

Вот улучшенная версия с изменчивым использованием таблицы: Python SQL l oop переменные через несколько запросов

udaExec = td.UdaExec(appConfigFile="udaexec.ini")

with udaExec.connect("${dataSourceName}") as session:

state_dataframes = []
STATES = ["state1", "state2", "state3", "state4", "state5"]

for state in STATES:

        query1 = """database my_db_{};"""

        query2 = """   
        create set volatile table v_table
        ,no fallback, no before journal, no after journal as
        (  
        select top 10
        '{}' as state
        ,t.*
        from table t
        )   
        with data
        primary index (dw_key)  
        on commit preserve rows;
        """

        query3 = """
        create set volatile table v_table_2
        ,no fallback, no before journal, no after journal as
        (  
        select t.*
        from v_table t
        )   
        with data
        primary index (dw_clm_key)  
        on commit preserve rows;

        """

        query4 = """

        select t.* 
        from v_table_2 t

        """

        session.execute(query1.format(state))
        session.execute(query2.format(state))
        session.execute(query3)
        session.execute(query4)
        state_dataframes.append(pd.read_sql(query4, session))
        session.execute("DROP TABLE v_table")
        session.execute("DROP TABLE v_table_2")

all_states_df = pd.concat(state_dataframes)
0 голосов
/ 20 февраля 2020

Мне удалось заставить его работать над одним тестовым запросом, который был действительно полезен, поэтому спасибо @andrew madsen

Что я еще не решил, так это как сделать это для нескольких запросов, которые я использую. Я читал о курсорах и связях, и я думаю, что это поможет мне.

import teradata as td
import pandas as pd
from teradata import tdodbc

udaExec = td.UdaExec(appConfigFile="udaexec.ini")

with udaExec.connect("${dataSourceName}") as session:


    state_dataframes = []
    STATES = ["IL", "TX", "MT", "OK", "NM"]

    for state in STATES:

        sql = """      
        select top 10
        '{}' as state
        ,a.*
         from my_db_{}.table a
        """.format(state,state)

    state_dataframes.append(pd.read_sql(sql, session))

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