|
1 | 1 | import pandas as pd |
2 | | -from ncls import NCLS |
| 2 | +import numpy as np |
3 | 3 |
|
4 | 4 |
|
5 | | -def _subtraction(scdf, ocdf, **kwargs): |
| 5 | +def add_rows_per_group(df): |
| 6 | + last_rows = df.groupby("__ix__").last().reset_index() |
| 7 | + last_rows.loc[:, "__last__"] = True |
| 8 | + df = pd.concat([df, last_rows], ignore_index=True) |
| 9 | + df = df.sort_values("__ix__", ascending=True) |
| 10 | + return df |
6 | 11 |
|
7 | | - if ocdf.empty or scdf.empty: |
| 12 | +def _subtraction(scdf, **kwargs): |
| 13 | + if scdf.empty: |
8 | 14 | return scdf |
9 | 15 |
|
10 | | - strandedness = kwargs["strandedness"] |
11 | | - strand = True if strandedness else False |
| 16 | + falses = np.zeros(len(scdf), dtype=bool) |
| 17 | + scdf.insert(scdf.shape[1], "__first__", falses) |
| 18 | + scdf.insert(scdf.shape[1], "__last__", falses) |
12 | 19 |
|
13 | | - chromosome = scdf.Chromosome.head(1).iloc[0] |
14 | | - kwargs["chromosome"] = chromosome |
| 20 | + scdf = add_rows_per_group(scdf) |
15 | 21 |
|
16 | | - if "Strand" in ocdf and strand: |
17 | | - strand = scdf.Strand.head(1).iloc[0] |
18 | | - kwargs["strand"] = strand |
| 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))) |
19 | 25 |
|
20 | | - o = NCLS(ocdf.Start.values, ocdf.End.values, ocdf.index.values) |
| 26 | + first_rows = scdf.groupby(scdf.__ix__, as_index=False).first() |
| 27 | + scdf.loc[scdf.__ix2__.isin(first_rows.__ix2__), "__first__"] = True |
21 | 28 |
|
22 | | - idx_self, new_starts, new_ends = o.set_difference_helper( |
23 | | - scdf.Start.values, scdf.End.values, scdf.index.values) |
| 29 | + scdf.loc[:, "NewStart"] = np.where(scdf.__first__, scdf.Start, scdf.NewStart) |
24 | 30 |
|
25 | | - missing_idx = pd.Index(scdf.index).difference(idx_self) |
| 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 |
26 | 35 |
|
27 | | - idx_to_drop = new_starts != -1 |
28 | 36 |
|
29 | | - new_starts = new_starts[idx_to_drop] |
30 | | - new_ends = new_ends[idx_to_drop] |
| 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) |
31 | 40 |
|
32 | | - idx_self = idx_self[idx_to_drop] |
33 | | - new_starts = pd.Series(new_starts, index=idx_self) |
34 | | - new_ends = pd.Series(new_ends, index=idx_self) |
| 41 | + remove_mask = scdf.Start >= scdf.End |
35 | 42 |
|
36 | | - scdf = scdf.reindex(missing_idx.union(idx_self)).sort_index() |
37 | | - new_starts = new_starts.sort_index() |
38 | | - new_ends = new_ends.sort_index() |
| 43 | + return scdf[~remove_mask] |
39 | 44 |
|
40 | | - if len(idx_self): |
41 | | - scdf.loc[scdf.index.isin(idx_self), "Start"] = new_starts.values |
42 | | - scdf.loc[scdf.index.isin(idx_self), "End"] = new_ends.values |
| 45 | +# def _subtraction(scdf, ocdf, **kwargs): |
43 | 46 |
|
44 | | - if not scdf.empty: |
45 | | - return scdf |
46 | | - else: |
47 | | - return None |
| 47 | +# if ocdf.empty or scdf.empty: |
| 48 | +# return scdf |
| 49 | + |
| 50 | +# strandedness = kwargs["strandedness"] |
| 51 | +# strand = True if strandedness else False |
| 52 | + |
| 53 | +# chromosome = scdf.Chromosome.head(1).iloc[0] |
| 54 | +# kwargs["chromosome"] = chromosome |
| 55 | + |
| 56 | +# if "Strand" in ocdf and strand: |
| 57 | +# strand = scdf.Strand.head(1).iloc[0] |
| 58 | +# kwargs["strand"] = strand |
| 59 | + |
| 60 | +# o = NCLS(ocdf.Start.values, ocdf.End.values, ocdf.index.values) |
| 61 | + |
| 62 | +# idx_self, new_starts, new_ends = o.set_difference_helper( |
| 63 | +# scdf.Start.values, scdf.End.values, scdf.index.values) |
| 64 | + |
| 65 | +# missing_idx = pd.Index(scdf.index).difference(idx_self) |
| 66 | + |
| 67 | +# idx_to_drop = new_starts != -1 |
| 68 | + |
| 69 | +# new_starts = new_starts[idx_to_drop] |
| 70 | +# new_ends = new_ends[idx_to_drop] |
| 71 | + |
| 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) |
| 75 | + |
| 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() |
| 79 | + |
| 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 |
| 83 | + |
| 84 | +# if not scdf.empty: |
| 85 | +# return scdf |
| 86 | +# else: |
| 87 | +# return None |
0 commit comments