Заполнить столбец в фрейме данных panda результатом groupby

Я очень новичок в пандах и не могу решить эту проблему самостоятельно. У меня есть цены на фреймворк данных, а вот цены.tail(5):

теперь я запускаю этот код:

prices['dollar_vol'] = (prices
                    .groupby('ticker',
                             group_keys=False,
                             as_index=False)
                    .dollar_vol
                    .rolling(window=21)
                    .mean()
                    .fillna(0)
                    .reset_index(level=0, drop=True))

и теперь доллар_vol заполнен NaN. вот цены.хвост(5)

Я работаю в Google Colab. Он работал правильно месяц назад и внезапно перестал работать. Пожалуйста помоги.

распечатайте свои prices.groupby()... штучки, и вы увидите, что данные имеют другой индекс, чем prices

Quang Hoang 11.12.2020 19:39

Я сделал это, и для индекса price.groupby() это только тикер. Не тикер, а дата. Так как бы вы предложили мне исправить это?

user1272913 11.12.2020 19:48
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
93
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Убедитесь, что ваш prices отсортирован с помощью ticker, а затем date с

prices.sort_index(inplace=True)

И затем вы можете передать базовый массив numpy:

prices['dollar_vol'] = (prices
                    .groupby('ticker')         # no need for other stuff
                    .dollar_vol
                    .rolling(window=21)
                    .mean()
                    .fillna(0)
                    .to_numpy() )              # the numpy array           

Другой способ — использовать transform без необходимости сортировки:

prices['dollar_vol'] = (prices
                        .groupby('ticker')         # no need for other stuff
                        .dollar_vol
                        .transform( lambda x: x.rolling(window=21)
                                               .mean().fillna(0)
                                   )
                        )

Спасибо, это решило проблему. Не могли бы вы объяснить, почему? Или укажите мне на материал, чтобы я мог лучше понять проблему. Спасибо.

user1272913 11.12.2020 20:00

Если вы передадите серию для назначения серии/столбца, Pandas выровняет индекс. Таким образом, данные серии могут быть переупорядочены/удалены/добавлены, когда два индекса не выровнены. Если вы передаете список/np.array, необработанные данные передаются в этом порядке. Вот почему вам нужно убедиться, что данные указаны в правильном порядке.

Quang Hoang 11.12.2020 20:02

@user1272913 user1272913 также смотрите обновленный ответ для другого варианта. Обратите внимание, что transform на лямбда-функции немного медленнее, чем предыдущий подход.

Quang Hoang 11.12.2020 20:05

Другие вопросы по теме