Изменение частоты панд на элемент, отличный от времени - PullRequest
0 голосов
/ 11 декабря 2019

В частности, у меня есть временной ряд заболеваний, проходящих через популяцию лошадей. Я хочу создать частоту, основанную не на времени, а на случаях, чтобы df поддерживал свой текущий порядок, но перечислял 1000 случаев для каждой записи. Если запись слишком высокая, она создаст новую строку, а если слишком низкую, она объединится со следующей строкой, усредняя входные данные на основе составных номеров случаев, чтобы я мог получить гетероскедастичность из данных. Я понимаю, что мог бы сделать это с помощью массивного цикла, но мне интересно, есть ли какие-либо менее сложные в вычислительном отношении методы применения, которые я могу использовать для выполнения той же задачи. Таким образом, в приведенном ниже примере время 0 создаст четыре новые строки, последняя из которых, имеющая 699 записей, слится с 230 из времени 1 плюс 71 из времени 2, усредняя их серьезность и состояния по количеству входных случаев.

Time    Severity   Cases   States  
0        4       3699      39  
1        7       230       15  
2        2       1300      27  
3        3       740       13  
4        2       3000      23

Ответы [ 2 ]

1 голос
/ 11 декабря 2019

IIUC, это должно сделать:

# this will blows up your dataframe by `Cases`, 
# so be aware if you have lengthy data
new_df = (df.loc[df.index.repeat(df.Cases)]    
            .assign(Cases=1,
                    groups=lambda x: np.arange(len(x))//1000
                   )
            .groupby('groups')
            .agg({'Time':'first',
                  'Cases':'sum',
                  'Severity':'mean',
                  'States':'mean'})
         )

Вывод:

        Time  Cases  Severity  States
groups                               
0          0   1000     4.000  39.000
1          0   1000     4.000  39.000
2          0   1000     4.000  39.000
3          0   1000     4.548  32.628
4          2   1000     2.000  27.000
5          2   1000     2.740  16.516
6          4   1000     2.000  23.000
7          4   1000     2.000  23.000
8          4    969     2.000  23.000
0 голосов
/ 12 декабря 2019

Для тех, кто в будущем найдет этот вопрос. Из того, что я могу сказать, нет применения, которое изменит TS. Ответ Куанга прекрасно работает, однако, как он указал, он действительно работает только с маленькими TS, в противном случае все происходит из-за ограничений памяти. Есть два решения, чтобы обойти это, во-первых, создать df, запустить вышеуказанный скрипт в долях всего TS и добавить результаты в новый df. Другой вариант, так как он не похож на патоку и не так сильно портит память, - вместо этого делать циклы в Cython. Вы можете найти пример кода Cython Loops здесь: https://github.com/Jackal08/financial-data-structures/blob/master/cython_loops.c

...