numpy 在pandas中使用滚动的滑动窗口迭代器

dzhpxtsq  于 2024-01-08  发布在  其他
关注(0)|答案(3)|浏览(167)

如果是单行,我可以得到如下迭代器

  1. import pandas as pd
  2. import numpy as np
  3. a = np.zeros((100,40))
  4. X = pd.DataFrame(a)
  5. for index, row in X.iterrows():
  6. print index
  7. print row

字符串
现在我希望每个迭代器都返回一个子集X[0:9, :]X[5:14, :]X[10:19, :]等。我如何通过rolling(pandas.DataFrame.rolling)实现这一点?

2j4z5cfb

2j4z5cfb1#

我将用下面的框架进行实验。

设置

  1. import pandas as pd
  2. import numpy as np
  3. from string import uppercase
  4. def generic_portfolio_df(start, end, freq, num_port, num_sec, seed=314):
  5. np.random.seed(seed)
  6. portfolios = pd.Index(['Portfolio {}'.format(i) for i in uppercase[:num_port]],
  7. name='Portfolio')
  8. securities = ['s{:02d}'.format(i) for i in range(num_sec)]
  9. dates = pd.date_range(start, end, freq=freq)
  10. return pd.DataFrame(np.random.rand(len(dates) * num_sec, num_port),
  11. index=pd.MultiIndex.from_product([dates, securities],
  12. names=['Date', 'Id']),
  13. columns=portfolios
  14. ).groupby(level=0).apply(lambda x: x / x.sum())
  15. df = generic_portfolio_df('2014-12-31', '2015-05-30', 'BM', 3, 5)
  16. df.head(10)

字符串


的数据
我现在将介绍一个函数,它滚动多个行,并将它们连接成一个单独的嵌套框架,在这个嵌套框架中,我将向列索引添加一个顶层,以指示滚动中的位置。

解决方案第一步

  1. def rolled(df, n):
  2. k = range(df.columns.nlevels)
  3. _k = [i - len(k) for i in k]
  4. myroll = pd.concat([df.shift(i).stack(level=k) for i in range(n)],
  5. axis=1, keys=range(n)).unstack(level=_k)
  6. return [(i, row.unstack(0)) for i, row in myroll.iterrows()]


虽然它隐藏在函数中,但myroll看起来像这样:



现在我们可以像迭代器一样使用它。

解决方案第二步

  1. for i, roll in rolled(df.head(5), 3):
  2. print roll
  3. print
  4. 0 1 2
  5. Portfolio
  6. Portfolio A 0.326164 NaN NaN
  7. Portfolio B 0.201597 NaN NaN
  8. Portfolio C 0.085340 NaN NaN
  9. 0 1 2
  10. Portfolio
  11. Portfolio A 0.278614 0.326164 NaN
  12. Portfolio B 0.314448 0.201597 NaN
  13. Portfolio C 0.266392 0.085340 NaN
  14. 0 1 2
  15. Portfolio
  16. Portfolio A 0.258958 0.278614 0.326164
  17. Portfolio B 0.089224 0.314448 0.201597
  18. Portfolio C 0.293570 0.266392 0.085340
  19. 0 1 2
  20. Portfolio
  21. Portfolio A 0.092760 0.258958 0.278614
  22. Portfolio B 0.262511 0.089224 0.314448
  23. Portfolio C 0.084208 0.293570 0.266392
  24. 0 1 2
  25. Portfolio
  26. Portfolio A 0.043503 0.092760 0.258958
  27. Portfolio B 0.132221 0.262511 0.089224
  28. Portfolio C 0.270490 0.084208 0.293570

展开查看全部
ev7lccsx

ev7lccsx2#

它可以用rolling完成,但效率很低(由于迭代所有窗口),需要Pandas 1.1

  1. for index, row in enumerate(list(X.rolling(10))[::5]):

字符串
更快(C中的迭代)

  1. from itertools import islice
  2. for index, row in enumerate(islice(X.rolling(10), None, None, 5)):

gblwokeq

gblwokeq3#

滚动不是这样工作的,它“提供滚动转换”(来自the docs)。
你可以循环并使用pandas索引吗?

  1. for i in range((X.shape[0] + 9) // 10):
  2. X_subset = X.iloc[i * 10: (i + 1) * 10]

字符串

相关问题