| // Functions for generating CSV from a DataFrame. |
| import { MISSING_DATA_SENTINEL } from '../const/const'; |
| import { ColumnHeader, DataFrame, Params } from '../json'; |
| import { fromKey } from '../paramtools'; |
| |
| export function parseIdsIntoParams(ids: string[]): {[key: string]: Params} { |
| const ret: {[key: string]: Params} = {}; |
| |
| ids.forEach((id: string) => { |
| ret[id] = fromKey(id); |
| }); |
| |
| return ret; |
| } |
| |
| export function allParamKeysSorted(allParams: {[key: string]: Params}): string[] { |
| const paramKeys: Set<string> = new Set(); |
| |
| Object.keys(allParams).forEach((key) => { |
| Object.keys(allParams[key]).forEach((pkey) => paramKeys.add(pkey)); |
| }); |
| |
| return Array.from<string>(paramKeys).sort(); |
| } |
| |
| export function dataFrameToCSV(df: DataFrame): string { |
| const csv: string[] = []; |
| // First figure out how many columns we need to represent all the ids in the |
| // DataFrame, then add all those column names. |
| const traceIDs = Object.keys(df.traceset); |
| const traceIDToParams = parseIdsIntoParams(traceIDs); |
| const sortedColumnNames = allParamKeysSorted(traceIDToParams); |
| |
| let line: (string | number)[] = sortedColumnNames.slice(0); |
| df.header!.forEach((ch: ColumnHeader|null) => { |
| line.push(new Date(ch!.timestamp * 1000).toISOString()); |
| }); |
| csv.push(line.join(',')); |
| Object.keys(df.traceset).forEach((traceId) => { |
| if (traceId.startsWith('special_')) { |
| return; |
| } |
| // Create the first columns of the CSV row which contain all the Param |
| // values for each column header, noting that not all columns will have a |
| // value. |
| const traceParams = traceIDToParams[traceId]; |
| line = sortedColumnNames.map((columnName) => traceParams[columnName] || ''); |
| df.traceset[traceId]!.forEach((f) => { |
| if (f === MISSING_DATA_SENTINEL) { |
| line.push(''); |
| } else { |
| line.push(f); |
| } |
| }); |
| csv.push(line.join(',')); |
| }); |
| |
| return csv.join('\n'); |
| } |