Skip to content

Commit 73f65b8

Browse files
endrebakendre bakken stovner
andauthored
0.0.110 (#223)
Co-authored-by: endre bakken stovner <endrebakkenstovner@endres-MacBook-Air.local>
1 parent d79ce68 commit 73f65b8

5 files changed

Lines changed: 76 additions & 76 deletions

File tree

CHANGELOG.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# 0.0.110 (20.09.21)
2+
- fix count_overlaps with keep_nonoverlapping=False
3+
- fix subtract with more than 1024 intervals (new fix)
4+
15
# 0.0.109 (16.09.21)
26
- fix overlap invert behavior
37
- add intersect invert flag

pyranges/methods/coverage.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,18 @@ def _number_overlapping(scdf, ocdf, **kwargs):
3333

3434
df = scdf.copy()
3535

36-
if keep_nonoverlapping:
37-
_missing_indexes = np.setdiff1d(scdf.index, _self_indexes)
38-
missing = pd.DataFrame(data={"Index": _missing_indexes, "Count": 0}, index=_missing_indexes)
39-
counts_per_read = pd.concat([counts_per_read, missing])
40-
else:
41-
df = df.loc[_self_indexes]
36+
_missing_indexes = np.setdiff1d(scdf.index, _self_indexes)
37+
missing = pd.DataFrame(data={"Index": _missing_indexes, "Count": 0}, index=_missing_indexes)
38+
counts_per_read = pd.concat([counts_per_read, missing])
4239

4340
counts_per_read = counts_per_read.set_index("Index").sort_index()
4441

4542
df.insert(df.shape[1], column_name, counts_per_read)
4643

47-
return df
44+
if keep_nonoverlapping:
45+
return df
46+
else:
47+
return df[df[column_name] != 0]
4848

4949

5050

pyranges/methods/subtraction.py

Lines changed: 54 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import pandas as pd
22
import numpy as np
33

4+
from ncls import NCLS
5+
46

57
def add_rows_per_group(df):
68
last_rows = df.groupby("__ix__").last().reset_index()
@@ -9,79 +11,79 @@ def add_rows_per_group(df):
911
df = df.sort_values("__ix__", ascending=True)
1012
return df
1113

12-
def _subtraction(scdf, **kwargs):
13-
if scdf.empty:
14-
return scdf
14+
# def _subtraction(scdf, **kwargs):
15+
# if scdf.empty:
16+
# return scdf
1517

16-
falses = np.zeros(len(scdf), dtype=bool)
17-
scdf.insert(scdf.shape[1], "__first__", falses)
18-
scdf.insert(scdf.shape[1], "__last__", falses)
18+
# falses = np.zeros(len(scdf), dtype=bool)
19+
# scdf.insert(scdf.shape[1], "__first__", falses)
20+
# scdf.insert(scdf.shape[1], "__last__", falses)
1921

20-
scdf = add_rows_per_group(scdf)
22+
# scdf = add_rows_per_group(scdf)
2123

22-
scdf.insert(scdf.shape[1], "NewStart", scdf.End__deleteme__.shift(fill_value=-1))
23-
scdf.insert(scdf.shape[1], "NewEnd", scdf.Start__deleteme__)
24-
scdf.insert(scdf.shape[1], "__ix2__", np.arange(len(scdf)))
24+
# scdf.insert(scdf.shape[1], "NewStart", scdf.End__deleteme__.shift(fill_value=-1))
25+
# scdf.insert(scdf.shape[1], "NewEnd", scdf.Start__deleteme__)
26+
# scdf.insert(scdf.shape[1], "__ix2__", np.arange(len(scdf)))
2527

26-
first_rows = scdf.groupby(scdf.__ix__, as_index=False).first()
27-
scdf.loc[scdf.__ix2__.isin(first_rows.__ix2__), "__first__"] = True
28+
# first_rows = scdf.groupby(scdf.__ix__, as_index=False).first()
29+
# scdf.loc[scdf.__ix2__.isin(first_rows.__ix2__), "__first__"] = True
2830

29-
scdf.loc[:, "NewStart"] = np.where(scdf.__first__, scdf.Start, scdf.NewStart)
31+
# scdf.loc[:, "NewStart"] = np.where(scdf.__first__, scdf.Start, scdf.NewStart)
3032

31-
scdf.loc[scdf.__first__ & ~(scdf.Start__deleteme__ >= scdf.Start), "NewStart"] = -1
32-
scdf.loc[:, "NewEnd"] = np.where(scdf.__last__, scdf.End, scdf.NewEnd)
33-
scdf.loc[:, "NewStart"] = np.where(scdf.__last__, scdf.End__deleteme__, scdf.NewStart)
34-
scdf.loc[scdf.__last__ & ~(scdf.End__deleteme__ <= scdf.End), ["NewEnd", "NewStart"]] = -1
33+
# scdf.loc[scdf.__first__ & ~(scdf.Start__deleteme__ >= scdf.Start), "NewStart"] = -1
34+
# scdf.loc[:, "NewEnd"] = np.where(scdf.__last__, scdf.End, scdf.NewEnd)
35+
# scdf.loc[:, "NewStart"] = np.where(scdf.__last__, scdf.End__deleteme__, scdf.NewStart)
36+
# scdf.loc[scdf.__last__ & ~(scdf.End__deleteme__ <= scdf.End), ["NewEnd", "NewStart"]] = -1
3537

3638

37-
scdf = scdf[~((scdf.NewStart == -1) | (scdf.NewEnd == -1))]
38-
scdf = scdf.drop(["Start", "End"], axis=1)
39-
scdf.rename(columns={"NewStart": "Start", "NewEnd": "End"}, inplace=True)
39+
# scdf = scdf[~((scdf.NewStart == -1) | (scdf.NewEnd == -1))]
40+
# scdf = scdf.drop(["Start", "End"], axis=1)
41+
# scdf.rename(columns={"NewStart": "Start", "NewEnd": "End"}, inplace=True)
4042

41-
remove_mask = scdf.Start >= scdf.End
43+
# remove_mask = scdf.Start >= scdf.End
4244

43-
return scdf[~remove_mask]
45+
# return scdf[~remove_mask]
4446

45-
# def _subtraction(scdf, ocdf, **kwargs):
47+
def _subtraction(scdf, ocdf, **kwargs):
4648

47-
# if ocdf.empty or scdf.empty:
48-
# return scdf
49+
if ocdf.empty or scdf.empty:
50+
return scdf
4951

50-
# strandedness = kwargs["strandedness"]
51-
# strand = True if strandedness else False
52+
strandedness = kwargs["strandedness"]
53+
strand = True if strandedness else False
5254

53-
# chromosome = scdf.Chromosome.head(1).iloc[0]
54-
# kwargs["chromosome"] = chromosome
55+
chromosome = scdf.Chromosome.head(1).iloc[0]
56+
kwargs["chromosome"] = chromosome
5557

56-
# if "Strand" in ocdf and strand:
57-
# strand = scdf.Strand.head(1).iloc[0]
58-
# kwargs["strand"] = strand
58+
if "Strand" in ocdf and strand:
59+
strand = scdf.Strand.head(1).iloc[0]
60+
kwargs["strand"] = strand
5961

60-
# o = NCLS(ocdf.Start.values, ocdf.End.values, ocdf.index.values)
62+
o = NCLS(ocdf.Start.values, ocdf.End.values, ocdf.index.values)
6163

62-
# idx_self, new_starts, new_ends = o.set_difference_helper(
63-
# scdf.Start.values, scdf.End.values, scdf.index.values)
64+
idx_self, new_starts, new_ends = o.set_difference_helper(
65+
scdf.Start.values, scdf.End.values, scdf.index.values, scdf.__num__.values)
6466

65-
# missing_idx = pd.Index(scdf.index).difference(idx_self)
67+
missing_idx = pd.Index(scdf.index).difference(idx_self)
6668

67-
# idx_to_drop = new_starts != -1
69+
idx_to_drop = new_starts != -1
6870

69-
# new_starts = new_starts[idx_to_drop]
70-
# new_ends = new_ends[idx_to_drop]
71+
new_starts = new_starts[idx_to_drop]
72+
new_ends = new_ends[idx_to_drop]
7173

72-
# idx_self = idx_self[idx_to_drop]
73-
# new_starts = pd.Series(new_starts, index=idx_self)
74-
# new_ends = pd.Series(new_ends, index=idx_self)
74+
idx_self = idx_self[idx_to_drop]
75+
new_starts = pd.Series(new_starts, index=idx_self)
76+
new_ends = pd.Series(new_ends, index=idx_self)
7577

76-
# scdf = scdf.reindex(missing_idx.union(idx_self)).sort_index()
77-
# new_starts = new_starts.sort_index()
78-
# new_ends = new_ends.sort_index()
78+
scdf = scdf.reindex(missing_idx.union(idx_self)).sort_index()
79+
new_starts = new_starts.sort_index()
80+
new_ends = new_ends.sort_index()
7981

80-
# if len(idx_self):
81-
# scdf.loc[scdf.index.isin(idx_self), "Start"] = new_starts.values
82-
# scdf.loc[scdf.index.isin(idx_self), "End"] = new_ends.values
82+
if len(idx_self):
83+
scdf.loc[scdf.index.isin(idx_self), "Start"] = new_starts.values
84+
scdf.loc[scdf.index.isin(idx_self), "End"] = new_ends.values
8385

84-
# if not scdf.empty:
85-
# return scdf
86-
# else:
87-
# return None
86+
if not scdf.empty:
87+
return scdf
88+
else:
89+
return None

pyranges/pyranges.py

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4376,27 +4376,21 @@ def subtract(self, other, strandedness=None, nb_cpu=1):
43764376

43774377
from pyranges.methods.subtraction import _subtraction
43784378

4379-
strand = True if strandedness in ["same", "opposite"] else False
4380-
kwargs = {"strandedness": strandedness, "strand": strand}
4379+
kwargs = {"strandedness": strandedness}
43814380
kwargs["sparse"] = {"self": False, "other": True}
43824381
kwargs = fill_kwargs(kwargs)
43834382

43844383
strand = True if strandedness else False
4385-
if len(other) != 0:
4386-
cols_original_order = self.columns.copy()
4387-
other_clusters = other.merge(strand=strand)
4388-
self.__ix__ = np.arange(len(self))
4389-
no_overlap = self.overlap(other_clusters, strandedness=strandedness, invert=True)
4390-
j = self.sort().join(other_clusters, strandedness=strandedness, suffix="__deleteme__")
4391-
result = pyrange_apply_single(_subtraction, j, **kwargs)
4392-
result = {k: v for (k, v) in result.items()}
4393-
result = PyRanges(result)
4394-
result = pr.concat([result, no_overlap])
4395-
result = PyRanges({k: v[cols_original_order] for k, v in result.items()})
4396-
else:
4397-
result = self
4384+
other_clusters = other.merge(strand=strand)
4385+
4386+
self = self.count_overlaps(other_clusters, strandedness=strandedness, overlap_col="__num__")
4387+
4388+
result = pyrange_apply(_subtraction, self, other_clusters, **kwargs)
4389+
4390+
self = self.drop("__num__")
4391+
4392+
return PyRanges(result).drop("__num__")
43984393

4399-
return result
44004394

44014395
def summary(self, to_stdout=True, return_df=False):
44024396

pyranges/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.0.109"
1+
__version__ = "0.0.110"

0 commit comments

Comments
 (0)