Repository: vaexio/vaex

Issue:
[BUG-REPORT]Clarifying error message when trying to use 'data' as column name.
**Description**
Trying to create a vaex dataframe with `from_arrays`, I got trapped with an error having a not so clear message.

```python
import vaex as vx
import numpy as np
vdf = vx.from_arrays(data=np.arange(5), buffer=np.array([0]*5))
Traceback (most recent call last):

  File "<ipython-input-17-bb962ad4cad9>", line 1, in <module>
    vdf = vx.from_arrays(data=np.arange(SIZE), buffer=np.array([0]*SIZE))

  File "/home/yoh/anaconda3/lib/python3.8/site-packages/vaex/__init__.py", line 360, in from_arrays
    return vaex.dataframe.DataFrameLocal(dataset)

  File "/home/yoh/anaconda3/lib/python3.8/site-packages/vaex/dataframe.py", line 5376, in __init__
    self._initialize_column(column_name)

  File "/home/yoh/anaconda3/lib/python3.8/site-packages/vaex/dataframe.py", line 3279, in _initialize_column
    self._save_assign_expression(name)

  File "/home/yoh/anaconda3/lib/python3.8/site-packages/vaex/dataframe.py", line 3308, in _save_assign_expression
    setattr(self, name, expression)

AttributeError: can't set attribute
```
But if I am calling the 1st column simply 'x', it works.
```python
import vaex as vx
import numpy as np
vdf = vx.from_arrays(x=np.arange(5), buffer=np.array([0]*5))
vdf
Out[19]: 
  #    x    buffer
  0    0         0
  1    1         0
  2    2         0
  3    3         0
  4    4         0
```

**Software information**
 - Vaex version
{'vaex': '4.5.0',
 'vaex-core': '4.5.1',
 'vaex-viz': '0.5.0',
 'vaex-hdf5': '0.10.0',
 'vaex-server': '0.6.1',
 'vaex-astro': '0.9.0',
 'vaex-jupyter': '0.6.0',
 'vaex-ml': '0.14.0'}
 - Vaex was installed via: conda-forge
 - OS: Ubuntu 20.04



Discussion:

Resolving patch:
diff --git a/packages/vaex-core/vaex/dataframe.py b/packages/vaex-core/vaex/dataframe.py
--- a/packages/vaex-core/vaex/dataframe.py
+++ b/packages/vaex-core/vaex/dataframe.py
@@ -5486,8 +5486,6 @@ def __init__(self, dataset=None, name=None):
         if hasattr(dataset, 'ucds'):
             self.ucds.update(dataset.ucds)
         self.column_names = list(self.dataset)
-        for column_name in self.column_names:
-            self._initialize_column(column_name)
         if len(self.dataset):
             self._length = self.dataset.row_count
             if self._length_unfiltered is None:
@@ -5497,6 +5495,8 @@ def __init__(self, dataset=None, name=None):
         # self.path = dataset.path
         self.mask = None
         self.columns = ColumnProxy(self)
+        for column_name in self.column_names:
+            self._initialize_column(column_name)
 
     def _fill_filter_mask(self):
         if self.filtered:


Test patch:
diff --git a/tests/column_names_test.py b/tests/column_names_test.py
--- a/tests/column_names_test.py
+++ b/tests/column_names_test.py
@@ -87,3 +87,10 @@ def test_invalid_name_read(tmpdir):
     df = vaex.open(path)
     assert df['1'].tolist() == x.tolist()
     assert (df.copy()['1']*2).tolist() == (x*2).tolist()
+
+
+def test_special_names():
+    # df.data accessed self.columns, which cause an exception, resulting in
+    # getattr(df, 'data', None) to return None
+    df = vaex.from_arrays(data=[1, 2])
+    assert df['data'].tolist() == [1, 2]