Toute aide sur ce problème sera grandement appréciée.
Donc, fondamentalement, je veux exécuter une requête sur ma base de données SQL et stocker les données renvoyées sous forme de structure de données Pandas.
J'ai joint le code pour la requête.
Je lis la documentation sur Pandas, mais j'ai du mal à identifier le type de retour de ma requête.
J'ai essayé d'imprimer le résultat de la requête, mais cela ne donne aucune information utile.
Merci!!!!
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)
Donc je veux en quelque sorte comprendre quel est le format / type de données de ma variable "resoverall" et comment la mettre avec la structure de données PANDAS.
python
mysql
data-structures
pandas
user1613017
la source
la source
Réponses:
Voici le code le plus court qui fera le travail:
Vous pouvez aller plus loin et analyser les types comme dans la réponse de Paul.
la source
df = DataFrame(cursor.fetchall())
renvoieValueError: DataFrame constructor not properly called!
, il semble que le tuple de tuples n'est pas acceptable pour le constructeur DataFrame. Il n'y a pas non plus.keys()
de curseur sur en mode dictionnaire ou en tuple.keys()
fonction mais je n'arrive pas à le faire fonctionner.df.columns=[ x.name for x in recoverall.description ]
Edit: mars 2015
Comme indiqué ci-dessous, pandas utilise maintenant SQLAlchemy pour lire à partir de ( read_sql ) et insérer dans ( to_sql ) une base de données. Ce qui suit devrait fonctionner
Réponse précédente: Via mikebmassey d'une question similaire
la source
pd.read_sql()
dans l'extrait de code ci-dessus?pyodbc
etpandas
ensemble pas mal. Ajout d'une nouvelle réponse avec exemple, FYI.Si vous utilisez l'ORM de SQLAlchemy plutôt que le langage d'expression, vous voudrez peut-être convertir un objet de type
sqlalchemy.orm.query.Query
en bloc de données Pandas.L'approche la plus propre consiste à obtenir le SQL généré à partir de l'attribut d'instruction de la requête, puis à l'exécuter avec la
read_sql()
méthode de pandas . Par exemple, en commençant par un objet Query appeléquery
:la source
pandas.read_sql_query
, en lui passantquery.statement
. Voir cette réponse: stackoverflow.com/a/29528804/1273938Modifier le 30/09/2014:
pandas a maintenant une
read_sql
fonction. Vous voulez certainement l'utiliser à la place.Réponse originale:
Je ne peux pas vous aider avec SQLAlchemy - J'utilise toujours pyodbc, MySQLdb ou psychopg2 selon les besoins. Mais ce faisant, une fonction aussi simple que celle ci-dessous a tendance à répondre à mes besoins:
la source
read_sql
peut toujours accepter les connexions non-SQLAlchemy via, par exemple, pyodbc, psychopg2, etc.Connecteur MySQL
Pour ceux qui fonctionnent avec le connecteur mysql, vous pouvez utiliser ce code comme point de départ. (Merci à @Daniel Velkov)
Réfs utilisés:
la source
Voici le code que j'utilise. J'espère que cela t'aides.
la source
Voici une réponse courte et claire à votre problème:
la source
1. Utilisation de MySQL-connector-python
2. Utilisation de SQLAlchemy
la source
Comme Nathan, je souhaite souvent vider les résultats d'une requête sqlalchemy ou sqlsoup dans une trame de données Pandas. Ma propre solution pour cela est:
la source
pandas.read_sql_query
, en lui passantquery.statement
. Voir cette réponse: stackoverflow.com/a/29528804/1273938resoverall
est un objet sqlalchemy ResultProxy. Vous pouvez en savoir plus à ce sujet dans la documentation sqlalchemy , cette dernière explique l'utilisation de base du travail avec les moteurs et les connexions. L'important ici est queresoverall
c'est dict comme.Les pandas aiment les objets comme des dict pour créer leurs structures de données, voir la documentation en ligne
Bonne chance avec sqlalchemy et pandas.
la source
Utilisez simplement
pandas
etpyodbc
ensemble. Vous devrez modifier votre chaîne de connexion (connstr
) en fonction des spécifications de votre base de données.J'ai utilisé
pyodbc
avec plusieurs bases de données d'entreprise (par exemple SQL Server, MySQL, MariaDB, IBM).la source
to_sql
méthode sur l'DataFrame
objet. Cette méthode utilise par défaut SQLite, vous devez donc lui transmettre explicitement un objet pointant vers la base de données MSSQL. Voir la documentation .pandas
être plus optimisé pour le travail ETL léger, mais hélas ...Cette question est ancienne, mais je voulais ajouter mes deux cents. J'ai lu la question comme "Je veux exécuter une requête sur ma [ma] base de données SQL et stocker les données renvoyées sous forme de structure de données Pandas [DataFrame]".
D'après le code, il semble que vous vouliez dire la base de données mysql et que vous vouliez dire pandas DataFrame.
Par exemple,
Cela importera toutes les lignes de testTable dans un DataFrame.
la source
Voici le mien. Juste au cas où vous utilisez "pymysql":
la source
pandas.io.sql.write_frame est DEPRECATED. https://pandas.pydata.org/pandas-docs/version/0.15.2/generated/pandas.io.sql.write_frame.html
Devrait changer pour utiliser pandas.DataFrame.to_sql https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html
Il existe une autre solution. PYODBC vers Pandas - DataFrame ne fonctionne pas - La forme des valeurs transmises est (x, y), les indices impliquent (w, z)
Depuis Pandas 0.12 (je crois), vous pouvez faire:
Avant la version 0.12, vous pouviez faire:
la source
Longtemps depuis le dernier message, mais peut-être que cela aide quelqu'un ...
Chemin court que Paul H:
la source
meilleure façon de faire ça
la source
Si le type de résultat est ResultSet , vous devez d'abord le convertir en dictionnaire. Ensuite, les colonnes DataFrame seront collectées automatiquement.
Cela fonctionne sur mon cas:
la source