Хотя ответ Чанга объясняет, как много раз рисовать на одном рисунке, в этом случае вам может быть лучше в этом случае с помощью groupby
и unstack
ing:
(Предположим, что у вас есть это в dataframe, с индексом datetime уже)
In [1]: df
Out[1]:
value
datetime
2010-01-01 1
2010-02-01 1
2009-01-01 1
# create additional month and year columns for convenience
df['Month'] = map(lambda x: x.month, df.index)
df['Year'] = map(lambda x: x.year, df.index)
In [5]: df.groupby(['Month','Year']).mean().unstack()
Out[5]:
value
Year 2009 2010
Month
1 1 1
2 NaN 1
Теперь легко построить (каждый год как отдельная строка):
df.groupby(['Month','Year']).mean().unstack().plot()
Python использует случайное хэш-семя, чтобы предотвратить атакующие из tar-pitting вашего приложения, отправив вам ключи, предназначенные для столкновения. См. Раскрытие оригинальной уязвимости . Смещая хэш с случайным семенем (установленным один раз при запуске), злоумышленники больше не могут предсказать, какие клавиши будут сталкиваться.
Вы можете установить фиксированное семя или отключить эту функцию, установив PYTHONHASHSEED
переменная среды ; по умолчанию это random
, но вы можете установить его на фиксированное положительное целочисленное значение, при этом 0
полностью отключит эту функцию.
В версиях версии 2.7 и 3.2 Python функция отключена по умолчанию (используйте -R
или установите PYTHONHASHSEED=random
, чтобы включить его); он включен по умолчанию в Python 3.3 и выше.
Если вы полагались на порядок ключей в словаре Python или устанавливали, то не делайте этого. Python использует хеш-таблицу для реализации этих типов, и их порядок зависит от истории вставки и удаления , а также от случайного хэш-семени.
Также см. object.__hash__()
специальная документация метода :
Примечание. По умолчанию значения
blockquote>__hash__()
объектов str, bytes и datetime «соленые» с непредсказуемым случайным значением. Хотя они остаются постоянными в рамках отдельного процесса Python, они не предсказуемы между повторными вызовами Python. Это предназначено для обеспечения защиты от отказа в обслуживании, вызванного тщательно подобранными входами, которые используют наихудшую производительность при вложении dict, сложность O (n ^ 2). Подробнее см. В http://www.ocert.org/advisories/ocert-2011-003.html . Изменение значений хеша влияет на порядок итераций dicts, множеств и других сопоставлений. Python никогда не предоставлял гарантии об этом заказе (и обычно он варьируется между 32-битными и 64-битными сборками). См. ТакжеPYTHONHASHSEED
.Если вам нужна стабильная реализация хэша, вы, вероятно, захотите посмотреть на модуль
hashlib
; это реализует криптографические хэш-функции. Проект pybloom использует этот подход .Поскольку смещение состоит из префикса и суффикса (начальное значение и конечное значение XORed, соответственно), вы не можете просто сохранить смещение, к сожалению. С положительной стороны это означает, что злоумышленники не могут легко определить смещение с тактическими атак.
hash () является встроенной функцией Python и использует ее для вычисления хэш-значения для объекта, а не для строки или номера.
Вы можете увидеть детали на этой странице: https : //docs.python.org/3.3/library/functions.html#hash .
и hash () исходят из метода __hash__ объекта. Документ говорит следующее:
По умолчанию значения hash () объектов str, bytes и datetime «соленые» с непредсказуемым случайным значением. Хотя они остаются постоянными в рамках отдельного процесса Python, они не предсказуемы между повторными вызовами Python.
blockquote>Вот почему у вас есть четкое хэш-значение для той же строки в другой консоли.
То, что вы реализуете, не очень хорошо.
Когда вы хотите вычислить значение хеш-строки, просто используйте hashlib
hash () is чтобы получить значение хеш-объекта, а не стимул.
hash()
отлично подходит для строковых или числовых значений. Вы смешиваете это с пользовательским методом __hash__
, используя на hash()
, чтобы обеспечить пользовательскую реализацию хэш-значения.
– Martijn Pieters♦
17 December 2014 в 11:05
Хеш-рандомизация включена по умолчанию в Python 3 . Это функция безопасности:
Хэш-рандомизация предназначена для обеспечения защиты от отказа в обслуживании, вызванного тщательно подобранными входами, которые используют наихудшую производительность конструкции dict
blockquote>В предыдущих версиях 2.6.8 вы можете включить его в командной строке с параметром -R или PYTHONHASHSEED .
Вы можете выключите его, установив
PYTHONHASHSEED
в ноль.
disable
при установке его на 0? Я не вижу эффективной разницы, чтобы установить его на любое старое стабильное число семян, если только я чего-то не упускаю. Я имею в виду, когда я используюPYTHONHASHSEED=12345
, я получаю один и тот же хэш для равных строк даже в сеансах - то же самое происходит, когда я используюPYTHONHASHSEED=0
- хэш для равных строк будет одинаковым во всех сеансах (хотя и отличается от 12345, но это очевидно, вот как работают семена). – blubberdiblub 13 April 2017 в 16:570
нет никакого семени, а хеши для объектов равны тем, которые сгенерированы в старой версии Python без поддержки hashseed. – Martijn Pieters♦ 13 April 2017 в 17:59