10#include "da_algorithm.hpp"
25 DAVector(
int size) : QVector< T >(size)
29 DAVector(
int size,
const T& t) : QVector< T >(size, t)
33 DAVector(std::initializer_list< T > args) : QVector< T >(args)
37 DAVector(
const QString& n) : QVector< T >(), mName(n)
41 const QString& name()
const;
44 void setName(
const QString& n);
45 QString getName()
const;
58QString& DAVector< T >::name()
64void DAVector< T >::setName(
const QString& n)
70QString DAVector< T >::getName()
const
110template<
typename T >
126 typedef std::shared_ptr< SeriesType > SeriesPtr;
130 typedef std::shared_ptr< TableType > TablePtr;
131 static SeriesPtr makeSeries();
132 static SeriesPtr makeSeries(
const QString& n);
133 static SeriesPtr makeSeries(std::initializer_list< T > args);
134 static TablePtr makeTable();
138 void resize(
int r,
int c);
147 void fill(
const T& v);
148 const T&
at(
int r,
int c)
const;
150 const T&
iloc(
int r,
int c)
const;
151 T&
iloc(
int r,
int c);
153 T
cell(
int r,
int c)
const;
156 void appendSeries(std::initializer_list< T > args,
const QString& n);
158 template<
typename Ite1,
typename Ite2 >
159 void appendRow(Ite1 b, Ite2 e);
160 void appendRow(std::initializer_list< T > args);
162 int nameToIndex(
const QString& n)
const;
164 const SeriesPtr&
series(
int c)
const;
165 SeriesPtr&
series(
const QString& n);
166 const SeriesPtr&
series(
const QString& n)
const;
169 SeriesPtr
row(
int r)
const;
171 SeriesType& operator[](
int c);
172 const SeriesType& operator[](
int c)
const;
173 SeriesType& operator[](
const QString& rowname);
174 const SeriesType& operator[](
const QString& rowname)
const;
176 void reserve(
int size);
212 void setName(
const QString& n);
235 TablePtr
takeByValue(
const QString& field, T value)
const;
243 QPair< QList< TablePtr >, QList< T > >
groupBy(
const QString& field)
const;
249 void orderBy(
const QString& sn);
258 QPair< T, int >
lowerBound(
const T& v,
const QString& sortedfield)
const;
259 QPair< T, int >
lowerBound(
const T& v,
int c)
const;
260 QPair< T, int > upperBound(
const T& v,
const QString& sortedfield)
const;
261 QPair< T, int > upperBound(
const T& v,
int c)
const;
279 SeriesPtr m_nullseries;
283template<
typename T >
284typename DADataTable< T >::TablePtr take_by_value(
const DADataTable< T >& table,
const QString& field, T value)
286 const int c = table.nameToIndex(field);
288 typename DADataTable< T >::TablePtr res = DADataTable< T >::makeTable();
290 res->setName(table.getName());
291 res->setSeriesNames(table.columns());
292 int rsize = table.rowCount();
294 for (
int i = 0; i < rsize; ++i) {
295 if (table.iloc(i, c) == value) {
296 typename DADataTable< T >::SeriesPtr rv = table.row(i);
297 res->appendDatas(rv->begin(), rv->end());
310template<
typename T >
311typename DADataTable< T >::TablePtr take_by_value(
const DADataTable< T >& table,
int c, T value)
321 for (
int i = 0; i < rsize; ++i) {
322 if (table.
iloc(i, c) == value) {
323 typename DADataTable< T >::SeriesPtr rv = table.
row(i);
324 res->appendDatas(rv->begin(), rv->end());
336template<
typename T >
339 QList< typename DADataTable< T >::TablePtr > restables;
342 int cindex = table.nameToIndex(field);
344 Q_ASSERT_X(cindex >= 0,
"groupby",
"unknow field");
345 typename DADataTable< T >::SeriesPtr r = table.
series(cindex);
347 return (qMakePair(restables, gr));
349 gr = r->toList().toSet().toList();
350 std::sort(gr.begin(), gr.end());
352 restables.append(take_by_value(table, cindex, v));
354 return (qMakePair(restables, gr));
360template<
typename T >
376template<
typename T >
379 return (a.value < b.value);
387template<
typename T >
388std::shared_ptr< DAVector< _DAValueWithIndex< T > > >
makeIndexSeries(
const typename DADataTable< T >::SeriesPtr& p)
390 std::shared_ptr< DAVector< _DAValueWithIndex< T > > > res = std::make_shared< DAVector< _DAValueWithIndex< T > > >();
393 const int s = p->size();
396 for (
int i = 0; i < s; ++i) {
402template<
typename T >
403void order_by(DADataTable< T >& table,
const QString& field)
405 const int r = table.nameToIndex(field);
412template<
typename T >
413void order_by(DADataTable< T >& table,
int c)
415 typename DADataTable< T >::SeriesPtr ser = table.series(c);
416 Q_ASSERT_X(ser !=
nullptr,
"orderBy",
"unknow field");
417 auto ordser = makeIndexSeries< T >(ser);
419 std::sort(ordser->begin(), ordser->end());
420 int sercount = table.columnCount();
423 for (
int i = 0; i < sercount; ++i) {
424 typename DADataTable< T >::SeriesPtr series = table.series(i);
425 typename DADataTable< T >::SeriesPtr ns = DADataTable< T >::makeSeries(series->getName());
426 ns->reserve(series->size());
427 for (
auto j = ordser->begin(); j != ordser->end(); ++j) {
428 ns->push_back(series->at((*j).index));
430 table.series(i).swap(ns);
437template<
typename T >
447template<
typename T >
452 for (
int i = 0; i < cols; ++i) {
453 SeriesPtr r = makeSeries(rows);
454 r->setName(QString(
"column_%1").arg(i));
464template<
typename T >
468 for (SeriesPtr& ser : m_d) {
469 if (ser ==
nullptr) {
482template<
typename T >
485 int c = columnCount();
486 Qt::CaseSensitivity cs = isCaseSensitivity() ? Qt::CaseSensitive : Qt::CaseInsensitive;
488 for (
int i = 0; i < c; ++i) {
489 if (series(i)->name().compare(field, cs) == 0) {
500template<
typename T >
503 for (SeriesPtr s : m_d) {
514template<
typename T >
517 return (m_d.at(c)->at(r));
526template<
typename T >
529 return (*(m_d[ c ])[ r ]);
538template<
typename T >
550template<
typename T >
562template<
typename T >
565 if (r < m_d.size()) {
566 const SeriesPtr& s = series(c);
578template<
typename T >
581 size_t s = ser->size();
585 resize(s, columnCount());
588 }
else if (s == m_rows) {
591 }
else if (s < m_rows) {
597 if (getMode() == ExpandMode) {
598 for (SeriesPtr colser : m_d) {
611template<
typename T >
614 SeriesPtr r = makeSeries(args);
620template<
typename T >
621template<
typename Ite1,
typename Ite2 >
622void DADataTable< T >::appendRow(Ite1 b, Ite2 e)
624 const int rc = columnCount();
627 for (
int i = 0; i < rc; ++i) {
630 series(i)->push_back(*it);
632 series(i)->push_back(T());
638template<
typename T >
639void DADataTable< T >::appendRow(std::initializer_list< T > args)
641 appendRow(args.begin(), args.end());
653template<
typename T >
654typename DADataTable< T >::SeriesPtr DADataTable< T >::makeSeries(
const QString& n)
656 return (std::make_shared< SeriesType >(n));
659template<
typename T >
660typename DADataTable< T >::SeriesPtr DADataTable< T >::makeSeries(std::initializer_list< T > args)
662 return (std::make_shared< SeriesType >(args));
665template<
typename T >
666typename DADataTable< T >::TablePtr DADataTable< T >::makeTable()
668 return (std::make_shared<
typename DADataTable< T >::TableType >());
671template<
typename T >
672typename DADataTable< T >::SeriesPtr DADataTable< T >::makeSeries()
674 return (std::make_shared< SeriesType >());
677template<
typename T >
678int DADataTable< T >::nameToIndex(
const QString& n)
const
680 int r = columnCount();
681 Qt::CaseSensitivity cs = isCaseSensitivity() ? Qt::CaseSensitive : Qt::CaseInsensitive;
683 for (
int i = 0; i < r; ++i) {
684 if (series(i)->name().compare(n, cs) == 0) {
696template<
typename T >
707template<
typename T >
718template<
typename T >
721 int r = nameToIndex(n);
723 if ((r < 0) || (r > columnCount())) {
724 return (m_nullseries);
734template<
typename T >
737 int i = nameToIndex(n);
739 if ((i < 0) || (i > columnCount())) {
740 return (m_nullseries);
750template<
typename T >
753 int csize = columnCount();
754 SeriesPtr sr = std::make_shared< SeriesType >(csize);
756 for (
int c = 0; c < csize; ++c) {
757 (*sr)[ r ] = cell(r, c);
762template<
typename T >
765 return (*(series(r)));
768template<
typename T >
769const typename DADataTable< T >::SeriesType& DADataTable< T >::operator[](
int c)
const
771 return (*(series(r)));
774template<
typename T >
775typename DADataTable< T >::SeriesType& DADataTable< T >::operator[](
const QString& rowname)
777 return (*(series(rowname)));
780template<
typename T >
781const typename DADataTable< T >::SeriesType& DADataTable< T >::operator[](
const QString& rowname)
const
783 return (*(series(rowname)));
786template<
typename T >
787void DADataTable< T >::reserve(
int size)
789 for (SeriesPtr& p : m_d) {
799template<
typename T >
802 std::vector< int > ss;
803 ss.reserve(m_d.size());
805 for (
const SeriesPtr& r : m_d) {
806 ss.push_back(r->size());
808 int maxsize = *(std::max_element(ss.begin(), ss.end()));
810 for (SeriesPtr& r : m_d) {
811 if (r->size() < maxsize) {
822template<
typename T >
832template<
typename T >
838template<
typename T >
844template<
typename T >
850template<
typename T >
861template<
typename T >
871template<
typename T >
874 return (m_d.getName());
882template<
typename T >
885 return columnNames();
892template<
typename T >
897 for (SeriesPtr p : m_d) {
898 r.append(p->getName());
908template<
typename T >
911 const int s = ns.size();
913 for (
int i = 0; i < s; ++i) {
914 if (i < columnCount()) {
915 series(i)->setName(ns[ i ]);
917 SeriesPtr r = makeSeries(ns[ i ]);
929template<
typename T >
932 return (take_by_value(*
this, field, value));
940template<
typename T >
950template<
typename T >
960template<
typename T >
963 order_by(*
this, cindex);
972template<
typename T >
975 const int r = nameToIndex(sortedfield);
977 return (lowerBound(v, r));
980template<
typename T >
983 typename DADataTable< T >::SeriesPtr prow = series(c);
984 SeriesIterator ite = std::lower_bound(prow->begin(), prow->end(), v);
986 if (ite == prow->end()) {
987 return (qMakePair< T, int >(prow->back(), prow->size() - 1));
989 size_t dis = std::distance(prow->begin(), ite);
991 return (qMakePair< T, int >(*ite, dis));
994template<
typename T >
995QPair< T, int > DADataTable< T >::upperBound(
const T& v,
const QString& sortedfield)
const
997 const int r = nameToIndex(sortedfield);
999 return (upperBound(v, r));
1002template<
typename T >
1003QPair< T, int > DADataTable< T >::upperBound(
const T& v,
int c)
const
1005 typename DADataTable< T >::SeriesPtr prow = series(c);
1006 SeriesIterator ite = std::upper_bound(prow->begin(), prow->end(), v);
1008 if (ite == prow->end()) {
1009 return (qMakePair< T, int >(prow->back(), prow->size() - 1));
1011 size_t dis = std::distance(prow->begin(), ite);
1013 return (qMakePair< T, int >(*ite, dis));
1020template<
typename T >
1023 m_caseSensitivity = cs;
1030template<
typename T >
1033 return (m_caseSensitivity == CaseSensitive);
1036#if (QT_VERSION >= QT_VERSION_CHECK(5, 4, 0))
1038template<
typename T >
1041 QDebugStateSaver saver(debug);
1046 for (
const QString& r : rns) {
1048 maxlen = qMax(maxlen, r.size());
1051 for (
int i = 0; i < colCnt; ++i) {
1052 typename DADataTable< T >::SeriesPtr r = t.
series(i);
1053 QString name = r->getName();
1054 if (name.size() < maxlen) {
1055 name.leftJustified(maxlen);
1057 debug.noquote() << name <<
":";
1060 for (
int j = 0; j < 5; ++j) {
1061 debug.noquote() << r->at(j) <<
",";
1063 debug.noquote() <<
" ...... ";
1064 for (
int j = cs - 6; j < cs; ++j) {
1065 debug.noquote() << r->at(j) <<
",";
1068 for (
int j = 0; j < cs; ++j) {
1069 debug << r->at(j) <<
",";
1079template<
typename T >
1080QDebug operator<<(QDebug debug,
const DADataTable< T >& t)
1082 QDebugStateSaver saver(debug);
1083 int rs = t.columnCount();
1084 QStringList rns = t.columns();
1087 for (
const QString& r : rns) {
1088 maxlen = qMax(maxlen, r.size());
1091 for (
int i = 0; i < rs; ++i) {
1092 typename DADataTable< T >::SeriesPtr r = t.series(i);
1093 QString name = r->getName();
1094 if (name.size() < maxlen) {
1095 name.resize(maxlen);
1097 debug.nospace() << name <<
":";
1100 for (
int j = 0; j < 5; ++j) {
1101 debug.nospace() << r->at(j) <<
",";
1103 debug.nospace() <<
" ...... ";
1104 for (
int j = cs - 6; j < cs; ++j) {
1105 debug.nospace() << r->at(j) <<
",";
1108 for (
int j = 0; j < cs; ++j) {
1109 debug << r->at(j) <<
",";
以列为基础的数据表,和python 的 pandas.DataFrame类似
Definition da_data_table.hpp:112
bool haveColumns(const QString &field) const
判断是否存在Columns
Definition da_data_table.hpp:483
void clear()
清空
Definition da_data_table.hpp:851
TablePtr takeByValue(const QString &field, T value) const
提取某个值等于value作为新表
Definition da_data_table.hpp:930
DADataTable()
构造一个空的数据表
Definition da_data_table.hpp:438
SeriesPtr row(int r) const
获取一行数据
Definition da_data_table.hpp:751
QStringList columnNames() const
获取列的名字序列
Definition da_data_table.hpp:893
QPair< T, int > lowerBound(const T &v, const QString &sortedfield) const
查找第一个大于或等于某个元素的位置
Definition da_data_table.hpp:973
void appendSeries(SeriesPtr ser)
追加一列
Definition da_data_table.hpp:579
void fill(const T &v)
填充元素
Definition da_data_table.hpp:501
int rowCount() const
表的列数
Definition da_data_table.hpp:833
QPair< QList< TablePtr >, QList< T > > groupBy(const QString &field) const
groupby
Definition da_data_table.hpp:941
int columnCount() const
表的行数
Definition da_data_table.hpp:823
QString getName() const
获取表的名字
Definition da_data_table.hpp:872
QStringList columns() const
和pandas统一
Definition da_data_table.hpp:883
void orderBy(const QString &sn)
orderBy
Definition da_data_table.hpp:951
SeriesPtr & series(int c)
获取行引用
Definition da_data_table.hpp:697
const T & at(int r, int c) const
定位单元格
Definition da_data_table.hpp:515
void resize(int r, int c)
改变table 的大小
Definition da_data_table.hpp:465
bool isCaseSensitivity() const
判断是否大小写敏感
Definition da_data_table.hpp:1031
CaseSensitivity
Definition da_data_table.hpp:120
@ CaseInsensitive
大小写不敏感
Definition da_data_table.hpp:121
@ CaseSensitive
大小写敏感
Definition da_data_table.hpp:122
void setMode(Mode m)
设置表格的模式
Definition da_data_table.hpp:839
void setCaseSensitivity(CaseSensitivity cs)
设置名字查询时是否对大小写敏感
Definition da_data_table.hpp:1021
T cell(int r, int c) const
获取单元格
Definition da_data_table.hpp:563
void setName(const QString &n)
设置表的名字
Definition da_data_table.hpp:862
void setSeriesNames(const QStringList &ns)
设置行名,如果是个空的表会生成一个默认行
Definition da_data_table.hpp:909
void fixSize()
以最大列数进行列数修正,保证所有行同列
Definition da_data_table.hpp:800
const T & iloc(int r, int c) const
定位单元格
Definition da_data_table.hpp:539
Mode
Definition da_data_table.hpp:115
@ ExpandMode
扩展模式,表的行是浮动的,如果插入一列比原来要宽,会自动扩充表的原来那些列对应的行数(默认)
Definition da_data_table.hpp:117
@ FixedMode
固定模式,表的行不会随着列的变化而变化
Definition da_data_table.hpp:116
Mode getMode() const
获取模式
Definition da_data_table.hpp:845
系列数据,系列允许设置名字
Definition da_data_table.hpp:19
含有index的值对
Definition da_data_table.hpp:362
序列化类都是带异常的,使用中需要处理异常
Definition AppMainWindow.cpp:44
QPair< QList< typename DADataTable< T >::TablePtr >, QList< T > > group_by(const DADataTable< T > &table, const QString &field)
groupby 对某个字段执行group by操作
Definition da_data_table.hpp:337
std::shared_ptr< DAVector< _DAValueWithIndex< T > > > makeIndexSeries(const typename DADataTable< T >::SeriesPtr &p)
把序列转换为带序号的序列
Definition da_data_table.hpp:388