Qualquer ajuda neste problema será muito apreciada.
Então, basicamente, eu quero executar uma consulta ao meu banco de dados SQL e armazenar os dados retornados como a estrutura de dados do Pandas.
Anexei o código para consulta.
Estou lendo a documentação do Pandas, mas tenho problemas para identificar o tipo de retorno da minha consulta.
Tentei imprimir o resultado da consulta, mas não dá nenhuma informação útil.
Obrigado!!!!
from sqlalchemy import create_engine
engine2 = create_engine('mysql://THE DATABASE I AM ACCESSING')
connection2 = engine2.connect()
dataid = 1022
resoverall = connection2.execute("
SELECT
sum(BLABLA) AS BLA,
sum(BLABLABLA2) AS BLABLABLA2,
sum(SOME_INT) AS SOME_INT,
sum(SOME_INT2) AS SOME_INT2,
100*sum(SOME_INT2)/sum(SOME_INT) AS ctr,
sum(SOME_INT2)/sum(SOME_INT) AS cpc
FROM daily_report_cooked
WHERE campaign_id = '%s'", %dataid)
Então, eu meio que quero entender qual é o formato / tipo de dados da minha variável "resoverall" e como colocá-la na estrutura de dados PANDAS.
python
mysql
data-structures
pandas
user1613017
fonte
fonte
Respostas:
Este é o código mais curto que fará o trabalho:
Você pode ir mais elaborado e analisar os tipos como na resposta de Paulo.
fonte
df = DataFrame(cursor.fetchall())
retornaValueError: DataFrame constructor not properly called!
, parece que a tupla de tuplas não é aceitável para o construtor DataFrame. Também não há um.keys()
cursor no modo de dicionário ou tupla.keys()
função, mas não consigo fazê-lo funcionar.df.columns=[ x.name for x in recoverall.description ]
Edição: março de 2015
Conforme observado abaixo, o pandas agora usa SQLAlchemy para ler ( read_sql ) e inserir em ( to_sql ) um banco de dados. O seguinte deve funcionar
Resposta anterior: Via mikebmassey de uma pergunta semelhante
fonte
pd.read_sql()
no trecho de código acima?pyodbc
epandas
junto um pouco. Adicionando nova resposta com exemplo, FYI.Se você estiver usando o ORM do SQLAlchemy em vez da linguagem de expressão, talvez queira converter um objeto do tipo
sqlalchemy.orm.query.Query
em um quadro de dados do Pandas.A abordagem mais limpa é obter o SQL gerado a partir do atributo de instrução da consulta e executá-lo com o
read_sql()
método do pandas . Por exemplo, começando com um objeto Query chamadoquery
:fonte
pandas.read_sql_query
, passandoquery.statement
para ela. Veja esta resposta: stackoverflow.com/a/29528804/1273938Editar 30/09/2014:
pandas agora tem uma
read_sql
função. Você definitivamente quer usar isso.Resposta original:
Não posso ajudá-lo com SQLAlchemy - eu sempre uso pyodbc, MySQLdb ou psychopg2 conforme necessário. Mas, ao fazer isso, uma função tão simples como a abaixo tende a atender às minhas necessidades:
fonte
read_sql
ainda pode aceitar conexões não-SQLAlchemy, por exemplo, pyodbc, psychopg2, etc.Conector MySQL
Para aqueles que trabalham com o conector mysql, você pode usar este código como um começo. (Obrigado a @Daniel Velkov)
Referências usadas:
fonte
Aqui está o código que uso. Espero que isto ajude.
fonte
Esta é uma resposta curta e nítida para o seu problema:
fonte
1. Usando MySQL-connector-python
2. Usando SQLAlchemy
fonte
Como Nathan, geralmente quero despejar os resultados de uma consulta sqlalchemy ou sqlsoup em um quadro de dados do Pandas. Minha própria solução para isso é:
fonte
pandas.read_sql_query
, passandoquery.statement
para ela. Veja esta resposta: stackoverflow.com/a/29528804/1273938resoverall
é um objeto sqlalchemy ResultProxy. Você pode ler mais sobre isso nos documentos do sqlalchemy , o último explica o uso básico de trabalhar com motores e conexões. O importante aqui é o queresoverall
é dito.O Pandas gosta de objetos ditados para criar suas estruturas de dados, veja a documentação online
Boa sorte com sqlalchemy e pandas.
fonte
Basta usar
pandas
epyodbc
juntos. Você terá que modificar sua string de conexão (connstr
) de acordo com as especificações do seu banco de dados.Eu usei
pyodbc
com vários bancos de dados corporativos (por exemplo, SQL Server, MySQL, MariaDB, IBM).fonte
to_sql
método noDataFrame
objeto. Esse método é padronizado como SQLite, então você deve passar explicitamente um objeto apontando para o banco de dados MSSQL. Veja a documentação .pandas
estar mais otimizado para trabalhos leves de ETL, mas, infelizmente ...Esta pergunta é antiga, mas eu queria adicionar meus dois centavos. Eu li a pergunta como "Eu quero executar uma consulta ao meu [meu] banco de dados SQL e armazenar os dados retornados como estrutura de dados do Pandas [DataFrame]."
Pelo código, parece que você quer dizer banco de dados mysql e assume que quer dizer pandas DataFrame.
Por exemplo,
Isso importará todas as linhas de testTable para um DataFrame.
fonte
Aqui é minha. Por precaução, se você estiver usando "pymysql":
fonte
pandas.io.sql.write_frame está DESCONTINUADO. https://pandas.pydata.org/pandas-docs/version/0.15.2/generated/pandas.io.sql.write_frame.html
Deve mudar para usar pandas.DataFrame.to_sql https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html
Existe outra solução. PYODBC para Pandas - DataFrame não funciona - A forma dos valores passados é (x, y), os índices implicam (w, z)
No Pandas 0.12 (eu acredito) você pode fazer:
Antes do 0.12, você podia fazer:
fonte
Muito tempo desde a última postagem, mas talvez ajude alguém ...
Caminho curto do que Paul H:
fonte
melhor maneira que eu faço isso
fonte
Se o tipo de resultado for ResultSet , você deve primeiro convertê-lo em dicionário. Em seguida, as colunas DataFrame serão coletadas automaticamente.
Isso funciona no meu caso:
fonte