#python #pandas
#python #pandas
Вопрос:
В настоящее время я рассчитываю соотношение денежных средств к цене примерно для 19 000 компаний за последние 10 лет. У меня есть все это в одном фрейме данных и более 20 переменных. Проблема, которую я хотел бы решить, заключается в перезапуске скользящей суммы после введения нового биржевого тикера. Способ, который я закодировал ниже, приводит к тому, что первые три записи нового запаса также суммируют Q_Cashflow запаса непосредственно перед ним в столбце.
Я закодировал следующим образом:
df['K_Cashflow'] = df.Q_Cashflow.rolling(4).sum()
df['cash-to-price'] = df['K_Cashflow']/df['Market Cap']
Вывод :
Ticker Symbol |Q_Cashflow |Market Cap |cash-to-price |K_Cashflow|
44 ADCT.1 | 16.9 |709.0700 |0.120157 | 85.2 |
45 ADCT.1 | 102.2 |718.7700 |0.310948 | 223.5 |
46 ADCT.1 | 136.6 |1231.5240 |0.260815 | 321.2 |
47 AAL | 456.0 |3034.1766 |0.234561 | 711.7 |
48 AAL | 1173.0 |2258.1468 |0.827138 | 1867.8 |
49 AAL | 1090.0 |2088.2862 |1.367437 | 2855.6 |
50 AAL | 1241.0 |2597.5755 |1.524499 | 3960.0 |
Строки 47:50 должны быть NaN для K_Cashflow.
Как мне изменить первые три записи K_Cashflow на Nan для каждого отдельного символа тикера?
Ответ №1:
Одним из способов добиться этого было бы создать столбец ранга на основе тикера, а затем присвоить nan три нижних ранга. Вот пример:
import numpy as np
import pandas as pd
df = pd.DataFrame({
'ticker': ['a'] * 7 ['b'] * 10,
'cash_flow': range(17),
})
# Create the rank
df['rank'] = df.groupby('ticker').rank()
# Set the first 3 instances of each ticker to nan
df.loc[df['rank'] < 4, ['cash_flow']] = np.nan
df
ticker cash_flow rank
0 a NaN 1.0
1 a NaN 2.0
2 a NaN 3.0
3 a 3.0 4.0
4 a 4.0 5.0
5 a 5.0 6.0
6 a 6.0 7.0
7 b NaN 1.0
8 b NaN 2.0
9 b NaN 3.0
10 b 10.0 4.0
11 b 11.0 5.0
12 b 12.0 6.0
13 b 13.0 7.0
14 b 14.0 8.0
15 b 15.0 9.0
16 b 16.0 10.0
Комментарии:
1. Это отличное предложение и будет очень полезно. Я получил TypeError: объект ‘NoneType’ недоступен для вызова после попытки использовать функцию ранга pandas. Есть ли что-то, что мне нужно отформатировать в моем наборе данных?