我的问题与前一个问题相同:
但是,我仍然希望将0值包含在一个分数中.有没有办法做到这一点?换句话说,如果我有600个值,其中50%为0,其余值为1到100之间,我将如何对fractile 1中的所有0值进行分类,然后对其余的非零值进行分类在分数标签2到10(假设我想要10个fractiles).我可以将0转换为nan,将剩余的非纳米数据切换为9个fractiles(1到9),然后在每个标签上添加1(现在为2到10)并将所有0值标记为手动分离1?即使这很棘手,因为在我的数据集中除了600个值之外,我还有另外几百个在将0转换为nan之前可能已经是nan.
2014年1月26日更新:
我提出了以下临时解决方案.但是,这个代码的问题是,如果高频值不在分布的边缘,那么它会在现有的一组箱子的中间插入一个额外的箱子,并抛弃一切(或很多)一切.
def fractile_cut(ser, num_fractiles):
num_valid = ser.valid().shape[0]
remain_fractiles = num_fractiles
vcounts = ser.value_counts()
high_freq = []
i = 0
while vcounts.iloc[i] > num_valid/ float(remain_fractiles):
curr_val = vcounts.index[i]
high_freq.append(curr_val)
remain_fractiles -= 1
num_valid = num_valid - vcounts[i]
i += 1
curr_ser = ser.copy()
curr_ser = curr_ser[~curr_ser.isin(high_freq)]
qcut = pd.qcut(curr_ser, remain_fractiles, retbins=True)
qcut_bins = qcut[1]
all_bins = list(qcut_bins)
for val in high_freq:
bisect.insort(all_bins, val)
cut = pd.cut(ser, bins=all_bins)
ser_fractiles = pd.Series(cut.labels + 1, index=ser.index)
return ser_fractiles
Run Code Online (Sandbox Code Playgroud) 当我运行以下代码时,循环执行所有进程需要两分钟多的时间。这是正常的吗?我一直在使用 psutil.process_iter() 一段时间,我不记得它花了这么长时间。
import psutil
import datetime as dt
for proc in psutil.process_iter():
try:
pinfo = proc.as_dict(attrs=['pid', 'name'])
except psutil.NoSuchProcess:
pass
else:
print(pinfo)
print dt.datetime.now()
Run Code Online (Sandbox Code Playgroud)
输出:
{'pid': 0, 'name': 'System Idle Process'}
2017-07-11 01:55:45.392000
{'pid': 4, 'name': 'System'}
2017-07-11 01:55:45.394000
{'pid': 256, 'name': 'acrotray.exe'}
2017-07-11 01:55:45.397000
{'pid': 404, 'name': None}
2017-07-11 01:55:46.670000
{'pid': 568, 'name': None}
2017-07-11 01:55:47.750000
{'pid': 604, 'name': None}
2017-07-11 01:55:48.996000
{'pid': 608, 'name': None}
2017-07-11 01:55:50.293000
{'pid': 700, 'name': None}
2017-07-11 01:55:51.492000
{'pid': 708, 'name': None} …Run Code Online (Sandbox Code Playgroud)