/// <summary> /// Converts a pandas.Series into a <see cref="SortedDictionary{DateTime, Double}"/> /// </summary> /// <param name="series">pandas.Series to be converted</param> /// <returns><see cref="SortedDictionary{DateTime, Double}"/> with pandas.Series information</returns> private SortedDictionary<DateTime, double> GetDictionaryFromSeries(PyObject series) { var dictionary = new SortedDictionary<DateTime, double>(); var pyDict = new PyDict(((dynamic)series).to_dict()); foreach (PyObject item in pyDict.Items()) { var key = (DateTime)item[0].AsManagedObject(typeof(DateTime)); var value = (double)item[1].AsManagedObject(typeof(double)); dictionary.Add(key, value); } return dictionary; }
/// <summary> /// Converts a dictionary with a list of <see cref="IndicatorDataPoint"/> in a pandas.DataFrame /// </summary> /// <param name="data"><see cref="PyObject"/> that should be a dictionary (convertible to PyDict) of string to list of <see cref="IndicatorDataPoint"/></param> /// <returns><see cref="PyObject"/> containing a pandas.DataFrame</returns> public PyObject GetIndicatorDataFrame(PyObject data) { using (Py.GIL()) { using var inputPythonType = data.GetPythonType(); var inputTypeStr = inputPythonType.ToString(); var targetTypeStr = nameof(PyDict); PyObject currentKvp = null; try { using var pyDictData = new PyDict(data); using var seriesPyDict = new PyDict(); targetTypeStr = $"{nameof(String)}: {nameof(List<IndicatorDataPoint>)}"; foreach (var kvp in pyDictData.Items()) { currentKvp = kvp; AddSeriesToPyDict(kvp[0].As <string>(), kvp[1].As <List <IndicatorDataPoint> >(), seriesPyDict); } return(MakeIndicatorDataFrame(seriesPyDict)); } catch (Exception e) { if (currentKvp != null) { inputTypeStr = $"{currentKvp[0].GetPythonType()}: {currentKvp[1].GetPythonType()}"; } throw new ArgumentException( $"ConvertToDictionary cannot be used to convert a {inputTypeStr} into {targetTypeStr}. Reason: {e.Message}", e ); } } }