Public
Edited
Apr 22
Insert cell
Insert cell
data = (await FileAttachment("tender_dates@1.csv").csv()).map((d) => {
return {
...d,
difference: +d.difference > 40000 ? 40000 : +d.difference,
amount: +d["Сума лота"],
oblast:
d["Регіон організатора"] == "Миколаївська"
? "Миколаївська"
: "Решта областей"
};
})
// .filter((d) => d.difference < 60 * 24 * 7)
Insert cell
vis1 = html`
<h3>Миколаївщина - лідер за швидкістю подачі документів бізнесом на будівельні тендери</h3>
<div style="display: grid; grid-template-columns: repeat(1, 1fr); gap: 10px; align-items: start;">
<div>${vis1_}</div>
<small>Дані: Модуль аналітики bi.prozorro.org</small>
</div>
`
Insert cell
Insert cell
data2 = width > 650
? data
.map((d) => {
return {
// ...d,
"Ідентифікатор лота": d["Ідентифікатор лота"].replace(/-L1/, ""),
Організатор: d["Організатор"],
// "Регіон організатора": d["Регіон організатора"],
// Постачальник: d["Постачальник"],
// Дата: d["Дата"],
"Сума лота": d["Сума лота"],
"Хвилин до подачі перших документів": d.difference
};
})
.sort(
(a, b) =>
a["Хвилин до подачі перших документів"] -
b["Хвилин до подачі перших документів"]
)
.filter((d) => d["Хвилин до подачі перших документів"] < 100)
: data
.map((d) => {
return {
// ...d,
"Ідентифікатор лота": d["Ідентифікатор лота"].replace(/-L1/, ""),
// Організатор: d["Організатор"],
// Постачальник: d["Постачальник"],
// "Сума лота": d["Сума лота"],
"Хвилин до подачі перших документів": d.difference
};
})
.sort(
(a, b) =>
a["Хвилин до подачі перших документів"] -
b["Хвилин до подачі перших документів"]
)
.filter((d) => d["Хвилин до подачі перших документів"] < 100)
Insert cell
vis_ = Inputs.table(data2)
Insert cell
vis2 = html`
<h3>Тендери в Миколаївській області, відсортовані за швикістю подачі документів учасниками, в хвилинах</h3>
<div style="display: grid; grid-template-columns: repeat(1, 1fr); gap: 10px; align-items: start;">
<div>${vis_}</div>
<small>Днів на подачу перших документів учасниками в Миколаївській області</small>
</div>
`
Insert cell
Plot.plot({
// height: 1020,
marginBottom: 40,
width: width > 650 ? 650 : 350,
x: { type: "point", align: 0, axis: "top", tickSize: 0 },
axis: null,
marks: [
Plot.text(data2, {
y: (d, i) => 1 + i, // paragraph number
x: 1,
// lineWidth: 20,
// frameAnchor: "top",
textAnchor: "start",
text: (d) => d["Ідентифікатор лота"]
}),
// Plot.text(data2, {
// y: (d, i) => 1 + i, // paragraph number
// x: 2,
// lineWidth: 20,
// textAnchor: "start",
// text: (d) => d["Організатор"]
// }),
Plot.text(data2, {
y: (d, i) => 1 + i, // paragraph number
x: 2,
textAnchor: "start",
text: (d) => d["Хвилин до подачі перших документів"]
})
]
})
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