gpt4 book ai didi

python - 在 Pandas 中获得滚动平均值的最快方法?

转载 作者:太空宇宙 更新时间:2023-11-04 04:56:30 25 4
gpt4 key购买 nike

我有一个节点列表(大约 2300 个节点),这些节点具有大约一年的每小时价格数据。我有一个脚本,对于每个节点,循环遍历一天中的时间以创建 4 小时的追踪平均值,然后按月和小时对平均值进行分组。最后,对一个月中的这些小时数进行平均,得出每个月典型的一天的价格。我想知道是否有更快的方法来执行此操作,因为我所拥有的似乎花费了大量时间(大约一个小时)。我还将数据帧保存为 csv 文件以供以后可视化(这不是缓慢的部分)。

df (before anything is done to it)
Price_Node_Name Local_Datetime_HourEnding Price Irrelevant_column

0 My-node 2016-08-17 01:00:00 20.95 EST
1 My-node 2016-08-17 02:00:00 21.45 EST
2 My-node 2016-08-17 03:00:00 25.60 EST

df_node (after the groupby as it looks going to csv)
Month Hour MA
1 0 23.55
1 1 23.45
1 2 21.63


for node in node_names:
df_node = df[df['Price_Node_Name'] == node]
df_node['MA'] = df_node['Price'].rolling(4).mean()
df_node = df_node.groupby([df_node['Local_Datetime_HourEnding'].dt.month,
df_node['Local_Datetime_HourEnding'].dt.hour]).mean()
df_node.to_csv('%s_rollingavg.csv' % node)

我收到一个有关 SetWithCopy 的弱错误警告,但我还没有完全弄清楚如何在此处使用 .loc,因为列 ['MA'] 在我在此代码段中以任何方式创建它之前不存在可以考虑事先创建它并填充它似乎比我拥有的慢。虽然可能是完全错误的。任何帮助都会很棒。

python 3.6

最佳答案

编辑:我可能误解了这里的问题,希望这至少能激发一些解决方案的想法。

我认为在 Pandas 中处理时间序列数据时,将索引作为日期时间列很有用。

这是一些示例数据:

Out[3]:
price
date
2015-01-14 00:00:00 155.427361
2015-01-14 01:00:00 205.285202
2015-01-14 02:00:00 205.305021
2015-01-14 03:00:00 195.000000
2015-01-14 04:00:00 213.102000
2015-01-14 05:00:00 214.500000
2015-01-14 06:00:00 222.544375
2015-01-14 07:00:00 227.090251
2015-01-14 08:00:00 227.700000
2015-01-14 09:00:00 243.456190

我们使用 Series.rolling 创建一个 MA 列,即我们将该方法应用于 price 列,具有两个周期窗口,并调用 mean 在生成的 rolling 对象上:

In [4]: df['MA'] = df.price.rolling(window=2).mean()

In [5]: df
Out[5]:
price MA
date
2015-01-14 00:00:00 155.427361 NaN
2015-01-14 01:00:00 205.285202 180.356281
2015-01-14 02:00:00 205.305021 205.295111
2015-01-14 03:00:00 195.000000 200.152510
2015-01-14 04:00:00 213.102000 204.051000
2015-01-14 05:00:00 214.500000 213.801000
2015-01-14 06:00:00 222.544375 218.522187
2015-01-14 07:00:00 227.090251 224.817313
2015-01-14 08:00:00 227.700000 227.395125
2015-01-14 09:00:00 243.456190 235.578095

如果你想要 monthhour 列,可以从索引中提取它们:

In [7]: df['month'] = df.index.month  

In [8]: df['hour'] = df.index.hour

In [9]: df
Out[9]:
price MA month hour
date
2015-01-14 00:00:00 155.427361 NaN 1 0
2015-01-14 01:00:00 205.285202 180.356281 1 1
2015-01-14 02:00:00 205.305021 205.295111 1 2
2015-01-14 03:00:00 195.000000 200.152510 1 3
2015-01-14 04:00:00 213.102000 204.051000 1 4
2015-01-14 05:00:00 214.500000 213.801000 1 5
2015-01-14 06:00:00 222.544375 218.522187 1 6
2015-01-14 07:00:00 227.090251 224.817313 1 7
2015-01-14 08:00:00 227.700000 227.395125 1 8
2015-01-14 09:00:00 243.456190 235.578095 1 9

然后我们可以使用groupby:

In [11]: df.groupby([
...: df['month'],
...: df['hour']
...: ]).mean()[['MA']]
Out[11]:
MA
month hour
1 0 NaN
1 180.356281
2 205.295111
3 200.152510
4 204.051000
5 213.801000
6 218.522187
7 224.817313
8 227.395125
9 235.578095

关于python - 在 Pandas 中获得滚动平均值的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46921311/

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