我正在编写一个Python脚本,用于比较每个组的最大值。我认为必须有更美妙的方法使用pandas
提供的方法或不使用全局变量,如previous_max
在下面的代码片段中。请告诉我怎么做。
import pandas as pd
import numpy as np
previous_max = 0
def f(x):
global previous_max
if x.max() >= previous_max:
previous_max = x.max()
return "ascending"
else:
previous_max = x.max()
return "descending"
df = pd.DataFrame({
'date': pd.date_range('2000-1-1', periods=100, freq='D'),
'val': np.random.random(100)
})
df['trend'] = df.groupby(pd.TimeGrouper(key='date', freq='10D'))['val'].transform(f)
使用:
transform
发表的max
,通过diff
得到差异并通过lt
进行比较numpy.where
和transform
通过any
为True
s每组np.random.seed(456)
previous_max = 0
def f(x):
global previous_max
if x.max() >= previous_max:
previous_max = x.max()
return "ascending"
else:
previous_max = x.max()
return "descending"
df = pd.DataFrame({
'date': pd.date_range('2000-1-1', periods=30, freq='D'),
'val': np.random.random(30)
})
df['trend1'] = df.groupby(pd.TimeGrouper(key='date', freq='3D'))['val'].transform(f)
g = df.groupby(pd.TimeGrouper(key='date', freq='3D'))
df['trend'] = g['val'].transform('max').diff().lt(0)
df['trend'] = np.where(g['trend'].transform('any'), 'descending','ascending')
print (df)
date val trend1 trend
0 2000-01-01 0.248756 ascending ascending
1 2000-01-02 0.163067 ascending ascending
2 2000-01-03 0.783643 ascending ascending
3 2000-01-04 0.808523 ascending ascending
4 2000-01-05 0.625628 ascending ascending
5 2000-01-06 0.604114 ascending ascending
6 2000-01-07 0.885702 ascending ascending
7 2000-01-08 0.759117 ascending ascending
8 2000-01-09 0.181105 ascending ascending
9 2000-01-10 0.150169 descending descending
10 2000-01-11 0.435679 descending descending
11 2000-01-12 0.385273 descending descending
12 2000-01-13 0.575710 ascending ascending
13 2000-01-14 0.146091 ascending ascending
14 2000-01-15 0.686593 ascending ascending
15 2000-01-16 0.468804 descending descending
16 2000-01-17 0.569999 descending descending
17 2000-01-18 0.645701 descending descending
18 2000-01-19 0.723341 ascending ascending
19 2000-01-20 0.680671 ascending ascending
20 2000-01-21 0.180917 ascending ascending
21 2000-01-22 0.118158 descending descending
22 2000-01-23 0.242734 descending descending
23 2000-01-24 0.008183 descending descending
24 2000-01-25 0.360068 ascending ascending
25 2000-01-26 0.146042 ascending ascending
26 2000-01-27 0.542723 ascending ascending
27 2000-01-28 0.857103 ascending ascending
28 2000-01-29 0.200212 ascending ascending
29 2000-01-30 0.134633 ascending ascending