Страницы

Поиск по вопросам

воскресенье, 29 марта 2020 г.

Как писать на C в Visual Studio 2017?

#c #visual_studio


Как установить язык C в Visual Studio 2017?
Нужен именно C, а не C++ или C#. При установке просто нет обычного C.


    


Ответы

Ответ 1



Компиляцией С и С++ в студии занимается один и тот же компилятор. Файлы с расширением .c автоматически компилируются как С код. Также это можно задать вручную посредством параметра /TC

Ответ 2



Если хочется писать на чистом си, при этом не особо хочется устанавливать большие пакеты студии, можно воспользоваться компилятором+IDE Pelles C - маленький, легенький, поддерживает с99, можно писать консольные и оконные приложения.

Циклическая смена background при наведении

#javascript_events


Задача состоит в том, чтобы при каждом наведении на элемент, у него менялся background.
3 раза он должен меняться, и далее, снова с первого.     



let getId = id => document.getElementById(id);
let check = 1;

if (check == 1) {
  getId('colorBox').onmouseover = function() {
    this.style.background = 'red';
  }
  getId('colorBox').onmouseout = function() {
    this.style.background = 'purple';
  }
  check = 2;
}
if (check == 2) {
  getId('colorBox').onmouseover = function() {
    this.style.background = 'yellow';
  }
  getId('colorBox').onmouseout = function() {
    this.style.background = 'purple';
  }
  check = 3;
}
if (check == 3) {
  getId('colorBox').onmouseover = function() {
    this.style.background = 'green';
  }
  getId('colorBox').onmouseout = function() {
    this.style.background = 'purple';
  }
  check = 1;
};



    


Ответы

Ответ 1



let check = -1; let colors = ["red", "yellow", "green"]; document.querySelector('.colorBox').addEventListener("mouseenter", function(e) { this.classList.remove.apply(this.classList, colors); this.classList.add(colors[check = ++check % colors.length]); }); document.querySelector('.colorBox').addEventListener("mouseleave", function(e) { this.classList.remove.apply(this.classList, colors); }); .colorBox { border: 1px solid black; width:100px; height:100px; display:inline-block; background:lightgray; } .red { background:red; } .yellow { background:yellow; } .green { background:green; }
Изменил строки this.classList.remove('red','yellow','green'); на this.classList.remove.apply(this.classList, colors); чтобы содержимое массива colors было известно только одному месту в коде.

Как сделать круговую диаграмму на SVG с заливкой?

#html #css #svg




Нужно сделать вот такую круговую диаграмму, с заливкой в центре заполненной части. 



    
        
    
 


Как сделать заливку? 

Бордер генерирую вот так: 



var stroke = 477, bg = 251;
  var percent = $('svg').attr('data-percent'),
      newStroke = stroke * (percent/100),
      newbg = bg * (percent/100);
      $('.start-2').css('stroke-dasharray', newBg+' '+bg);
      $('.start').css('stroke-dasharray', newStroke+' '+stroke);
  console.log(newStroke+' '+stroke);
 
svg {
  width: 300px;
  height: 300px;
}

.start {
  stroke-dasharray: 238.5 477;
  transition: 1s;
  fill-rule: nonzero;
  fill:none;
  stroke:green;
  stroke-width:4;
}
.start-2 {
  stroke-dasharray: 125.5 251;
  transition: 1s;
  fill: none;
  stroke-width: 75;
}




  
	
	







    


Ответы

Ответ 1



Решил самостоятельно. Может кому пригодится. var stroke = 477, bg = 251; $('[data-role="pie-chart"]').each(function() { var percent = $(this).attr('data-percent'), newStroke = stroke * (percent / 100), newBg = bg * (percent / 100), $this = $(this); setTimeout(function() { $('.pie-chart__bg', $this).css('stroke-dasharray', newBg + ' ' + bg); $('.pie-chart__border', $this).css('stroke-dasharray', newStroke + ' ' + stroke); }, 500); }); .pie-chart { width: 300px; } .pie-chart__gradient-from { stop-color: #fff; stop-opacity: 1; } .pie-chart__gradient-to { stop-color: #e2e2e2; stop-opacity: .75; } .pie-chart__bg { stroke-dasharray: 0 251; transition: 1s; fill: none; stroke-width: 75; } .pie-chart__border { stroke-dasharray: 0 477; transition: 1s; fill-rule: nonzero; fill: none; stroke: #757575; stroke-width: 4; } .pie-chart_gray .pie-chart__border { stroke: #757575; } .pie-chart_yellow .pie-chart__border { stroke: #F9DF3C; } .pie-chart_orange .pie-chart__border { stroke: #FC9C1E; } .pie-chart_green .pie-chart__border { stroke: #86BF40; } .pie-chart_blue .pie-chart__border { stroke: #214DA6; } 50% 87% 15% 44% 60% Codepen

background-image слайдер, как сделать плавность?

#javascript #html #jquery #css


Всем привет!
Есть у меня JS код слайдера при помощи background-image.
Проблема в том, что он меняет изображения очень резко.

Помогите пожалуйста добавить плавность в это явление 



var bgArr = [
  "http://via.placeholder.com/250x250/ff00ff/000000",
  "http://via.placeholder.com/250x250/000000/ff00ff",
  "http://via.placeholder.com/250x250/ff00ff/cdfc11"
];
var i = 0;

// Start the slide show
setInterval(function() {
  $("#demo").css("background-image", "url(" + bgArr[i] + ")");
  (i < bgArr.length - 1) ? i++ : i = 0
}, 2000);
 


Ответы

Ответ 1



Задай блоку #demo transition: all 1s; var bgArr = [ "http://via.placeholder.com/250x250/ff00ff/000000", "http://via.placeholder.com/250x250/000000/ff00ff", "http://via.placeholder.com/250x250/ff00ff/cdfc11" ]; var i = 0; // Start the slide show setInterval(function() { $("#demo").css("background-image", "url(" + bgArr[i] + ")"); (i < bgArr.length - 1) ? i++ : i = 0 }, 2000); #demo { transition: all 1s; }



Регулярное выражение для положительных целых четных чисел

#регулярные_выражения


Как найти положительные (то есть без знака "-" перед) целые (без знаков "." и ","
после) числа при помощи регулярного выражения? 

Мой почти рабочий вариант: (?


Ответы

Ответ 1



Я предлагаю (?

Преобразование из String в массив байтов и обратно

#java #кодировка #потоки_данных


Написал на Java следующую последовательность действий:


Получаю из строки с кириллицей массив байтов

byte[] bytes="новая строка".getBytes();

Получается следующий массив: 

[-19, -18, -30, -32, -1, 32, -15, -14, -16, -18, -22, -32]
Передаю его на вход классу ByteArrayOutputStream

ByteArrayOutputStream baos=new ByteArrayOutputStream();
baos.write(bytes);

Выполняю обратное преобразование из массива байтов в строку

System.out.println(baos.toString());

Программа выводит в консоль текст новая строка


Вопрос: так как кириллица в юникоде имеет кодепойнты, превышающие 1 тысячу (кодепойнт
буквы А, к примеру, равен 1040), а байт в Java может принимать значения от -128 до
127, следовательно при попытке преобразовать строку в массив типа byte должна происходить
потеря информации, как следствие - при вызове метода toString() строка должна восстановиться
некорректно. Но этого не произошло. В чем тут причина?
    


Ответы

Ответ 1



Это не юникод. String.getBytes() использует кодировку по-умолчанию платформы: Encodes this String into a sequence of bytes using the platform's default charset, storing the result into a new byte array. Кодировка по-умолчанию задается настройками Java, ее можно проверить с помощью: System.getProperty("file.encoding"); Для получения байтов в юникоде, задайте кодировку явно: byte[] bytes="новая строка".getBytes("UTF-8"); Получится больше 12 байтов. Обновление по вопросам в комментарии: Разве UTF-8 выдает байты, эквивалентные юникодовскому представлению? У юникода бывают разные представления. UTF-8 — одно из них. Я знаю, что char выдает кодепойнты юникода. Если вывести System.out.println((byte)'н'), то это будет равно 61. Здесь можно посмотреть как строчная кириллическая «н» представляется в разных кодировках: https://unicode-table.com/en/043D/ UTF-8: Десятичное значение: 53437 Байты: 208 189 UTF-16BE: Десятичное значение: 1085 Байты: 4 61 Для char в Java, согласно спецификации (§3.1 Unicode) используется кодировка UTF-16. Это тоже двухбайтовая кодировка. Соответственно, когда Вы приводите char к byte Вы получаете младший байт в этой кодировке. Получить байты в "UTF-16BE" можно так: byte[] bytes="новая строка".getBytes("UTF-16BE"); Если вывести байты, как Вы предложили byte[] bytes="новая строка".getBytes("UTF-8"), то там первый байт равен -48, а не 61. Кодировка UTF-8, как указано ранее беззнаковые (от 0 до 255) байты: 208 и 189. Знаковые байты, соответственно, -48 и -67.

Оптимизация больших изображений для сайта

#html #css #css3 #оптимизация #оптимизация_сайтов


На сайте используется ряд изображений с высоким разрешением от 2500px.

pageSpeed конечно же ругается, поэтому пытаюсь использовать современный атрибут srcset
для изображений:



* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

img {
  max-width: 100%;
  margin: auto;
}
A title
Для высоко разрешения так и использую в 2500px, а для обычного делаю эти же картинки в уменьшенным в 2 раза разрешением. Пример записи img для реального проекта: В итоге по всем "возможностям" pagespeed ругается на эти изображения и ругается на img-1-2x.jpg Т.е. на телефонах вместо того чтобы отображать img-1-1x.jpg отображается большая картинка. И такие проблемы только для моб. девайсов: Для десктопа все отлично, скорость 90+! По совету использую Echo.js lazy load, но этот lazy load на телефонах (особенно при плохом интернете) не все фото грузит. Update: Как оказалось запись: A title не валидна! При использовании атрибута sizes запись должна быть подобна этой: A title Просмотрев видеоурок с рекомендацией о сжатии изображения в squoosh.app, сделала изображения с разрешением .webp. Подключила с использованием picture: Изображения в формате .webp весят около 200-300 кб, это при том что в большом разрешении около 2 Мб. В итоге скорость на страницах упала до 10 - 13, и изображения отображаются только в хроме. Стоит последняя версия firefox, но почему-то и в нем не отображаются картинки. caniuse.com/#feat=picture ! Да и не всегда есть возможность оптимизировать все изображения, т.е. менять размеры или разрешение, а таких картинок на сайте много. Вопрос: Почему срабатывает огромное разрешение для телефонов, а не уменьшенное при записи


Ответы

Ответ 1



Делайте картинки в формате webp и добавляйте их в ваш srcset, этого гугл от вас и ждет, о чем вы бы и сами узнали, если бы развернули блок с ошибкой и прочитали что там написано. Для изображений в форматах JPEG 2000, JPEG XR и WebP используется более эффективное сжатие, поэтому они загружаются быстрее и потребляют меньше трафика, чем изображения PNG и JPEG. Вариант с picture наиболее кроссбраузерный. Сначала даете ему на съедение картинку в формате webp (как я вам в примере написал), если он не поддерживает такой тип, то будет грузить jpg. Но гугл пейдж спид это расценит как ХОРОШО.

Ответ 2



Вообще можете тестировать и оптимизировать изображения в gtmetrix, но если поищите можете найти другие сайты для оптимизации, и еще в photoshop сохраните изображение с таким качеством что бы было оптимально размер -> качество. И еще один важный момент. Это для мобильного сайта. Изображения которые не должны быть видны в мобильном. сделайте фоном блока(если это возможно) в место тега img. И в определенный момент когда блок скрывается ОБЯЗАТЕЛЬНО для этого разрешения экрана поставьте для этого блока с фоновым изображением background-image: none;. Вот таким образом в вы достаточно оптимизируете свою страницу.

Ответ 3



А если в src ставить уменьшенную картинку, или заглушку и после загрузки скриптом менять из атрибута, причем можно и с проверкой разрешения окна и для мобильных брать например из data-mobile меньшего размера? Не знаю такой вариант обманет ли pageSpeed. Можно переписать на чистом JS $(function() { $('.big').html(function() { $(this).attr("src", $(this).attr('data')); }); });

Как оценить работу и сроки над проектом? [закрыт]

#project


        
             
                
                    
                        
                            Закрыт. На этот вопрос невозможно дать объективный ответ.
Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы на него можно было дать ответ, основанный на фактах и цитатах, отредактировав его.
                        
                        Закрыт 2 года назад.
                                                                                
           
                
        
Как оценивать:


Цену за исполнение работы
Сроки исполнения


Как рассчитать цену/сроки, которые нужно сказать заказчику? Тем более, если раньше
не сталкивался с проектами относительно большого масштаба (раньше работал с более мелкими).
    


Ответы

Ответ 1



В сколько долларов в час ты себя оцениваешь? В сколько часов ты оцениваешь обьем работ на проекте? Умножь на коэфициэнт ошибки (1.2-1.5), т.к. с малым опытом сложно обьективно оценить, сколько времени это займет. Ну а дальше перемножь все эти числа. По поводу сроков: Оцени количество часов, которые тебе теоретически нужно работать Умножь на 2 И объясни заказчику, что это с запасом, а не точный день сдачи. :)

Как устранить ошибку 403?

#linux #htaccess #битрикс #веб_сервер #хостинг


Есть выделенный сервер на CentOS 7 на котором хостится муниципальный сайт на битриксе.
Проблема в том, что сайт (в основном, по ночам) становится не доступен и судя по логам
Nginx выдаёт ошибку 403. "Ложится" он на время от 5 до 50 минут и потом сам "поднимается".
Доступ для пользователей к директории с битрексом есть на чтение и запись. htaccess
(на сколько я могу судить) стандартный битрексовский. Наименование файлов корректное.
Думал, что это может быть из-за бэкапов, но "ложится" сайт по времени рандомно. Подскажите,
пожалуйста, что может быть?
    


Ответы

Ответ 1



Требуется для начала исследовать кто выдает ошибку 403: Nginx/Apache или PHP-код. Найти это можно в логах nginx/apache и по заголовкам ответа (X-Powered-By). Далее требуется разбиратся с логами конкретного сервера nginx/apache (и искать в логе ошибок причину ошибки 403) либо при выдаче этого кодом php - разбиратся в нём

Ответ 2



Нашёл причину (точнее, помог коллега). Оказалось, всё было в банальном фишинге сайта (использовали rk.php для перенаправления на свои сайты). По этой причине, сервер временно блокировал балансировщик пересылающий эти запросы серверу. Решается это всё в настройках Битрикса. Нужно зайти в интерфейс Битрикса, в раздел меню "Проактивная защита", дальше в "Защита редиректов" и включить защиту редиректов. Битрикс будет подписывать ссылки через rk.php.

Перенос Windows 7 компакт-диска на флешку?

#windows #windows_7 #flash_память


Есть установочный компакт-диск Windows 7.
Как перенести файлы установки на флешку? 
    


Ответы

Ответ 1



Судя по каментам я видимо уже опоздал, но тем не менее: Windows USB/DVD Download Tool Прекрасно пишет как 7, так и 10. Но убивает всё что на флэшке было, аккуратнее.

Ответ 2



Может кому пригодится и такой проверенный рецепт - при наличии уже установленной Windows NT 6.x (Win7|8|8.1|10) с административными правами. Запустить diskpart и начать исполнять следующие команды. Вывести список всех подключенных дисков. list disk Найти номер нужного Вам флеш-диска из перечня (например 1). Выбрать диск select disk 1 Очистить флешку clean Создать основной раздел create partition primary Выбрать созданный раздел select partition 1 Сделать активным созданный раздел active Форматировать раздел format fs=FAT32 quick либо format fs=NTFS quick смонтировать раздел assign Выйти из программы exit Скопировать целиком со структурой каталогов содержимое установочного компакт-диска на форматированную флешку. P.S. Полученная флешка грузится на большом множестве компьютеров. Замечено, что загрузчик, прописанный с помощью Windows 10, грузится даже на тех ПК, на которых не срабатывает загрузчик от Win7.

Как в Roslyn выполнить код с точки входа

#c_sharp #roslyn


Нужно сделать, чтобы пользователь мог выполнять C#-код на моем сервере (что-то вроде
dotnetfiddle.net). Приложение Asp.net Core.

Есть такой метод, который вполне нормально работает:

public static async Task> ExecuteScriptAsync(string code, IEnumerable
references,
    IEnumerable usings)
{
    var options = ScriptOptions.Default.WithReferences(references).WithImports(usings);

    return await CSharpScript.RunAsync(code, options);
}


Проблема метода ExecuteScript в том, что такой код он уже не будет выполнять: 

class Program 
{
    public static void Main() 
    {
        throw new System.Exception();   
    }
}


Как сделать чтобы код выполнялся как в консольном приложении, т.е. метод Main был
точкой входа?

Update

Нашел такой код. Срабатывает, но если в скрипт дописать Console.WriteLine("hi"),
то он ломается с ошибкой "Имя Console не существует в текущем контексте". 

var script = @"using System;
                public static class Program
                {
                    public static int Main(string[] args)
                    {
                        var x = 7 * 8;
                        return x;
                    }
                }";

var assemblyPath = Path.GetDirectoryName(typeof(object).Assembly.Location);
var refs = new List
{
    MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
    MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "mscorlib.dll")),
    MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.dll")),
    MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Core.dll")),
    MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Runtime.dll")),
    MetadataReference.CreateFromFile(Assembly.GetEntryAssembly().Location)
};

// Parse the script to a SyntaxTree
var syntaxTree = CSharpSyntaxTree.ParseText(script);
var options = new CSharpCompilationOptions(OutputKind.ConsoleApplication);
// Compile the SyntaxTree to a CSharpCompilation
var compilation = CSharpCompilation.Create("Script",
    new[] { syntaxTree },
    refs,
    new CSharpCompilationOptions(
        OutputKind.ConsoleApplication,
        optimizationLevel: OptimizationLevel.Release,
        assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default));

//CodeDomProvider codeDomProvider = new CodeDomProvider();
using (var outputStream = new MemoryStream())
using (var pdbStream = new MemoryStream())
{
    // Emit assembly to streams.
    var result = compilation.Emit(outputStream, pdbStream);
    if (!result.Success)
    {
        return;
    }

    // Load the emitted assembly.
    var assembly = Assembly.Load(outputStream.ToArray(), pdbStream.ToArray());

    // Invoke the entry point.
    var x = assembly.EntryPoint.Invoke(null, null);

    


Ответы

Ответ 1



Assembly.Load, тем более из массива байт - очень плохая идея, ведь она не дает возможности впоследствии выгрузить сборку из памяти, т.е. при работе в серверном приложении память рано или поздно исчерпается и сервер придется перезапускать. Кроме того, как ограничить права для запускаемого кода, чтобы он не разрушил вам систему? Если вы ориентируетесь под .NET Core, то домены приложений недоступны. Правильнее скомпилировать код в файл и запускать его в новом процессе под пользователем с ограниченными правами и перехватывать его вывод: using System; using System.Collections.Generic; using System.IO; using System.Diagnostics; using System.Reflection; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; namespace RoslynTest { class Program { static void RunScript() { var script = @"using System; public static class Program { public static int Main(string[] args) { var x = 7 * 8; Console.WriteLine(x.ToString()); return x; } }"; var assemblyPath = Path.GetDirectoryName(typeof(object).Assembly.Location); var refs = new List { MetadataReference.CreateFromFile(typeof(object).Assembly.Location), MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "mscorlib.dll")), MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.dll")), MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Core.dll")), MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Runtime.dll")), MetadataReference.CreateFromFile(Assembly.GetEntryAssembly().Location) }; // Parse the script to a SyntaxTree var syntaxTree = CSharpSyntaxTree.ParseText(script); var options = new CSharpCompilationOptions(OutputKind.ConsoleApplication); // Compile the SyntaxTree to a CSharpCompilation var compilation = CSharpCompilation.Create("Script", new[] { syntaxTree }, refs, new CSharpCompilationOptions( OutputKind.ConsoleApplication, optimizationLevel: OptimizationLevel.Release, assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default) ); var result = compilation.Emit("script.exe"); if (!result.Success) { throw new ApplicationException("Cannot compile script"); } ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = "script.exe"; psi.UseShellExecute = false; psi.RedirectStandardOutput = true; psi.RedirectStandardInput = true; psi.UserName = "Vasya"; psi.Password = "123"; var process = new Process(); using (process) { process.StartInfo = psi; process.Start(); while (!process.StandardOutput.EndOfStream) { string res = process.StandardOutput.ReadLine(); Console.WriteLine(res); } } } } } Код заточен под .NET Framework / Windows, но думаю, не составит труда переделать под .NET Core, так как все используемые библиотеки есть в .NET Standard. Запуск процессов от имени другого пользователя должен работать в .NET Core на всех ОС, начиная с .NET Core 2.1. Примечание. В .NET Core 3.0 появилась возможность выгрузки сборок из памяти, но это все еще не решает проблему обеспечения безопасности.

Можно ли с сайта открыть отзыв на Ютубе сразу с субтитрами и нужным языком?

#javascript #html #html5 #youtube #youtube_api


Мне нужно, чтобы на моем сайте при клике по видеоотзыву открывался айфрейм с видео,
которое лежит на Ютубе (это уже реализовано). Причем, в зависимости от текущего языка
видео должно открываться с субтитрами и соответствующим языком. Реально ли это сделать?
Если бы можно было при открытии видео передать параметром язык и обязательность субтитров,
то было бы отлично. 
Вопрос - это вообще реально? И если нет, то как можно выйти из положения?
    


Ответы

Ответ 1



Согласно официальной документации, язык интерфейса можно задать при помощи параметра hl, а для включения субтитров используется параметр cc_load_policy со значением 1. При необходимости можно использовать параметр cc_lang_pref, чтобы задать язык субтитров. Этот параметр работает аналогично параметру hl. Стоит иметь в виду, что cc_load_policy=1 не работает с автогенерированными субтитрами, их нужно включать вручную. Пример использования: https://www.youtube.com/embed/QRS8MkLhQmM?hl=en&cc_load_policy=1&cc_lang_pref=ru&autoplay=1

Как реализовать эффект затемнения изображения с двумя кнопками?

#html #jquery #css


Уважаемые профи!
Прошу помощи в реализации следующего эффекта.



Смог сделать всё, кроме работающих кнопок "лупа" и "ссылка".

Мой фрагмент кода:


$('.projects-post').mouseenter(function() {
  $(this).find('.projects-post__arrow>img').attr('src', '../img/projects/arrow-activ.png');
  $(this).find('.projects-post-img').css('background-color', '#362f2d');
  $(this).find('.projects-post-text').css('background-color', '#362f2d');
});
$('.projects-post').mouseleave(function() {
  $(this).find('.projects-post__arrow>img').attr('src', '../img/projects/arrow.png');
  $(this).find('.projects-post-img').css('background-color', '#fbfaf8');
  $(this).find('.projects-post-text').css('background-color', '#fbfaf8');
});
.projects-post {
  background-color: #fbfaf8;
}

.projects-post-img {
  position: relative;
  text-align: center;
}

.projects-post-img a {
  display: block;
  position: relative;
}

.projects-post-img a:after {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: rgba(0, 0, 0, 0.5);
  opacity: 0;
}

.projects-post-img a:before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: url("../img/projects/lupa.png") center no-repeat;
  opacity: 0;
  z-index: 10;
}

.projects-post-img a:hover:before,
.projects-post-img a:hover:after {
  opacity: 1;
}

.projects-post__arrow {
  position: absolute;
  bottom: 3px;
  left: 30px;
}

.projects-post-text {
  padding-top: 20px;
  padding-bottom: 15px;
}

.projects-post-text__title {
  color: #c7b299;
  font-family: 'Raleway';
  font-size: 18px;
  font-weight: 500;
}

.projects-post-text__subtitle {
  color: #d1d1d1;
  font-family: 'Montserrat';
  font-size: 14px;
  font-weight: 300;
  line-height: 20px;
}

Claritas Etiam Processus
Photography, Nature
Quam Nutamus Farum
Graphic Design, Mock-Up
Usus Legentis Videntur
Photography, Holiday
Заранее всем спасибо!


Ответы

Ответ 1



Не по вашему примеру сделал но показал механизм как такое реализуется Создаём блок в котором находится всё то что надо скрыть и показываем при событии hover * { margin: 0; padding: 0; } .items { display: inline-block; text-align: center; position: relative; width: 220px; height: 220px; overflow: hidden; } .post_hidden { text-align: left; position: absolute; bottom: 0; transform: translateY(100%); padding: 20px; background: #222; transition: 0.34s linear; } .post_hidden h3 { font-size: 18px; color: #fbfbfb; } .post_hidden p { font-size: 12px; color: #fbfbfb; } .post_hidden p { width: 200px; } .preview { position: absolute; top: 0; left: 0; bottom: 0; } .wrapper { position: relative; width: 220px; height: 100%; background: rgba(0, 0, 0, 0.5); opacity: 0; visibility: hidden; transition: 0.34s linear; } .item { height: 120px; line-height: 140px; } .item a { margin: 0 10px; color: #fbfbfb; } .items:hover .wrapper { opacity: 1; visibility: visible; } .items:hover .post_hidden { transform: translateY(0); }

post name

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Amet, eaque?



TryOpenExisting() и использование Discards (пустых переменных) на обьектах которые наследуют IDisposable

#c_sharp #c_sharp_faq #mutex #c_sharp_70


Мне нужно только результат функции, который записывается в переменную existing. 

Boolean existing = Mutex.TryOpenExisting(name: key, rights: MutexRights.ReadPermissions,
result: out Mutex _);


Могу ли я использовать "Пустую переменную" в этом коде? Вызовет ли она Dispose();
для этого обьекта автоматически?

Или правильным было бы обьявить переменную Mutex mutex и после вызова метода вызвать
mutex.Dispose(); ?

P.S. Кому не понятна суть вопроса, подробнее про пустые переменные тут: https://docs.microsoft.com/en-us/dotnet/csharp/discards
    


Ответы

Ответ 1



Сама документация описывает что "пустые переменные" просто ссылаются на некую "пустую" область памяти. То есть не занимают места. Что вряд ли означает что они будут вызывать Dispose() у IDisposable обьектов. Я провел личное расследование даного вопроса и написал прогу для тестирования. Простая винформс апликуха на старте которого вызывается метод: public bool TestMethod(out Image bmp) { Thread.Sleep(3000); bmp = Bitmap.FromFile(@"C:\Users\UKS\Desktop\2000x2000pixels.bmp"); Thread.Sleep(1000); return true; } Выкладываю результаты: public Form1() { InitializeComponent(); Image img; var a = TestMethod(out img); img.Dispose(); } Как видно из картинки - Память возросла и освободилась т.к. мы использовали диспоуз Теперь настал черед теста: public Form1() { InitializeComponent(); var a = TestMethod(out _); } Как видим из картинки - память НЕ освободилась когда я использовал Discard-переменную. Из чего делаем вывод что Дискарды не диспоузят данные. Теперь настал черед еще пары тестов: Конструкция: var a = TestMethod(out _.Dispose()); Не сработает. Говорит что _ не существует в даном контексте. Конструкция: var a = TestMethod(out _); _.Dispose(); Даст ровно тот же результат. Вывод: пустые переменные использовать на IDisposable обьектах категорически нельзя. Итак, самый коректный код в даном конкретном случае есть: Mutex mutex; Boolean existing = Mutex.TryOpenExisting(name: key, rights: MutexRights.ReadPermissions, result: mutex); mutex?.Dispose();//проверяем на null. Если не налл, то вызываем диспоуз.

Как нарисовать звезду в круге c#

#c_sharp #net #windows


Как на c# нарисовать звезду в круге используя picturebox?

    private void OnPaint()
    {
        int n = 5;               // число вершин
        double R = 25, r = 50;   // радиусы
        double alpha = 0;        // поворот
        double x0 = 60, y0 = 60; // центр
        Graphics e = pictureBox1.CreateGraphics();
        PointF[] points = new PointF[2 * n + 1];
        double a = alpha, da = Math.PI / n, l;
        for (int k = 0; k < 2 * n + 1; k++)
        {
            l = k % 2 == 0 ? r : R;
            points[k] = new PointF((float)(x0 + l * Math.Cos(a)), (float)(y0 + l
* Math.Sin(a)));
            a += da;
        }

        e.DrawLines(Pens.Black, points);
        e.DrawEllipse(Pens.Green, 60, 60, 200, 200);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        OnPaint();
    }
}


}

У меня получилось только вот это: 


    


Ответы

Ответ 1



Вы вызываете DrawEllipse(), передавая вторым и третьим аргументом координаты центра: double x0 = 60, y0 = 60; ^^ ^^ // ... e.DrawEllipse(Pens.Green, 60, 60, 200, 200); ^^ ^^ Однако согласно документации функция ожидает там координаты верхнего левого угла: public void DrawEllipse (System.Drawing.Pen pen, int x, int y, int width, int height); ^ ^ Можно, конечно, просто поправить числа. Но лучше вообще от них отказаться, динамически подгоняя круг под звезду: e.DrawEllipse(Pens.Green, x0 - R, y0 - R, R * 2, R * 2)

Не получается натренировать нейронную сеть

#python #машинное_обучение #numpy


Народ, всем привет! Столкнулся с бедой - нужно натренировать сеть по приложенному
датасету (выше) и образцу с хабра (сам пост). Итоговый результат никак не похож на
изначальный набор значений. С чем я мог налажать: грешу на сигмоиду, но упустить что-то
важное из внимания мог и в любом другом месте. Огромное спасибо, если откликнитесь!

Описание сета

Данные

(Предварительно удалил строчки с вопросительными знаками и поместил сет в txt).

По-английски/in English

import numpy as np

# sigmoid func
def sigmoid(x, deriv=False):
    if deriv:
        # print(sigmoid(x) * (1 - sigmoid(x)))
        return sigmoid(x) * (1 - sigmoid(x))
    return 1 / (1 + np.exp(-x))


# input initialization
dataset = np.genfromtxt('dataset.txt', delimiter=',')
X = dataset[..., 0:12]
y = np.array([dataset[..., 13]]).T

# input normalization
Xn = X / X.max(axis=0)
yn = y / y.max(axis=0)

# random numbers initialization
np.random.seed(1)
syn0 = 2 * np.random.random((12, 1)) - 1

for i in range(50000):
    # direct error propagation
    l0 = Xn
    l1 = sigmoid(np.dot(l0, syn0))
    # error computing
    l1_error = yn - l1
    # multiply this by the slope of sigmoid
    # using values of l1
    l1_delta = l1_error * sigmoid(l1, True) # - !
    # weights update
    syn0 += np.dot(l0.T, l1_delta)  # - !
print("Output data after training: ")
print(l1)

Actual result        Required result:      
[[8.25305827e-28]    ~0
 [9.99999908e-01]    ~0.5
 [5.25318843e-04]    ~0.25
 [2.41309677e-22]    ~0
 [2.09811612e-28]    ~0
 [2.37186828e-34]    ~0
 [1.43044972e-07]    ~0.75
 [6.83698176e-30]    ~0
...                  ...

    


Ответы

Ответ 1



Дело в том, что это датасет для мультиклассовой классификации: y принимает значения 1, 2, 3, 4, 5. Для решения такой задачи нужна другая функция активации (softmax обычно) и другая функция потерь (обычно crossentropy). Советую взять датасет с бинарным таргетом.

При декодировании текста методом Base64, содержащего русские буквы, выводится неверный результат

#python #python_3x #base64


Хотя на сайте http://crypt-online.ru/crypts/base64/ всё дешифруется верно.
Вот пример кода:

import base64
s = input()
resault = base64.b64encode(bytes(s, 'utf-8')) #Шифровка
print(resault) 
print(base64.b64decode(resault)) #Дешифровка

    


Ответы

Ответ 1



print(base64.b64decode(resault).decode()) и лучше resault = base64.b64encode(s.encode())

BitmapImage не работает с Binding?

#c_sharp #wpf


Интересная ситуация, при попытке установки значения для BitmapImage.UriSource через
привязку данных, вот так:



    
        
            
                
                
                
            

            
                
                    
                        
                    
                
            

            
                
            

            
                
            

        
    




После инициализации View происходит исключение: 


  InvalidOperationException: Необходимо задать свойство "UriSource" или
  "StreamSource".


Т.е. в момент инициализации DataContext еще не установлен, но это произойдет немного
позже. Как с этим бороться т.к. игнорируется значение TargetNullValue а так же FallbackValue?
    


Ответы

Ответ 1



Смотрите (c). TargetNullValue предназначен для случаев, когда привязка работает, но источник содержит значение null, у вас же, пока DataContext не установлен, привязка оказывается в нерабочем состоянии, но для BitmapImage это недопустимо, он обязательно должен иметь установленное свойство UriSource или StreamSource. Для случаев, когда привязка сломана или источник содержит недопустимое значение предназначена именно фича FallbackValue, т. е. вроде бы ваш пример должен заработать если написать так: Но он не заработает как нам нужно: заглушка для картинки появится, но когда мы установим DataContext, она не поменяется на нужную нам. Тут есть еще одна загвоздка (читайте комментарии в статье про BitmapImage на MSDN): ... После инициализации изменения свойств игнорируются. т. е. созданное единожды BitmapImage навсегда останется таким. Тут у вас есть несколько вариантов: написать простой конвертер, который будет по строке (или Uri) создавать новый экземпляр BitmapImage: class UriToBitmapImageConverter : ConverterBase { public override object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var b = new BitmapImage { CacheOption = BitmapCacheOption.OnDemand, CreateOptions = BitmapCreateOptions.DelayCreation }; b.BeginInit(); b.UriSource = new Uri((string)value); b.EndInit(); return b; } } и воспользоваться им: воспользоваться фичей PriorityBinding: затем: но здесь, конечно, BitmapImage создается автоматически с настройками по умолчанию. В обоих вариантах получаем:

Как поменять название файла, не изменив расширение?

#php


Есть вот такой простой код:

$file = 'http://site.ru/photo.jpg';
echo basename($file));


Как мне изменить название файла так, чтобы не менялось расширение?
В переменной file файлы меняются, поэтому нужно заменить название у всех других файлов,
а не просто заменой photo на другое слово.
    


Ответы

Ответ 1





Как преобразовать string в char?

#cpp #строки #char #преобразование


Есть произвольная строка не больше 25 символов. Например "wo1fram"
Как преобразовать ее в массив char[255]?
Чтобы потом с char можно было работать как с полноценным массивом символов, оканчивающимся
нуль-символом.
    


Ответы

Ответ 1



Тут, видите ли, есть два решения. Одно - если вам надо только читать эту строку, или там, поменять в ней пару символов - но не менять ее размер (так что всякие strcpy отменяются) - то можно воспользоваться функциями c_str() и data(). Очень рекомендую внимательно почитать описания, а главное - ограничения, накладываемые этими функциями. И другое - если нужно работать с ней как со строкой в стиле С со всеми возможностями - то просто скопируйте ее в массив, типа char buf[255]; strcpy(buf,s.c_str()); или char * buf = strdup(s); Примерно так.

Игра змейка, проблема реализации

#python #python_3x #разработка_игр


Начал писать консольную змейку, сталкивался с многими проблемами, но данную проблему
не могу пока что решить. Проблема в том, что как только игра начинается всё в порядке,
края правильно рисуются, но стоит взять фрукт так сразу происходит какая-то ахинея
и правая сторона уходит на несколько клеточек вправо.

import threading
import random
import os
from pynput import keyboard
from time import sleep


def draw():
    global score
    global fruitX
    global fruitY
    global snake

    os.system("clear")

    # top
    for i in range(0, width + 1):
        print("#", end='')
    print()

    # all mid
    for i in range(0, height):
        for j in range(0, width):
            if (j == 0) or (j == width - 1):
                print("#", end='')
            for k in snake:
                if (i == k[1]) and (j == k[0]):
                    print("G", end='')
                elif (i == fruit[0][1]) and (j == fruit[0][0]):
                    print('*', end='')
                else:
                    print(' ', end='')
        print()

    # bot
    for i in range(0, width + 1):
        print("#", end='')
    print()

    print(f"Total score: {score}")


def input():
    with keyboard.Listener(on_release=on_release) as listener:
        listener.join()


def on_release(key):
    global gameOver
    global snake

    ka = 0

    if key == keyboard.Key.esc:
        gameOver = True

    if key == keyboard.KeyCode.from_char('w'):
        for k in snake:
            snake[ka][1] -= 1
        ka += 1

    if key == keyboard.KeyCode.from_char('s'):
        for k in snake:
            snake[ka][1] += 1
        ka += 1

    if key == keyboard.KeyCode.from_char('d'):
        for k in snake:
            snake[ka][0] += 1
        ka += 1

    if key == keyboard.KeyCode.from_char('a'):
        for k in snake:
            snake[ka][0] -= 1
        ka += 1


def logic():
    global score
    global fruit
    global snake

    # Got a fruit
    if (snake[0][0] == fruit[0][0]) and (snake[0][1] == fruit[0][1]):
        score += 1
        snake.append([snake[0][0] - 1, snake[0][1]])
        fruit.pop()

    if len(fruit) == 0:
        fruit.append((random.randint(1, width - 1),
                      random.randint(1, height - 1)))


