Math.sum (javascript) .... вид замещения оператора
.1 + .0001 + -.1 --> 0.00010000000000000286
Math.sum(.1 , .0001, -.1) --> 0.0001
Object.defineProperties(Math, {
sign: {
value: function (x) {
return x ? x < 0 ? -1 : 1 : 0;
}
},
precision: {
value: function (value, precision, type) {
var v = parseFloat(value),
p = Math.max(precision, 0) || 0,
t = type || 'round';
return (Math[t](v * Math.pow(10, p)) / Math.pow(10, p)).toFixed(p);
}
},
scientific_to_num: { // this is from https://gist.github.com/jiggzson
value: function (num) {
//if the number is in scientific notation remove it
if (/e/i.test(num)) {
var zero = '0',
parts = String(num).toLowerCase().split('e'), //split into coeff and exponent
e = parts.pop(), //store the exponential part
l = Math.abs(e), //get the number of zeros
sign = e / l,
coeff_array = parts[0].split('.');
if (sign === -1) {
num = zero + '.' + new Array(l).join(zero) + coeff_array.join('');
} else {
var dec = coeff_array[1];
if (dec)
l = l - dec.length;
num = coeff_array.join('') + new Array(l + 1).join(zero);
}
}
return num;
}
}
get_precision: {
value: function (number) {
var arr = Math.scientific_to_num((number + "")).split(".");
return arr[1] ? arr[1].length : 0;
}
},
diff:{
value: function(A,B){
var prec = this.max(this.get_precision(A),this.get_precision(B));
return +this.precision(A-B,prec);
}
},
sum: {
value: function () {
var prec = 0, sum = 0;
for (var i = 0; i < arguments.length; i++) {
prec = this.max(prec, this.get_precision(arguments[i]));
sum += +arguments[i]; // force float to convert strings to number
}
return Math.precision(sum, prec);
}
}
});
Идея состоит в том, чтобы вместо Math вместо Math использовать ошибки плавания
Math.diff(0.2, 0.11) == 0.09 // true
0.2 - 0.11 == 0.09 // false
также отмечают, что Math.diff и Math.sum автоматически определяют точность использования
. Math.sum принимает любое количество аргументов
Вы можете использовать pivot_table
с unstack
:
print df.pivot_table(index='Symbol',
columns='Year',
values='Action',
fill_value=0,
aggfunc='count').unstack()
Year Symbol
2001 AAPL 2
BAC 0
2002 AAPL 0
BAC 2
dtype: int64
Если вам нужен вывод как DataFrame
, используйте to_frame
:
print df.pivot_table(index='Symbol',
columns='Year',
values='Action',
fill_value=0,
aggfunc='count').unstack()
.to_frame()
.rename(columns={0:'Action'})
Action
Year Symbol
2001 AAPL 2
BAC 0
2002 AAPL 0
BAC 2
Шаг 1. Создайте фрейм данных, в котором хранится счет каждого ненулевого класса в столбцах count
count_df = df.groupby(['Symbol','Year']).size().reset_index(name='counts')
. Шаг 2: Теперь используйте pivot_table для получения нужного кадра данных с подсчетом как для существующих, так и для несуществующие классы.
df_final = pd.pivot_table(count_df,
index=['Symbol','Year'],
values='counts',
fill_value = 0,
dropna=False,
aggfunc=np.sum)
Теперь значения счетчиков можно извлечь как список с помощью команды
list(df_final['counts'])
Вы можете использовать это:
df = df.groupby(['Symbol','Year']).count().unstack(fill_value=0).stack()
print df
Выход:
Action
Symbol Year
AAPL 2001 2
2002 0
BAC 2001 0
2002 2
Если вы хотите сделать это без использования pivot_table, вы можете попробовать следующий подход:
midx = pd.MultiIndex.from_product([ df['Symbol'].unique(), df['Year'].unique()], names=['Symbol', 'Year'])
df_grouped_by = df_grouped_by.reindex(midx, fill_value=0)
То, что мы в основном делаем выше, это создание мультииндекса всех возможных значений, умножающих два столбцы, а затем используя этот мультииндекс, чтобы заполнить нули в нашей группе - с помощью dataframe.