149

この問題に関する助けをいただければ幸いです。

したがって、基本的には、SQLデータベースに対してクエリを実行し、返されたデータをPandasデータ構造として格納します。

クエリ用のコードを添付しました。

Pandasのドキュメントを読んでいますが、クエリの戻りタイプを特定するのに問題があります。

クエリ結果を印刷しようとしましたが、有用な情報が得られません。

ありがとう!!!!

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
)

ですから、変数「resoverall」の形式/データ型と、それをPANDASデータ構造にどのように配置するかを理解したいと思います。

4

18 に答える 18

161

これがその仕事をする最短のコードです:

from pandas import DataFrame
df = DataFrame(resoverall.fetchall())
df.columns = resoverall.keys()

Paulの答えのように、もっと凝ってタイプを解析することができます。

于 2012-08-21T18:28:30.690 に答える
160

編集:2015年3月

以下に示すように、pandas はSQLAlchemyを使用して、データベースからの読み取り ( read_sql ) とデータベースへの挿入( to_sql )の両方を行うようになりました。以下は動作するはずです

import pandas as pd

df = pd.read_sql(sql, cnxn)

前の回答:同様の質問 からmikebmassey経由

import pyodbc
import pandas.io.sql as psql
    
cnxn = pyodbc.connect(connection_info) 
cursor = cnxn.cursor()
sql = "SELECT * FROM TABLE"
    
df = psql.frame_query(sql, cnxn)
cnxn.close()
于 2013-01-23T19:38:02.580 に答える
23

2014-09-30 を編集:

pandas にread_sql関数が追加されました。代わりにそれを使用したいのは間違いありません。

元の答え:

SQLAlchemy についてはお手伝いできません。必要に応じて、常に pyodbc、MySQLdb、または Psychopg2 を使用しています。しかし、そうするとき、以下のような単純な関数が私のニーズに合う傾向があります:

import decimal

import pyodbc #just corrected a typo here
import numpy as np
import pandas

cnn, cur = myConnectToDBfunction()
cmd = "SELECT * FROM myTable"
cur.execute(cmd)
dataframe = __processCursor(cur, dataframe=True)

def __processCursor(cur, dataframe=False, index=None):
    '''
    Processes a database cursor with data on it into either
    a structured numpy array or a pandas dataframe.

    input:
    cur - a pyodbc cursor that has just received data
    dataframe - bool. if false, a numpy record array is returned
                if true, return a pandas dataframe
    index - list of column(s) to use as index in a pandas dataframe
    '''
    datatypes = []
    colinfo = cur.description
    for col in colinfo:
        if col[1] == unicode:
            datatypes.append((col[0], 'U%d' % col[3]))
        elif col[1] == str:
            datatypes.append((col[0], 'S%d' % col[3]))
        elif col[1] in [float, decimal.Decimal]:
            datatypes.append((col[0], 'f4'))
        elif col[1] == datetime.datetime:
            datatypes.append((col[0], 'O4'))
        elif col[1] == int:
            datatypes.append((col[0], 'i4'))

    data = []
    for row in cur:
        data.append(tuple(row))

    array = np.array(data, dtype=datatypes)
    if dataframe:
        output = pandas.DataFrame.from_records(array)

        if index is not None:
            output = output.set_index(index)

    else:
        output = array

    return output
于 2012-08-21T14:20:22.593 に答える
9

これはあなたの問題に対する短くて鮮明な答えです:

from __future__ import print_function
import MySQLdb
import numpy as np
import pandas as pd
import xlrd

# Connecting to MySQL Database
connection = MySQLdb.connect(
             host="hostname",
             port=0000,
             user="userID",
             passwd="password",
             db="table_documents",
             charset='utf8'
           )
print(connection)
#getting data from database into a dataframe
sql_for_df = 'select * from tabledata'
df_from_database = pd.read_sql(sql_for_df , connection)
于 2018-07-12T14:55:47.953 に答える
5

Nathan のように、sqlalchemy または sqlsoup クエリの結果を Pandas データ フレームにダンプしたいことがよくあります。これに対する私自身の解決策は次のとおりです。

query = session.query(tbl.Field1, tbl.Field2)
DataFrame(query.all(), columns=[column['name'] for column in query.column_descriptions])
于 2013-09-30T19:42:03.630 に答える
4

resoverallsqlalchemy ResultProxy オブジェクトです。詳細についてはsqlalchemy docsを参照してください。後者では、エンジンと接続の基本的な使用方法について説明しています。ここで重要なのは、resoveralldict のようなものです。

Pandas は dict のようなオブジェクトを使用してデータ構造を作成します。オンライン ドキュメントを参照してください。

sqlalchemy と pandas で頑張ってください。

于 2012-08-21T12:36:18.620 に答える
3

この質問は古いですが、私は 2 セントを追加したかったのです。質問を「 [my]SQL データベースに対してクエリを実行し、返されたデータを Pandas データ構造 [DataFrame] として保存したい」と読みました。

コードから、mysql データベースを意味しているように見え、pandas DataFrame を意味していると想定しています。

import MySQLdb as mdb
import pandas.io.sql as sql
from pandas import *

conn = mdb.connect('<server>','<user>','<pass>','<db>');
df = sql.read_frame('<query>', conn)

例えば、

conn = mdb.connect('localhost','myname','mypass','testdb');
df = sql.read_frame('select * from testTable', conn)

これにより、testTable のすべての行が DataFrame にインポートされます。

于 2013-07-31T18:55:22.767 に答える
1

前回の投稿から長い時間ですが、誰かの助けになるかもしれません...

ポール H よりも近道:

my_dic = session.query(query.all())
my_df = pandas.DataFrame.from_dict(my_dic)
于 2015-07-21T17:23:19.303 に答える