Я хочу сделать группу pandas on pr. тикер группы. в нижнем коде. Для расчета различных KPIs pr. тикер в наличии. Здесь я просто показываю col 'Difference' от предыдущего дня. Очевидно, я не хочу разницы между разными тикерами - это не имеет смысла - отсюда и группа. Но это не работает должным образом.Python pandas groupby не работает
Проблема возникают в выходном файле Фактическое GroupBy, не делать то, что он должен, как вы можете увидеть в приведенном ниже примере, что Col «Difference» преступить и охватывают различные группы в GroupBy (бегущая строка). Таким образом, он вычисляет разницу между последней тикер-линией в первой группе и первой линией тикера во второй группе. Это не так. эта линия должна быть NaN в качестве первой линии ...
Это результат «Difference» цв в ф.р. Разница Дата
2015-04-09 NaN
2015-04-10 1.180000
2015-04-13 3.150000
2015-04-14 -0.980000
2015-04-15 1.280000
2015-04-16 -8.280000
2015-04-17 -8.770000
2015-04-09 -139.859995 This is not correct. The groupby does not separate the tickers as it should. This should be a NaN... not the diff between 2 different tickers!
2015-04-10 0.899994
2015-04-13 -1.130005
2015-04-14 -0.589996
2015-04-15 1.000000
2015-04-16 0.350006
2015-04-09 -139.859995
Любые идеи относительно того, почему «разница» цв является не разделяться в группе, как это должно быть в моем коде?
import pandas as pd
import time
from io import StringIO
text = """Date Ticker Open High Low Adj_Close Volume
2015-04-09 vws.co 315.000000 316.100000 312.500000 311.520000 1686800
2015-04-10 vws.co 317.000000 319.700000 316.400000 312.700000 1396500
2015-04-13 vws.co 317.900000 321.500000 315.200000 315.850000 1564500
2015-04-14 vws.co 320.000000 322.400000 318.700000 314.870000 1370600
2015-04-15 vws.co 320.000000 321.500000 319.200000 316.150000 945000
2015-04-16 vws.co 319.000000 320.200000 310.400000 307.870000 2236100
2015-04-17 vws.co 309.900000 310.000000 302.500000 299.100000 2711900
2015-04-20 vws.co 303.000000 312.000000 303.000000 306.490000 1629700
2015-04-09 mmm 166.750000 167.500000 166.500000 166.630005 1762800
2015-04-10 mmm 165.630005 167.740005 164.789993 167.529999 1993700
2015-04-13 mmm 167.110001 167.490005 165.919998 166.399994 2022800
2015-04-14 mmm 165.179993 166.550003 164.649994 165.809998 1610300
2015-04-15 mmm 165.339996 167.080002 164.839996 166.809998 2092200
2015-04-16 mmm 165.880005 167.229996 165.250000 167.160004 2721900"""
df = pd.read_csv(StringIO(text), delim_whitespace=1, parse_dates=[0], index_col=0)
def Screener(group):
def diff_calc(group):
df['Difference'] = df['Adj_Close'].diff()
return df['Difference']
df['Difference'] = diff_calc(group)
return df
if __name__ == '__main__':
### groupby screeener (filtering to only rel ticker group)
grouped = df.groupby('Ticker', as_index=False) # Now doing the groupby outside the iteration...
for name, group in grouped:
# Testing/showing the groups...
print ('(group)\n',name,'\n')
print ('(group (ticker) in df)\n',group.head(10),'\n')
df = Screener(group)
print(60 * '=')
# Test the first 3 rows of each group for 'Difference' col transgress groups...
df_test = df.groupby('Ticker').head(3).reset_index().set_index('Date')
print ('df_test (summary from df) (Output)\n',df_test,'\n')
Apparantly мой GroupBy работает, как задумано, но предполагаемый «разница» цв ведет себя хаотично показано на моем тестовом выходе здесь:
(group)
mmm
(group (ticker) in df)
Ticker Open High Low Adj_Close Volume
Date
2015-04-09 mmm 166.750000 167.500000 166.500000 166.630005 1762800
2015-04-10 mmm 165.630005 167.740005 164.789993 167.529999 1993700
2015-04-13 mmm 167.110001 167.490005 165.919998 166.399994 2022800
2015-04-14 mmm 165.179993 166.550003 164.649994 165.809998 1610300
2015-04-15 mmm 165.339996 167.080002 164.839996 166.809998 2092200
2015-04-16 mmm 165.880005 167.229996 165.250000 167.160004 2721900
============================================================
(group)
vws.co
(group (ticker) in df)
Ticker Open High Low Adj_Close Volume
Date
2015-04-09 vws.co 315.0 316.1 312.5 311.52 1686800
2015-04-10 vws.co 317.0 319.7 316.4 312.70 1396500
2015-04-13 vws.co 317.9 321.5 315.2 315.85 1564500
2015-04-14 vws.co 320.0 322.4 318.7 314.87 1370600
2015-04-15 vws.co 320.0 321.5 319.2 316.15 945000
2015-04-16 vws.co 319.0 320.2 310.4 307.87 2236100
2015-04-17 vws.co 309.9 310.0 302.5 299.10 2711900
2015-04-20 vws.co 303.0 312.0 303.0 306.49 1629700
============================================================
df_test (summary from df) (Output)
Ticker Open High Low Adj_Close Volume Date
2015-04-09 vws.co 315.000000 316.100000 312.500000 311.520000 1686800
2015-04-10 vws.co 317.000000 319.700000 316.400000 312.700000 1396500
2015-04-13 vws.co 317.900000 321.500000 315.200000 315.850000 1564500
2015-04-09 mmm 166.750000 167.500000 166.500000 166.630005 1762800
2015-04-10 mmm 165.630005 167.740005 164.789993 167.529999 1993700
2015-04-13 mmm 167.110001 167.490005 165.919998 166.399994 2022800
Difference
Date
2015-04-09 NaN
2015-04-10 1.180000
2015-04-13 3.150000
2015-04-09 -139.859995 This is not correct!!! This should be NaN...
2015-04-10 0.899994
2015-04-13 -1.130005
@piRSqueared, спасибо. Это действительно сделало мой день (midsummernights). Потрясающие. Зачем использовать мультииндекс? Я взял вашу группу и включил ее в свой контекст, но поддерживаю групповую итерацию. Таким образом, я могу вызвать больше функций в своем Screener, как я хочу. Diff не является единственной частью расчета, который мне нужен на этих цифрах ... И если я делаю отдельную группу по KPI, как вы предлагаете. Я подозреваю, что теряю время, если я запустил код на миллионах данных запаса временного ряда. – Excaliburst