if __name__ == "__main__":
    gameOver = False
    width = 20
    height = 20

    snake = [[width / 2 - 1,
              height / 2 - 1]]

    fruit = [(random.randint(1, width - 1),
              random.randint(1, height - 1))]
    score = 0

    t_input = threading.Thread(target=input, name='InputThread')
    t_input.start()

    # Main game
    while not gameOver:
        sleep(0.1)
        draw()
        logic()


Можете не кидать готовый код, можно просто объяснить что не так. Если всё уж так
плохо, то подскажите что переучить заново, или попрактиковаться снова. Учился по книге
Билл Любанович "Простой Python"

    


Ответы

Ответ 1



но стоит взять фрукт так сразу происходит какая-то ахинея и правая сторона уходит на несколько клеточек вправо Смотрите, у вас когда рисуется змейка заодно рисуются фрукт и пустое пространство, что странно -- это ведь разные объекты. ... for k in snake: if (i == k[1]) and (j == k[0]): print("G", end='') elif (i == fruit[0][1]) and (j == fruit[0][0]): print('*', end='') else: print(' ', end='') ... Поэтому, когда змейка берет фрукт, у змеи становится два блока и тот цикл два раза прогоняется и получается в два раза больше пространства Решил другим подходом рисовать поле -- сначала составить матрицу, заполнить ее, а после отрисовать: import threading import random import os from pynput import keyboard from time import sleep def clear(): if os.name == 'posix': os.system('clear') else: os.system('cls') def draw(): global score global snake board = [] for _ in range(width): board.append([' ' for _ in range(height)]) # Top for i in range(width): board[0][i] = "#" # Left for i in range(height): board[i][0] = "#" # Right for i in range(height): board[i][width - 1] = "#" # All mid for i, j in snake: board[j][i] = 'G' for i, j in fruit: board[j][i] = '*' # Bottom for i in range(width): board[height - 1][i] = "#" clear() print() for row in board: print(''.join(row)) print(f"Total score: {score}") def keyboard_listener(): with keyboard.Listener(on_release=on_release) as listener: listener.join() def on_release(key): global gameOver global snake ka = 0 if key == keyboard.Key.esc: gameOver = True if key == keyboard.KeyCode.from_char('w') or key == keyboard.Key.up: for k in snake: snake[ka][1] -= 1 ka += 1 if key == keyboard.KeyCode.from_char('s') or key == keyboard.Key.down: for k in snake: snake[ka][1] += 1 ka += 1 if key == keyboard.KeyCode.from_char('d') or key == keyboard.Key.right: for k in snake: snake[ka][0] += 1 ka += 1 if key == keyboard.KeyCode.from_char('a') or key == keyboard.Key.left: for k in snake: snake[ka][0] -= 1 ka += 1 def logic(): global score global fruit global snake print(f'snake={snake} fruit={fruit}') # Got a fruit if snake[0][0] == fruit[0][0] and snake[0][1] == fruit[0][1]: score += 1 snake.append([snake[0][0] - 1, snake[0][1]]) fruit.pop() if not fruit: fruit.append((random.randint(1, width - 1), random.randint(1, height - 1))) if __name__ == "__main__": gameOver = False width = 20 height = 20 snake = [[width // 2 - 1, height // 2 - 1]] fruit = [(random.randint(1, width - 1), random.randint(1, height - 1))] score = 0 t_input = threading.Thread(target=keyboard_listener, name='InputThread') t_input.start() # Main game while not gameOver: draw() logic() sleep(0.1) PS. Вам нужно будет подумать как движение змейки организовать, пока только голова движется PPS Этот код с этим может выдать странный результат snake = [[width / 2 - 1, height / 2 - 1]] / -- это деление с остатком, после него будет вещественное число. Поэтому, нужно делить через //

Преобразовать данные из MongoDB

#java #spring #mongodb #spring_boot


Есть класс Person, в нем есть поле name. Я записываю эти данные в Mongo, но на выходе,
хочу получать не записанные по 1-у классы, а все поля name из них, но в List.
Вот код 

@RestController
public class Post_Get {
    @Autowired
    private PersonRepository personRepository;
    private List persons = new ArrayList<>();

    @PostMapping("api/names")
    public void post (@RequestParam("username") String name) {
        Person person = new Person(name);
        personRepository.save(person);
    }

    @GetMapping("api/names")
    public List get () {
        return personRepository.findAll();
    }
}

    


Ответы

Ответ 1



@GetMapping("api/names") public List getNames() { return personRepository.findAll() .stream() .map(Person::getName) .filter(Objects::nonNull) .collect(Collectors.toList()); } Или без лишней конвертаций public interface PersonRepository extends Repository { Stream findByNameNotNull(); } @GetMapping("api/names") public List getNames() { return personRepository.findByNameNotNull() .map(Person::getName) .collect(Collectors.toList()); }

Сравнивание однотипных элементов списка друг с другом в Python

#python #python_3x


Дан список:

list = [220.32, 205.1, 204.6, 203.2, 203.75, 203.25, 203.75, 203.5]


Необходимо сравнить элементы списка друг с другом в цикле и больший элемент
разделить на меньший. Но при этом не присваивать имена каждому элементу списка. 

Мой код не дает сделать этого:  

for i in list:  
     if list[i] > list[i + 1]:  
     a = (list[i] / list[i + 1] ) 
     else:  
         a = (list[i + 1] / list[i] ) 
     print(a)  


Пользоваться библиотеками нельзя.   

