私はパンダに2列、QuarterHourDimID
とStartDateDimID
のテーブルを持っています。これらの列は私に日付と時間のペアごとのIDを与えます。たとえば、2015年1月1日の午後12時15分には、StartDateDimID
は1097
に等しく、QuarterHourDimID
は26
に等しくなります。これは、私が読んでいるデータがどのように整理されているかです。パンダは大きなデータセットに速度を適用します。
pyodbc
とpandas.read_sql()
、〜450M行と〜60列を使用して読んでいる大きなテーブルです。パフォーマンスが問題です。追加の列datetime
を作成するために、私はすべての行に適用する機能を実行している実行可能datetime
インデックスにQuarterHourDimID
とStartDateDimID
列を解析する
。
追加の解析を行わずにテーブルを読み取るコードは約800msです。しかし、この適用関数を実行すると、合計実行時間が約4秒増える(問合せが予想される5.8〜6秒の間)。返されるdf
は約45K行と5列(〜450日*〜100時間)
私が書いたものをより効率的に書き換えて、途中で入力を得ることを望んでいます。以下は
私がこれまでに書いたコードです:
import pandas as pd
from datetime import datetime, timedelta
import pyodbc
def table(network, demo):
connection_string = "DRIVER={SQL Server};SERVER=OURSERVER;DATABASE=DB"
sql = """SELECT [ID],[StartDateDimID],[DemographicGroupDimID],[QuarterHourDimID],[Impression] FROM TABLE_NAME
WHERE (MarketDimID = 1
AND RecordTypeDimID = 2
AND EstimateTypeDimID = 1
AND DailyOrWeeklyDimID = 1
AND RecordSequenceCodeDimID = 5
AND ViewingTypeDimID = 4
AND NetworkDimID = {}
AND DemographicGroupDimID = {}
AND QuarterHourDimID IS NOT NULL)""".format(network, demo)
with pyodbc.connect(connection_string) as cnxn:
df = pd.read_sql(sql=sql, con=cnxn, index_col=None)
def time_map(quarter_hour, date):
if quarter_hour > 72:
return date + timedelta(minutes=(quarter_hour % 73)*15)
return date + timedelta(hours=6, minutes=(quarter_hour-1)*15)
map_date = {}
init_date = datetime(year=2012, month=1, day=1)
for x in df.StartDateDimID.unique():
map_date[x] = init_date + timedelta(days=int(x)-1)
#this is the part of my code that is likely bogging things down
df['datetime'] = df.apply(lambda row: time_map(int(row['QuarterHourDimID']),
map_date[row['StartDateDimID']]),
axis=1)
if network == 1278:
df = df.loc[df.groupby('datetime')['Impression'].idxmin()]
df = df.set_index(['datetime'])
return df
... WHEN ... THEN ... ELSE' - はるかに速くなるはずです – MaxU
ありがとうございました。これは間違いなくトリックでした。パフォーマンスが大幅に向上しました。 – mburke05