Pandalar: Ödenmemiş faturaların aylık alt toplamlarını oluşturma

0

Soru

Şuna benzeyen bir veri çerçevem var:

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

Her satır, daha önce ödenmiş bir faturayı temsil eder, DF, 2019-01'den bugüne kadar uzanan faturalandırılmış tarihlere sahip verileri içerir.

Her ayın sonunda ne kadar ödenmemiş olduğunu belirlemek için aylık olarak bazı raporlar yapmaya çalışıyorum.

İlk fatura tarihinden bu yana her ay gösterilen bir çıktı df'si ve ay için ödenmemiş ar'nin toplamını saklamak için bir yer ayarladım, şu anda şöyle görünüyor:

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

Sonuçta, çıktının böyle bir şeye benzemesini istiyorum:

                    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   

Ödenmemiş Toplam AR, faturanın kapatılmadığı her ay için faturalanan tutarın toplanmasından gelir.

Örneğin, 2019-08'de yumruk üç fatura için faturalandırılan tutarı topluyoruz, 1443.62 + 3585.78 + 68276.25 = 73,305.65, çünkü bu üç fatura ağustos sonunda ödenmemiş kaldı. Bu mantık, fatura ödenene kadar devam eder, ancak fatura, ödendiği ay için ödenmemiş AR'ye katkıda bulunmaz.

Birisi istediğim çıktıyı oluşturmanın en iyi yolunu bulmama yardımcı olabilir mi?

teşekkür ederim!

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

En iyi cevabı

1

Bu istediğini yapmalı.

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)

Çıktı:

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

Olarak ile tüm pandas diziler, muhtemelen bu çalışan toplamları bir veya iki işlev çağrısında döngü olmadan yapmanın bir yolu vardır. Birinin sesini keseceğine eminim.
Tim Roberts

bu yararlı, ancak yalnızca ilk ay için çalışıyor gibi görünüyor. sonraki aylar olması gerekenden daha yüksek bir değere sahiptir. fatura kapatıldıktan sonra, takip eden aylardan hariç tutulmalıdır
ksan

Oops, yanlış. Tamir edeceğim. En sağdaki sütunun doğru olduğunu görebilirsiniz, sadece yanlış sütunu df'ye kaydediyordum.
Tim Roberts

Diğer dillerde

Bu sayfa diğer dillerde

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