मेरे पास निम्न रूप का एक समय श्रृंखला डेटा है:

  Item  2020 Jan  2020 Feb  2020 Mar  2020 Apr  2020 May  2020 Jun
0    A         0         1         2         3         4         5
1    B         5         4         3         2         1         0

यह मासिक डेटा है लेकिन मैं इस डेटा का त्रैमासिक डेटा प्राप्त करना चाहता हूं। एक सामान्य त्रैमासिक डेटा की गणना जनवरी-मार्च और अप्रैल-जून के योग से की जाएगी और यह इस तरह दिखेगा:

  Item  2020 Q1  2020 Q2
0    A        3       12
1    B       12        3

मैं आसान त्रैमासिक डेटा प्राप्त करना चाहता हूं, इसलिए यह प्रत्येक नए डेटा आइटम के लिए केवल 1 महीने में बदल जाएगा, 3 महीने नहीं। तो यह जनवरी-मार्च, फिर फरवरी-अप्रैल, फिर मार्च-मई और अप्रैल-जून होगा। तो परिणामी डेटा इस तरह दिखेगा:

  Item  2020 Q1  2020 Q1  2020 Q1  2020 Q2
0    A        3        6        9       12
1    B       12        9        6        3

मेरा मानना ​​है कि यह कमसम के समान है जिसका उपयोग इस प्रकार किया जा सकता है:

df_dates = df.iloc[:,1:]
df_dates.cumsum(axis=1)

जो निम्नलिखित परिणाम की ओर जाता है:

   2020 Jan  2020 Feb  2020 Mar  2020 Apr  2020 May  2020 Jun
0         0         1         3         6        10        15
1         5         9        12        14        15        15

लेकिन पूरे समय में राशि मिलने के बजाय, उसे निकटतम 3 महीने (एक चौथाई) का योग मिलता है। मुझे नहीं पता कि कमसम के इस संस्करण को कैसे कहा जाता है, लेकिन मैंने इसे कई जगहों पर देखा है, इसलिए मेरा मानना ​​है कि इसके लिए एक पुस्तकालय समारोह हो सकता है।

2
Sayyor Y 5 सितंबर 2021, 08:36

2 जवाब

सबसे बढ़िया उत्तर

आइए चरणों में हल करें

  • इंडेक्स को Item कॉलम पर सेट करें
  • कॉलम की तरह तारीख को त्रैमासिक अवधि में पार्स करें
  • 3 आकार की विंडो के साथ रोलिंग योग की गणना करें
  • कॉलम अक्ष के साथ गणना की गई रोलिंग योग 2 इकाइयों को शिफ्ट करें और अंतिम दो कॉलम से छुटकारा पाएं
s = df.set_index('Item')
s.columns = pd.PeriodIndex(s.columns, freq='M').strftime('%Y Q%q')

s = s.rolling(3, axis=1).sum().shift(-2, axis=1).iloc[:, :-2]

print(s)

      2020 Q1  2020 Q1  2020 Q1  2020 Q2
Item                                    
A         3.0      6.0      9.0     12.0
B        12.0      9.0      6.0      3.0
2
Shubham Sharma 5 सितंबर 2021, 05:58

axis=1 के साथ कॉलम वार ग्रुपबाय के साथ प्रयास करें:

>>> df.iloc[:, [0]].join(df.iloc[:, 1:].groupby(pd.to_datetime(df.columns[1:], format='%Y %b').quarter, axis=1).sum().add_prefix('Q'))
  Item  Q1  Q2
0    A   3  12
1    B  12   3
>>> 

संपादित करें:

मैंने आपके प्रश्न को गलत तरीके से पढ़ा, जो आप चाहते हैं उसे करने के लिए rolling योग करने का प्रयास करें:

>>> x = df.rolling(3, axis=1).sum().dropna(axis='columns')
>>> df.iloc[:, [0]].join(x.set_axis('Q' + pd.to_datetime(df.columns[1:], format='%Y %b').quarter.astype(str)[:len(x.T)], axis=1))
  Item    Q1   Q1   Q1    Q2
0    A   3.0  6.0  9.0  12.0
1    B  12.0  9.0  6.0   3.0
>>> 
1
U12-Forward 5 सितंबर 2021, 06:09