Public
Edited
Dec 9, 2022
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
{
var div = DOM.element('div');
div.innerHTML = `<style>.observablehq p{font-size:16px;}</style>`
return div;
}


Insert cell
groupingValue
Insert cell
function gFunc() {
switch (groupingValue) {
case "median":
return d3.median;
case "average":
return d3.mean;
}

return d3.mean;
}
Insert cell
Insert cell
d3
.nest()
.key((d) => d["GPA"])
.rollup((arr) => Math.round(gFunc()(arr, (d) => d.revenue)))
.entries(ვალიდური_შემოსავლებიანები)
.filter((d) => Number(d.key.split("-")[0]))
.sort((a, b) => (a.key > b.key ? 1 : -1))
Insert cell
GPA_განაწილება = d3
.nest()
.key((d) => d["GPA"])
//.rollup(arr=> Math.round(d3.mean(arr,d=>d.revenue)))
.rollup((d) => {
return {
revenue: Math.round(gFunc()(d, (v) => v.revenue)),
count: d.length
};
})
.entries(ვალიდური_შემოსავლებიანები)
.filter((d) => d.value.count >= 5)
.filter((d) => Number(d.key.split("-")[0]))
.sort((a, b) => (a.key > b.key ? 1 : -1))
Insert cell
უნარების_განაწილება = d3
.nest()
.key((d) => d["NationalSkillExamPoints"])
//.rollup(arr=> Math.round(d3.mean(arr,d=>d.revenue)))
.rollup((d) => {
return {
revenue: Math.round(gFunc()(d, (v) => v.revenue)),
count: d.length
};
})
.entries(ვალიდური_შემოსავლებიანები)
.filter((d) => d.key)
.filter((d) => d.key != "ჩემ დროს არ იყო")
.filter((d) => d.key != "ჯერ არ ჩამიბარებია")
.filter((d) => d.key != "არ უპასუხია")
.filter((d) => d.value.count >= 5)

