корреляция окон с использованием группового и скользящего в Pandas - PullRequest
0 голосов
/ 03 марта 2020

Я хочу рассчитать скользящую корреляцию сгруппированных данных. Как я могу сделать это в Pandas? Я создал фиктивные данные и сделал это с PySpark ниже, используя SQL

import pandas as pd
import numpy as np
from datetime import datetime, timedelta

my_array = np.random.random(90).reshape(-1, 3)
groups = np.array(['a', 'b', 'c']).reshape(-1,1)
groups = np.repeat(groups, 10).reshape(-1, 1)
my_array = np.append(my_array, groups, axis = 1)
df = pd.DataFrame(my_array, columns = list('abcd'))
df['date'] = pd.to_datetime([datetime.today() + timedelta(i) for i in range(30)])

spark.createDataFrame(df).createOrReplaceTempView('df_tbl')
spark.sql("""
   select *, 
     corr(a,b) over (partition by d order by date rows between 8 preceding and current row) as cor1,
     corr(a,b) over (partition by d order by date rows between 8 preceding and current row) as cor2
   from df_tbl
  """).toPandas().head(10)

1 Ответ

0 голосов
/ 03 марта 2020

Используйте date в качестве индекса и применяйте функцию скользящей группировки для расчета corr на a и b. Позже reset_index to преобразует индексы в столбцы, поскольку будет трудно получить метку времени как index. Вот так

df.set_index('date', inplace=True)
result = df.groupby(['d'])[['a','b']].rolling(8).corr()
result.reset_index(inplace=True)

Вывод будет выглядеть так:

    d   date                    level_2 a   b
0   a   2020-03-03 21:21:29.512854  a   NaN NaN
1   a   2020-03-03 21:21:29.512854  b   NaN NaN
2   a   2020-03-04 21:21:29.512866  a   NaN NaN
3   a   2020-03-04 21:21:29.512866  b   NaN NaN
4   a   2020-03-05 21:21:29.512869  a   NaN NaN
5   a   2020-03-05 21:21:29.512869  b   NaN NaN
6   a   2020-03-06 21:21:29.512871  a   NaN NaN
7   a   2020-03-06 21:21:29.512871  b   NaN NaN
8   a   2020-03-07 21:21:29.512872  a   NaN NaN
9   a   2020-03-07 21:21:29.512872  b   NaN NaN
10  a   2020-03-08 21:21:29.512874  a   NaN NaN
11  a   2020-03-08 21:21:29.512874  b   NaN NaN
12  a   2020-03-09 21:21:29.512876  a   NaN NaN
13  a   2020-03-09 21:21:29.512876  b   NaN NaN
14  a   2020-03-10 21:21:29.512878  a   1.000000    -0.166854
15  a   2020-03-10 21:21:29.512878  b   -0.166854   1.000000
16  a   2020-03-11 21:21:29.512880  a   1.000000    -0.095549
17  a   2020-03-11 21:21:29.512880  b   -0.095549   1.000000
...
...
...