Unlisted
Edited
Dec 6, 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
// List of Rosneft origin stations taken from here: https://www.rosneft.ru/upload/site1/document_file/rep11_ezho4kv2020.pdf
getmanovskaya = FileAttachment("crude-to-getmanovskaya.csv")
.csv()
.then(c => c
.filter(d => d["Код станции назначения РФ"] === "52620")
.map(d => ({
date: d3.utcParse("%m.%Y")(d["Месяц отправления"]),
producer: d["Грузоотправитель наим по ЕГРПО"],
volume: d["Объем перевозок тонн"] / 1e3
})))
Insert cell
kropotkin = d3.sort(
d3.flatRollup(
shell_exports
.filter(d =>
d.stat === "1" &&
d["exporter code"] === "TMPRU006615")
.map(d => ({
date: d3.utcParse("%d-%m-%Y")(d.Date),
producer: d["raw manufacturer name"] ? d["raw manufacturer name"].match(/ОРЕНБУРГНЕФТЬ|ИНГУШНЕФТЬ|СТАВРОПОЛЬНЕФТЕГАЗ|ДАГНЕФТЬ|РОСНЕФТЬ/)[0] : "No data",
volume: parseInt(d["Net Weight Kg"]) / 1e3 / 1e3
})),
v => d3.sum(v, d => d.volume),
k => d3.utcMonth.floor(k.date),
k => k.producer
)
.map(([date, producer, volume]) => ({ date, producer, volume })),
k => k.date,
k => k.producer
)
Insert cell
komsomolsk = d3.sort(
d3.flatRollup(
lukoil_exports
.filter(d =>
d.stat === "1" &&
d["place of discharge"] === "PS KOMSOMOLSKAYA")
.map(d => ({
date: d3.utcParse("%d-%m-%Y")(d.Date),
volume: parseInt(d["Net Weight Kg"]) / 1e3 / 1e3
})),
v => d3.sum(v, d => d.volume),
k => d3.utcDay.floor(k.date)
)
.map(([date, volume]) => ({ date, volume })),
k => k.date
)
Insert cell
cpc_rf_freq = d3.flatRollup(
cpc,
v => d3.sum(v.filter(d => d.producer !== "Kazakhstan transit"), d => d.volume) / d3.sum(v, d => d.volume) * 100,
k => k.date
).map(([date, freq]) => ({ date, freq }))
Insert cell
cpc = d3.sort([...cpc_2021, ...cpc_2022, ...cpc_estimates], k => k.date, k => -k.volume)
Insert cell
cpc_estimates = [
{date: new Date("2022-10-15"), producer: "Kazakhstan transit", volume: 3448.4},
{date: new Date("2022-10-15"), producer: "LUKOIL", volume: 364},
{date: new Date("2022-10-15"), producer: "Independent producers", volume: 24.5},
{date: new Date("2022-10-15"), producer: "ROSNEFT", volume: 3},
{date: new Date("2022-11-15"), producer: "Kazakhstan transit", volume: 3448.4},
{date: new Date("2022-11-15"), producer: "LUKOIL", volume: 660},
{date: new Date("2022-11-15"), producer: "Independent producers", volume: 24.5},
{date: new Date("2022-11-15"), producer: "ROSNEFT", volume: 3}
]
Insert cell
cpc_2022 = FileAttachment("INE4092022.XLSX")
.xlsx()
.then(w => w
.sheet(0, { headers: true, range: "A4:N68" })
.filter(d => d["Country/port"] === "CPC" && d["Producer**"] !== "GAZPROM NEFT")
.flatMap(d => {
var o = [];
const producer = d["Producer**"];
[
"Producer**", "Markets", "Country/port", "Transport inside Russia",
"Transport on Russia frontier", "Ytd"
].forEach(c => {
delete d[c];
});
Object.keys(d).forEach(c => {
o.push({
date: d3.utcParse("%d %B %Y")(`15 ${c} 2022`),
producer: producer,
volume: d[c]
});
});
return o;
})
)
Insert cell
cpc_2021 = FileAttachment("INE4122021.XLSX")
.xlsx()
.then(w => w
.sheet(0, { headers: true, range: "A4:R103" })
.filter(d => d["Country/port"] === "CPC")
.flatMap(d => {
var o = [];
const producer = d["Producer"];
[
"Producer", "Markets", "Country/port", "Transport inside Russia",
"Transport on Russia frontier", "Ytd"
].forEach(c => {
delete d[c];
});
Object.keys(d).forEach(c => {
o.push({
date: d3.utcParse("%d %B %Y")(`1 ${c} 2021`),
producer: producer,
volume: d[c]
});
});
return o;
})
)
Insert cell
shell_exports = xlsx.utils.sheet_to_json(
xlsx.read(await FileAttachment("Export_Genius_09_16_2022_10_07_58.xlsx").arrayBuffer(), { type: "array" })
.Sheets["Data"],
{ raw: false })
Insert cell
lukoil_exports = xlsx.utils.sheet_to_json(
xlsx.read(await FileAttachment("Export_Genius_09_16_2022_10_19_26.xlsx").arrayBuffer(), { type: "array" })
.Sheets["Data"],
{ raw: false })
Insert cell
xlsx = require("xlsx@0.17.0/dist/xlsx.core.min.js")
Insert cell

One platform to build and deploy the best data apps

Experiment and prototype by building visualizations in live JavaScript notebooks. Collaborate with your team and decide which concepts to build out.
Use Observable Framework to build data apps locally. Use data loaders to build in any language or library, including Python, SQL, and R.
Seamlessly deploy to Observable. Test before you ship, use automatic deploy-on-commit, and ensure your projects are always up-to-date.
Learn more