Выдает исключение:  


  Traceback (most recent call last):   File "", line 2, in
  
   TypeError: list indices must be integers or slices, not
  
  float`

    


Ответы

Ответ 1



myList = [220.32, 205.1, 204.6, 203.2, 203.75, 203.25, 203.75, 203.5] [ [myList[i-1]/myList[i] if myList[i-1]>myList[i] else myList[i]/myList[i-1]] for i in range(1, len(myList)) ] [[1.0742077035592394], [1.0024437927663734], [1.0068897637795275], [1.0027066929133859], [1.002460024600246], [1.002460024600246], [1.0012285012285012]] или так: for i in range(1, len(myList)): if myList[i-1]>myList[i]: a = myList[i-1]/myList[i] else: a = myList[i]/myList[i-1] print(a) 1.0742077035592394 1.0024437927663734 1.0068897637795275 1.0027066929133859 1.002460024600246 1.002460024600246 1.0012285012285012

Ответ 2



# a = [((a / b) if (a > b) else (b / a)) for (a, b) in zip(myList, myList[1:])] # import operator, itertools # a = list(itertools.starmap(operator.truediv, map(reversed, map(sorted, zip(myList, myList[1:]))))) myList = [220.32, 205.1, 204.6, 203.2, 203.75, 203.25, 203.75, 203.5] a = list(next(i)/next(i) for i in map(iter, map(reversed, map(sorted, zip(myList, myList[1:]))))) print(a) # [1.0742077035592394, 1.0024437927663734, 1.0068897637795275, 1.0027066929133859, 1.002460024600246, 1.002460024600246, 1.0012285012285012]

Как эффективно объединить несколько pandas DataFrame?

#python #pandas #numpy #dataframe


Готовлю данные для модели, в частности заполняю пропуски для вещественных признаков
и преобразую категориальные. Исходные данные имеют размерность (40000, 230), из них
первые 190 признаков вещественные, остальные — категориальные.


Подготовим вещественные данные для анализа. Заполним пропуски средним

X_data = pd.DataFrame()
for column in data.columns[:num_of_numerical_vars]:
    m1 = data[column].mean()
    if np.isnan(m1):
        m1 = data[column].notnull().mean()
    X_data[column] = data[column].fillna(m1) 

Подготовим категориальные признаки. Воспользуемся LabelEncoder в 
связке с OneHotEncoder

label_encoder = LabelEncoder()
data_categorical_num = data_categorical.apply(lambda col: label_encoder.fit_transform(col))
hot_encoder = OneHotEncoder(handle_unknown='ignore', sparse=False)
encoded_categorical = hot_encoder.fit_transform(data_categorical_num)



Выводим размерность encoded_categorical

print encoded_categorical.shape


Вывод:


  (40000, 143513)


То есть данных довольно много. Подскажите, как в этом случае объединить получившиеся
вещественные и категориальные признаки эффективно? Если написать что–то вроде:

pd_cats = pd.DataFrame(data=encoded_categorical)
X_data = pd.concat([X_data, pd_cats])


То на моем ПК не хватает памяти для данной операции. Как мне кажется, данные можно
объединить как–то без копирования данных.

Данные могут быть загружены отсюда ("small" dataset)
    


Ответы

Ответ 1



В данном случае стоит использовать разреженные матрицы / фреймы. from sklearn.preprocessing import MultiLabelBinarizer mlb = MultiLabelBinarizer(sparse_output=True) WORK_DIR = Path(r'D:\data\927487') train = pd.read_csv(WORK_DIR / 'orange_small_train.data', sep='\t') labels = pd.read_csv(WORK_DIR / 'orange_small_train_appetency.labels', header=None, squeeze=True, dtype='int8') categorical_cols = train.columns[train.dtypes.eq('object')] train_cat = train[categorical_cols].copy() train = pd.SparseDataFrame(train.drop(categorical_cols, axis=1)) train = train.join( pd.SparseDataFrame( mlb.fit_transform( train_cat.T.apply(lambda c: c.dropna() .str.cat(sep=' ') .split())), default_fill_value=0)) Результат: In [242]: type(train) Out[242]: pandas.core.sparse.frame.SparseDataFrame In [243]: train.memory_usage().sum() Out[243]: 27806864 # NOTE: sparse DF takes only 27 MiB in RAM In [244]: train.shape Out[244]: (50000, 71696)

Ответ 2



Несколько слов об обработке столбцов с преимущественно отсутствующими данными... Если внимательно посмотреть на исходные данные, то можно заметить, что львиная доля (154) столбцов состоит из NaN на 90+%: train = pd.read_csv(WORK_DIR / 'orange_small_train.data', sep='\t') labels = pd.read_csv(WORK_DIR / 'orange_small_train_appetency.labels', header=None, squeeze=True, dtype='int8') оценка количества столбцов состоящих преимущественно из NaN: In [52]: (train.isna().sum() / len(train) > 0.9).sum() Out[52]: 154 мне кажется стоит попробовать построить регрессионную модель в которой данные столбцы не будут учавствовать вовсе и сравнить с той моделью, где такие данные заполнены средним значением (с высокой долей вероятности эти столбцы/признаки не сильно повлияют на результаты предсказываний): In [54]: train = train.loc[:, train.isna().sum() / len(train) <= 0.9] In [55]: train.shape Out[55]: (50000, 76) categorical_cols = train.columns[train.dtypes.eq('object')] train_cat = train[categorical_cols].copy() # drop categorical cols from the train DF train = train.drop(categorical_cols, axis=1) Чтобы заполнить NaN в оставшихся вещественных столбцах можно воспользоваться sklearn.imputer.SimpleImputer. Кроме того стоит нормализовать данные, чтобы все признаки имели одинаковую шкалу величин - для этого существует sklearn.preprocessing.StandardScaler: from sklearn.impute import SimpleImputer from sklearn.preprocessing import StandardScaler impute = SimpleImputer(strategy='mean') scale = StandardScaler() train = pd.SparseDataFrame( scale.fit_transform(impute.fit_transform(train)), columns=train.columns, index=train.index, default_fill_value=0) train = train.join( pd.SparseDataFrame( mlb.fit_transform( train_cat.T.apply(lambda c: c.dropna() .str.cat(sep=' ') .split())), default_fill_value=0)) In [82]: train.memory_usage().sum() Out[82]: 21455996 In [83]: train.shape Out[83]: (50000, 71542) In [84]: train.info() RangeIndex: 50000 entries, 0 to 49999 Columns: 71542 entries, Var6 to 71499 dtypes: float64(42), int32(71500) memory usage: 20.5 MB PS также стоит попробовать воспользоваться методом главных компонент (sklearn.decomposition.PCA) для уменьшения размерности (уменьшить число признаков) выборки и сравнить результаты регрессии. PCA позволяет значительно уменьшить число признаков, выбрав самые значимые. Как работает MultilabelBinarizer: In [104]: mlb = MultiLabelBinarizer() In [105]: df = pd.DataFrame({ ...: 'Col1': [10, 20, 30], ...: 'Col2': [['Apple','Orange','Banana'], ['Apple','Grape'], ['Banana']] ...: }) In [106]: df Out[106]: Col1 Col2 0 10 [Apple, Orange, Banana] 1 20 [Apple, Grape] 2 30 [Banana] In [107]: df.join(pd.DataFrame(mlb.fit_transform(df['Col2']), index=df.index, columns=mlb.classes_)) Out[107]: Col1 Col2 Apple Banana Grape Orange 0 10 [Apple, Orange, Banana] 1 1 0 1 1 20 [Apple, Grape] 1 0 1 0 2 30 [Banana] 0 1 0 0

Удаленный доступ к linux ubuntu

#linux #ubuntu #remote_access


я новичок в linux и мне нужно удаленно подключиться к ферме на ubuntu 18.04 TLS.
О варианте с приобретением белого ip знаю, но все же хочу узнать, есть ли бесплатные
способы установить стабильное удаленное соединение на linux, тк ставить буду на ферму
к которой не буду иметь физического доступа долгое время. Интересуют способы как подключиться
и с другого linux, и с windows 8/10. Спасибо!
    


Ответы

Ответ 1



Если оператор выдаёт белый динамический адрес, то dynamic dns + cron-скрипт на сервере для обновления записи на DynDNS. Если оператор не выдаёт белый адрес, а предоставляет доступ в интернет через NAT, то Remote Port Forwarding SSH Tunnel на/с сервер(а) с белым IP. Как-то так: Remote Port Forwarding SSH Tunnel (port ABCD): UbuntuServer -> (Operator->NAT) -> Internet Server ssh -R ABCD:localhost:10022 user@internet.server Client (другой Linux / Windows) ssh user@internet.server:ABCD // эта ssh-сессия будет проброшена на UbuntuServer:10022 При этом SSH-сервер, к которому нужен доступ, должен слушать порт 10022. Дополняю ответ насчёт SSH Remote Port Forwarding. Т.к. remote port forward сессия может обрываться/подвисать, надо а) настроить таймауты для SSH и б) при необходимости перезапускать эту сессию. Для этого делаем: скрипт для (пере)запуска RemotePortForwarding-туннеля (для основного Ubuntu-сервера) - скажем, /opt/scripts/sshtunn.sh: (апостроф в начале первой строки не нужен) '#!/usr/bin/env bash CMD="ssh -f -N tunnel" PID=`pgrep -f "$CMD"` if [ -z "$PID" ]; then $CMD echo "[$(date '+%Y-%m-%d %H:%M:%S')] SSH tunnel (re)start" >> /tmp/ssh.tunnel.log fi исполняет его cron; для этого в /etc/cron.d нужно положить такой файлик: (< user > - имя пользователя, под которым запускать скрипт) * * * * * /opt/scripts/sshtunn.sh Чтобы скрипт нормально сработал (а также, чтобы сессия не подвисала), должна быть соответствующая настройка в ~/.ssh/config (в домашней директории того самого пользователя, под которым запускается скрипт): host tunnel hostname user port 22 identityfile ~/.ssh/keys/tunnel.key RemoteForward 10222 127.0.0.1:22 TCPKeepAlive yes ServerAliveInterval 10 ServerAliveCountMax 6 ну и тот самый интернет-сервер должен принимать подключения по ключу ~/.ssh/keys/tunnel.key

Парсинг строки в Java в HashMap

#java


Как правильнее распарсить строку.
Строка вот такого типа: key:value|key:value|key:value

В итоге планирую получить HashMap. 
Пример: "Temperature:35"
    


Ответы

Ответ 1



1) split: String example = "Terminator:35|SuperMen:53|Robbin:12"; String[] pairs = example.split("\\|"); Map map = new HashMap<>(); for (String pair : pairs) { String[] keyValue = pair.split(":"); map.put(keyValue[0], Integer.valueOf(keyValue[1])); } 2) regex: Map map = new HashMap<>(); String example = "Terminator:35|SuperMen:53|Robbin:12"; Pattern pattern = Pattern.compile("(\\w+):(\\d+)"); Matcher matcher = pattern.matcher(example); while (matcher.find()) { map.put(matcher.group(1), Integer.valueOf(matcher.group(2))); } System.out.println(map); 3) в цикле, не сильно оптимально вышло, но Map map = new HashMap<>(); String example = "Terminator:35|SuperMen:53|Robbin:12"; StringBuilder key = new StringBuilder(); StringBuilder value = new StringBuilder(); boolean keyFlag = true; boolean valueFlag = false; for (char ch : example.toCharArray()) { if (ch == ':') { valueFlag = true; keyFlag = false; } else if (ch == '|') { keyFlag = true; valueFlag = false; map.put(key.toString(), Integer.valueOf(value.toString())); value = new StringBuilder(); key = new StringBuilder(); } else { if (keyFlag) { key.append(ch); } else if (valueFlag) { value.append(ch); } } } map.put(key.toString(), Integer.valueOf(value.toString())); System.out.println(map);

Почему перезаписывается словарь?

#python


Из DataSet выбираю события, которые произошли 2015 году, и хочу записывать тип Primary
Type в словарь, чтобы через class Counter посмотреть самые популярные.
Как правильно добавлять в словарь, а не перезаписывать значения?

import csv
import re
import collections

a = {"Primary Type": set()}

with open("Crimes.csv") as f:
    reader = csv.reader(f)
    for smt in reader:
        if len(re.findall(r"\w+/\w+/2015\b", smt[2])) > 0:
            a["Primary Type"] = smt[5]
            print(a)

c = collections.Counter(a)
print(c.most_common(3))


Пример того что я получаю на выходе:

{'Primary Type': 'ASSAULT'}
{'Primary Type': 'DECEPTIVE PRACTICE'}
{'Primary Type': 'BURGLARY'}
{'Primary Type': 'DECEPTIVE PRACTICE'}
{'Primary Type': 'HOMICIDE'}
{'Primary Type': 'HOMICIDE'}
{'Primary Type': 'HOMICIDE'}
{'Primary Type': 'HOMICIDE'}
{'Primary Type': 'HOMICIDE'}
[('Primary Type', 'HOMICIDE')]  # тут я ожидаю получить HOMICIDE DECEPTIVE PRACTICE и тд.

    


Ответы

Ответ 1



Поправил, сделал так: import csv import re import collections m = [] with open("Crimes.csv") as f: reader = csv.reader(f) for smt in reader: if len(re.findall(r"\w+/\w+/2015\b", smt[2])) > 0: m.append(smt[5]) c = collections.Counter(m) print(c.most_common(3))

Ответ 2



Модуль Pandas гораздо лучше подходит для решение такого рода задач: import pandas as pd # читаем данные из CSV в Pandas DataFrame filename = r'D:\download\Chicago_Crimes_2012_to_2017.csv' df = pd.read_csv(filename, index_col=0) # фильтруем данные - оставляем только 2015 год df = df[df['Date'].str.contains('\d{2}/\d{2}/2015\s')] показываем top-5 наиболее часто встречающихся в выборке за 2015г. преступлений: print(df['Primary Type'].value_counts().head(5)) результат: THEFT 57292 BATTERY 48904 CRIMINAL DAMAGE 28669 NARCOTICS 23833 OTHER OFFENSE 17534 Name: Primary Type, dtype: int64 тоже самое в виде словаря: print(df['Primary Type'].value_counts().head(5).to_dict()) результат: {'THEFT': 57292, 'BATTERY': 48904, 'CRIMINAL DAMAGE': 28669, 'NARCOTICS': 23833, 'OTHER OFFENSE': 17534}

Возможно ли прописать свое value в input type file?

#javascript #fileupload


Возможно ли добавить свои файлы в input type=file? Имеется ввиду, что записывается
в value, когда файлы были добавлены? Т.к. мне нужна возможность менять файлы, которые
я буду отправлять (У меня идет drag'n'drop и при drop'e файла я создаю свой массив
в который сохраняю fileList и нужно узнать, что из этого массива пойдет в value).
    


Ответы

Ответ 1



*Перевод данного ответа *Это возможно если у вас есть dataTransfer или объект FileList Раньше, Программное изменение файлов через поле input[type=file] было отключено из соображений безопасности но это исправлено в современных браузерах. Firefox, последним из основных браузеров, добавил возможность, позволяющую нам установить файлы для input полей типа file. Так же согласно W3C тестированию, это осуществимо в Google Chrome. Соответствуюзий скриншот и текст из MDN: Вы можете установить, а также получить значение HTMLInputElement.files во всех современных браузерах. Смотри совместимость здесь MDN В Firefox обсуждениях ошибок и исправлений есть демо которое вы можете посмотреть И также исходный код если вы хотите это поредактировать. Снизу представлен исполняемый код из этой ссылки: let target = document.documentElement; let body = document.body; let fileInput = document.querySelector('input'); target.addEventListener('dragover', (e) => { e.preventDefault(); body.classList.add('dragging'); }); target.addEventListener('dragleave', () => { body.classList.remove('dragging'); }); target.addEventListener('drop', (e) => { e.preventDefault(); body.classList.remove('dragging'); fileInput.files = e.dataTransfer.files; }); body { font-family: Roboto, sans-serif; } body.dragging::before { content: "Drop the file(s) anywhere on this page"; position: fixed; left: 0; width: 100%; top: 0; height: 100%; display: flex; justify-content: center; align-items: center; font-size: 1.5em; background-color: rgba(255, 255, 0, .3); pointer-events: none; } button, input { font-family: inherit; } a { color: blue; } JS Bin

Drag and drop files into file input

Supported in WebKit and Blink. To test, drag and drop one or more files from your operating system onto this page.

Важно: Вы можете сделать это только если у вас есть объект FileList или dataTransfer который вы можете установить для элемента входного файла(так как метод не принимает строки в виде обычно текста). Для больше информации смотрите здесь: How to set File objects and length property at FileList object where the files are also reflected at FormData object? Небольшой пример как установить значение для input после того как файл будет сброшен: document.querySelector('.селектор-вашего-поля-для-дропа') .addEventListener('drop', (ev) => { ev.preventDefault(); document.querySelector('.селектор-вашего-input-елемента').files = ev.dataTransfer.files; });

Где указать лицензию MIT для браузерной игры?

#разработка_игр #лицензирование


Суть лицензии в том что просто нужно вставить письмо.

В игре есть пользовательское соглашение и политика конфиденциальности. Также нажав
на правую кнопку перейти в папку source , можно посмотреть код игры, там можно указать
этот текст в текстовом файле.

А какое наказание может быть если эту лицензию не соблюсти?
    


Ответы

Ответ 1



Разместите ссылку рядом со ссылками на пользовательское соглашение, и прям так и назовите "Лицензия MIT". А какое наказание может быть если эту лицензию не соблюсти? Такое же как и за любую другую: запрет на использование и компенсация судебных издержек правообладателя. Возмещение убытка в данном случае не грозит, т.к. код и так предоставляется бесплатно.

Мини графический редактор на canvas и vuex

#javascript #vuejs #инспекция_кода #vuex


Сделал небольшой редактор изображений для изучения возможностей vuex с состояниями. 



Никто не хочет в рамках инспекции кода высказать свои замечания к написанному?

Файл components/Main.vue








Файл store/index.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const ModeEnum = Object.freeze({
  "PointerTool": "Pointer",

  "LineTool": "Line (click canvas to choose start point)",
  "LineToolStartPoint": "Line (click canvas to choose finish point)",

  "CircleTool": "Circle (click canvas to choose center)",
  "CircleToolCenterPoint": "Circle (choose radius)",

  "RectangleTool": "Rectangle (click canvas to set top left corner)",
  "RectangleToolTopLeftCorner": "Rectangle (click canvas to set bottom right corner)",
});

const state = {
  cursor: {
    X: 0,
    Y: 0,
  },
  temporaryPoint: {
    X: 0,
    Y: 0,
  },
  currentMode: ModeEnum.PointerTool,
}

const mutations = {
  coord(state, pos) {
    state.cursor.X = pos.X;
    state.cursor.Y = pos.Y;
  },

  setMode(state, mode) {
    state.currentMode = mode;
  },

  savePointCoordinates(state, pos) {
    state.temporaryPoint.X = pos.X;
    state.temporaryPoint.Y = pos.Y;
  },

  drawLine(state, pos) {
    var canvas = document.getElementById("cnv");
    var context = canvas.getContext("2d");

    context.beginPath();
    context.moveTo(state.temporaryPoint.X, state.temporaryPoint.Y);
    context.lineTo(pos.X, pos.Y);
    context.stroke();
  },

  drawCircle(state, pos) {
    var canvas = document.getElementById("cnv");
    var context = canvas.getContext("2d");

    context.beginPath();
    var radius = Math.sqrt((state.temporaryPoint.X - pos.X) * (state.temporaryPoint.X
- pos.X) + (state.temporaryPoint.Y - pos.Y) * (state.temporaryPoint.Y - pos.Y));
    context.arc(state.temporaryPoint.X, state.temporaryPoint.Y, radius, 0, Math.PI
* 2, false);
    context.strokeStyle = "red";
    context.stroke();
  },

  drawRectangle(state, pos) {
    var canvas = document.getElementById("cnv");
    var context = canvas.getContext("2d");

    context.beginPath();
    context.rect(state.temporaryPoint.X, state.temporaryPoint.Y, pos.X, pos.Y);
    context.stroke();
  },
}

const actions = {
  coord({
    commit
  }, event) {
    var canvas = document.getElementById("cnv");
    var rect = canvas.getBoundingClientRect();
    var pos = {
      X: event.clientX - rect.left,
      Y: event.clientY - rect.top,
    };

    commit('coord', pos);
  },

  setPointerMode: ({
    commit
  }) => commit('setMode', ModeEnum.PointerTool),

  setLineMode: ({
    commit
  }) => commit('setMode', ModeEnum.LineTool),

  setCircleMode: ({
    commit
  }) => commit('setMode', ModeEnum.CircleTool),

  setRectangleMode: ({
    commit
  }) => commit('setMode', ModeEnum.RectangleTool),

  canvas_left_click({
    commit
  }, event) {
    var canvas = document.getElementById("cnv");
    var rect = canvas.getBoundingClientRect();
    var pos = {
      X: event.clientX - rect.left,
      Y: event.clientY - rect.top,
    };

    switch (state.currentMode) {
      case ModeEnum.PointerTool:
        console.log('Current state is: ' + state.currentMode);
        break;

      case ModeEnum.LineTool:
        commit('savePointCoordinates', pos);
        commit('setMode', ModeEnum.LineToolStartPoint);
        break;

      case ModeEnum.LineToolStartPoint:
        commit('drawLine', pos);
        commit('setMode', ModeEnum.LineTool);
        break;

      case ModeEnum.CircleTool:
        commit('savePointCoordinates', pos);
        commit('setMode', ModeEnum.CircleToolCenterPoint);
        break;

      case ModeEnum.CircleToolCenterPoint:
        commit('drawCircle', pos);
        commit('setMode', ModeEnum.CircleTool);
        break;

      case ModeEnum.RectangleTool:
        commit('savePointCoordinates', pos);
        commit('setMode', ModeEnum.RectangleToolTopLeftCorner);
        break;

      case ModeEnum.RectangleToolTopLeftCorner:
        commit('drawRectangle', pos);
        commit('setMode', ModeEnum.RectangleTool);
        break;

      default:
        break;
    }
  },

  destroy() {
    var main = document.getElementById("cnv");
    main.ctx = main.getContext("2d");
    main.ctx.clearRect(0, 0, 600, 300);
  },
}

const getters = {}

export default new Vuex.Store({
  state,
  getters,
  actions,
  mutations
})


Мои собственные заметки:


мне не нравится, что объект canvas фактически не является состоянием. Фактически
приходящие команды рисования изменяют его состояние, верно? Тогда можно было бы вынести
процедуру получения контекста
нормально ли сохранять промежуточные клики (промежуточные переменные между событиями)
во временную переменную, возможно есть какой-то более изящный способ? 

    


Ответы

Ответ 1



Store предназначен только для хранения данных, которые нужны нескольким компонентам. Все, что касается только лишь одного компонента, должно находиться в компонента. Т.е., все методы, которые касаются отрисовки, я бы перенес непосредственно в компонент. Context, соответственно тоже может храниться в компоненте, и тогда не будет необходимости получать его каждый раз. Actions - предназначены для асинхронной работы с хранилищем. Те методы, которые используются у Вас в actions этому не соответствуют. Поэтому я бы их тоже перенес в компонент. Хотя... при работе с canvas, огромные функции, которые управляют холстом я выношу в отдельные файлы и просто импортирую их в компонент. Что касается моделуй в Store, то у меня это выглядит так: файл modules/index.js import person from './person'; import preview from './preview'; import grid from './grid'; import header from './header'; import bigData from './bigData'; import loading from './loading'; export default { person, preview, grid, header, bigData, loading, }; файл index.js import Vue from 'vue'; import Vuex from 'vuex'; import modules from './modules'; Vue.use(Vuex); const store = new Vuex.Store({ modules, }); export default store; как пример, modules/loading.js Модуль отвечает за отображание лоадера при запросах на сервер. const loading = { state: { isLoading: false, }, mutations: { SHOW_LOADING: state => { state.isLoading = true; }, HIDE_LOADING: state => { state.isLoading = false; }, }, }; export default loading; Но Vue очень гибок, и все что я сказал - это только лишь моя практика. Каждый может делать так, как ему будет удобно.

Чем отличаются функции _vsnprintf() и vsnprintf()

#c #mingw


Я использую компиляторы MinGW и не могу понять, в чем разница между названными функциями.
Попытался разобраться в комментариях заголовочных файлов MinGW, но смысл там написанного
от меня ускользает.

Например, использование Sleep() в MinGW часто приводит к повреждению кучи/стека,
поэтому рекомендуют использовать _sleep().

Функции _vsnprintf() и vsnprintf() тоже чем-то отличаются?
    


Ответы

Ответ 1



vsnprintf используется начиная с Visual Studio 2015 и соответствует стандарту C99; _vnsprintf осталась для обратной совместимости со старыми версиями Visual Studio. Источник

Определить xpath locator элемента на странице

#python #selenium #xpath




Мне нужно проверить/убедиться, что текст "(carrier specific)" существует и лежит
в нужном месте.

Я делаю

try: self.assertEqual("(carrier specific)", sel.get_table("//form/fieldset[4]/table.2.1"))


но он никак не хочет "подцепить" этот текст (обращается к пустому полю National prefix,
но не к тексту сразу за ним). Мне нужно как-то определить локейшн этого текста на страничке,
т.е. обратиться к этому элементу через xpath/css.

Dialing Location


Ответы

Ответ 1



xpath для получения текста из описанной вами ноды: //input[@name='dl-ntp']/../text()[boolean(string-length(normalize-space(.)))] xpath для проверки совпадения ожидаемого текста в описанной ноде: //input[@name='dl-ntp']/ancestor::*[1][contains(.,'carrier specific')] Если используете python, то может пригодиться: driver.execute_script("return document.evaluate('//input[@name='dl-ntp']/../text()[boolean(string-length(normalize-space(.)))]', document, null, XPathResult.ANY_TYPE, null).iterateNext().data")

Вычислить координаты ортогональной проекции точки на отрезок

#javascript #математика #геометрия


Проект для создания чертежей в svg, на нативном js. 

Столкнулся со следующей задачей:

Известны координаты 3х точек A B C на плоскости. Точки A B являются началом и концом
отрезка AB. Нужно найти координаты ортогональной проекции (точка D) точки С на отрезок
АВ. Как это сделать?
    


Ответы

Ответ 1



Проекцию можно найти, используя скалярное произведение векторов D = A + AB * Dot(AC, AB) / Dot(AB, AB) В псевдокоде: abx = B.X - A.X aby = B.Y - A.Y dacab = (C.X - A.X) * abx + (C.Y - A.Y) * aby dab = abx * abx + aby * aby t = dacab / dab D.X = A.X + abx * t D.Y = A.Y + aby * t Здесь немного другие обозначения (C=P, N=D) и пояснения

Ответ 2



Метод "пересечения": Если построить точку С' = (Cx - (By - Ay), Cy + (Bx - Ax)), то прямая CC' будет перпендикулярна прямой AB. Пересечение прямых AB и CC' даст вам точку D. Метод "тяжеловат" с вычислительной точки зрения из-за того, что использует пересечение двух прямых в качестве примитива. Но прост в реализации, если такой примитив уже есть под руками. Метод "расстояния": Если AA, BB и CC - коэффициенты уравнения прямой, содержащей отрезок AB (легко вычисляются через координаты точек A и B), то величина DD = AA * Cx + BB * Cy + CC даст вам знаковое расстояние от этой прямой до точки C, домноженное на |(AA, BB)|. Если к точке C прибавить вектор DD * (-AA, -BB), то мы получим точку, которая смещена относительно C в правильном направлении, но, условно выражаясь, "слишком далеко": расстояние превышает требуемое в |(AA, BB)|^2 раз. Достаточно разделить смещение на эту величину - мы получим требуемую точку D DD D = C + ------------ * (-AA, -BB) |(AA, BB)|^2 Этот метод тоже несколько громоздок из-за "лишних" вычислений уравнения прямой, но может быть полезен, если вы и так уже знаете/вычисляете уравнение прямой, а также если вам в дополнение к точке проекции нужно еще вычислять и расстояние от C до AB. Метод "скалярного произведения": Очевидно, что |(A, D)| D = A + -------- * (A, B) |(A, B)| При этом скалярное произведение вектора (A, C) на вектор (A, B) - это длина проекции (A, D), домноженная на |(A, B)|. (A, C)•(A, B) = |(A, D)| * |(A, B)| Тогда (A, C)•(A, B) D = A + ------------- * (A, B) |(A, B)|^2 (Можно показать, что если собрать все вычисления второго метода в одну формулу, то она "сократится" до третьего метода.)

Почему переменная undefined в функции?

#javascript #jquery


Объясните, пожалуйста, почему в переменная a в функции makeDiv получает undefined? 



        var a=10000;
    (function makeDiv(a){
    		var b=a+1000;
        var divsize = ((Math.random()*100) + 50).toFixed();
        var color = '#'+ Math.round(0xffffff * Math.random()).toString(16);
        $newdiv = $('
').css({ 'width':'50px', 'height':'50px', 'background-color': color }); var posx = (Math.random() * ($(document).width() - divsize)).toFixed(); var posy = (Math.random() * ($(document).height() - divsize)).toFixed(); $newdiv.css({ 'position':'absolute', 'left':posx+'px', 'top':posy+'px', 'display':'none' }).appendTo( 'body' ).fadeIn(100).delay(1000).fadeOut(200, function(){ $(this).remove(); makeDiv(); }); console.log(a); })();


Ответы

Ответ 1



Внутри функции у Вас переменная а - это параметр, который Вы не подаете в вызов функции. var a = 10000; (function makeDiv(/* do not redefine "a" by declaring parameter of the same name */) { var b = a + 1000; console.log(a, b); })(); или var a = 10000; (function makeDiv(a) { var b = a + 1000; console.log(a, b); })(a /* pass global "a" as parameter "a" - they may have different names */);

Как в pandas применить метод rolling к нескольким столбцам DataFrame?

#python #python_3x #pandas #dataframe


Подскажите, как правильнее скользящим окном пройтись по датафрейму для нескольких
столбцов? Окно например 3х3.

Я хочу вычислять максимум из значений попадающих в это окно и записать их в новый
столбец. Вот мой код в несколько действий:

x = pd.Series([1, 4, 3, 2, 1, 6, 2, 8, 3, 0, 1, 2, 1, 5])

df = pd.DataFrame({"A": x**2+8, "B": x*8, "C": x+34})
df[['maxA','maxB','maxC']]  = df.loc[:,'A':'C'].rolling(3).max()
df['Max_ABC']  = df.loc[:,['maxA','maxB','maxC']].max(axis=1)

df


Сейчас я использую промежуточное вычисление как на рисунке, используя столбцы ['maxA','maxB','maxC']
только для получения промежуточного результата. Мне видится что это лишний шаг вычисления,
и наверное есть более простой способ решения.


Знаете ли более пандовский метод для работы со скользящим окном, чтобы получить сразу
нужный столбец как на рисунке ниже?


    


Ответы

Ответ 1



In [46]: df['Max_ABC'] = df[['A','B','C']].rolling(3).max().max(axis='columns') In [47]: df Out[47]: A B C Max_ABC 0 9 8 35 NaN 1 12 16 36 NaN 2 17 24 37 37.0 3 24 32 38 38.0 4 33 40 39 40.0 5 44 48 40 48.0 6 57 56 41 57.0 7 72 64 42 72.0 Пояснение: df[['A','B','C']].rolling(3).max() - возвращает максимумы в скользящем окне для всех указанных столбцов: In [51]: df[['A','B','C']].rolling(3).max() Out[51]: A B C 0 NaN NaN NaN 1 NaN NaN NaN 2 17.0 24.0 37.0 3 24.0 32.0 38.0 4 33.0 40.0 39.0 5 44.0 48.0 40.0 6 57.0 56.0 41.0 7 72.0 64.0 42.0 далее мы выбираем максимум для каждой строки, указав axis='columns': In [52]: df[['A','B','C']].rolling(3).max().max(axis='columns') Out[52]: 0 NaN 1 NaN 2 37.0 3 38.0 4 40.0 5 48.0 6 57.0 7 72.0 dtype: float64

National Prefix (carrier specific)