Перейти к содержимому

DataFrame и Pandas

В ML PascalABC.NET основной тип для табличных данных называется DataFrame. По назначению он похож на DataFrame из библиотеки Pandas в Python, но устроен в стиле PascalABC.NET.

Если вы знакомы с Pandas, большинство базовых операций имеют прямые аналоги.

PandasDataFrame
pd.read_csv('data.csv')DataFrame.FromCsv('data.csv')
pd.read_excel(...)DataFrame.FromODS(...)
PandasDataFrame
print(df)df.Print;
df.info()df.PrintInfo;
df.head()df.Head.Print;
df.tail()df.Tail.Print;
df.describe()df.Describe.Print;
PandasDataFrame
df[['Age','Salary']]df.Select(['Age','Salary'])
df.drop(columns=['Comment'])df.Drop(['Comment'])
df['T_K'] = df['T'] + 273.15df.WithColumnFloat('T_K', r -> r['T'] + 273.15)
df['T'] = df['T'] + 273.15df.ReplaceColumnFloat('T', r -> r['T'] + 273.15)
PandasDataFrame
pd.to_datetime(...)автоматическое распознавание DateTime
df['Date'].dt.yeardf.WithDatePart(...)
df['Date'].dt.monthdf.WithDatePart(...)
df['Date'].dt.daydf.WithDatePart(...)

Pandas:

df[df['Salary'] > 80000]

DataFrame:

df.Filter(r -> r['Salary'] > 80000)

Сложное условие:

df[(df['Department']=='IT') & (df['Salary']>80000)]
df.Filter(r ->
(r['Department'] = 'IT') and
(r['Salary'] > 80000)
)
PandasDataFrame
df.sort_values('Salary')df.SortBy('Salary')
df.sort_values('Salary', ascending=False)df.SortByDescending('Salary')
PandasDataFrame
df['Salary'].min()df.Min('Salary')
df['Salary'].max()df.Max('Salary')
df['Salary'].mean()df.Mean('Salary')
df['Salary'].median()df.Median('Salary')
df['Salary'].std()df.Std('Salary')
df['Salary'].var()df.Variance('Salary')

Pandas:

df.groupby('City')['Salary'].max()

DataFrame:

df.GroupBy('City')
.Max('Salary')
PandasDataFrame
df['City'].unique()df.Unique('City')
df['City'].nunique()df.NUnique('City')
df['City'].value_counts()df.ValueCounts('City')
PandasDataFrame
df.isna().sum()df.MissingCounts
df.dropna()df.DropMissing()
df.dropna(subset=['Age'])df.DropMissing(['Age'])

Для заполнения пропусков в ML PascalABC.NET рекомендуется использовать класс Imputer.

PandasDataFrame
df.drop_duplicates()df.DropDuplicates()
PandasDataFrame
df['Age'].clip(18,70)df.Clip('Age', 18, 70)

DataFrame не является прямой копией Pandas.

В DataFrame:

  • отсутствует индекс строк;
  • отсутствуют loc, iloc и at;
  • отсутствуют строковые запросы query(...);
  • отсутствуют операции inplace=True;
  • используются типизированные столбцы (Integer, Real, String, Boolean, DateTime);
  • фильтрация и преобразования выполняются с помощью лямбда-выражений PascalABC.NET.

Такой подход делает код более типобезопасным и лучше соответствует стилю PascalABC.NET.