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

标签 python pandas loops

我有一个节点列表(大约 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/

相关文章:

python - 将 DataFrame 导出和导入到 Access 文件 (.mdb)

r - 根据以前的评级创建顺序排名

Javascript for循环,里面有计数器?

python - Selenium Python 改变 IP

python - Numpy 根据另一个数组的值分配一个数组值,并根据向量选择列

python - pandas:通过将两列数据框与元组列表进行比较来获取行

python - 使用 pandas 高效读取大型 CSV 文件而不会崩溃

c# - 运行C#几分钟后计时器错误

python - 带有 Flask 的 Google Cloud Endpoints API

python - Pandas 数据框中的循环依赖