.sort((a, b) => (a.key > b.key ? 1 : -1))
Insert cell
Insert cell
სორს_კონტროლის_ტიპით_დაჯგუფებული = d3
.nest()
.key((d) => d["SourceControl"])
.entries(ვალიდური_შემოსავლებიანები)
.filter((d) => d.key)
.filter((d) => d.key != "არ უპასუხია")
Insert cell
სორს_კონტროლით_დაჯგუფებული = d3
.nest()
.key((d) =>
d.key == "არ ვიყენებთ"
? "არ ვიყენებთ source control-ს"
: "ვიყენებთ source control-ს"
)
.rollup((d) =>
Math.round(
gFunc()(
d.map((v) => v.values).reduce((a, b) => a.concat(b)),
(mn) => mn.revenue
)
)
)
.entries(სორს_კონტროლის_ტიპით_დაჯგუფებული)
.sort((a, b) => (a.key > b.key ? 1 : -1))
Insert cell
ტესტერების_ტიპით_დაჯგუფებული = d3
.nest()
.key((d) => d["HasTesters"])
.entries(ვალიდური_შემოსავლებიანები)
.filter((d) => d.key != "არ უპასუხია")
Insert cell
ტესტერებით_დაჯგუფებული = d3
.nest()
.key((d) => (d.key == "არა" ? "არ გვყავს ტესტერები" : "გვყავს ტესტერები"))
.rollup((d) =>
Math.round(
gFunc()(
d.map((v) => v.values).reduce((a, b) => a.concat(b)),
(mn) => mn.revenue
)
)
)
.entries(ტესტერების_ტიპით_დაჯგუფებული)
.sort((a, b) => (a.key > b.key ? 1 : -1))
Insert cell
CI_ტიპით_დაჯგუფებული = d3
.nest()
.key((d) => d["CI"])
.entries(ვალიდური_შემოსავლებიანები)
.filter((d) => d.key != "არ მაქვს account")
.filter((d) => d.key != "არ უპასუხია")
.filter((d) => d.key)
Insert cell
CIით_დაჯგუფებული = d3
.nest()
.key((d) => (d.key == "არ ვიყენებთ" ? "არ ვიყენებთ CI-ს" : "ვიყენებთ CI-ს"))
.rollup((d) =>
Math.round(
gFunc()(
d.map((v) => v.values).reduce((a, b) => a.concat(b)),
(mn) => mn.revenue
)
)
)
.entries(CI_ტიპით_დაჯგუფებული)
.sort((a, b) => (a.key > b.key ? 1 : -1))
Insert cell
so_ტიპით_დაჯგუფებული = d3
.nest()
.key((d) => d["StackoverflowPoints"])
.entries(ვალიდური_შემოსავლებიანები)
.filter((d) => d.key != "არ მაქვს account")
.filter((d) => d.key != "არ უპასუხია")
.filter((d) => d.key)
Insert cell
SOით_დაჯგუფებული = d3
.nest()
.key((d) =>
d.key == "0-10" || d.key == "არ ვარ აქტიური stackoverflow-ში"
? "stackoverflow ქულა < 10 "
: "stackoverflow ქულა > 10 "
)
.rollup((d) =>
Math.round(
gFunc()(
d.map((v) => v.values).reduce((a, b) => a.concat(b)),
(mn) => mn.revenue
)
)
)
.entries(so_ტიპით_დაჯგუფებული)
.sort((a, b) => (a.key > b.key ? 1 : -1))
Insert cell
gh_ტიპით_დაჯგუფებული = d3
.nest()
.key((d) => d["GithubStars"])
.entries(ვალიდური_შემოსავლებიანები)
.filter((d) => d.key != "არ მაქვს account")
.filter((d) => d.key != "არ უპასუხია")
.filter((d) => d.key)
Insert cell
ghით_დაჯგუფებული = d3
.nest()
.key((d) => (d.key == "0-10" ? "github stars < 10 " : "github stars > 10 "))
.rollup((d) =>
Math.round(
gFunc()(
d.map((v) => v.values).reduce((a, b) => a.concat(b)),
(mn) => mn.revenue
)
)
)
.entries(gh_ტიპით_დაჯგუფებული)
.sort((a, b) => (a.key > b.key ? 1 : -1))
Insert cell
შეერთებული_software_practice_შედეგები = [
სორს_კონტროლით_დაჯგუფებული,
ტესტერებით_დაჯგუფებული,
CIით_დაჯგუფებული,
SOით_დაჯგუფებული,
ghით_დაჯგუფებული
]
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
კომენტარები = საწყისი_მონაცემები_გადმოწერილი.filter((d) =>
d["InformationTechProgressActions"].trim()
)
Insert cell
gainNewGenerationInterest = საწყისი_მონაცემები_გადმოწერილი.filter((d) =>
d["GainNewGenerationInterest"].trim()
)
Insert cell
Insert cell
საწყისი_მონაცემები_გადმოწერილი = new Promise((r) =>
d3.csv(
"https://docs.google.com/spreadsheets/d/e/2PACX-1vQP9Xmy7JxnS6KmW6_jfjZT4BklNdVF5SQZyBkX5t0m-F8ZTltkmSDTr3Wbf4hEs84fdNJkwWJscjyU/pub?output=csv",
(dt) => r(dt)
)
)
Insert cell
საწყისი_მონაცემები = საწყისი_მონაცემები_გადმოწერილი.filter((d) => {
if (filterValue == "all") return true;

if (filterValue == "full_time_local") {
return (
(d["JobType"] == "Office - Local Projects" ||
d["JobType"] == "Remote - Local Projects") &&
d["WorkType"] != "არ ვარ დასაქმებული"
);
}
if ("remote_international") {
return (
(d["JobType"] == "Office - International Projects" ||
d["JobType"] == "Remote - International Projects") &&
d["WorkType"] != "არ ვარ დასაქმებული"
);
}
return true;
})
Insert cell
Insert cell
ენებით_დაჯგუფებული_შემოსავლიანები = d3
.nest()
.key((d) => d["CurrentLanguage"])
.rollup((d) => {
return {
revenue: Math.round(gFunc()(d, (v) => v.revenue)),
count: d.length
};
})
.entries(ვალიდური_შემოსავლებიანები)
.slice()
.filter((d) => d.key)
.filter((d) => d.key != "არ უპასუხია")
.filter((d) => d.key != "არც ერთს")
.filter((d) => d.key.length < 15)
.filter((d) => d.value.count > 3)
.sort((a, b) => (a.value.revenue > b.value.revenue ? 1 : -1))
.reverse()
Insert cell
ფრეიმვორქებით_დაჯგუფებული_შემოსავლიანები = d3
.nest()
.key((d) => d["MainFramework"])
.rollup((d) => {
return {
revenue: Math.round(gFunc()(d, (v) => v.revenue)),
count: d.length
};
})
.entries(ვალიდური_შემოსავლებიანები)
.filter((d) => d.key)
.filter((d) => d.key != "არც ერთს")
.filter((d) => d.key != "არ უპასუხია")
.slice()
.filter((d) => d.value.count > 3)
.sort((a, b) => (a.value.revenue > b.value.revenue ? 1 : -1))
.reverse()
Insert cell
function getRotation(d) {
var centerAngle = (d.startAngle + d.endAngle) / 2;
var grad = (centerAngle / Math.PI) * 180;
if (grad < 180) {
grad -= 90;
} else {
grad += 90;
}
return Math.round(grad);
}
Insert cell
ენების_განაწილება = d3
.nest()
.key((d) => d["CurrentLanguage"].toUpperCase())
.rollup((d) => d.length)
.entries(საწყისი_მონაცემები)
.filter((d) => d.key)
.slice()
.sort((a, b) => (a.value > b.value ? 1 : -1))
.reverse()
Insert cell
ენების_განაწილება_ჯამი = d3.sum(ენების_განაწილება,d=>d.value)
Insert cell
ენების_განაწილება_სხვათი = ენების_განაწილება
.slice(0,4)
.concat([{
key:"სხვები",
value:d3.sum(ენების_განაწილება.filter((d,i)=>i>=4),v=>v.value)
}])
.map(d=>Object.assign({},d,{value:Math.round(d.value/ენების_განაწილება_ჯამი*100)}))
Insert cell
ფრეიმვორქების_განაწილება = d3
.nest()
.key((d) => d["MainFramework"].toUpperCase())
.rollup((d) => d.length)
.entries(საწყისი_მონაცემები)
.filter((d) => d.key)
.filter((d) => d.key != "ᲐᲠᲪ ᲔᲠᲗᲡ")
.slice()
.sort((a, b) => (a.value > b.value ? 1 : -1))
.reverse()
Insert cell
ფრეიმვორქების_განაწილება_ჯამი = d3.sum(ფრეიმვორქების_განაწილება,d=>d.value)
Insert cell
ფრეიმვორქების_განაწილება_სხვათი = ფრეიმვორქების_განაწილება
.slice(0,4)
.concat([{
key:"სხვები",
value:d3.sum(ფრეიმვორქების_განაწილება.filter((d,i)=>i>=4),v=>v.value)
}])
.map(d=>Object.assign({},d,{value:Math.round(d.value/ფრეიმვორქების_განაწილება_ჯამი*100)}))
Insert cell
Insert cell
ასაკის_რაოდენობები = d3
.nest()
.key((d) => d["Age"])
.rollup((d) => d.length)
.entries(საწყისი_მონაცემები)
.slice()
.sort((a, b) => (a.value < b.value ? 1 : -1))
.filter((d) => d.key)
Insert cell
დალაგებული_ასაკები = ასაკის_რაოდენობები.slice().sort((a,b)=> a.key>b.key?1:-1)
Insert cell
ასაკის_სიჭარბე = ასაკის_რაოდენობები[0].key
Insert cell
ასაკით_დაჯგუფებული_შემოსავლიანები = d3
.nest()
.key((d) => d["Age"])
.rollup((d) => {
return {
revenue: Math.round(gFunc()(d, (v) => v.revenue)),
count: d.length
};
})
.entries(ვალიდური_შემოსავლებიანები)
.slice()
.filter((d) => d.value.count >= 5)
.sort((a, b) => (a.value.revenue < b.value.revenue ? 1 : -1))
Insert cell
მაქს_ასაკის_რაოდენობა = ასაკის_რაოდენობები[0].value
Insert cell
ასაკით_დალაგებული_შემოსავლიანები=ასაკით_დაჯგუფებული_შემოსავლიანები
.slice()
.sort((a,b)=>a.key>b.key?1:-1)
Insert cell
მაქს_შემოსავლიანი_ასაკი = ასაკით_დაჯგუფებული_შემოსავლიანები[0].key
Insert cell
მაქს_შემოსავლიანი_ასაკის_შემოსავალი = ასაკით_დაჯგუფებული_შემოსავლიანები[0].value
Insert cell
Insert cell
გამოცდილებით_დაჯგუფებული_შემოსავლიანები = d3
.nest()
.key((d) => d["Experience"])
.rollup((d) => {
return {
revenue: Math.round(gFunc()(d, (v) => v.revenue)),
count: d.length
};
})
.entries(ვალიდური_შემოსავლებიანები)
.slice()
.filter((d) => d.value.count > 4)
.sort((a, b) => (a.value.revenue < b.value.revenue ? 1 : -1))
Insert cell
გამოცდილებით_დალაგებული_შემოსავლიანები = გამოცდილებით_დაჯგუფებული_შემოსავლიანები
.slice()
.filter((d) => d.key != "არ მაქვს")
.filter((d) => d.value.count > 4)
.sort((a, b) =>
Number(a.key.split("-")[0]) < Number(b.key.split("-")[0]) ? 1 : -1
)
Insert cell
მაქს_შემოსავლიანი_გამოცდილება = გამოცდილებით_დაჯგუფებული_შემოსავლიანები[0].key
Insert cell
მაქს_შემოსავლიანი_გამოცდილების_შემოსავალი = გამოცდილებით_დაჯგუფებული_შემოსავლიანები[0].value
Insert cell
Insert cell
სქესები = d3
.nest()
.key((d) => d["Sex"])
.entries(ვალიდური_შემოსავლებიანები)
.filter((d) => d.key)
.filter((d) => d.key != "არ უპასუხია")
.sort((a, b) => (a.key > b.key ? 1 : -1))
Insert cell
შემოსავლები_სქესის_მიხედვით = d3
.nest()
.key((d) => d["Sex"])
.rollup((d) => {
return {
revenue: Math.round(gFunc()(d, (v) => v.revenue)),
count: d.length
};
})
.entries(ვალიდური_შემოსავლებიანები)
.filter((d) => d.key)
.filter((d) => d.key != "არ უპასუხია")
.sort((d) => d.key)
Insert cell
Insert cell
დასაქმებული_რესპონდენტები
Insert cell
ვალიდური_შემოსავლებიანები = დასაქმებული_რესპონდენტები
.slice()
.map(d=>Object.assign({revenue:getAverageRevenue(d)},d))
.filter(d=>d.revenue)
.filter(d=>d.revenue<20000) // filter too big ones
Insert cell
ვალიდური_შემოსავლიანები_მდედრობითი = ვალიდური_შემოსავლებიანები.filter(
(d) => d["Sex"] == "მდედრობითი"
)
Insert cell
function getAverageRevenue(response) {
var rev = response["AverageMonthlyRevenueInGel"];
var res = rev.replace(/k/g, "000");
var ranges = res.split("-");
var min = Number(ranges[0]);
var max = Number(ranges[1]);
return (min + max) / 2;
}
Insert cell
საშუალო_შემოსავალი = Math.round(
gFunc()(ვალიდური_შემოსავლებიანები, (d) => d.revenue)
)
Insert cell
Insert cell
დასაქმებული_რესპონდენტები = საწყისი_მონაცემები.filter((d) => {
return d["WorkType"] != "არ ვარ დასაქმებული";
})
Insert cell
import { wrangle } from "@bumbeishvili/utils"
Insert cell
wrangle(საწყისი_მონაცემები)
Insert cell
დასაქმებულთა_პროცენტი = Math.round(დასაქმებული_რესპონდენტები.length/საწყისი_მონაცემები.length*100)
Insert cell
Insert cell
import {load,requireFromGithub} from "@bumbeishvili/fetcher"
Insert cell
d3 = require("d3@v4")
Insert cell
dc.d3.version
Insert cell
dc = require('dc@3.1.9')
Insert cell
import {radio} from "@jashkenas/inputs"
Insert cell
//dc = require("https://unpkg.com/dc@3.1.9/dc.js")
Insert cell
crossfilter = await require("crossfilter2@1.4.6");
Insert cell
windowCrossfilter = {
window.crossfilter = crossfilter;
return "window-crossfilter"
}
Insert cell
style = html`<style>
p{
font-size:14px;
}
</style>`
Insert cell
InjectDcCss = {
var div = DOM.element('div');
div.innerHTML = '<link rel="stylesheet" type="text/css" href="https://unpkg.com/dc@3.0.0-beta.1/dc.css">'
return div;
}
Insert cell
Insert cell
function container() {
return `
<h1>მედიანური/საშუალო ანაზღაურება (ლარი)</h1>
<div>
<div class="dc-wrapper-second">
<div id="gender">
<h3> სქესით</h3>
</div>
<div id="age">
<h3> ასაკით</h3>
</div>
<div id="workExperience">
<h3> გამოცდილებით</h3>
</div>
<div id="category">
<h3> კატეგორიით </h3>
</div>
<div id="language">
<h3> პროგ. ენით </h3>
</div>
<div id="cloud">
<h3> ღრუბლოვანით </h3>
</div>
<div id="frameworks">
<h3> ფრეიმვორქით </h3>
</div>
<div id="sourceControl">
<h3> src. control</h3>
</div>
<div id="testers">
<h3> ტესტერებით</h3>
</div>
<div id="ci">
<h3> CI-ით</h3>
</div>
<div id="stackoverflow">
<h3> Stackoverflow-ით</h3>
</div>

<div id="github">
<h3> Github-ით </h3>
</div>

<div id="jobType">
<h3> დასაქმებით </h3>
</div>

<div id="workType">
<h3> სამუშაოთი </h3>
</div>

<div id="workLang">
<h3> სამუშაო ენით</h3>
</div>

<div id="orgType">
<h3> სფეროთი</h3>
</div>

<div id="hours">
<h3> დრო (სთ/თვე) </h3>
</div>

<div id="countryRevenue">
<h3> შემოსავლებით </h3>
</div>



<div id="locCountry">
<h3>მდებარეობით </h3>
</div>

<div id="satisfaction">
<h3>სამუშაოს კმაყოფილებით</h3>
</div>

<div id="desiredRevenue">
<h3>შესაფერისი ხელფასით</h3>
</div>


<div id="covid19">
<h3>პანდემიის გავლენით</h3>
</div>

<div id="gpa">
<h3>GPA-ით</h3>
</div>


<div id="points">
<h3>უნარებით </h3>
</div>

<div id="eduLevel">
<h3>განათლების დონით</h3>
</div>

<div id="workStation">
<h3>კომპიუტერით</h3>
</div>


<div id="compOrigin">
<h3>მოდელით</h3>
</div>

<div id="ram">
<h3>ოპერატიულით</h3>
</div>


<div id="memory">
<h3>მეხსიერებით</h3>
</div>

</div>
</div>

<hr style="clear:both;">
`;
}
Insert cell
dcConfigs = [
{
selector: "memory",
group: "Memory"
},
{
selector: "ram",
group: "RAM"
},

{
selector: "compOrigin",
group: "ComputerModel"
},
{
selector: "workStation",
group: "LaptopDesktop"
},
{
selector: "eduLevel",
group: "EducationLevel"
},
{
selector: "points",
group: "NationalSkillExamPoints"
},
{
selector: "gpa",
group: "GPA"
},
{
selector: "covid19",
group: "CovidSalaryInfluence"
},
{
selector: "desiredRevenue",
group: "DeservedSalaryOpinion"
},
{
selector: "satisfaction",
group: "CurrentJobSatisfaction"
},
{
selector: "hours",
group: "AverageMonthlyWorkHours"
},
{
selector: "locCountry",
group: "PhysicalLocation"
},
{
selector: "countryRevenue",
group: "CountryWithMostRevenue"
},

{
selector: "orgType",
group: "MainEmployerCategory"
},
{
selector: "workLang",
group: "WorkingLanguage"
},
{
selector: "workType",
group: "WorkType"
},
{
selector: "jobType",
group: "JobType"
},
{
selector: "github",
group: "GithubStars"
},
{
selector: "stackoverflow",
group: "StackoverflowPoints"
},
{
selector: "ci",
group: "CI"
},
{
selector: "testers",
group: "HasTesters"
},
{
selector: "sourceControl",
group: "SourceControl"
},
{
selector: "language",
group: "CurrentLanguage"
},
{
selector: "frameworks",
group: "MainFramework"
},
{
selector: "cloud",
group: "CloudUsage"
},
{
selector: "category",
group: "Category"
},
{
selector: "workExperience",
group: "Experience"
},
{
selector: "gender",
group: "Sex"
},
{
selector: "age",
group: "Age"
}
]
Insert cell
year = {
const date = new Date();
date.setMonth(date.getMonth() + 2);
return date.getFullYear();
}
Insert cell
<style>
.observablehq {
display: flex;
justify-content: center;
}

.observablehq form{
max-width: 646px;
}
</style>
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more