Panda: Tworzenie miesięcznych sum częściowych niezapłaconych faktur

0

Pytanie

Mam ramkę danych, który wygląda tak:

df:

Index   AMOUNT_INVOICED  INVOICED_DATE    CLOSED_DATE
0         1443.62          2019-08-01        2019-09-04
1         3585.78          2019-08-03        2019-09-04
2         68276.25         2019-08-05        2019-09-04
3         19673.84         2019-09-10        2019-11-06
4         9119.40          2019-09-11        2019-10-07
...
700       9976.25          2021-09-01        2021-10-04
701       7273.84          2021-09-01        2021-11-14
702       3129.40          2021-10-04        2021-11-23

Każdy wiersz reprezentuje wynik, który już został zapłacony, DF zawiera dane z datami wystawienia faktur, охватывающими okresie od 2019-01 po dziś dzień.

Staram się co miesiąc sporządzać raporty, aby określić, ile dolarów było непогашено na koniec każdego miesiąca.

Ustawiłem wyjście df, który pokazuje, że każdy miesiąc od daty pierwszego konta, i miejsce do przechowywania kwoty zaległych AR za miesiąc, obecnie to wygląda tak:

                    Total Outstanding AR  
Month                                              
2019-08                     0
2019-09                     0 
2019-10                     0  
...
2021-09                     0  
2021-10                     0   

Ostatecznie, chciałbym, aby wynik wyglądał mniej więcej tak:

                    Total Outstanding AR  
Month                                                                        
2019-08                     73,305.65 
2019-09                     28,793.24  
2019-10                     19673.84  
...
2021-09                     17,250.09  
2021-10                     10,403.24   

Łączna kwota zaległych AR będzie uzyskana w wyniku sumowania kwoty wystawionej faktury za każdy miesiąc, w którym rachunek nie został zamknięty.

Na przykład, w 2019-08 roku podsumowujemy kwotę, narażonych na pierwszych trzech kont, 1443.62 + 3585.78 + 68276.25 = 73,305.65, ponieważ te trzy rachunki pozostały niezapłaconych przez pod koniec sierpnia. Logika ta będzie trwać do momentu, gdy faktura nie zostanie zapłacona, ale faktury nie wpływa na непогашенную kwotę AR za miesiąc, w którym został zapłacony.

Czy może ktoś pomóc mi zrozumieć, jak najlepiej stworzyć pożądany rezultat?

Dziękuję!

date pandas python
2021-11-23 23:33:01
1

Najlepsza odpowiedź

1

To musi zrobić to, o co prosicie.

import datetime
import pandas as pd
data = {
    'AMOUNT_INVOICED': [ 1443.62, 3585.78, 68276.25, 19673.84,
        9119.40, 9976.25, 7273.84, 3129.40 ],
    'INVOICED_DATE': [ '2019-08-01', '2019-08-03', '2019-08-05',
        '2019-09-10', '2019-09-11', '2021-09-01', '2021-09-01',
        '2021-10-04' ],
    'CLOSED_DATE': [ '2019-09-04', '2019-09-04', '2019-09-04',
         '2019-11-06', '2019-10-07', '2021-10-04', '2021-11-14',
         '2021-11-23' ]
}

df = pd.DataFrame(data)

dates = []
amounts = []
for year in range(2019,2022):
    for month in range(12):
        magic = '%04d-%02d-01' % (year,month+1)
        s1 = df[df['INVOICED_DATE'] < magic]['AMOUNT_INVOICED'].sum()
        s2 = df[df['CLOSED_DATE'] < magic]['AMOUNT_INVOICED'].sum()
        print("%s %10.2f %10.2f %10.2f" % (magic, s1,s2,s1-s2))
        dates.append( magic[:7] )
        amounts.append( s1-s2 )

newdf = pd.DataFrame(amounts, index=dates, columns=['Total Outstanding AR'])
print(newdf)

Wyjście:

2019-01-01       0.00       0.00       0.00
2019-02-01       0.00       0.00       0.00
2019-03-01       0.00       0.00       0.00
2019-04-01       0.00       0.00       0.00
2019-05-01       0.00       0.00       0.00
2019-06-01       0.00       0.00       0.00
2019-07-01       0.00       0.00       0.00
2019-08-01       0.00       0.00       0.00
2019-09-01   73305.65       0.00   73305.65
2019-10-01  102098.89   73305.65   28793.24
2019-11-01  102098.89   82425.05   19673.84
2019-12-01  102098.89  102098.89       0.00
2020-01-01  102098.89  102098.89       0.00
2020-02-01  102098.89  102098.89       0.00
2020-03-01  102098.89  102098.89       0.00
2020-04-01  102098.89  102098.89       0.00
2020-05-01  102098.89  102098.89       0.00
2020-06-01  102098.89  102098.89       0.00
2020-07-01  102098.89  102098.89       0.00
2020-08-01  102098.89  102098.89       0.00
2020-09-01  102098.89  102098.89       0.00
2020-10-01  102098.89  102098.89       0.00
2020-11-01  102098.89  102098.89       0.00
2020-12-01  102098.89  102098.89       0.00
2021-01-01  102098.89  102098.89       0.00
2021-02-01  102098.89  102098.89       0.00
2021-03-01  102098.89  102098.89       0.00
2021-04-01  102098.89  102098.89       0.00
2021-05-01  102098.89  102098.89       0.00
2021-06-01  102098.89  102098.89       0.00
2021-07-01  102098.89  102098.89       0.00
2021-08-01  102098.89  102098.89       0.00
2021-09-01  102098.89  102098.89       0.00
2021-10-01  119348.98  102098.89   17250.09
2021-11-01  122478.38  112075.14   10403.24
2021-12-01  122478.38  122478.38       0.00
         Total Outstanding AR
2019-01                  0.00
2019-02                  0.00
2019-03                  0.00
2019-04                  0.00
2019-05                  0.00
2019-06                  0.00
2019-07                  0.00
2019-08                  0.00
2019-09              73305.65
2019-10              28793.24
2019-11              19673.84
2019-12                  0.00
2020-01                  0.00
2020-02                  0.00
2020-03                  0.00
2020-04                  0.00
2020-05                  0.00
2020-06                  0.00
2020-07                  0.00
2020-08                  0.00
2020-09                  0.00
2020-10                  0.00
2020-11                  0.00
2020-12                  0.00
2021-01                  0.00
2021-02                  0.00
2021-03                  0.00
2021-04                  0.00
2021-05                  0.00
2021-06                  0.00
2021-07                  0.00
2021-08                  0.00
2021-09                  0.00
2021-10              17250.09
2021-11              10403.24
2021-12                  0.00
2021-11-24 01:41:37

Jak i ze wszystkimi pandas sekwencje, prawdopodobnie, istnieje sposób, aby wykonać te aktualne kwoty za jeden lub dwa wywołania funkcji bez cyklu. Jestem pewien, że ktoś zamknie.
Tim Roberts

jest to przydatne, ale wydaje się, że działa tylko w ciągu pierwszego miesiąca. nowsze miesiącach mają większą wartość, niż muszą być. jak tylko konto zostanie zamknięte, musi być wykluczony z kolejnych miesięcy
ksan

Oj, literówka. Naprawię to. Widać, że skrajna prawa kolumna była prawidłowa, po prostu zachował złą rubrykę w df.
Tim Roberts

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................