gpt4 book ai didi

python - 通过从 SQL DB 导入的 pd 数据帧的子集提高循环性能

转载 作者:行者123 更新时间:2023-11-29 18:36:38 25 4
gpt4 key购买 nike

我对 python/编码总体来说是新手。我花了一些时间来生成下面的代码(对此感到非常自豪),但我现在遇到了性能问题 - 不知道如何解决它们。

我的任务如下:每个产品都有交货时间和生产时间戳。生产时间可以是发货前1天15:00至发货前30分钟。我想将每个交货小时的生产时间聚合为 15 分钟间隔,并在每个间隔内对生产的单位执行几个简单的操作(并非所有这些都是内置函数) -成交量加权平均价格、总数量、标准差等。

我的问题:该数据集由大约 1100 万个数据点组成。计算 6 个月期间的值花了我超过 24 小时。我尝试循环执行 sql 查询,只导入了 15 分钟的时间段,但情况更糟

我的问题:您认为有什么方法可以提高此操作的性能吗?那就太棒了<3

<小时/>

原始输入数据如下所示:

列 交货开始 交货结束 生产日期 时间 价格EURpMW 数量MW p*Q
73 2017-01-03 01:00:00 2017-01-03 02:00:00 2017-01-02 19:03:00 37,4 20 748
80 2017-01-03 01:00:00 2017-01-03 02:00:00 2017-01-02 19:08:00 35,9 25 897,5
86 2017-01-03 01:00:00 2017-01-03 02:00:00 2017-01-02 19:23:00 36,3 1 36,3
94 2017-01-03 01:00:00 2017-01-03 02:00:00 2017-01-02 19:24:00 35,3 0,4 14,12
915 2017-01-03 02:00:00 2017-01-03 03:00:00 2017-01-02 23:47:00 33,7 5 168,5
929 2017-01-03 02:00:00 2017-01-03 03:00:00 2017-01-02 23:50:00 32,6 0,3 9,78
340 2017年1月3日 02:00:00 2017-01-03 03:00:00 2017-01-02 22:17:00 34 7,9 268,6
345 2017-01-03 02:00:00 2017-01-03 03:00:00 2017-01-02 22:19:00 34 0,8 27,2

<小时/>

输出数据如下所示:

index   StartDelivery   Production(intervall)   Quantity    VWAP
17 2017-01-03 01:00:00 2017-01-02 19:00:00 45 36,56666667
18 2017-01-03 01:00:00 2017-01-02 19:15:00 1,4 36,01428571
...
69 2017-01-03 02:00:00 2017-01-02 22:15:00 8,7 34
70 2017-01-03 02:00:00 2017-01-02 23:45:00 5,3 33,63773585
<小时/>

到目前为止我的代码:

import mysql.connector
import numpy as np
import pandas as pd
import datetime




conn=mysql.connector.connect(user='AriHeck',password='none',host='local',database='DataEvaluation', port=3308)
df = pd.read_sql("select StartOfDelivery,EndOfDelivery,ProdDateTime,PriceEURpMW,QuantityMW, PriceEURpMW*QuantityMW as 'p*Q' from `Production`\
where timestampdiff(hour,StartOfDelivery,EndOfDelivery)=1 AND StartOfDelivery >= '2017-01-03 01:00:00' AND StartOfDelivery < '2017-01-03 03:00:00'", con=conn)

#Delivery Time Loop
dt=datetime.datetime.strptime('2017-01-03 01:00:00', "%Y-%m-%d %H:%M:%S")
end_date=datetime.datetime.strptime('2017-01-05 00:00:00', "%Y-%m-%d %H:%M:%S")

#Dummies loops
incr_delivery_loop=datetime.timedelta(hours=1)
incr_production_loop=datetime.timedelta(minutes=15)
delta_start=datetime.timedelta(days=1)
delta_end=datetime.timedelta(minutes=30)

#Dummies Data
a=1
delivery_array=[0]*a
production_array=[0]*a
time_remaining_array=[0]*a
VWAP_array=np.zeros(a)
quantity_array=np.zeros(a)

#Start Delivery time loop
while (dt <= end_date):

#Production Time Loop:
#Start Production: 1 Day before delivery 15:00 (3:00 PM), End Production 30 mins before delivery
prod_time=(dt-delta_start).replace(hour=15)
end_prod=dt-delta_end

while (prod_time<=end_prod):

quantity=df[(df['StartOfDelivery']==dt)& (df['ProdDateTime']>=prod_time) & (df['ProdDateTime']<(prod_time+incr_production_loop))].QuantityMW.sum()
if (quantity==0):
VWAP=0
else:
#Calculate Volume Weighted Average Price
pq_total=df[(df['StartOfDelivery']==dt)& (df['ProdDateTime']>=prod_time) & (df['ProdDateTime']<(prod_time+incr_production_loop))]['p*Q'].sum()
VWAP=pq_total/quantity

#Save values to arrays
VWAP_array=np.append(VWAP_array,VWAP)
quantity_array=np.append(quantity_array,quantity)
delivery_array.append(dt)
production_array.append(prod_time)

#Increments
prod_time=prod_time+incr_production_loop

dt=dt+incr_delivery_loop
#END LOOPS

#Save to Dataframe
WAP_dict={'TimeOfDelivery':delivery_array,
'ProductionDateTime':production_array,
'VWAP':VWAP_array,
'Quantity':quantity_array,}
df_WAP=pd.DataFrame(WAP_dict)
df_WAP=df_WAP[['TimeOfDelivery','ProductionDateTime','Quantity','VWAP']]


#Output
print(df_WAP.head(50))

Python 3.4、Windows 10、Eclipse IDE

最佳答案

欢迎使用Python! Profiling您的代码将是一个很好的起点:)

也就是说,随着数据集的增长,每次调用:

df['some_column']==some_variable

变得更贵。如果您在处理 2 天的数据时性能良好,但在扩展到 6 个月时性能下降,这可能是罪魁祸首。

尝试通过在 SQL 查询末尾添加 order by StartOfDelivery 来对数据进行预排序。然后将数据帧拆分为数据帧列表,其中每个子帧仅包含循环体内所需的 15 分钟增量的记录。

然后您可以将该列表作为主循环进行迭代,而不是:

while (dt <= end_date):

这应该消除所有数据帧过滤,并使您的执行时间随数据集大小呈线性缩放。

关于python - 通过从 SQL DB 导入的 pd 数据帧的子集提高循环性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45237670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com