Ответы пользователя по тегу Python
  • VS + Python + кириллица, ошибка в консоли, как решить?

    @Roman_Kh
    Конструкция # -*- coding: cp1251 -*- указывает кодировку самого файла с кодом программы. Поэтому все строки в тексте будут сохранены в кодировке 1251, и если вы выводите в консоль с кодировкой 1251, то все напечатается нормально. Однако если кодировка консоли будет 866 или Unicode, то вместо кириллицы вы получите кракозябры.

    Проблема python'а заключается в том, что разные команды/функции почему-то по-разному кодируют/раскодируют строки.
    Чтобы с этим справиться, лучше все строки кодировать в Unicode и выводить в Unicode консоль. И использовать только команды с понятным поведением, например, print. Иначе рано или поздно вы снова столкнетесь с кракозябрами.
    Ответ написан
  • Как в pandas cгруппировать DataFrame по n значений?

    @Roman_Kh
    Добавьте в DataFrame еще один столбец, в котором для первых 100 строк будет стоять значение 1, для следующих 100 - 2 и так далее. А зате сделайте groupby по этому столбцу.
    Ответ написан
    Комментировать
  • Как работать с бинарными данными?

    @Roman_Kh
    Комментировать
  • Есть ли аналог модуля shelve, который работает как список, а не как словарь?

    @Roman_Kh
    Тут все сильно зависит от того, что именно вы храните в этом списке, поэтому приведу несколько вариантов.

    1. numpy позволяет создавать типизированные массивы и хранит их в памяти, но в весьма компактном виде (объем порой в разы меньше, чем у обычного python'овского списка) и представляет очень богатые возможности по обработке данных.

    2. pandas, используя numpy, умеет создавать структурированные массивы (датафреймы), похожие на таблицы баз данных, и предоставляет развитый функционал по выборке и обработке этих данных.

    3. pytables позволяет сохранить numpy-массивы или pandas-датафреймы на диск в виде файлов в формате HDF5, обеспечивая быстрый доступ к данным и опять же удобный функционал по поиску/выборке данных.
    Скорее всего на ваших объемах данных pandas+HDF5 будет в разы/десятки раз быстрее любой СУБД.

    4. bcolz позволяет сжать данные, а также хранить их не только в памяти, но и на диске.
    При этом операции с данными производится очень быстро, иногда даже быстрее чем с несжатым списками.

    Вообще, спископодобные данные гораздо быстрее обрабатывать с помощью векторных операций в numpy и pandas. Но если вам все-таки нужны именно циклы, то также рекомендую обратить внимание на numba, с помощью которой можно в десятки-сотни раз ускорить python'овские циклы.
    Ответ написан
    Комментировать
  • Как сделать random с неравномерным распределением в Python?

    @Roman_Kh
    Сначала определите предельно конкретно, что означает "в начале вероятность выше, чем в конце".
    После чего сможете написать свою функцию распределения. Например, в вашем списке 4 элемента и вероятности распределены так: 60, 25, 12, 3, то есть 60% - для 1-го элемента, 25% - для 2-го и так далее.
    Тогда
    your_data_list = [...]
    probabilities_list=[60, 85, 97, 100]
    rnd = random.uniform(1, 100)
    idx = -1
    idx_found = False
    while idx < len(probabilities_list) and not idx_found:
      idx += 1
      idx_found = rnd <= probabilities_list[idx]
    your_random = your_data_list[idx]

    Однако, это очень медленный способ (и к тому же не лишенный некоторых проблем).

    Можно сделать быстрее и короче с помощью модуля bisect:
    idx = bisect.bisect_right(probabilities_list, rnd)
    Этот вариант будет заметно быстрее (иногда, правда, на 20%, но иногда и в 3.5 раза).

    Но правильнее всего использовать numpy:
    numpy.random.choice(your_data_list, size=N, p=prb_list)

    Это будет раз в 10 быстрее.
    При этом prb_list должен содержать именно вероятности появления каждого элемента, т.е. для вышеприведенного примера [0.6, 0.25, 0.12, 0.03]
    Ответ написан
    1 комментарий