I am learning about data frames. I have a set of functions that will read CSV files into data frames, allow me to format a string into a date and then sort by date in ascending order. What I would like to do now is add a column to the data frame then populate it with values calculated from values already in the data frame. I am unable to get past the first step of adding an empty column to the data frame. Any assistance will be appreciated.
import TabularData
import SwiftUI
func GetAlphaVantageDF(fileName: String) -> DataFrame {
var alphaVantageDF = ReadAlphaVantageCSV(fileName: fileName)
TransformStringToDateAV(dataFrame: &alphaVantageDF)
SortDataFrameByDate(dataFrame: &alphaVantageDF, sortOn: "timestamp")
alphaVantageDF.append(column: Column<T>) // do not know what to put in place of Column<T> or if this is even the right path to take
let alphaVanDF1Year: DataFrame.Slice = OneYearSlice(dataFrame: alphaVantageDF, filterOn: "timestamp")
return alphaVantageDF
}
func ReadAlphaVantageCSV(fileName: String) -> DataFrame {
guard let pathURL = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first else { return DataFrame() }
let fileURL = pathURL.appendingPathComponent((fileName + ".csv"))
let options = CSVReadingOptions(hasHeaderRow: true, ignoresEmptyLines: true, delimiter: ",")
let dataFrame = try! DataFrame(contentsOfCSVFile: fileURL, columns: ["timestamp","close"], types: ["timestamp": .string , "close": .double], options: options)
return dataFrame
}
func TransformStringToDateAV(dataFrame: inout DataFrame) {
dataFrame.transformColumn("timestamp") { (theDate: String) -> Date in
return alphaVantageDateFormatter.date(from: theDate)!
}
}
func SortDataFrameByDate(dataFrame: inout DataFrame, sortOn: String) {
dataFrame.sort(on: sortOn, order: .ascending)
}
func OneYearSlice(dataFrame: DataFrame, filterOn: String) -> DataFrame.Slice {
let lastRowNum = dataFrame.shape.rows - 1
let lastDataFrameRow = dataFrame[row: lastRowNum]
let latestDate = lastDataFrameRow[0]
let oneYearAgo = Calendar.current.date(byAdding: .year, value: -1, to: latestDate as! Date)
let dataFrame1Year: DataFrame.Slice = dataFrame.filter(on: filterOn, Date.self, { $0! > oneYearAgo! })
return dataFrame1Year
}
let alphaVantageDateFormatter: DateFormatter = {
let result = DateFormatter()
result.dateFormat = "yyyy-MM-dd"
result.locale = Locale(identifier: "en_US_POSIX")
result.timeZone = TimeZone(secondsFromGMT: 0)
return result
}()