DataFrame: как найти значение в одном столбце для квантиля во втором столбце

Модель Threading в UI

Пожалуйста, прочитайте Threading Model в приложениях пользовательского интерфейса, чтобы понять основные понятия. Ссылка перемещается на страницу, описывающую модель потоков WPF. Тем не менее, Windows Forms использует ту же идею.

Пользовательский интерфейс

  • Существует только один поток (поток пользовательского интерфейса), которому разрешен доступ к System.Windows .Forms.Control и его подклассы.
  • Попытайтесь получить доступ к члену System.Windows.Forms.Control из другого потока, кроме потока пользовательского интерфейса, вызовет перекрестный поток Исключение.
  • Поскольку существует только один поток, все операции пользовательского интерфейса помещаются в качестве рабочих элементов в этот поток:

enter image description here [/g22]

  • Если для потока пользовательского интерфейса нет работы, тогда существуют промежутки времени ожидания, которые могут использоваться вычислениями, не связанными с UI.
  • Для использования указанных недостатков используйте System .Windows.Forms.Control.Invoke или System.Windows.Forms.Control.BeginInvoke :

enter image description here [/g23]

Методы BeginInvoke и Invoke

  • Вычисление вычислительных ресурсов вызываемого метода должно быть небольшим, а также вычислить накладные расходы на методы обработчика событий, поскольку U Здесь используется поток I - тот же самый, который отвечает за обработку ввода пользователя. Независимо от того, является ли это System.Windows.Forms.Control.Invoke или System.Windows.Forms.Control.BeginInvoke .
  • Для выполнения вычисления дорогостоящей операции всегда используйте отдельный поток. Поскольку .NET 2.0 BackgroundWorker предназначен для выполнения дорогостоящих операций в Windows Forms. Однако в новых решениях вы должны использовать шаблон async-await, описанный здесь здесь .
  • Используйте System.Windows.Forms.Control.Invoke или System.Windows.Forms.Control.BeginInvoke только для обновления пользовательского интерфейса. Если вы используете их для тяжелых вычислений, ваше приложение заблокирует:

enter image description here [/g24]

Вызвать

enter image description here [/g25]

BeginInvoke

enter image description here [/g26]

Решение для кода

Прочитать ответы на вопрос Как обновить графический интерфейс из другого потока в C #? . Для C # 5.0 и .NET 4.5 рекомендуемым решением является здесь .

2
задан CestLaGalere 6 March 2019 в 11:58
поделиться

1 ответ

Это сработало для меня:

df['count'] = df['count'].astype(int)
quantiles = [.25, .5, .75]

def get_offset(x):
    s = x['count']
    indices = [(s.sort_values()[::-1] <= s.quantile(q)).idxmax() for q in quantiles]
    return df.iloc[indices, x.columns.get_loc('offset')]

res = df.groupby('obs_date').apply(get_offset).reset_index(level=0)

Тогда вы можете concat с квантилями:

pd.concat([res.reset_index(drop=True), pd.Series(quantiles * df.obs_date.nunique())], axis=1)

    obs_date    offset  0
0   2018-01-01  178     0.25
1   2018-01-01  208     0.50
2   2018-01-01  224     0.75
3   2018-01-02  11      0.25
4   2018-01-02  12      0.50
5   2018-01-02  20      0.75
0
ответ дан Josh Friedlander 6 March 2019 в 11:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: