【问题标题】:Pandas: How can you calculate rolling metrics (mean, standard deviation, z score, etc.) when using itertuples?Pandas:使用 itertuples 时如何计算滚动指标(均值、标准差、z 分数等)?
【发布时间】:2021-01-07 04:00:03
【问题描述】:

我正在尝试计算金融时间序列数据的滚动指标。我想使用循环方法来模拟对实时数据的测试。

在 itertuples 循环中计算这些滚动指标的最有效方法是什么?

示例数据:

DateTime                 Bid                                              
2006-01-03 00:01:07.588  0.85208       
2006-01-03 00:01:08.654  0.85213       
2006-01-03 00:01:08.859  0.85212       
2006-01-03 00:01:11.472  0.85215       
2006-01-03 00:01:12.002  0.85218  
...                          ...  
2020-03-15 23:59:57.150  0.85178  
2020-03-15 23:59:57.300  0.85179  
2020-03-15 23:59:58.233  0.85179  
2020-03-15 23:59:58.366  0.85178  
2020-03-15 23:59:58.595  0.85179  

到目前为止我的代码。

df = pd.read_hdf(r"F:\Market Data\2020.3.15 FXAUDCAD-TICK-NoSession.h5")
df = df.set_index(pd.DatetimeIndex(df['DateTime']))
df = df.drop(columns=['DateTime'])

Rolling_Metric = []

for row in df.itertuples():
     ?

【问题讨论】:

  • 你的实时数据是怎么来的?计算窗口的常用方法是df.shift(),而不是生成器或逐行计算。另见:stackoverflow.com/questions/48084356/…
  • @ChrisTang 数据来自一个 API,该 API 返回一个数据窗口或相当于上面找到的“示例数据”中的单行。
  • 我想确认API的新数据,无论是窗口形式还是单行形式,是否在您收集的时间索引之后?
  • @ChrisTang 是的,数据将按时间顺序排列,每个新数据点在前一个点之后的一段时间内下降。
  • 只是为了澄清:你不能使用DataFrame.rolling

标签: python pandas loops time-series rolling-computation


【解决方案1】:

我认为 pandas 不适合这个问题。
如果你有api之类的数据生成源,这里用生成器模拟

import numpy as np
def gen():
    while True:
        yield np.random.rand((np.random.randint(1,10)))

输出不同大小的数据数组

for i in islice(gen(), 4):
    print(i)

输出

[0.1591485]
[0.40462191 0.32921298 0.64704824 0.9433797  0.44754502 0.47600713
 0.66130654]
[0.45582976 0.37764161 0.47205139 0.32354448 0.06795233 0.47943393
 0.13395702]
[0.0967848]

您可以计算滚动测量,例如使用 10 个样本的窗口

import time
from itertools import islice

data = np.array([])
for new_data in islice(gen(), 5):              # get data
    for elem in new_data:                      # iterate through new data
        data = np.concatenate((data, [elem]))  # add new data row by row
        print(data[-10:].mean())               # get mean of last 10 observations
    time.sleep(.5)

输出

0.8251054981003462
0.5154331864262989
0.5677470477572374
0.6084844147856047
0.6532425615231122
0.6663683916931894
0.6768810511903373
0.6098697771903554
0.5976415974047367
0.5442112622703545
0.556721858529291
0.5851107975154073
0.6129548571751687
0.5519507890295304
0.47809901125252807
0.457599927037135
0.47739535574047764
0.5135494376774083
0.5620825459637069
0.5914086396034781
0.5554789093102113
0.6042456773490161
0.5860524867501515
0.6218627945520632
0.6509948271807725
0.6693775700674035
0.6657165569407465
0.6825455302579173
0.609296884720923
0.6708821735456445

【讨论】:

    猜你喜欢
    • 2018-07-20
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 2021-09-23
    • 2019-08-15
    • 2021-05-08
    相关资源
    最近更新 更多