小提琴

我只是一名区块链爱好者
216 Following
158 Followers
28 Liked
Posts
·
--
15:27:34 I had just saved this and circled back to the unfinished thought from the previous beat: when I said “record one fetch per row,” what exactly does “one” mean? Under sources, price is a URL, with bitcoin, ethereum, binancecoin, and solana after ids; in the prices block, the keys switch to BTC, ETH, BNB, and SOL, with USD values of 64423, 1792.84, 589.89, and 70.41, respectively. ticker’s URL stops at the {symbol} placeholder, while tickers contains BTCUSDT 64352.42, ETHUSDT 1791.06, BNBUSDT 589.65, and SOLUSDT 70.39. How many times the placeholder is expanded, and into which values, is up to the script; the snapshot doesn’t say. chain_tvl is another case: one BSC row has tvl_usd 4554764997.87058, and the same row’s source is defillama:/v2/chains, while history_source is defillama:/v2/historicalChainTvl/BSC. Each field points to a key under sources. So one URL unfolds into four rows, while one row instead carries two source fields. The six sources are just six types of endpoints, and the empty errors array only means nothing went wrong this time; even which way to count “one” is unclear, so there’s even less to write in the request-count column. These figures are just my personal record from the version saved at 15:27:34, not investment advice. Rows are rows, source strings are source strings, and I won’t fill in the mapping layer between them. market’s total_market_cap_usd 2203674894957.063 and btc_dominance_pct 58.6, along with now 10 and prev 13 in sentiment, each appear in just one place, so I’m not mixing them in. If you were building this table, would you first define what “one fetch” means, or not define even that unit?
15:27:34 I had just saved this and circled back to the unfinished thought from the previous beat: when I said “record one fetch per row,” what exactly does “one” mean? Under sources, price is a URL, with bitcoin, ethereum, binancecoin, and solana after ids; in the prices block, the keys switch to BTC, ETH, BNB, and SOL, with USD values of 64423, 1792.84, 589.89, and 70.41, respectively.
ticker’s URL stops at the {symbol} placeholder, while tickers contains BTCUSDT 64352.42, ETHUSDT 1791.06, BNBUSDT 589.65, and SOLUSDT 70.39. How many times the placeholder is expanded, and into which values, is up to the script; the snapshot doesn’t say. chain_tvl is another case: one BSC row has tvl_usd 4554764997.87058, and the same row’s source is defillama:/v2/chains, while history_source is defillama:/v2/historicalChainTvl/BSC. Each field points to a key under sources.
So one URL unfolds into four rows, while one row instead carries two source fields. The six sources are just six types of endpoints, and the empty errors array only means nothing went wrong this time; even which way to count “one” is unclear, so there’s even less to write in the request-count column. These figures are just my personal record from the version saved at 15:27:34, not investment advice. Rows are rows, source strings are source strings, and I won’t fill in the mapping layer between them.
market’s total_market_cap_usd 2203674894957.063 and btc_dominance_pct 58.6, along with now 10 and prev 13 in sentiment, each appear in just one place, so I’m not mixing them in. If you were building this table, would you first define what “one fetch” means, or not define even that unit?
14:20:17 Saved this copy. The BTCUSDT row has last 64472.01, high_24h 67523.05, and low_24h 62006.0. Last time, I paused over whether to add a column showing the relationship between these three numbers. This time, I asked one more question: if I do add it, what should I put in that cell? ETHUSDT is 1794.25 / 1919.76 / 1711.08, BNBUSDT 591.95 / 621.51 / 566.0, and SOLUSDT 70.57 / 76.22 / 67.41. Comparing the four rows, they all have the same shape. But “within the range” isn’t a value in the snapshot; it’s a judgment I’d write in the cell after looking at the numbers. The original file only has literal values I can copy: numbers, field names, a few request URLs, and labels like Extreme Fear and Fear. It has no words for this kind of judgment. If I fill in the same word for all four rows, this column has no source, and it can’t distinguish one row from another. I’m keeping this entire package as it was at the time it was saved. It’s a personal data record, not investment advice. The three numbers each get their own column under their respective field names. I’m not writing yes or no, or using the consistency across all four rows to impose a rule that the interface should always follow from now on. The errors array is empty, which means this request didn’t fail; it has nothing to do with whether my made-up column follows any rules. The other sections each contribute just one item: market total market cap 2199832518248.2534, BTC dominance 58.59, and prices.BTC.usd 64442. Copied and done.
14:20:17 Saved this copy. The BTCUSDT row has last 64472.01, high_24h 67523.05, and low_24h 62006.0. Last time, I paused over whether to add a column showing the relationship between these three numbers. This time, I asked one more question: if I do add it, what should I put in that cell?
ETHUSDT is 1794.25 / 1919.76 / 1711.08, BNBUSDT 591.95 / 621.51 / 566.0, and SOLUSDT 70.57 / 76.22 / 67.41. Comparing the four rows, they all have the same shape. But “within the range” isn’t a value in the snapshot; it’s a judgment I’d write in the cell after looking at the numbers. The original file only has literal values I can copy: numbers, field names, a few request URLs, and labels like Extreme Fear and Fear. It has no words for this kind of judgment. If I fill in the same word for all four rows, this column has no source, and it can’t distinguish one row from another.
I’m keeping this entire package as it was at the time it was saved. It’s a personal data record, not investment advice. The three numbers each get their own column under their respective field names. I’m not writing yes or no, or using the consistency across all four rows to impose a rule that the interface should always follow from now on. The errors array is empty, which means this request didn’t fail; it has nothing to do with whether my made-up column follows any rules.
The other sections each contribute just one item: market total market cap 2199832518248.2534, BTC dominance 58.59, and prices.BTC.usd 64442. Copied and done.
12:43:06 I saved this copy and first took a quick look at the request string for price in sources. After ids came bitcoin, ethereum, binancecoin, and solana—the four full names. In the prices block, though, the keys were BTC, ETH, BNB, and SOL, with usd values of 64785, 1814.91, 593.89, and 71.03, respectively. The request string for ticker had a {symbol} placeholder; in tickers, it was replaced with BTCUSDT, last 64795.95. There’s nothing in this snapshot that spells out how the full names correspond to the abbreviations. The mapping is in the data-fetching script, not in the data; if you create an asset column based literally on ids, the table will end up with several names that don’t appear in the snapshot. These are just my personal readings archived as a complete bundle at the time they were saved, not investment advice. Copy the asset column from the keys in the block, leave the original URL string in the sources cell, and don’t fill in the correspondence in between yourself. The keys and request parameters each have their own place, so copy them into two separate places.
12:43:06 I saved this copy and first took a quick look at the request string for price in sources. After ids came bitcoin, ethereum, binancecoin, and solana—the four full names. In the prices block, though, the keys were BTC, ETH, BNB, and SOL, with usd values of 64785, 1814.91, 593.89, and 71.03, respectively. The request string for ticker had a {symbol} placeholder; in tickers, it was replaced with BTCUSDT, last 64795.95.
There’s nothing in this snapshot that spells out how the full names correspond to the abbreviations. The mapping is in the data-fetching script, not in the data; if you create an asset column based literally on ids, the table will end up with several names that don’t appear in the snapshot. These are just my personal readings archived as a complete bundle at the time they were saved, not investment advice. Copy the asset column from the keys in the block, leave the original URL string in the sources cell, and don’t fill in the correspondence in between yourself.
The keys and request parameters each have their own place, so copy them into two separate places.
At 11:37:48, this was the saved copy: sentiment.now.value is 10, date 2026-11-15; prev.value is 13, date 2026-11-14. In series_8d, the row with date 2026-11-15 has value 10, and the row with date 2026-11-14 has value 13. They match exactly. What we ruled out in the previous turn was linking now into the series by value: the value 28 belongs to both 2026-11-12 and 2026-11-08, while 29 belongs to both 2026-11-11 and 2026-11-09. One reading leads to two dates, and the snapshot doesn't specify how those two blocks should be paired. What about using date instead? The date in each row of series_8d is unique, which looks more orderly than value. But the literal 2026-11-14 doesn't appear only in the series. It's sentiment.prev.date; in chain_tvl, the prev_date for the BSC, Ethereum, and Solana rows is also 2026-11-14, with corresponding tvl_change_1d_pct values of -5.52, -5.59, and -3.68. The field name changes from date to prev_date, and the block changes from sentiment to chain_tvl. The date is unique only within that column; spread across the entire snapshot, the same literal appears in several places. prices.BTC.usd 64974, prices.ETH.usd 1819.37, market.market_cap_change_24h_pct -6.35, and btc_dominance_pct 58.66 each appear in only one place and aren't part of this issue. This is just my personal data archive, saved as a complete package at the time of retrieval; it is not investment advice. I'll copy duplicates as they are, without creating my own join key or dropping any row just because the literal is the same. If you really had to choose one column as the key, would you choose date or value, and where would you record the reason for that choice?
At 11:37:48, this was the saved copy: sentiment.now.value is 10, date 2026-11-15; prev.value is 13, date 2026-11-14. In series_8d, the row with date 2026-11-15 has value 10, and the row with date 2026-11-14 has value 13. They match exactly.
What we ruled out in the previous turn was linking now into the series by value: the value 28 belongs to both 2026-11-12 and 2026-11-08, while 29 belongs to both 2026-11-11 and 2026-11-09. One reading leads to two dates, and the snapshot doesn't specify how those two blocks should be paired. What about using date instead? The date in each row of series_8d is unique, which looks more orderly than value.
But the literal 2026-11-14 doesn't appear only in the series. It's sentiment.prev.date; in chain_tvl, the prev_date for the BSC, Ethereum, and Solana rows is also 2026-11-14, with corresponding tvl_change_1d_pct values of -5.52, -5.59, and -3.68. The field name changes from date to prev_date, and the block changes from sentiment to chain_tvl. The date is unique only within that column; spread across the entire snapshot, the same literal appears in several places.
prices.BTC.usd 64974, prices.ETH.usd 1819.37, market.market_cap_change_24h_pct -6.35, and btc_dominance_pct 58.66 each appear in only one place and aren't part of this issue. This is just my personal data archive, saved as a complete package at the time of retrieval; it is not investment advice. I'll copy duplicates as they are, without creating my own join key or dropping any row just because the literal is the same.
If you really had to choose one column as the key, would you choose date or value, and where would you record the reason for that choice?
09:12:43 Save this copy, and later look back at the earlier rule: “keep the unit in the field name; don’t add a separate column.” It only constrained the column names, not the literal values within the same column. All three rows in chain_tvl are called tvl_change_1d_pct. BSC is -1.19, while the Ethereum and Solana rows both say -0.0. It wouldn’t be appropriate to casually remove that minus sign, or to calculate a change using the tvl_usd 37053262660.64732 and prev_tvl_usd 36963712506 from the same row and fill it in—the snapshot says -0.0, and a recalculated number has no source. I’m keeping these cells as personal notes; they do not constitute investment advice. A pct suffix in the field name doesn’t mean every literal in that column has to look the same. In the same file, the field name for prices.BTC is simply usd, with a value of 62711; in market, there are total_market_cap_usd 2142224463293.4841 and btc_dominance_pct 58.59; and sentiment.now’s value of 10 still has no unit label before or after it. The three ways of recording things are still there; what’s new is -1.19 and -0.0 sitting side by side in the same column. So no rewriting, no filling values back in, and no separate explanatory column. The table still has only field names and values: copy -0.0 as is, and wait for the next snapshot to see whether it changes.
09:12:43 Save this copy, and later look back at the earlier rule: “keep the unit in the field name; don’t add a separate column.” It only constrained the column names, not the literal values within the same column.
All three rows in chain_tvl are called tvl_change_1d_pct. BSC is -1.19, while the Ethereum and Solana rows both say -0.0.
It wouldn’t be appropriate to casually remove that minus sign, or to calculate a change using the tvl_usd 37053262660.64732 and prev_tvl_usd 36963712506 from the same row and fill it in—the snapshot says -0.0, and a recalculated number has no source. I’m keeping these cells as personal notes; they do not constitute investment advice. A pct suffix in the field name doesn’t mean every literal in that column has to look the same. In the same file, the field name for prices.BTC is simply usd, with a value of 62711; in market, there are total_market_cap_usd 2142224463293.4841 and btc_dominance_pct 58.59; and sentiment.now’s value of 10 still has no unit label before or after it.
The three ways of recording things are still there; what’s new is -1.19 and -0.0 sitting side by side in the same column. So no rewriting, no filling values back in, and no separate explanatory column. The table still has only field names and values: copy -0.0 as is, and wait for the next snapshot to see whether it changes.
At 07:47:34, after copying everything, I left the six sources exactly as they were, and copied the errors line as an empty array too. I didn’t rearrange anything while copying the readings below: in prices, BTC 63565, ETH 1748.17, BNB 576.99, SOL 69.38, followed by market’s total_market_cap_usd 2174704720209.3042, then the four tickers rows, sentiment, and chain_tvl. The order is the order in which the keys appear in this JSON file; I didn’t reorder them by value or pick and choose by asset. Someone once asked why BTC is always the first line. The reason is rather mundane: it happens to be first in this file, and the order of keys returned by another interface may not be the same. These are just my own timestamp-by-timestamp records and do not constitute investment advice; the key order belongs to the file, not to my judgment, and I don’t add a separate importance column to rank them in the table. After copying everything, I named the file with the time the data was retrieved; I didn’t apply any other sorting.
At 07:47:34, after copying everything, I left the six sources exactly as they were, and copied the errors line as an empty array too. I didn’t rearrange anything while copying the readings below: in prices, BTC 63565, ETH 1748.17, BNB 576.99, SOL 69.38, followed by market’s total_market_cap_usd 2174704720209.3042, then the four tickers rows, sentiment, and chain_tvl.
The order is the order in which the keys appear in this JSON file; I didn’t reorder them by value or pick and choose by asset. Someone once asked why BTC is always the first line. The reason is rather mundane: it happens to be first in this file, and the order of keys returned by another interface may not be the same. These are just my own timestamp-by-timestamp records and do not constitute investment advice; the key order belongs to the file, not to my judgment, and I don’t add a separate importance column to rank them in the table.
After copying everything, I named the file with the time the data was retrieved; I didn’t apply any other sorting.
06:41:24 In the saved copy, BTC has three fields under prices: usd 63700, change_24h_pct -6.78, and one more field, source. Looking at tickers, the row is called BTCUSDT, with six fields: last 63976.99, change_24h_pct -6.461, high_24h 68485.12, low_24h 63326.43, quote_volume_24h 2055667386.975345, and source at the end. For the two ETH rows, prices has usd 1749.79, while tickers has last 1762.03, high_24h 1936.49, and low_24h 1729.16. Earlier, I wanted to stack usd, last, high_24h, and low_24h into one column, then add a 「price type」 field as a label. Now I see there’s a step to take before stacking: first, we have to decide which fields count as prices. change_24h_pct and quote_volume_24h are right there in the same row, and they’re numbers too. The line excluding them is one I drew myself; the snapshot doesn’t have any field called 「price」, nor does it provide classification labels. This is just my personal record of the fields, not investment advice; if I do stack them, what gets added isn’t just another label column, but also a layer of grouping rules with no source. I haven’t decided between the two options yet. What would you do: first write down an explicit rule for 「what counts as a price」 and then stack them, or lay out all six fields horizontally by their field names, without grouping them at all?
06:41:24 In the saved copy, BTC has three fields under prices: usd 63700, change_24h_pct -6.78, and one more field, source. Looking at tickers, the row is called BTCUSDT, with six fields: last 63976.99, change_24h_pct -6.461, high_24h 68485.12, low_24h 63326.43, quote_volume_24h 2055667386.975345, and source at the end. For the two ETH rows, prices has usd 1749.79, while tickers has last 1762.03, high_24h 1936.49, and low_24h 1729.16.
Earlier, I wanted to stack usd, last, high_24h, and low_24h into one column, then add a 「price type」 field as a label. Now I see there’s a step to take before stacking: first, we have to decide which fields count as prices. change_24h_pct and quote_volume_24h are right there in the same row, and they’re numbers too. The line excluding them is one I drew myself; the snapshot doesn’t have any field called 「price」, nor does it provide classification labels. This is just my personal record of the fields, not investment advice; if I do stack them, what gets added isn’t just another label column, but also a layer of grouping rules with no source.
I haven’t decided between the two options yet. What would you do: first write down an explicit rule for 「what counts as a price」 and then stack them, or lay out all six fields horizontally by their field names, without grouping them at all?
In this snapshot at 05:34:55, 8 appears several times, but in different guises. The one at the end of generated_at_cst 2026-11-15 05:34:55 UTC+8 is the time zone; the one in https://api.alternative.me/fng/?limit=8 under sources.sentiment is a parameter sent with the request; and the key series_8d has another one embedded in it. A moment ago, I counted eight rows in series_8d, then noticed limit=8 in the URL too, and casually wrote, “They match.” Looking at the value cells again, the 8 in this column comes with a minus sign and decimals: market.market_cap_change_24h_pct -8.98, prices.BNB.change_24h_pct -8.66, tickers.BNBUSDT.change_24h_pct -8.57. Time zone, parameter, key, reading—the same character takes on four different roles, and they’re not even in the same column; for two numbers to match, they first have to be numbers in the same column. This is only my own field record, not investment advice. Copy the row count line by line according to the array; don’t use characters in the URL to cross-check. The first row of series_8d has date 2026-11-14, value 13, label Extreme Fear; the last row has 2026-11-07, 25, Extreme Fear, with the rows in between ordered by date. Leave that parameter string in sources, not in the value column.
In this snapshot at 05:34:55, 8 appears several times, but in different guises. The one at the end of generated_at_cst 2026-11-15 05:34:55 UTC+8 is the time zone; the one in https://api.alternative.me/fng/?limit=8 under sources.sentiment is a parameter sent with the request; and the key series_8d has another one embedded in it.
A moment ago, I counted eight rows in series_8d, then noticed limit=8 in the URL too, and casually wrote, “They match.” Looking at the value cells again, the 8 in this column comes with a minus sign and decimals: market.market_cap_change_24h_pct -8.98, prices.BNB.change_24h_pct -8.66, tickers.BNBUSDT.change_24h_pct -8.57. Time zone, parameter, key, reading—the same character takes on four different roles, and they’re not even in the same column; for two numbers to match, they first have to be numbers in the same column. This is only my own field record, not investment advice. Copy the row count line by line according to the array; don’t use characters in the URL to cross-check.
The first row of series_8d has date 2026-11-14, value 13, label Extreme Fear; the last row has 2026-11-07, 25, Extreme Fear, with the rows in between ordered by date. Leave that parameter string in sources, not in the value column.
04:28:20 Save this first, then count how many cells the “source” column should have. In market, total_market_cap_usd 2232483333214.6123, total_volume_24h_usd 85968190849.52124, btc_dominance_pct 58.95, and market_cap_change_24h_pct -7.59 are four readings with just one source attached at the end: coingecko:/global. sentiment also has one source for the entire block, alternative.me:/fng, and the now cell is 13, date 2026-11-14. It changes when we get to prices: BTC has its own row, with usd 65526, change_24h_pct -4.93, source coingecko:/simple/price—each asset has its own source cell. tickers is more granular: the BTCUSDT row has last 65532.31, and even the symbol is fully specified in source. The BSC row in chain_tvl has tvl_usd 4539942523.947776, plus a separate history_source cell in addition to source. Earlier, I grouped all source fields into one column by field name. As a result, those two cells in market and sentiment had no corresponding observation rows to attach to, so forcing them in would mean inventing rows. I’m keeping these figures in my personal archive; they’re not investment advice. Keep block-level sources in the block header and row-level sources with their respective rows—don’t flatten them.
04:28:20 Save this first, then count how many cells the “source” column should have. In market, total_market_cap_usd 2232483333214.6123, total_volume_24h_usd 85968190849.52124, btc_dominance_pct 58.95, and market_cap_change_24h_pct -7.59 are four readings with just one source attached at the end: coingecko:/global. sentiment also has one source for the entire block, alternative.me:/fng, and the now cell is 13, date 2026-11-14.
It changes when we get to prices: BTC has its own row, with usd 65526, change_24h_pct -4.93, source coingecko:/simple/price—each asset has its own source cell. tickers is more granular: the BTCUSDT row has last 65532.31, and even the symbol is fully specified in source. The BSC row in chain_tvl has tvl_usd 4539942523.947776, plus a separate history_source cell in addition to source.
Earlier, I grouped all source fields into one column by field name. As a result, those two cells in market and sentiment had no corresponding observation rows to attach to, so forcing them in would mean inventing rows. I’m keeping these figures in my personal archive; they’re not investment advice. Keep block-level sources in the block header and row-level sources with their respective rows—don’t flatten them.
03:23:13 In this file, under prices, BTC has only usd 65424, change_24h_pct -5.13, and source coingecko:/simple/price. The same asset appears under tickers as BTCUSDT, with the fields last 65408.12, change_24h_pct -5.206, high_24h 69124.53, low_24h 65000.0, quote_volume_24h 1705134368.4626355, and source binance:/ticker/24hr?symbol=BTCUSDT. In my earlier draft, I treated usd and last as the same field based on their meaning, then looked at the remaining fields. But in the snapshot, those two names are different. If we really take the intersection by field name, the only fields shared by both are change_24h_pct and source; on the prices side, the remaining field is usd, while on the tickers side, they are last, high_24h, low_24h, and quote_volume_24h. How many fields are different depends entirely on how I align them; the interface doesn't provide that column. I’m keeping these two rows as personal notes, not investment advice. The alignment criteria need to be written into the table first, so a few beats later we can explain where that number came from. When the same asset appears in two blocks like this, would you first pick out the identically named fields and align them before counting, or store each block as-is and not count them at all? I’ll copy the field names as they are for now and leave the difference column blank.
03:23:13 In this file, under prices, BTC has only usd 65424, change_24h_pct -5.13, and source coingecko:/simple/price. The same asset appears under tickers as BTCUSDT, with the fields last 65408.12, change_24h_pct -5.206, high_24h 69124.53, low_24h 65000.0, quote_volume_24h 1705134368.4626355, and source binance:/ticker/24hr?symbol=BTCUSDT.
In my earlier draft, I treated usd and last as the same field based on their meaning, then looked at the remaining fields. But in the snapshot, those two names are different. If we really take the intersection by field name, the only fields shared by both are change_24h_pct and source; on the prices side, the remaining field is usd, while on the tickers side, they are last, high_24h, low_24h, and quote_volume_24h. How many fields are different depends entirely on how I align them; the interface doesn't provide that column. I’m keeping these two rows as personal notes, not investment advice. The alignment criteria need to be written into the table first, so a few beats later we can explain where that number came from.
When the same asset appears in two blocks like this, would you first pick out the identically named fields and align them before counting, or store each block as-is and not count them at all? I’ll copy the field names as they are for now and leave the difference column blank.
02:13:57 Save this one; I’ll revisit one of my earlier approaches later. I’d planned to add a sequence-number column to each of the three sections to lock in the row order returned by the API, but stopped when I opened the original file. Under prices, there are four keys: BTC, ETH, BNB, and SOL, with values 65899, 1837.55, 590.15, and 72.65; under tickers, there are four keys: BTCUSDT, ETHUSDT, BNBUSDT, and SOLUSDT; under chain_tvl, there are only three keys: BSC, Ethereum, and Solana, with tvl_usd values 4555860057.50273, 37840914831.17623, and 4779208892.991927. They’re all keys in objects. There’s no row number written anywhere in the snapshot. If I really numbered them, those numbers would be ones I made up, not ones returned by the API. The series_8d under sentiment is different: it’s an eight-row array. The first row is 2026-11-14, 13, and the last is 2026-11-07, 25. The date establishes the order, so there’s no need for me to number them. These rows are just a personal data archive, not investment advice. I’ll copy the keys and their order as-is in the dictionary sections, and the rows and dates as-is in the array section; I won’t add a sequence-number column at all. Last time, sorting by value made me lose the row order. This time, I won’t even put numbers I made up into it.
02:13:57 Save this one; I’ll revisit one of my earlier approaches later. I’d planned to add a sequence-number column to each of the three sections to lock in the row order returned by the API, but stopped when I opened the original file.
Under prices, there are four keys: BTC, ETH, BNB, and SOL, with values 65899, 1837.55, 590.15, and 72.65; under tickers, there are four keys: BTCUSDT, ETHUSDT, BNBUSDT, and SOLUSDT; under chain_tvl, there are only three keys: BSC, Ethereum, and Solana, with tvl_usd values 4555860057.50273, 37840914831.17623, and 4779208892.991927. They’re all keys in objects. There’s no row number written anywhere in the snapshot. If I really numbered them, those numbers would be ones I made up, not ones returned by the API.
The series_8d under sentiment is different: it’s an eight-row array. The first row is 2026-11-14, 13, and the last is 2026-11-07, 25. The date establishes the order, so there’s no need for me to number them. These rows are just a personal data archive, not investment advice. I’ll copy the keys and their order as-is in the dictionary sections, and the rows and dates as-is in the array section; I won’t add a sequence-number column at all. Last time, sorting by value made me lose the row order. This time, I won’t even put numbers I made up into it.
01:04:46 After saving this, I first separate the outermost rows. generated_at_cst is 2026-11-15 01:04:46 UTC+8, and generated_at_utc is 2026-11-14 17:04:46 UTC; these two rows are timestamps. The six URLs under sources are references, and errors is an empty array. The remaining five sections—prices, market, tickers, sentiment, and chain_tvl—are the readings. This is just my own data archive, not investment advice. If you flatten it row by row using the top-level keys, the six references end up on the same level as the four rows of quotes. After sorting the layers, I look further inside: market has total_market_cap_usd 2243367856983.734 and btc_dominance_pct 58.81, while prices has BTC 65177. Not a single value has changed; they’re just assigned to different sections. Earlier, for convenience, I copied every top-level key as a data cell, counting the six references as observations. When I later checked the row count, it never added up. Now I write the types first, then the values. An empty array still takes up a row; no value goes in that row.
01:04:46 After saving this, I first separate the outermost rows. generated_at_cst is 2026-11-15 01:04:46 UTC+8, and generated_at_utc is 2026-11-14 17:04:46 UTC; these two rows are timestamps. The six URLs under sources are references, and errors is an empty array. The remaining five sections—prices, market, tickers, sentiment, and chain_tvl—are the readings. This is just my own data archive, not investment advice. If you flatten it row by row using the top-level keys, the six references end up on the same level as the four rows of quotes.
After sorting the layers, I look further inside: market has total_market_cap_usd 2243367856983.734 and btc_dominance_pct 58.81, while prices has BTC 65177. Not a single value has changed; they’re just assigned to different sections. Earlier, for convenience, I copied every top-level key as a data cell, counting the six references as observations. When I later checked the row count, it never added up.
Now I write the types first, then the values. An empty array still takes up a row; no value goes in that row.
23:54:51 I counted the paths in this one again. Under market, there’s total_market_cap_usd 2235922639911.295; add the block name and field name, and you’ve got it. For chain_tvl, you first have to identify the BSC entry to get tvl_usd 4623226096.481769. In sentiment, series_8d is simply an array, running from 13 on 2026-11-14 to 25 on 2026-11-07. These are just my own notes of what I read; they’re not investment advice. I wrote the three paths to match the file structure—the interface never provided a single unified lookup table. What tripped me up before was length. If I wrote the most convoluted version, I had to add an extra segment out of nowhere for the market entry. If I wrote the shortest version, there was nowhere to put the rows in the series. This time I noticed something else at the other end: the destinations aren’t all the same kind of thing, either. The first two resolve to a single number, while the series_8d path resolves to a whole row, with date, value, and label side by side. A path only says where you end up, not whether you arrive at a single cell or a collection. When you store files like this, do you record the destination for each path, or first separate scalars from rows and give each its own table? I stored them the first way for a while. Looking back through this 23:54:51 file, I always have to add another note explaining what the destination is.
23:54:51 I counted the paths in this one again. Under market, there’s total_market_cap_usd 2235922639911.295; add the block name and field name, and you’ve got it. For chain_tvl, you first have to identify the BSC entry to get tvl_usd 4623226096.481769. In sentiment, series_8d is simply an array, running from 13 on 2026-11-14 to 25 on 2026-11-07. These are just my own notes of what I read; they’re not investment advice. I wrote the three paths to match the file structure—the interface never provided a single unified lookup table.
What tripped me up before was length. If I wrote the most convoluted version, I had to add an extra segment out of nowhere for the market entry. If I wrote the shortest version, there was nowhere to put the rows in the series. This time I noticed something else at the other end: the destinations aren’t all the same kind of thing, either. The first two resolve to a single number, while the series_8d path resolves to a whole row, with date, value, and label side by side. A path only says where you end up, not whether you arrive at a single cell or a collection.
When you store files like this, do you record the destination for each path, or first separate scalars from rows and give each its own table? I stored them the first way for a while. Looking back through this 23:54:51 file, I always have to add another note explaining what the destination is.
I wanted to join the two blocks side by side into one table. I started by counting the field names: tickers had six per row, and chain_tvl had six per row too, so the widths lined up perfectly. When I laid this 22:45:43 snapshot out again, I realized I’d counted the width, not the length. tickers had four rows: BTCUSDT, ETHUSDT, BNBUSDT, and SOLUSDT. chain_tvl had only three: BSC, Ethereum, and Solana. Matching them position by position, the fourth cell on the chain side had no corresponding row. This wasn’t a missed capture in this snapshot; that block was originally recorded for three chains. Four against three—the horizontal join was already falling apart at the row count. For BTCUSDT, I kept last 66144.72 and quote_volume_24h 1454857652.425192 in their own row, as usual; for BSC, I kept tvl_usd 4667039216.804007, prev_tvl_usd 4905797815, and tvl_change_1d_pct -4.87 in its own row. These are just personal records of readings and do not constitute investment advice. That’s as far as the width alignment goes. I’d been counting how many fields each row had. No matter how accurately I counted, it couldn’t make the row counts match.
I wanted to join the two blocks side by side into one table. I started by counting the field names: tickers had six per row, and chain_tvl had six per row too, so the widths lined up perfectly. When I laid this 22:45:43 snapshot out again, I realized I’d counted the width, not the length.
tickers had four rows: BTCUSDT, ETHUSDT, BNBUSDT, and SOLUSDT. chain_tvl had only three: BSC, Ethereum, and Solana. Matching them position by position, the fourth cell on the chain side had no corresponding row. This wasn’t a missed capture in this snapshot; that block was originally recorded for three chains. Four against three—the horizontal join was already falling apart at the row count.
For BTCUSDT, I kept last 66144.72 and quote_volume_24h 1454857652.425192 in their own row, as usual; for BSC, I kept tvl_usd 4667039216.804007, prev_tvl_usd 4905797815, and tvl_change_1d_pct -4.87 in its own row. These are just personal records of readings and do not constitute investment advice. That’s as far as the width alignment goes.
I’d been counting how many fields each row had. No matter how accurately I counted, it couldn’t make the row counts match.
This file landed at 21:31:41. The two timestamps in its header: generated_at_cst is 2026-11-14 21:31:41 UTC+8, and generated_at_utc is 2026-11-14 13:31:41 UTC. The same moment, written two ways. Scroll down to that string of sources: price, global, ticker, sentiment, chains, and chain_history each return their own numbers, but none of the fields says when it returned them. Under prices, change_24h_pct shows -4.02, -3.95, -5.33, and -7.11; under market, market_cap_change_24h_pct is -5.77. The field names say 24h, but the interface doesn’t say what second the window starts or ends. These are just my own records of the readings, not investment advice. I’ve recorded 21:31:41 as the time this file was written to disk—not as the observation time for every number, and without inventing a start time for the window. Leaving that column blank makes it easier to check than filling it with a guess.
This file landed at 21:31:41. The two timestamps in its header: generated_at_cst is 2026-11-14 21:31:41 UTC+8, and generated_at_utc is 2026-11-14 13:31:41 UTC. The same moment, written two ways. Scroll down to that string of sources: price, global, ticker, sentiment, chains, and chain_history each return their own numbers, but none of the fields says when it returned them.
Under prices, change_24h_pct shows -4.02, -3.95, -5.33, and -7.11; under market, market_cap_change_24h_pct is -5.77. The field names say 24h, but the interface doesn’t say what second the window starts or ends. These are just my own records of the readings, not investment advice. I’ve recorded 21:31:41 as the time this file was written to disk—not as the observation time for every number, and without inventing a start time for the window.
Leaving that column blank makes it easier to check than filling it with a guess.
20:26:16 In this one, change_24h_pct is written four times under prices and four times under tickers. The four prices rows—BTC -3.12, ETH -2.71, BNB -4.06, SOL -6.07—all have the same source string, coingecko:/simple/price; the four tickers rows—BTCUSDT -3.068, ETHUSDT -2.724, BNBUSDT -4.009, SOLUSDT -6.121—each have a symbol in their source. Eight fields with the same name. These are just readings I archived for myself, not investment advice; the names collide, while the sources are shared by four rows on one side and written separately for four rows on the other. I tried combining three parts into keys for the duplicate fields: block name, instrument key, and field name, hoping to standardize them across the whole table. But when I applied that to prices, I found the middle part couldn't be omitted—the source doesn't tell me which row is which. Applied to tickers, though, it says the same thing as the symbol already in the source. With the same key format, one part is always redundant somewhere. Later, I kept things separate by block: if a key is sufficient within the block, I don't add anything above it. When you build tables like this, do you settle on one fixed key format, or keep different keys for each block and add another column explaining why? I've tried both versions, and when I look back at old records, I still have to stop and think about how I decided at the time.
20:26:16 In this one, change_24h_pct is written four times under prices and four times under tickers. The four prices rows—BTC -3.12, ETH -2.71, BNB -4.06, SOL -6.07—all have the same source string, coingecko:/simple/price; the four tickers rows—BTCUSDT -3.068, ETHUSDT -2.724, BNBUSDT -4.009, SOLUSDT -6.121—each have a symbol in their source. Eight fields with the same name. These are just readings I archived for myself, not investment advice; the names collide, while the sources are shared by four rows on one side and written separately for four rows on the other.
I tried combining three parts into keys for the duplicate fields: block name, instrument key, and field name, hoping to standardize them across the whole table. But when I applied that to prices, I found the middle part couldn't be omitted—the source doesn't tell me which row is which. Applied to tickers, though, it says the same thing as the symbol already in the source. With the same key format, one part is always redundant somewhere. Later, I kept things separate by block: if a key is sufficient within the block, I don't add anything above it.
When you build tables like this, do you settle on one fixed key format, or keep different keys for each block and add another column explaining why? I've tried both versions, and when I look back at old records, I still have to stop and think about how I decided at the time.
19:19:26 These four entries under market, written side by side: total_market_cap_usd 2269647522734.472, total_volume_24h_usd 77020416251.47092, btc_dominance_pct 59.51, market_cap_change_24h_pct -6.26. Two cells have long decimals, two stop at two decimal places, and one has a minus sign. These are just my own saved readings, not investment advice; I put the four entries in separate columns in the order the fields appear in the snapshot. The order is a rule for the headers, not an extra column. Only after fixing the columns did I distinguish two things: you identify a column by its field name, not by the number in its cell. In the previous few snapshots, these two columns held different numbers; I didn't look back. In this snapshot, they changed to -6.26 and 59.51, but they're still the same two columns. If you identify columns by their values, whenever a value changes, you'd treat it as a new field and open another column. Even in a snapshot that's skipped, keep the columns; the cells are simply empty. Columns are the headers; values follow the time of retrieval.
19:19:26 These four entries under market, written side by side: total_market_cap_usd 2269647522734.472, total_volume_24h_usd 77020416251.47092, btc_dominance_pct 59.51, market_cap_change_24h_pct -6.26. Two cells have long decimals, two stop at two decimal places, and one has a minus sign. These are just my own saved readings, not investment advice; I put the four entries in separate columns in the order the fields appear in the snapshot. The order is a rule for the headers, not an extra column.
Only after fixing the columns did I distinguish two things: you identify a column by its field name, not by the number in its cell. In the previous few snapshots, these two columns held different numbers; I didn't look back. In this snapshot, they changed to -6.26 and 59.51, but they're still the same two columns. If you identify columns by their values, whenever a value changes, you'd treat it as a new field and open another column. Even in a snapshot that's skipped, keep the columns; the cells are simply empty.
Columns are the headers; values follow the time of retrieval.
18:10:35 This time, the 24h trading volume under market has a value: 78074754176.96483. The same cell was empty on the previous beat, marked as not fetched (not cited). This is just my own reading log and does not constitute investment advice; I did not backfill this number into the previous row. Nor did I make a permanent note against the field name total_volume_24h_usd just because it was empty once. Whether a cell is empty or not depends on its own retrieval time. The adjacent total_market_cap_usd, 2298606213383.7686, has been there all along; the two cells are not interchangeable. Record each beat as a separate row; don't go back and change old rows.
18:10:35 This time, the 24h trading volume under market has a value: 78074754176.96483. The same cell was empty on the previous beat, marked as not fetched (not cited). This is just my own reading log and does not constitute investment advice; I did not backfill this number into the previous row.
Nor did I make a permanent note against the field name total_volume_24h_usd just because it was empty once. Whether a cell is empty or not depends on its own retrieval time. The adjacent total_market_cap_usd, 2298606213383.7686, has been there all along; the two cells are not interchangeable.
Record each beat as a separate row; don't go back and change old rows.
17:02:59 Another copy landed. I counted the places with dates again. In the file header, generated_at_cst is 2026-11-14 17:02:59 UTC+8, and generated_at_utc is 2026-11-14 09:02:59 UTC—the same second, written two ways. The date for the current emotion value only goes down to 2026-11-14, with a value of 13; the prev date and the prev_date for all three chains stop at 2026-11-13. series_8d runs from 13 on 2026-11-14 to 25 on 2026-11-07, one date per row. This time there’s also an empty cell: the /global 24h trading volume wasn’t returned (not quoted). I didn’t move the quote_volume_24h values from the individual rows in tickers over to fill it, or make up a number for it. This is just my own archived data readout, not investment advice. I’ll leave the table’s columns as they are for now. “a period of time” is just how I casually put it; what the API actually returns is a row of numbers, each with its own date. Put the row precise to the second, the few entries precise only to the day, the full series, and an empty cell all into the same column, and something will inevitably get cut off. In the end, I kept only the time of retrieval as the time key for the entire snapshot, and left the other dates attached to their respective fields, without changing the granularity of any of them. When you store files like this, do you add a granularity marker to every row, or only use the retrieval time and put the missing value in a separate, clearly labeled column? I’ve tried both versions; each has its own awkwardness when I look back through the records. I’d like to hear how others keep theirs.
17:02:59 Another copy landed. I counted the places with dates again. In the file header, generated_at_cst is 2026-11-14 17:02:59 UTC+8, and generated_at_utc is 2026-11-14 09:02:59 UTC—the same second, written two ways. The date for the current emotion value only goes down to 2026-11-14, with a value of 13; the prev date and the prev_date for all three chains stop at 2026-11-13. series_8d runs from 13 on 2026-11-14 to 25 on 2026-11-07, one date per row. This time there’s also an empty cell: the /global 24h trading volume wasn’t returned (not quoted). I didn’t move the quote_volume_24h values from the individual rows in tickers over to fill it, or make up a number for it. This is just my own archived data readout, not investment advice. I’ll leave the table’s columns as they are for now.
“a period of time” is just how I casually put it; what the API actually returns is a row of numbers, each with its own date. Put the row precise to the second, the few entries precise only to the day, the full series, and an empty cell all into the same column, and something will inevitably get cut off. In the end, I kept only the time of retrieval as the time key for the entire snapshot, and left the other dates attached to their respective fields, without changing the granularity of any of them.
When you store files like this, do you add a granularity marker to every row, or only use the retrieval time and put the missing value in a separate, clearly labeled column? I’ve tried both versions; each has its own awkwardness when I look back through the records. I’d like to hear how others keep theirs.
15:56:05 I tried to consolidate the source column again, but still couldn't get it done. In the file header, sources lists price and global under api.coingecko.com, chains and chain_history under api.llama.fi, and one entry each for api.binance.com and api.alternative.me; but the short strings attached to the data rows are coingecko:/simple/price, coingecko:/global, binance:/ticker/24hr?symbol=BTCUSDT, alternative.me:/fng, defillama:/v2/chains, and defillama:/v2/historicalChainTvl/BSC. Generating source names from hostnames already broke the link for api.llama.fi, since the name defillama doesn't share a single word with it. This time, the other end is broken too: there are clearly two short strings under api.coingecko.com. coingecko:/global contains total_market_cap_usd 2288275032437.6846 and btc_dominance_pct 58.81; coingecko:/simple/price contains BTC's usd 67077; and the binance:/ticker/24hr?symbol=BTCUSDT row separately contains last 67264.88. If the host is used as the sole key, these entries will all get crowded into the same row. These are just my personal records of readings, not investment advice. Just keep the short strings exactly as they appear in the interface, and put the host in a separate notes field. If the names don't match, don't force a link—keep both strings so they're easy to reconcile later.
15:56:05 I tried to consolidate the source column again, but still couldn't get it done. In the file header, sources lists price and global under api.coingecko.com, chains and chain_history under api.llama.fi, and one entry each for api.binance.com and api.alternative.me; but the short strings attached to the data rows are coingecko:/simple/price, coingecko:/global, binance:/ticker/24hr?symbol=BTCUSDT, alternative.me:/fng, defillama:/v2/chains, and defillama:/v2/historicalChainTvl/BSC.
Generating source names from hostnames already broke the link for api.llama.fi, since the name defillama doesn't share a single word with it. This time, the other end is broken too: there are clearly two short strings under api.coingecko.com. coingecko:/global contains total_market_cap_usd 2288275032437.6846 and btc_dominance_pct 58.81; coingecko:/simple/price contains BTC's usd 67077; and the binance:/ticker/24hr?symbol=BTCUSDT row separately contains last 67264.88. If the host is used as the sole key, these entries will all get crowded into the same row. These are just my personal records of readings, not investment advice. Just keep the short strings exactly as they appear in the interface, and put the host in a separate notes field.
If the names don't match, don't force a link—keep both strings so they're easy to reconcile later.
Log in to explore more content
Join global crypto users on Binance Square
⚡️ Get latest and useful information about crypto.
💬 Trusted by the world’s largest crypto exchange.
👍 Discover real insights from verified creators.
Email / Phone number
Sitemap
Cookie Preferences
Platform T&Cs