Решение: используйте любой из следующих столбцов, чтобы получить точную повторную выборку:
df['4ma'] = df.resample('4T', base=2).mean().shift(1)
df['7ma'] = df.resample('7T', base=3).mean().shift(1)
df['8ma'] = df.resample('8T', base=2).mean().shift(1)
df['9ma'] = df.resample('9T', base=1).mean().shift(1)
Следующий поток GitHub предлагает использовать «base = x» для решения этой проблемы в Pandas: https: / /github.com/pandas-dev/pandas/issues/4197
По сути, при понижающей дискретизации в Pandas с мелкими данными, Pandas пытается «вывести» различные начальные точки. Изменение базы меняет место, где начинается выборка.
Я не понимаю логику предполагаемой особенности Pandas, но настройка базы решает эту проблему.
Я предпочитаю броски as
в большинстве случаев, потому что обычно, если тип объекта является неправильным, который указывает на ошибку. Ошибки должны вызвать исключения IMO - и InvalidCastException
в точно строке, которая выполняет бросок, намного более ясно, чем a NullReferenceException
намного позже в коде.
as
должен использоваться, когда это допустимо и законно быть переданным ссылка на объект типа, который Вы не хотите. Та ситуация подходит, но не так часто как нормальный кастинг, по моему опыту.
Сравнение использования типов GetType()
, однако, очень редко правильное решение - только уместно, когда Вы хотите проверить на точный включенный тип, а не совместимый тип.
Я записал значительно более длинный ответ о "броске по сравнению с как" обсуждение в другом месте.
Вообще говоря, эти два отрывка не эквивалентны. TreeViewItem i = sender as TreeViewItem
приведет к корректному результату даже если sender
главный главный ребенок TreeViewItem
, тогда как sender.GetType() == typeof(TreeViewItem)
будет true
только, когда sender
точно TreeViewItem
и ни один из его возможных подклассов.
Нисколько - это дает Вам шанс проверить, что преобразование (бросок) было сделано хорошо. Если Вы делаете
TreeViewItem i = (TreeViewItem) sender;
Вы могли бы получить исключение, если состав исполнителей перестал работать.
"как": хороший материал. используйте все это время.
если Вы действительно хотите альтернативу ручному сравнению попытки типов:
if(person is Employee) { }
чтения еще лучше.
Ваш пример был бы лучше записан как:
if (sender is TreeViewItem) {
TreeViewItem i = (TreeViewItem)sender;
...
}
Это - точно этот двойной тип, проверяющий что as
оператор может помочь избежать. Таким образом для Вашего приведенного примера, я сказал бы, что это - определенно хорошее решение.
Однако существуют ситуации, где Вы действительно хотите бросок. Если Вы ожидаете a TreeViewItem
и не хочу ничто иное, кастинг удостоверится InvalidCastException
брошен, если Вам дают что-либо еще.
Точно так же, как в большинстве ситуаций, здесь нет никакой всеохватывающей нормы: используйте правильный инструмент для правильного задания.
Если Вы захотите плоскость (не nullable) тип значения, то очевидно, это не будет работать, например:
int test = sender as int;
не допустимо, однако:
int? test = sender as int?;
позволяется.
Нет, я использую его вполне немного. Это позволяет Вам избегать InvalidCastException
s в очевидном способе.
Например:
TreeViewItem tvItem = sender as TreeViewItem;
if (tvItem != null) return;
// Do stuff
в противоположность:
try
{
TreeViewItem tvItem = (TreeViewItem)sender;
// Do stuff.
}
catch (InvalidCastException ex)
{
// Didn't work, do something about it
return; // ... or not...
}
"как" быстрее, но вещи принять во внимание:
"как" возвращает пустой указатель вместо того, чтобы выдать исключение, если это - проблема
это не сделает пользовательских преобразований iirc
это не работает на ссылку-> значение
Править: "как" определенно быстрее (http://www.codeproject.com/KB/cs/csharpcasts.aspx)
Edit2: так в основном скорость по сравнению с решением безопасности
Если получение неправильного типа было бы ошибкой, затем необходимо использовать бросок. Причина этого состоит в том, что действительно существует проблема, и необходимо знать об этом.
Если возможно, что значение будет нулевым, и это не ошибка в системе, когда это происходит затем использование "как". Так как причина - это, необходимо использовать "в качестве" любого времени, когда возвращение пустого указателя приемлемо.
Следует иметь в виду, что Вы не можете использовать для преобразования в типы значения, потому что нулевое значение не приемлемо для них. Если Вы будете иметь тип значения и захотите использовать "как", то необходимо будет использовать nullable тип значения.