将外部SQL文件读入Pandas Dataframe

时间:2017-10-11 17:36:13

标签: python pandas dataframe path mysql-python

这是一个我无法找到答案的简单问题。我有一个带有两个命令的.SQL文件。我想让Pandas将这些命令的结果拉入DataFrame。

SQL文件的命令就是这样,使用今天的日期查询时间较长。

SET @todaydate = DATE(NOW());
SELECT ...long query....;

我在建立连接(prod_db)之后尝试以下列方式使用read_sql并收到错误消息'' NoneType'对象不可迭代'

sqlpath = 'path.sql'
scriptFile = open(sqlpath,'r')
script = scriptFile.read()
df = pd.read_sql(script,prod_db) 

我还尝试使用此处描述的功能和方法reading external sql script in python,但我不确定如何将结果导入熊猫数据框(或者我可能会遗漏某些内容) )。我似乎没有按照我的命令跳过'命令跳过'反复。

def executeScriptsFromFile(filename):
    fd = open(filename, 'r')
    sqlFile = fd.read()
    fd.close()
    # all SQL commands (split on ';')
    sqlCommands = sqlFile.split(';')
    # Execute every command from the input file
    for command in sqlCommands:
        try:
            c.execute(command)
        except OperationalError, msg:
            print "Command skipped: ", msg
df = executescriptsfromfile(sqlpath)

2 个答案:

答案 0 :(得分:14)

我有一个可能适合您的解决方案。它应该给你一个不错的小pandas.DataFrame

首先,您必须阅读sql文件中的查询。然后,只需使用pd.read_sql_query()代替pd.read_sql()

我相信你知道,但这是函数的文档:http://pandas.pydata.org/pandas-docs/version/0.20/generated/pandas.read_sql_query.html#pandas.read_sql_query

# Read the sql file
query = open('filename.sql', 'r')

# connection == the connection to your database, in your case prob_db
DF = pd.read_sql_query(query.read(),connection)

我可以向你保证它正在使用T-SQL,但我从未在MySQL上使用它。

答案 1 :(得分:1)

这是它如何为我工作的MWE:

from sklearn.preprocessing import LabelEncoder
import pandas as pd

df = pd.DataFrame({
        'first_browser': ['Firefox', 'Chrome', 'Opera'],
        'gender': ['Male', 'Female', 'Male'],
     })

all_labelencoders = {}

cols = ['first_browser', 'gender'] # strings with names

for name in cols:
    labelencoder = LabelEncoder()
    all_labelencoders[name] = labelencoder

    labelencoder.fit( df[name] )
    df['labelencoder_' + name] = labelencoder.transform( df[name] )


print(all_labelencoders['first_browser'])
print(all_labelencoders['gender'])

#for name in cols:
#    print(name, all_labelencoders[name])

print(df)

# inverse data

for name in cols:
    encoder = all_labelencoders[name]
    data = encoder.inverse_transform(df['labelencoder_' + name])
    print(data)

我希望这会有所帮助。