- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用以下示例数据和代码:
import pandas as pd
import numpy as np
np.random.seed(2021)
dates = pd.date_range('20130226', periods=90)
df = pd.DataFrame(np.random.uniform(0, 10, size=(90, 4)), index=dates, columns=['A_values', 'B_values', 'C_values', 'target'])
# function to calculate mape
def mape(y_true, y_pred):
y_pred = np.array(y_pred)
return np.mean(np.abs(y_true - y_pred) / np.clip(np.abs(y_true), 1, np.inf),
axis=0)*100
preds = df.columns[df.columns.str.endswith('_values')]
k = 2
print(df)
输出:
A_values B_values C_values target
2013-02-26 6.059783 7.333694 1.389472 3.126731
2013-02-27 9.972433 1.281624 1.789931 7.529254
2013-02-28 6.621605 7.843101 0.968944 0.585713
2013-03-01 9.623960 6.165574 0.866300 5.612724
2013-03-02 6.165247 9.638430 5.743043 3.711608
... ... ... ...
2013-05-22 0.589729 6.479978 3.531450 6.872059
2013-05-23 6.279065 3.837670 8.853146 8.209883
2013-05-24 5.533017 5.241127 1.388056 5.355926
2013-05-25 1.596038 4.665995 2.406251 1.971875
2013-05-26 3.269001 1.787529 6.659690 7.545569
[90 rows x 4 columns]
我将计算 mape
并使用两种不同的方法为每个年/月组找到 2 个最低误差值:
方法一:
def grpProc(grp):
err = mape(grp[preds], grp[['target']])
print(err)
sort_args = np.argsort(err, axis=1) < k
cols = preds[sort_args]
print(cols)
print('-'*50)
df.groupby(pd.Grouper(freq='M')).apply(grpProc)
输出:
A_values 54.685258
B_values 212.458242
C_values 161.332752
dtype: float64
Index(['A_values', 'C_values'], dtype='object')
--------------------------------------------------
A_values 77.504315
B_values 128.986127
C_values 118.977186
dtype: float64
Index(['A_values', 'C_values'], dtype='object')
--------------------------------------------------
A_values 132.535352
B_values 150.886936
C_values 94.279492
dtype: float64
Index(['B_values', 'C_values'], dtype='object')
--------------------------------------------------
A_values 150.554314
B_values 114.113724
C_values 92.487276
dtype: float64
Index(['B_values', 'C_values'], dtype='object')
--------------------------------------------------
方法二:
def grpProc(grp):
err = mape(grp[preds], grp[['target']])
print(err)
cols = err.nsmallest(k).index
print(cols)
print('-'*50)
df.groupby(pd.Grouper(freq='M')).apply(grpProc)
输出:
A_values 54.685258
B_values 212.458242
C_values 161.332752
dtype: float64
Index(['A_values', 'C_values'], dtype='object')
--------------------------------------------------
A_values 77.504315
B_values 128.986127
C_values 118.977186
dtype: float64
Index(['A_values', 'C_values'], dtype='object')
--------------------------------------------------
A_values 132.535352
B_values 150.886936
C_values 94.279492
dtype: float64
Index(['C_values', 'A_values'], dtype='object')
--------------------------------------------------
A_values 150.554314
B_values 114.113724
C_values 92.487276
dtype: float64
Index(['C_values', 'B_values'], dtype='object')
--------------------------------------------------
如您所见,方法 1 为第三组给出了错误的 2 个最低值,正确的应该是:['C_values', 'A_values']
。
A_values 132.535352
B_values 150.886936
C_values 94.279492
dtype: float64
Index(['B_values', 'C_values'], dtype='object')
如果我们使用 np.argsort
而不是 pd.nsmallest
,如何让它正确?谢谢。
编辑:
def grpProc(grp):
err = mape(grp[preds], grp[['target']])
print(err)
# sort_args = np.argsort(err, axis=1) < k # incorrect result
# sort_args = np.argsort(err, axis=1)[:k] # correct result and order of values
# sort_args = np.argsort(err).head(k) # correct result and order of values
sort_args = np.argsort(np.argsort(err, axis=1)) < k # correct result but incorrect order of values
cols = preds[sort_args]
print(cols)
print('-'*50)
df.groupby(pd.Grouper(freq='M')).apply(grpProc)
输出:
A_values 54.685258
B_values 212.458242
C_values 161.332752
dtype: float64
Index(['A_values', 'C_values'], dtype='object')
--------------------------------------------------
A_values 77.504315
B_values 128.986127
C_values 118.977186
dtype: float64
Index(['A_values', 'C_values'], dtype='object')
--------------------------------------------------
A_values 132.535352
B_values 150.886936
C_values 94.279492
dtype: float64
Index(['A_values', 'C_values'], dtype='object')
--------------------------------------------------
A_values 150.554314
B_values 114.113724
C_values 92.487276
dtype: float64
Index(['B_values', 'C_values'], dtype='object')
--------------------------------------------------
最佳答案
np.argsort
正在做位置重新索引
sort_args = err.iloc[np.argsort(err)].head(2)
你还有 pandas
argsort
(与 numpy 相同)
err.iloc[err.argsort()].head(2)
更新
sort_args = np.argsort(np.argsort(err, axis=1)) < k
关于python-3.x - np.argsort 和 pd.nsmallest 给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69950691/
(请注意这里有一个问题 Pandas: group by and Pivot table difference ,但是这个问题是不同的。) 假设您从一个 DataFrame 开始 df = pd.Da
我在Windows 10上安装了Anaconda 3。我正在使用pd.read_csv()加载CSV文件,但收到错误消息。首先,我尝试了df=pd.read_csv(‘C:\Direct_market
我的输入数据是以下形式: gold,Program,MethodType,CallersT,CallersN,CallersU,CallersCallersT,CallersCallersN,
是否可以使用pd.merge复制以下内容 a = pd.DataFrame(dict(x=[1,2], y=[5,5])) b = pd.DataFrame(dict(x=[7,7], y=[12,1
我有一个像这样保存的数据框: Y_train_1.head() 0 4691.0 1 4661.0 2 4631.0 3 4601.0 4 4571.0 Y_train_
我有一个如下所示的 Excel 文件: CompanyName High Priority QualityIssue Customer1 Yes
题 为什么排序使用 pd.Series.sort_index使用分类索引时似乎不起作用?如何使用字母/数字以外的其他排序顺序对多索引 pd.Series 的索引进行排序? 移动电源 设置代码 impo
tt = pd.DataFrame({'a':[1,2,None,3],'b':[None,3,4,5]}) bb=pd.DataFrame(pd.isnull(tt).astype(int), in
示例代码: import pandas as pd import numpy as np sample = pd.DataFrame({"a":[1,2,3,1,2,3,1,2,3], "b":np.
我有一个 Pandas 系列和一个 Pandas 多索引数据框。 下面是一个简单的例子: iterables = [['milk', 'honey', 'dates'], ['jan', 'feb',
我拥有的: pd.Timestamp('2021-07-05 08:10:11') pd.Timestamp('2021-07-07 12:13:14') 我在找什么: [pd.Timestamp('
在使用 pandas 时,我遇到了创建新 data-Frame 的两种最常见的方法。使用pandas如下; 1. pandas.read_csv() Type: 2. pandas.DataFram
伙计们,我有一个Dataframe df= pd.DataFrame({'Point_ID':[1,2,3,1,2,1] , 'Shape_ID': [84,85,86,87,88,89],'LOL'
在 pandas datetimeindex 中,dayofweek和 weekday似乎是一样的。他们只是彼此的别名吗?我发现了这些功能 here 最佳答案 根据pandas源码定义的Datetim
我正在尝试按另一个按特定顺序排序的系列对 DataFrame (axis = 0) 进行排序。 例子:DataFrame 包含 CountryCodes 的索引:'AUS'、'BWA' ....(按字
我正在尝试使用 dask 读取 csv 文件,它给了我如下错误。但问题是我想要我的 ARTICLE_ID是 object(string) .谁能帮我成功读取数据? 回溯如下: ValueError:
为什么 pandas 有两个用于箱线图的函数:pandas.DataFrame.plot.box() 和 pandas.DataFrame.boxplot()? df = pd.DataFrame(n
我有一个多索引系列,如下所示。 > data = [['a', 'X', 'u', 1], ['a', 'X', 'v', 2], ['b', 'Y', 'u', 4], ['a', 'Z', 'u'
这个问题在这里已经有了答案: Inconsistency when setting figure size using pandas plot method (2 个答案) 关闭 4 年前。 在下面
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 6 年前。 Improve t
我是一名优秀的程序员,十分优秀!