{"id":16783,"date":"2025-01-20T11:24:26","date_gmt":"2025-01-20T19:24:26","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=16783"},"modified":"2025-01-20T11:24:26","modified_gmt":"2025-01-20T19:24:26","slug":"couchbase-shell-time-series-data","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-shell-time-series-data\/","title":{"rendered":"Fa\u00e7a gr\u00e1ficos de dados de s\u00e9ries temporais no conforto de seu terminal"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">Se voc\u00ea tem acompanhado as postagens anteriores no blog do Couchbase, j\u00e1 viu <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/tag\/cbshell\/\">conte\u00fado sobre o Couchbase Shell<\/a> \u00faltima vers\u00e3o. Estou experimentando coisas diferentes e hoje quis ver o que poderia fazer com conjuntos de dados de s\u00e9ries temporais.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Ingerir dados de s\u00e9ries temporais<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Navegando no Kaggle, encontrei <a href=\"https:\/\/www.kaggle.com\/datasets\/berkeleyearth\/climate-change-earth-surface-temperature-data?resource=download\">dados de temperatura por cidade<\/a><\/span><span style=\"font-weight: 400;\">. Eu fiz o download. Ele tem cerca de 500 Mb e isso o torna dif\u00edcil de manipular como um todo. Mas, \u00e9 claro, \u00e9 um arquivo de texto, portanto, podemos facilmente dar uma olhada na estrutura de dados da seguinte forma:<\/span><\/p>\n<pre class=\"line-height:12 nums:false wrap-toggle:false lang:sh decode:true\">&gt; open GlobalLandTemperaturesByCity.csv | first 10\r\n\r\n\u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\r\n\u2502 # \u2502 \u00a0 \u00a0 dt \u00a0 \u00a0 \u2502 AverageTemperature \u2502 AverageTemperatureUncertainty \u2502 City\u00a0 \u2502 Country \u2502 Latitude \u2502 Longitude \u2502\r\n\u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 0 \u2502 1743-11-01 \u2502 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 6.07 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 1.74 \u2502 \u00c5rhus \u2502 Denmark \u2502 57.05N \u00a0 \u2502 10.33E\u00a0 \u00a0 \u2502\r\n\u2502 1 \u2502 1743-12-01 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502 \u00c5rhus \u2502 Denmark \u2502 57.05N \u00a0 \u2502 10.33E\u00a0 \u00a0 \u2502\r\n\u2502 2 \u2502 1744-01-01 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502 \u00c5rhus \u2502 Denmark \u2502 57.05N \u00a0 \u2502 10.33E\u00a0 \u00a0 \u2502\r\n\u2502 3 \u2502 1744-02-01 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502 \u00c5rhus \u2502 Denmark \u2502 57.05N \u00a0 \u2502 10.33E\u00a0 \u00a0 \u2502\r\n\u2502 4 \u2502 1744-03-01 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502 \u00c5rhus \u2502 Denmark \u2502 57.05N \u00a0 \u2502 10.33E\u00a0 \u00a0 \u2502\r\n\u2502 5 \u2502 1744-04-01 \u2502 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 5.79 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 3.62 \u2502 \u00c5rhus \u2502 Denmark \u2502 57.05N \u00a0 \u2502 10.33E\u00a0 \u00a0 \u2502\r\n\u2502 6 \u2502 1744-05-01 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 10.64 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 1.28 \u2502 \u00c5rhus \u2502 Denmark \u2502 57.05N \u00a0 \u2502 10.33E\u00a0 \u00a0 \u2502\r\n\u2502 7 \u2502 1744-06-01 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 14.05 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 1.35 \u2502 \u00c5rhus \u2502 Denmark \u2502 57.05N \u00a0 \u2502 10.33E\u00a0 \u00a0 \u2502\r\n\u2502 8 \u2502 1744-07-01 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 16.08 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 1.40 \u2502 \u00c5rhus \u2502 Denmark \u2502 57.05N \u00a0 \u2502 10.33E\u00a0 \u00a0 \u2502\r\n\u2502 9 \u2502 1744-08-01 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502 \u00c5rhus \u2502 Denmark \u2502 57.05N \u00a0 \u2502 10.33E\u00a0 \u00a0 \u2502\r\n\u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f<\/pre>\n<pre class=\"line-height:12 nums:false lang:default decode:true\">&gt; open GlobalLandTemperaturesByCity.csv | length\r\n\r\n8599212<\/pre>\n<p><span style=\"font-weight: 400;\">8599212 linhas, ser\u00e3o 8599211 documentos. Meu objetivo final \u00e9 ver um gr\u00e1fico de temperatura de v\u00e1rias cidades ao longo dos anos. Para fazer isso, primeiro vou importar tudo para um bucket de importa\u00e7\u00e3o e, em seguida, transformarei os dados em s\u00e9ries temporais. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Se eu importar isso de forma ing\u00eanua, terei um documento por cidade\/grupo de meses. Portanto, a chave do meu documento ser\u00e1 como <em>\u00c5rhus:1743-11-01<\/em>. Digamos que eu queira fazer o upload apenas da primeira linha, ela dever\u00e1 ter a seguinte apar\u00eancia:<\/span><\/p>\n<pre class=\"line-height:12 nums:false lang:default decode:true\">&gt; open GlobalLandTemperaturesByCity.csv | first 1 | wrap content | insert id { |x| $\"($x.content.City):($x.content.dt)\" }\r\n\r\n\u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\r\n\u2502 # \u2502\u00a0 \u00a0 \u00a0 content\u00a0 \u00a0 \u00a0 \u2502\u00a0 \u00a0 \u00a0 \u00a0 id\u00a0 \u00a0 \u00a0 \u00a0 \u2502\r\n\u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 0 \u2502 {record 7 fields} \u2502 \u00c5rhus:1743-11-01 \u2502\r\n\u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\r\n\r\n&gt; open GlobalLandTemperaturesByCity.csv | first 1 | wrap content | insert id { |x| $\"($x.content.City):($x.content.dt)\" } |doc upsert\r\n\r\n\u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\r\n\u2502 # \u2502 processed \u2502 success \u2502 failed \u2502 failures \u2502 cluster \u2502\r\n\u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 0 \u2502 \u00a0 \u00a0 \u00a0 \u00a0 1 \u2502 \u00a0 \u00a0 \u00a0 1 \u2502\u00a0 \u00a0 \u00a0 0 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502 capella \u2502\r\n\u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">E agora que eu sei que funciona, vamos pegar tudo e fazer um lote:<\/span><\/p>\n<pre class=\"line-height:12 nums-toggle:false wrap:true lang:default decode:true\">open GlobalLandTemperaturesByCity.csv | par-each -t 5 {|x| wrap content | insert id {$\"($x.City):($x.dt)\" } } | doc upsert\r\n\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">Eu criei um <\/span><span style=\"font-weight: 400;\">s\u00e9rie<\/span><span style=\"font-weight: 400;\"> na qual importo o resultado de uma cole\u00e7\u00e3o <em>SELECIONAR<\/em> agrega\u00e7\u00e3o, obtendo todas as datas como registros de data e hora e todas as <\/span><i><span style=\"font-weight: 400;\">Temperatura m\u00e9dia <\/span><\/i><span style=\"font-weight: 400;\">como valor:<\/span><\/p>\n<pre class=\"line-height:12 nums:false lang:default decode:true\">query '\r\n\r\nINSERT INTO series(KEY _k, VALUE _v)\r\n\u00a0\u00a0\u00a0\u00a0SELECT a.City _k,\r\n\u00a0\u00a0\u00a0\u00a0{\"City\": a.City ,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"ts_start\" : MIN(STR_TO_MILLIS(a.dt)),\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"ts_end\" : MAX(STR_TO_MILLIS(a.dt)),\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"ts_data\" : ARRAY_AGG([STR_TO_MILLIS(a.dt), a.AverageTemperature]) } _v\r\n\u00a0\u00a0\u00a0\u00a0FROM import a\r\n\u00a0\u00a0\u00a0\u00a0WHERE a.dt BETWEEN \"1700-01-01\" AND \"2020-12-31\"\r\n\u00a0\u00a0\u00a0\u00a0GROUP BY a.City;\r\n\u00a0\u00a0\u00a0\u00a0'\r\n\r\n\u00a0\u00a0\u00a0\u00a0INSERT INTO series(KEY _k, VALUE _v)\r\n\u00a0\u00a0\u00a0\u00a0SELECT a.City _k,\r\n\u00a0\u00a0\u00a0\u00a0{\"City\": a.City ,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"ts_start\" : MIN(STR_TO_MILLIS(a.dt)),\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"ts_end\" : MAX(STR_TO_MILLIS(a.dt)),\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"ts_data\" : ARRAY_AGG([STR_TO_MILLIS(a.dt), a.AverageTemperature]) } _v\r\n\u00a0\u00a0\u00a0\u00a0FROM import a\r\n\u00a0\u00a0\u00a0\u00a0WHERE SUBSTR(a.City,0,1) = \"Z\" AND a.dt BETWEEN \"2010-01-01\" AND \"2020-12-31\"\u00a0\r\n\u00a0\u00a0\u00a0\u00a0GROUP BY a.City;\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">E agora todos os dados est\u00e3o dispon\u00edveis como s\u00e9ries temporais. Digamos que eu queira os dados de Paris, posso usar o comando <em>_timeseries<\/em> fun\u00e7\u00e3o como esta:<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">&gt; let ts_ranges = [946684800000,1375315200000]; query $\"SELECT t._t time, t._v0 `value` FROM series AS d UNNEST _timeseries\\(d, {\\\"ts_ranges\\\":($ts_ranges)}\\) AS t WHERE d.city = \\\"Paris\\\" AND \\(d.ts_start &lt;= ($ts_ranges.1) AND d.ts_end &gt;= ($ts_ranges.0) \\);\" | reject cluster | to csv\u00a0\u00a0\r\n\r\ntime,value\r\n946684800000,3.845\r\n949363200000,6.587000000000001\r\n951868800000,7.872000000000001\r\n954547200000,10.067\r\n957139200000,15.451\r\n959817600000,17.666\r\n962409600000,16.954\r\n965088000000,19.512\r\n967766400000,16.548000000000002\r\n970358400000,11.675999999999998\r\n....<\/pre>\n<p><span style=\"font-weight: 400;\">Para acelerar o processo, voc\u00ea pode criar o seguinte \u00edndice: <\/span><span style=\"font-weight: 400;\"><code>CREATE INDEX ix1 ON series(City, ts_end, ts_start);<\/code><\/span><\/p>\n<p><span style=\"font-weight: 400;\">Observe o uso da palavra <em>ts_ranges<\/em> no in\u00edcio. Voc\u00ea pode reutilizar facilmente esses valores em um modelo <em>Cordas<\/em>. Eles come\u00e7am com um<em> $<\/em> e as vari\u00e1veis devem estar entre par\u00eanteses, como <em>($my_variable)<\/em>. Isso tamb\u00e9m significa que agora voc\u00ea precisa escapar do caractere de par\u00eantese, bem como das aspas duplas.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Plotar s\u00e9ries temporais<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">H\u00e1 uma variedade de bibliotecas de plotagem de terminal, aqui estou usando <\/span><a href=\"https:\/\/github.com\/red-data-tools\/YouPlot\"><span style=\"font-weight: 400;\">youplot<\/span><\/a>:<\/p>\n<pre class=\"line-height:12 nums:false wrap:true lang:default decode:true\">&gt; let ts_ranges = [946684800000,1375315200000]; query $\"SELECT t._t date, t._v0 `value` FROM series AS d UNNEST _timeseries\\(d, {\\\"ts_ranges\\\":($ts_ranges)}\\) AS t WHERE d.city = \\\"Paris\\\" AND \\(d.ts_start &lt;= ($ts_ranges.1) AND d.ts_end &gt;= ($ts_ranges.0) \\);\" | reject cluster | to csv\u00a0 | uplot line -d, --xlim 946684800000,1375315200000 --ylim -20,35 --title \"global temperature in Paris\" --xlabel date --ylabel temperature`<\/pre>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image1-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-16784 size-large\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image1-1-1024x677.png\" alt=\"\" width=\"900\" height=\"595\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image1-1-1024x677.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image1-1-300x198.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image1-1-768x507.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image1-1.png 1108w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Tudo isso \u00e9 \u00f3timo, mas o ideal \u00e9 que eu queira ter v\u00e1rias cidades para compar\u00e1-las. Todas as colunas CSV adicionais s\u00e3o coletadas automaticamente, desde que voc\u00ea execute <\/span><span style=\"font-weight: 400;\">linhas do youplot<\/span><span style=\"font-weight: 400;\">. Fazendo as coisas gradualmente, vamos come\u00e7ar com o suporte de v\u00e1rias cidades na consulta. Portanto, algumas altera\u00e7\u00f5es aqui:<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">agrupamento dos dados por tempo<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">adicionando <\/span><em><span style=\"font-weight: 400;\">d.city IN ($city)<\/span><\/em><span style=\"font-weight: 400;\"> na cl\u00e1usula where. Isso funciona porque a matriz de cidades \u00e9 um literal String de uma matriz JSON. Vamos dar uma olhada na resposta como um documento JSON:<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"line-height:12 nums:false lang:default decode:true\">&gt; let ts_ranges = [946684800000,1375315200000]; let city = ['\"Aba\"','\"Berlin\"','\"London\"','\"Paris\"']; query $\"SELECT t._t date, \\(\u00a0 ARRAY_AGG\\({\\\"city\\\": d.city, \\\"temp\\\":t._v0}\\) \\)\u00a0 FROM series AS d UNNEST _timeseries\\(d, {\\\"ts_ranges\\\":($ts_ranges)}\\) AS t WHERE d.city IN ($city) AND \\(d.ts_start &lt;= ($ts_ranges.1) AND d.ts_end &gt;= ($ts_ranges.0) \\) GROUP BY t._t ORDER BY t._t;\" | reject cluster | first |to json\r\n\r\n[\r\n\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\"date\": \"2000-01-01\",\r\n\u00a0\u00a0\u00a0\u00a0\"$1\":\r\n\u00a0\u00a0\u00a0\u00a0[\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"city\": \"Aba\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"temp\": 26.985000000000007\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"city\": \"Berlin\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"temp\": 1.3239999999999998\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"city\": \"London\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"temp\": 4.6930000000000005\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"city\": \"Paris\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"temp\": 3.845\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0]\r\n\u00a0\u00a0}\r\n]<\/pre>\n<p><span style=\"font-weight: 400;\">Mas isso n\u00e3o pode se transformar em um CSV, mesmo que voc\u00ea achate tudo dessa forma:<\/span><\/p>\n<pre class=\"line-height:12 nums:false wrap:true lang:default decode:true\">&gt; let ts_ranges = [946684800000,1375315200000]; let city = ['\"Aba\"','\"Berlin\"','\"London\"','\"Paris\"']; query $\"SELECT t._t date, \\(\u00a0 ARRAY_AGG\\({\\\"city\\\": d.city, \\\"temp\\\":t._v0}\\) \\)\u00a0 FROM series AS d UNNEST _timeseries\\(d, {\\\"ts_ranges\\\":($ts_ranges)}\\) AS t WHERE d.city IN ($city) AND \\(d.ts_start &lt;= ($ts_ranges.1) AND d.ts_end &gt;= ($ts_ranges.0) \\) GROUP BY t._t ORDER BY t._t;\" |reject cluster | first |flatten|flatten|to csv\r\n\r\ndate,city,temp\r\n2000-01-01,Aba,26.985000000000007\r\n2000-01-01,Berlin,1.3239999999999998\r\n2000-01-01,London,4.6930000000000005\r\n2000-01-01,Paris,3.845<\/pre>\n<p><span style=\"font-weight: 400;\">Portanto, podemos transform\u00e1-lo em um objeto da seguinte forma: <\/span><span style=\"font-weight: 400;\"><code>Objeto v.city : v.temp FOR v IN ARRAY_AGG({\"city\": d.city, \"temp\":t._v0}) when v IS NOT MISSING END<\/code><\/span><\/p>\n<pre class=\"line-height:12 nums:false wrap:true lang:default decode:true\">&gt; let ts_ranges = [946684800000,1375315200000]; let city = ['\"Aba\"','\"Berlin\"','\"London\"','\"Paris\"']; query $\"SELECT t._t date, \\( Object v.city : v.temp FOR v IN ARRAY_AGG\\({\\\"city\\\": d.city, \\\"temp\\\":t._v0}\\) when v IS NOT MISSING END\\)\u00a0 FROM series AS d UNNEST _timeseries\\(d, {\\\"ts_ranges\\\":($ts_ranges)}\\) AS t WHERE d.city IN ($city) AND \\(d.ts_start &lt;= ($ts_ranges.1) AND d.ts_end &gt;= ($ts_ranges.0) \\) GROUP BY t._t ORDER BY t._t;\" |reject cluster | first | to json\r\n\r\n{\r\n\u00a0\u00a0\"date\": \"2000-01-01\",\r\n\u00a0\u00a0\"$1\":\r\n\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\"Aba\": 26.985000000000007,\r\n\u00a0\u00a0\u00a0\u00a0\"Berlin\": 1.3239999999999998,\r\n\u00a0\u00a0\u00a0\u00a0\"London\": 4.6930000000000005,\r\n\u00a0\u00a0\u00a0\u00a0\"Paris\": 3.845\r\n\u00a0\u00a0}\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">Que agora pode ser transformado em um CSV:<\/span><\/p>\n<pre class=\"line-height:12 nums:false wrap:true lang:default decode:true\">&gt; let ts_ranges = [946684800000,1375315200000]; let city = ['\"Aba\"','\"Berlin\"','\"London\"','\"Paris\"']; query $\"SELECT t._t date, \\( Object v.city : v.temp FOR v IN ARRAY_AGG\\({\\\"city\\\": d.city, \\\"temp\\\":t._v0}\\) when v IS NOT MISSING END\\)\u00a0 FROM series AS d UNNEST _timeseries\\(d, {\\\"ts_ranges\\\":($ts_ranges)}\\) AS t WHERE d.city IN ($city) AND \\(d.ts_start &lt;= ($ts_ranges.1) AND d.ts_end &gt;= ($ts_ranges.0) \\) GROUP BY t._t ORDER BY t._t;\" |reject cluster | first | flatten| to csv\r\n\r\ndate,Aba,Berlin,London,Paris\r\n\r\n2000-01-01,26.985000000000007,1.3239999999999998,4.6930000000000005,3.845<\/pre>\n<p><span style=\"font-weight: 400;\">E, com isso, estamos prontos para tra\u00e7ar v\u00e1rias linhas:<\/span><\/p>\n<pre class=\"line-height:12 nums:false wrap:true lang:default decode:true\">&gt; let ts_ranges = [946684800000,1375315200000]; let city = ['\"Aba\"','\"Berlin\"','\"London\"','\"Paris\"']; query $\"SELECT t._t date, \\( Object v.city : v.temp FOR v IN ARRAY_AGG\\({\\\"city\\\": d.city, \\\"temp\\\":t._v0}\\) when v IS NOT MISSING END\\)\u00a0 FROM series AS d UNNEST _timeseries\\(d, {\\\"ts_ranges\\\":($ts_ranges)}\\) AS t WHERE d.city IN ($city) AND \\(d.ts_start &lt;= ($ts_ranges.1) AND d.ts_end &gt;= ($ts_ranges.0) \\) GROUP BY t._t ORDER BY t._t;\" |reject cluster | flatten | to csv | uplot lines -H -d, --xlim 946684800000,1375315200000 --ylim -10,50 -w 50 --title \"temperature per month\" --xlabel date --ylabel temperature<\/pre>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image2-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-16785 size-large\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image2-1-1024x676.png\" alt=\"\" width=\"900\" height=\"594\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image2-1-1024x676.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image2-1-300x198.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image2-1-768x507.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image2-1.png 1101w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Para facilitar isso, voc\u00ea pode usar fun\u00e7\u00f5es. Criar uma <em>.nu<\/em> arquivo, como <em>temp.nu<\/em>com o seguinte conte\u00fado:<\/span><\/p>\n<pre class=\"line-height:12 nums:false wrap:true lang:default decode:true\">def tempGraph [$ts_ranges, $cities] {\r\n\u00a0\u00a0\u00a0\u00a0cb-env bucket cbsh\r\n\u00a0\u00a0\u00a0\u00a0cb-env scope globaltemp\r\n\u00a0\u00a0\u00a0\u00a0cb-env collection series\r\n\u00a0\u00a0\u00a0\u00a0\r\n\u00a0\u00a0\u00a0\u00a0let query = ($\"SELECT t._t date, \\( Object v.city : v.temp FOR v IN ARRAY_AGG\\({\\\"city\\\": d.city, \\\"temp\\\":t._v0}\\) when v IS NOT MISSING END\\)\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0+ $\" FROM series AS d UNNEST _timeseries\\(d, {\\\"ts_ranges\\\":($ts_ranges)}\\) AS t \"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0+ $\" WHERE d.city IN ($city) \"\u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0+ $\" AND \\(d.ts_start &lt;= ($ts_ranges.1) AND d.ts_end &gt;= ($ts_ranges.0) \\)\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0+ $\" GROUP BY t._t ORDER BY t._t;\" )\r\n\u00a0\u00a0\u00a0\u00a0let csv = query $query |reject cluster | flatten | to csv\r\n\u00a0\u00a0\u00a0\u00a0$csv | uplot lines -H -d, --xlim 946684800000,1375315200000 --ylim -10,50 -w 50 --title \"temperature per month\" --xlabel date --ylabel temperature\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">Ent\u00e3o, se voc\u00ea o adquirir, ele se tornar\u00e1 muito mais f\u00e1cil de usar:<\/span><\/p>\n<pre class=\"line-height:12 nums:false wrap:true lang:default decode:true\">&gt; source .\/testingcbshell\/temp.nu\r\n\r\n&gt; tempGraph\u00a0 [946684800000,1375315200000] ['\"Aba\"','\"Berlin\"','\"London\"','\"Paris\"']\r\n\r\n<\/pre>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image3-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16786\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image3-1-1024x683.png\" alt=\"\" width=\"900\" height=\"600\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image3-1-1024x683.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image3-1-300x200.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image3-1-768x512.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image3-1-400x267.png 400w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image3-1-450x300.png 450w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image3-1.png 1103w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<hr \/>\n<p><span style=\"font-weight: 400;\">Espero que isso tenha lhe dado uma r\u00e1pida vis\u00e3o geral do suporte a s\u00e9ries temporais do Couchbase, da manipula\u00e7\u00e3o de dados do Couchbase Shell e de como voc\u00ea pode usar outros comandos do shell, como <em>youplot<\/em> para tornar as coisas mais integradas e interessantes. Voc\u00ea poderia facilmente gerar um relat\u00f3rio completo em v\u00e1rios formatos a partir de um <a href=\"https:\/\/github.com\/features\/actions\">A\u00e7\u00f5es do GitHub<\/a> por exemplo, infinitas possibilidades!<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Leia mais postagens sobre <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/tag\/cbshell\/\">Shell do Couchbase<\/a>.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>If you have been following the earlier posts on the Couchbase blog, you have seen content about Couchbase Shell latest release. I am trying different things and today I wanted to see what I could do with time series datasets. [&hellip;]<\/p>","protected":false},"author":49,"featured_media":16788,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1812],"tags":[10020,10024,9827],"ppma_author":[9023],"class_list":["post-16783","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-n1ql-query","tag-cbshell","tag-couchbase-shell","tag-time-series"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Graph Time Series Data From the Comfort of Your Terminal - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Learn to manage and analyze time series data with Couchbase Shell, from ingestion to visualization using global temperature datasets.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-shell-time-series-data\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Graph Time Series Data From the Comfort of Your Terminal\" \/>\n<meta property=\"og:description\" content=\"Learn to manage and analyze time series data with Couchbase Shell, from ingestion to visualization using global temperature datasets.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-shell-time-series-data\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-01-20T19:24:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-couchbase-shell-time-series-graph.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1256\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Laurent Doguin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ldoguin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"unstructured.io\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/\"},\"author\":{\"name\":\"Laurent Doguin\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\"},\"headline\":\"Graph Time Series Data From the Comfort of Your Terminal\",\"datePublished\":\"2025-01-20T19:24:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/\"},\"wordCount\":554,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-couchbase-shell-time-series-graph.png\",\"keywords\":[\"cbshell\",\"couchbase shell\",\"time series\"],\"articleSection\":[\"Best Practices and Tutorials\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/\",\"name\":\"Graph Time Series Data From the Comfort of Your Terminal - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-couchbase-shell-time-series-graph.png\",\"datePublished\":\"2025-01-20T19:24:26+00:00\",\"description\":\"Learn to manage and analyze time series data with Couchbase Shell, from ingestion to visualization using global temperature datasets.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-couchbase-shell-time-series-graph.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-couchbase-shell-time-series-graph.png\",\"width\":2400,\"height\":1256},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Graph Time Series Data From the Comfort of Your Terminal\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\",\"name\":\"Laurent Doguin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"caption\":\"Laurent Doguin\"},\"description\":\"Laurent is a nerdy metal head who lives in Paris. He mostly writes code in Java and structured text in AsciiDoc, and often talks about data, reactive programming and other buzzwordy stuff. He is also a former Developer Advocate for Clever Cloud and Nuxeo where he devoted his time and expertise to helping those communities grow bigger and stronger. He now runs Developer Relations at Couchbase.\",\"sameAs\":[\"https:\/\/x.com\/ldoguin\"],\"honorificPrefix\":\"Mr\",\"birthDate\":\"1985-06-07\",\"gender\":\"male\",\"award\":[\"Devoxx Champion\",\"Couchbase Legend\"],\"knowsAbout\":[\"Java\"],\"knowsLanguage\":[\"English\",\"French\"],\"jobTitle\":\"Director Developer Relation & Strategy\",\"worksFor\":\"Couchbase\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/laurent-doguin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Graph Time Series Data From the Comfort of Your Terminal - The Couchbase Blog","description":"Aprenda a gerenciar e analisar dados de s\u00e9ries temporais com o Couchbase Shell, desde a ingest\u00e3o at\u00e9 a visualiza\u00e7\u00e3o usando conjuntos de dados de temperatura global.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-shell-time-series-data\/","og_locale":"pt_BR","og_type":"article","og_title":"Graph Time Series Data From the Comfort of Your Terminal","og_description":"Learn to manage and analyze time series data with Couchbase Shell, from ingestion to visualization using global temperature datasets.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-shell-time-series-data\/","og_site_name":"The Couchbase Blog","article_published_time":"2025-01-20T19:24:26+00:00","og_image":[{"width":2400,"height":1256,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-couchbase-shell-time-series-graph.png","type":"image\/png"}],"author":"Laurent Doguin","twitter_card":"summary_large_image","twitter_creator":"@ldoguin","twitter_misc":{"Written by":"unstructured.io","Est. reading time":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/"},"author":{"name":"Laurent Doguin","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e"},"headline":"Graph Time Series Data From the Comfort of Your Terminal","datePublished":"2025-01-20T19:24:26+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/"},"wordCount":554,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-couchbase-shell-time-series-graph.png","keywords":["cbshell","couchbase shell","time series"],"articleSection":["Best Practices and Tutorials","SQL++ \/ N1QL Query"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/","url":"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/","name":"Graph Time Series Data From the Comfort of Your Terminal - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-couchbase-shell-time-series-graph.png","datePublished":"2025-01-20T19:24:26+00:00","description":"Aprenda a gerenciar e analisar dados de s\u00e9ries temporais com o Couchbase Shell, desde a ingest\u00e3o at\u00e9 a visualiza\u00e7\u00e3o usando conjuntos de dados de temperatura global.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-couchbase-shell-time-series-graph.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-couchbase-shell-time-series-graph.png","width":2400,"height":1256},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Graph Time Series Data From the Comfort of Your Terminal"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e","name":"Laurent Doguin","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071","url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","caption":"Laurent Doguin"},"description":"Laurent \u00e9 um nerd metaleiro que mora em Paris. Em sua maior parte, ele escreve c\u00f3digo em Java e texto estruturado em AsciiDoc, e frequentemente fala sobre dados, programa\u00e7\u00e3o reativa e outras coisas que est\u00e3o na moda. Ele tamb\u00e9m foi Developer Advocate do Clever Cloud e do Nuxeo, onde dedicou seu tempo e experi\u00eancia para ajudar essas comunidades a crescerem e se fortalecerem. Atualmente, ele dirige as Rela\u00e7\u00f5es com Desenvolvedores na Couchbase.","sameAs":["https:\/\/x.com\/ldoguin"],"honorificPrefix":"Mr","birthDate":"1985-06-07","gender":"male","award":["Devoxx Champion","Couchbase Legend"],"knowsAbout":["Java"],"knowsLanguage":["English","French"],"jobTitle":"Director Developer Relation & Strategy","worksFor":"Couchbase","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/laurent-doguin\/"}]}},"authors":[{"term_id":9023,"user_id":49,"is_guest":0,"slug":"laurent-doguin","display_name":"Laurent Doguin","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","author_category":"","last_name":"Doguin","first_name":"Laurent","job_title":"","user_url":"","description":"Laurent \u00e9 um nerd metaleiro que mora em Paris. Em sua maior parte, ele escreve c\u00f3digo em Java e texto estruturado em AsciiDoc, e frequentemente fala sobre dados, programa\u00e7\u00e3o reativa e outras coisas que est\u00e3o na moda. Ele tamb\u00e9m foi Developer Advocate do Clever Cloud e do Nuxeo, onde dedicou seu tempo e experi\u00eancia para ajudar essas comunidades a crescerem e se fortalecerem. Atualmente, ele dirige as Rela\u00e7\u00f5es com Desenvolvedores na Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/16783","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=16783"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/16783\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/16788"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=16783"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=16783"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=16783"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=16783"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}