Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
dios
Manage
Activity
Members
Labels
Plan
Issues
11
Issue boards
Milestones
Wiki
Jira
Code
Merge requests
0
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
RDM
dios
Commits
f672e760
Commit
f672e760
authored
5 years ago
by
Bert Palm
🎇
Browse files
Options
Downloads
Patches
Plain Diff
more better
parent
9b8b4c89
No related branches found
Branches containing commit
No related tags found
Tags containing commit
2 merge requests
!2
Develop
,
!1
complete rework
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
dios/dios.py
+44
-48
44 additions, 48 deletions
dios/dios.py
dios/options.py
+16
-6
16 additions, 6 deletions
dios/options.py
with
60 additions
and
54 deletions
dios/dios.py
+
44
−
48
View file @
f672e760
...
...
@@ -193,16 +193,23 @@ class DictOfSeries:
raise
KeyError
(
key
)
# all other cases
else
:
keys
,
ixs
=
self
.
_unpack_key
(
key
)
keys
,
ixs
,
ixstype
=
self
.
_unpack_key
(
key
)
ixs
=
self
.
_unpack_indexer
(
keys
,
ixs
,
ixstype
)
new
=
self
.
copy_empty
()
for
i
,
_
in
enumerate
(
keys
):
key
,
ix
=
keys
[
i
],
ixs
[
i
]
new
.
_data
[
key
]
=
self
.
_get_item
(
key
)[
ix
]
new
.
_data
[
key
]
=
self
.
_get_item
(
key
,
ix
,
True
)
return
new
def
_get_item
(
self
,
key
):
def
_get_item
(
self
,
key
,
ix
=
None
,
insertna
=
False
):
"""
Extract a pd.Series from self
"""
return
self
.
_data
[
key
]
if
ix
is
None
:
return
self
.
_data
[
key
]
elif
insertna
:
s
=
self
.
_data
[
key
]
return
s
[
ix
].
reindex_like
(
s
)
else
:
return
self
.
_data
[
key
][
ix
]
def
__setitem__
(
self
,
key
,
value
):
"""
...
...
@@ -224,11 +231,11 @@ class DictOfSeries:
self
.
_insert
(
key
,
value
)
return
else
:
k
,
i
=
[
key
],
[
slice
(
None
)]
k
,
i
,
it
=
[
key
],
[
slice
(
None
)]
,
None
# all other cases
else
:
k
,
i
=
self
.
_unpack_key
(
key
)
k
,
i
,
it
=
self
.
_unpack_key
(
key
)
i
=
self
.
_unpack_indexer
(
k
,
i
,
it
)
gen
=
self
.
_unpack_value
(
k
,
i
,
value
)
for
tup
in
gen
:
self
.
_set_item
(
*
tup
)
...
...
@@ -285,29 +292,22 @@ class DictOfSeries:
Notes:
Which keys we get, may depend on the policy in dios_options
"""
err_bool
=
"
only boolean values are allowed
"
len_err_msg
=
"
length of given column-indexer does not match length of columns
"
keys
=
None
boolidxer
=
None
sliceidxer
=
None
haskeys
=
False
indexer
,
idxtype
=
None
,
None
# prevent consuming of a generator
key
=
list
(
key
)
if
is_iterator
(
key
)
else
key
if
isinstance
(
key
,
slice
):
keys
=
self
.
columns
sliceidxer
=
[
key
]
indexer
,
idxtype
=
[
key
],
'
slice
'
# list, np.arrays, ... of list, np.arrays..
elif
is_nested_list_like
(
key
):
# we only allow bool nlists
keys
=
self
.
columns
boolidxer
=
key
# todo ..
# elif is_bool_indexer(key):
# ...
indexer
,
idxtype
=
key
,
'
nlist
'
# ser, df, dios
elif
is_pandas_like
(
key
):
...
...
@@ -328,16 +328,15 @@ class DictOfSeries:
elif
is_dataframe_like
(
key
):
# we only allow bool df's
keys
=
key
.
columns
.
to_list
()
boolidxer
,
haskeys
=
key
,
True
indexer
,
idxtype
=
key
,
'
df
'
elif
is_dios_like
(
key
):
# we only allow bool dios's
keys
=
key
.
columns
boolidxer
,
haskeys
=
key
,
True
indexer
,
idxtype
=
key
,
'
dios
'
# list, np.array, np.ndarray, ...
# Note: series considered list-like,
# so we handle lists last
# Note: series considered list-like, so we handle lists at last
elif
is_list_like
(
key
):
arr
=
np
.
array
(
key
)
if
is_bool_array
(
arr
):
...
...
@@ -347,7 +346,6 @@ class DictOfSeries:
keys
=
np
.
array
(
keys
)[
arr
]
else
:
keys
=
key
else
:
raise
KeyError
(
f
"
{
key
}
"
)
...
...
@@ -355,30 +353,28 @@ class DictOfSeries:
method
=
dios_options
[
OptsFields
.
col_indexing_method
]
keys
=
check_keys_by_policy
(
keys
,
self
.
columns
,
method
)
# check indexers
idxer
=
[]
if
sliceidxer
is
not
None
:
idxer
=
sliceidxer
*
len
(
keys
)
elif
boolidxer
is
not
None
:
if
haskeys
:
for
k
in
keys
:
ix
=
boolidxer
[
k
]
idxer
.
append
(
ix
)
if
not
is_bool_indexer
(
ix
):
raise
ValueError
(
err_bool
)
else
:
for
i
in
boolidxer
:
ix
=
np
.
array
(
i
)
idxer
.
append
(
ix
)
if
not
is_bool_array
(
ix
):
raise
ValueError
(
err_bool
)
else
:
idxer
=
[
slice
(
None
)]
*
len
(
keys
)
assert
len
(
idxer
)
==
len
(
keys
)
return
keys
,
indexer
,
idxtype
# now we have a valid indexer (a slice or a bool array) for every key
return
keys
,
idxer
def
_unpack_indexer
(
self
,
keys
,
indexer
,
idxtype
):
err_bool
=
"
only boolean values are allowed
"
idxerlist
=
[]
if
idxtype
==
'
slice
'
:
idxerlist
=
indexer
*
len
(
keys
)
elif
idxtype
in
[
'
df
'
,
'
dios
'
]:
for
k
in
keys
:
ix
=
indexer
[
k
]
idxerlist
.
append
(
ix
)
if
not
is_bool_indexer
(
ix
):
raise
ValueError
(
err_bool
)
elif
idxtype
==
'
nlist
'
:
for
i
in
indexer
:
ix
=
np
.
array
(
i
)
idxerlist
.
append
(
ix
)
if
not
is_bool_array
(
ix
):
raise
ValueError
(
err_bool
)
else
:
idxerlist
=
[
slice
(
None
)]
*
len
(
keys
)
return
idxerlist
@property
def
loc
(
self
):
...
...
@@ -606,7 +602,7 @@ class _LocIndexer(_Indexer):
rkey
,
cols
=
self
.
_unpack_key
(
key
)
new
=
self
.
_dios
.
copy_empty
()
for
i
,
_
in
enumerate
(
cols
):
c
,
r
=
cols
[
i
],
rkey
[
i
]
c
,
r
=
cols
[
i
],
rkey
[
i
]
new
[
c
]
=
self
.
_data
[
c
].
loc
[
r
]
return
new
...
...
@@ -637,7 +633,7 @@ class _LocIndexer(_Indexer):
else
:
try
:
# list and bool list like
cols
,
_
=
self
.
_dios
.
_unpack_key
(
ckey
)
cols
,
*
_
=
self
.
_dios
.
_unpack_key
(
ckey
)
except
Exception
:
raise
...
...
@@ -669,7 +665,7 @@ class _iLocIndexer(_Indexer):
rkey
,
cols
=
self
.
_unpack_key
(
key
)
new
=
self
.
_dios
.
copy_empty
()
for
i
,
_
in
enumerate
(
cols
):
c
,
r
=
cols
[
i
],
rkey
[
i
]
c
,
r
=
cols
[
i
],
rkey
[
i
]
new
[
c
]
=
self
.
_data
[
c
].
iloc
[
r
]
return
new
...
...
This diff is collapsed.
Click to expand it.
dios/options.py
+
16
−
6
View file @
f672e760
...
...
@@ -10,16 +10,25 @@ class OptsFields:
disp_max_vars
=
"
disp_max_vars
"
"""
none_plus: none or more can be given
at_leat_one: accept if at least one column is present
all_present: all given columns must be present
all_plus: (pandas, bool-series style) all must be present but more can be given
none_plus: none or more columns, than in self, can be given
at_least_one: accept if at least one column is present in self
all_present: all given columns must be present in self
"""
col_indexing_method
=
"
dios_to_dios
_method
"
col_indexing_method
=
"
col_indexing
_method
"
mixed_itype_warn_policy
=
"
mixed_itype_policy
"
"""
should nans be droppend during comparision(drop),
stay nans (keep), or be compared (nplike).
nplike is quite silly as `5 < NaN` will simply evaluate to False
"""
comparison_nan_policy
=
"
comparison_nan_policy
"
"""
Get item nan policy:
"""
class
Opts
:
none_plus
=
'
none_plus
'
...
...
@@ -31,7 +40,8 @@ class Opts:
itype_ignore
=
'
ignore
'
keep_nans
=
'
keep
'
nplike_nans
=
'
nplike_nans
'
nplike_nans
=
'
nplike
'
drop_nans
=
'
drop
'
# set default values
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment