J'ai les exemples de données et de code ci-dessous où j'essaie de parcourir la colonne dataDF avec la fonction et de trouver le premier cas de valeurs croissantes, puis de renvoyer la valeur Quarter correspondant à la première valeur croissante de la colonne dataDF. Je prévois d'utiliser la fonction avec apply, mais je ne pense pas utiliser shift () correctement. Si j'essaye juste de retourner dataDF.shift (), j'obtiens une erreur. Je suis nouveau sur python, donc tous les conseils sur la façon de comparer une ligne à la ligne suivante ou ce que je fais de mal avec shift () sont grandement appréciés.

Exemples de données:

 return dataDF.head(20).to_dict() 

{'Quarter': {246: '2008q3',
 247: '2008q4',
 248: '2009q1',
 249: '2009q2',
 250: '2009q3',
 251: '2009q4',
 252: '2010q1',
 253: '2010q2',
 254: '2010q3',
 255: '2010q4',
 256: '2011q1',
 257: '2011q2',
 258: '2011q3',
 259: '2011q4',
 260: '2012q1',
 261: '2012q2',
 262: '2012q3',
 263: '2012q4',
 264: '2013q1',
 265: '2013q2'},
 'dataDF': {246: 14843.0,
 247: 14549.9,
 248: 14383.9,
 249: 14340.4,
 250: 14384.1,
 251: 14566.5,
 252: 14681.1,
 253: 14888.6,
 254: 15057.700000000001,
 255: 15230.200000000001,
 256: 15238.4,
 257: 15460.9,
 258: 15587.1,
 259: 15785.299999999999,
 260: 15973.9,
 261: 16121.9,
 262: 16227.9,
 263: 16297.299999999999,
 264: 16475.400000000001,
 265: 16541.400000000001}}

Code:

 def find_end(x):
        qrts = []
        if (dataDF < dataDF.shift()):
        qrts.append(dataDF.iloc[0,:].shift(1))
 return qrts
3
user3476463 21 avril 2017 à 00:46

3 réponses

Meilleure réponse

Essayer

df.Quarter[df.dataDF > df.dataDF.shift()].iloc[0]

Retour

«2009q3»

2
Vaishali 20 avril 2017 à 21:55

IIUC:

In [46]: x.loc[x.dataDF.diff().gt(0).idxmax(), 'Quarter']
Out[46]: '2009q3'

Explication:

In [43]: x
Out[43]:
    Quarter   dataDF
246  2008q3  14843.0
247  2008q4  14549.9
248  2009q1  14383.9
249  2009q2  14340.4
250  2009q3  14384.1
251  2009q4  14566.5
252  2010q1  14681.1
253  2010q2  14888.6
254  2010q3  15057.7
255  2010q4  15230.2
256  2011q1  15238.4
257  2011q2  15460.9
258  2011q3  15587.1
259  2011q4  15785.3
260  2012q1  15973.9
261  2012q2  16121.9
262  2012q3  16227.9
263  2012q4  16297.3
264  2013q1  16475.4
265  2013q2  16541.4

In [44]: x.dataDF.diff()
Out[44]:
246      NaN
247   -293.1
248   -166.0
249    -43.5
250     43.7   # <-------------------
251    182.4
252    114.6
253    207.5
254    169.1
255    172.5
256      8.2
257    222.5
258    126.2
259    198.2
260    188.6
261    148.0
262    106.0
263     69.4
264    178.1
265     66.0
Name: dataDF, dtype: float64

In [45]: x.dataDF.diff().gt(0).idxmax()
Out[45]: 250
2
MaxU 20 avril 2017 à 21:51

Utilisation de numpy pour trouver le argmax de diff supérieur à 0. Puis en utilisant get_value pour récupérer le value dont nous avons besoin.

v = dataDF.dataDF.values
j = dataDF.columns.get_loc('Quarter')
dataDF.get_value((np.diff(v) > 0).argmax() + 1, j, takeable=True)

'2009q3'

Et la vitesse!

enter image description here

1
piRSquared 20 avril 2017 à 22:14