public void SaveAffinityIndex(AffinityIndexResult result, string userId, string name) { using (var ms = new MemoryStream()) { var binaryFormatter = new BinaryFormatter(); binaryFormatter.Serialize(ms, result); byte[] rr = ms.GetBuffer(); var cntx = new BaseDb(); cntx.VkAffinityIndexResults.Add(new VkAffinityIndexResults { UserId = userId, Name = name, CollectionDate = DateTime.Now, Result = rr }); cntx.SaveChanges(); } }
public AffinityIndexResult GetResult(int id) { var resultDb = _vkDbService.GetAffinityIndexResult(id); var result = new AffinityIndexResult(); try { var formatter = new BinaryFormatter(); using (var ms = new MemoryStream(resultDb.Result)) { result = (AffinityIndexResult)formatter.Deserialize(ms); } } catch (Exception ex) { } return(result); }
public void Start(IEnumerable <AffinityIndexOptionsAuditoryModel> audiencesUnderAnalysis, AffinityIndexOptionsAuditoryModel comparativeAudience, string accountId, string clientId, string accessToken, string userId, string name) { var result = new AffinityIndexResult { ComparativeAudience = comparativeAudience.Name }; var categories = GetCategories(accessToken); categories.ForEach(cat => result.Results.Add(new AffinityIndexCounter { Category = cat.Name, CategoryId = cat.Id })); //Сравнительная аудитория //Общая кампания для запроса var affinityIndexCampaign = CreateCampaign(accountId, clientId, accessToken, "common"); var allCategories = string.Join(",", categories.Select(c => c.Id)); var commonСomparativeAd = CreateAd(accountId, accessToken, affinityIndexCampaign.Id, comparativeAudience.Gender, comparativeAudience.AgesFrom, comparativeAudience.AgesUpTo, comparativeAudience.Status, comparativeAudience.InterestGroupIds, comparativeAudience.ExcludeInterestGroupIds, allCategories, comparativeAudience.Country, comparativeAudience.Cities, comparativeAudience.ExcludeCities, comparativeAudience.RetargetGroupIds, comparativeAudience.ExcludeRetargetGroupIds); var commonСomparativeTargeting = GetAdTarget(accountId, clientId, string.Format("[{0}]", commonСomparativeAd.Id), accessToken); if (!string.IsNullOrEmpty(commonСomparativeTargeting.ErrorDesc)) { result.ErrorMessage = string.Format( "Выбранные Вами параметры настроек для аудитории {0} содержат в себе слишком мало людей для анализа.", comparativeAudience.Name); } //Анализируемые аудтиории if (string.IsNullOrEmpty(result.ErrorMessage)) { foreach (var audience in audiencesUnderAnalysis) { result.Audience = audience.Name; var commonAd = CreateAd(accountId, accessToken, affinityIndexCampaign.Id, audience.Gender, audience.AgesFrom, audience.AgesUpTo, audience.Status, audience.InterestGroupIds, audience.ExcludeInterestGroupIds, allCategories, audience.Country, audience.Cities, audience.ExcludeCities, audience.RetargetGroupIds, audience.ExcludeRetargetGroupIds); var commonTargeting = GetAdTarget(accountId, clientId, string.Format("[{0}]", commonAd.Id), accessToken); if (!string.IsNullOrEmpty(commonTargeting.ErrorDesc)) { continue; } foreach (var category in categories) { var categoryAd = CreateAd(accountId, accessToken, affinityIndexCampaign.Id, audience.Gender, audience.AgesFrom, audience.AgesUpTo, audience.Status, audience.InterestGroupIds, audience.ExcludeInterestGroupIds, category.Id.ToString(), audience.Country, audience.Cities, audience.ExcludeCities, audience.RetargetGroupIds, audience.ExcludeRetargetGroupIds); if (!string.IsNullOrEmpty(categoryAd.ErrorDesc)) { continue; } var categoryTargeting = GetAdTarget(accountId, clientId, string.Format("[{0}]", categoryAd.Id), accessToken); result.Results.First(f => f.CategoryId == category.Id).Audience1Abs = categoryTargeting.Count; result.Results.First(f => f.CategoryId == category.Id).Audience1Result = (decimal)categoryTargeting.Count / (decimal)commonTargeting.Count; } } //Выгрузка категорий сравнительной аудитории foreach (var category in categories) { if (result.Results.All(f => f.Audience1Result == 0)) { continue; } var categoryAd = CreateAd(accountId, accessToken, affinityIndexCampaign.Id, comparativeAudience.Gender, comparativeAudience.AgesFrom, comparativeAudience.AgesUpTo, comparativeAudience.Status, comparativeAudience.InterestGroupIds, comparativeAudience.ExcludeInterestGroupIds, category.Id.ToString(), comparativeAudience.Country, comparativeAudience.Cities, comparativeAudience.ExcludeCities, comparativeAudience.RetargetGroupIds, comparativeAudience.ExcludeRetargetGroupIds); if (!string.IsNullOrEmpty(categoryAd.ErrorDesc)) { continue; } var categoryTargeting = GetAdTarget(accountId, clientId, string.Format("[{0}]", categoryAd.Id), accessToken); result.Results.First(f => f.CategoryId == category.Id).Audience2Abs = categoryTargeting.Count; result.Results.First(f => f.CategoryId == category.Id).Audience2Result = (decimal)categoryTargeting.Count / (decimal)commonСomparativeTargeting.Count; } result.Results.Where(w => w.Audience1Result != 0 && w.Audience2Result != 0).ForEach(f => f.Index = f.Audience1Result / f.Audience2Result); } result.DateOfCollection = DateTime.Now; _vkDbService.SaveAffinityIndex(result, userId, name); }