生成只有 6 个十进制数的数据集
Generate a dataset with only 6 decimal numbers
有没有办法生成一个(随机)数据集,该数据集填充有 6 位小数和小数点分隔符前有 1 个数字的值?
所以例如像这样:
"A":[5.398811, 2.232098, 9.340909, 3.343434],
"B":[6.436293,5.293756, 1.235937, 1.987384],
"C": [3.572831, 3.826355, 3.827264, 3.257321]
我发现 round(random.uniform(33.33, 66.66), 2) returns 是一个小数点后两位的随机浮点数。但是,我不希望数据框“最多”填充 2 个小数位,而是只填充 6 个小数位的数据框。我想要大约 1000 行和 100 列。
编辑:
在任何小数点中没有任何 0 或 9 也很好。这是因为我正在研究四舍五入的小数点。当将 1.999999 舍入到 5 位小数时,将得到 2.00000,即 2。这样就不会给出可靠的舍入结果。不知道实际可行到什么程度。
可以使用numpy.random.uniform
提高效率,然后转换成字典:
import numpy as np
col,row = (10,20) # (100, 1000) in your case
out = dict(enumerate(np.random.uniform(0,10,size=col*row)
.round(6).reshape(row,col).tolist()))
print(out)
输出:
{0: [5.488135, 7.151894, 6.027634, 5.448832, 4.236548, 6.458941, 4.375872, 8.91773, 9.636628, 3.834415],
1: [7.91725, 5.288949, 5.680446, 9.255966, 0.710361, 0.871293, 0.202184, 8.326198, 7.781568, 8.700121],
2: [9.786183, 7.991586, 4.614794, 7.805292, 1.182744, 6.39921, 1.433533, 9.446689, 5.218483, 4.146619],
...
19: [3.982211, 2.098437, 1.86193, 9.443724, 7.395508, 4.904588, 2.274146, 2.543565, 0.580292, 4.344166],
}
注意。请注意,数字将是 最多 6 位十进制数字(例如,0.123400 将显示为 0.1234,否则会产生 non-random 偏差
纯python版本(效率较低):
import random
out = {i: [round(random.uniform(0, 10), 6) for j in range(100)]
for i in range(1000)}
刚好 6 位数
您可以检查四舍五入的数字是否在小数点后第 6 位为零,在这种情况下添加任意数字。
这是一个示例,初始数据集:
np.random.seed(0) # for reproducibility
a = np.random.uniform(0, 10, size=20).round(6)
array([5.488135, 7.151894, 6.027634, 5.448832, 4.236548, 6.458941,
4.375872, 8.91773 , 9.636628, 3.834415, 7.91725 , 5.288949,
5.680446, 9.255966, 0.710361, 0.871293, 0.202184, 8.326198,
7.781568, 8.700121])
修正后:
np.random.seed(0) # for reproducibility
a = np.random.uniform(0, 10, size=20).round(6)
# identify numbers ending in 0
mask = (a*1e6).astype(int)%10==0
# add a terminal 1
a[mask] += 1e-6
a
array([5.488135, 7.151894, 6.027634, 5.448832, 4.236548, 6.458941,
4.375872, 8.917731, 9.636628, 3.834415, 7.917251, 5.288949,
5.680446, 9.255966, 0.710361, 0.871293, 0.202184, 8.326198,
7.781568, 8.700121])
这通过乘以 1e6 作为整数并得到除以 10 的余数来工作:
(a*1e6).astype(int)%10
array([5, 4, 4, 2, 8, 1, 2, 0, 8, 5, 0, 9, 6, 6, 1, 3, 4, 8, 8, 1])
DataFrame 示例
import numpy as np
col,row = (4,5) # (100, 1000) in your case
a = np.random.uniform(0,10,size=col*row).round(6).reshape(row,col)
mask = (a*1e6+1).astype(int)%10<2
# add a terminal 1
a[mask] += 2e-6
df = pd.DataFrame(a)
print(df)
输出:
0 1 2 3
0 5.488135 7.151894 6.027634 5.448832
1 4.236548 6.458941 4.375872 8.917732
2 9.636628 3.834415 7.917252 5.288951
3 5.680446 9.255966 0.710361 0.871293
4 0.202184 8.326198 7.781568 8.700121
也许尝试生成从 1,000,000 到 9,999,999 的数字,然后除以 1,000,000。这将确保数字始终正好是 6 位小数。
关于第二个条件,您可以 运行 通过转换为字符串来检查数字,例如:
if '9' in str(the_number):
continue
else:
result.append(the_number)
有没有办法生成一个(随机)数据集,该数据集填充有 6 位小数和小数点分隔符前有 1 个数字的值?
所以例如像这样:
"A":[5.398811, 2.232098, 9.340909, 3.343434],
"B":[6.436293,5.293756, 1.235937, 1.987384],
"C": [3.572831, 3.826355, 3.827264, 3.257321]
我发现 round(random.uniform(33.33, 66.66), 2) returns 是一个小数点后两位的随机浮点数。但是,我不希望数据框“最多”填充 2 个小数位,而是只填充 6 个小数位的数据框。我想要大约 1000 行和 100 列。
编辑: 在任何小数点中没有任何 0 或 9 也很好。这是因为我正在研究四舍五入的小数点。当将 1.999999 舍入到 5 位小数时,将得到 2.00000,即 2。这样就不会给出可靠的舍入结果。不知道实际可行到什么程度。
可以使用numpy.random.uniform
提高效率,然后转换成字典:
import numpy as np
col,row = (10,20) # (100, 1000) in your case
out = dict(enumerate(np.random.uniform(0,10,size=col*row)
.round(6).reshape(row,col).tolist()))
print(out)
输出:
{0: [5.488135, 7.151894, 6.027634, 5.448832, 4.236548, 6.458941, 4.375872, 8.91773, 9.636628, 3.834415],
1: [7.91725, 5.288949, 5.680446, 9.255966, 0.710361, 0.871293, 0.202184, 8.326198, 7.781568, 8.700121],
2: [9.786183, 7.991586, 4.614794, 7.805292, 1.182744, 6.39921, 1.433533, 9.446689, 5.218483, 4.146619],
...
19: [3.982211, 2.098437, 1.86193, 9.443724, 7.395508, 4.904588, 2.274146, 2.543565, 0.580292, 4.344166],
}
注意。请注意,数字将是 最多 6 位十进制数字(例如,0.123400 将显示为 0.1234,否则会产生 non-random 偏差
纯python版本(效率较低):
import random
out = {i: [round(random.uniform(0, 10), 6) for j in range(100)]
for i in range(1000)}
刚好 6 位数
您可以检查四舍五入的数字是否在小数点后第 6 位为零,在这种情况下添加任意数字。 这是一个示例,初始数据集:
np.random.seed(0) # for reproducibility
a = np.random.uniform(0, 10, size=20).round(6)
array([5.488135, 7.151894, 6.027634, 5.448832, 4.236548, 6.458941,
4.375872, 8.91773 , 9.636628, 3.834415, 7.91725 , 5.288949,
5.680446, 9.255966, 0.710361, 0.871293, 0.202184, 8.326198,
7.781568, 8.700121])
修正后:
np.random.seed(0) # for reproducibility
a = np.random.uniform(0, 10, size=20).round(6)
# identify numbers ending in 0
mask = (a*1e6).astype(int)%10==0
# add a terminal 1
a[mask] += 1e-6
a
array([5.488135, 7.151894, 6.027634, 5.448832, 4.236548, 6.458941,
4.375872, 8.917731, 9.636628, 3.834415, 7.917251, 5.288949,
5.680446, 9.255966, 0.710361, 0.871293, 0.202184, 8.326198,
7.781568, 8.700121])
这通过乘以 1e6 作为整数并得到除以 10 的余数来工作:
(a*1e6).astype(int)%10
array([5, 4, 4, 2, 8, 1, 2, 0, 8, 5, 0, 9, 6, 6, 1, 3, 4, 8, 8, 1])
DataFrame 示例
import numpy as np
col,row = (4,5) # (100, 1000) in your case
a = np.random.uniform(0,10,size=col*row).round(6).reshape(row,col)
mask = (a*1e6+1).astype(int)%10<2
# add a terminal 1
a[mask] += 2e-6
df = pd.DataFrame(a)
print(df)
输出:
0 1 2 3
0 5.488135 7.151894 6.027634 5.448832
1 4.236548 6.458941 4.375872 8.917732
2 9.636628 3.834415 7.917252 5.288951
3 5.680446 9.255966 0.710361 0.871293
4 0.202184 8.326198 7.781568 8.700121
也许尝试生成从 1,000,000 到 9,999,999 的数字,然后除以 1,000,000。这将确保数字始终正好是 6 位小数。
关于第二个条件,您可以 运行 通过转换为字符串来检查数字,例如:
if '9' in str(the_number):
continue
else:
result.append(the_number)