शिफ्टिंग और लैग फ़ीचर
shift() से लैग और लीड कॉलम बनाएँ, diff() से अवधि-दर-अवधि परिवर्तन निकालें और प्रतिशत परिवर्तन की गणना करें।
शिफ्टिंग और लैग फ़ीचर, CoddyKit पर Pandas & NumPy Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Pandas & NumPy Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Pandas & NumPy Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
लैग विशेषताएँ क्यों महत्वपूर्ण हैं
समय-श्रृंखला विश्लेषण में पिछले समय चरण का मान (lag) अक्सर वर्तमान मान का सबसे अच्छा पूर्वानुमानक होता है। उदाहरण के लिए, कल की बिक्री आज की बिक्री के बारे में उपयोगी जानकारी देती है। लैग स्तंभ बनाने से आप मशीन लर्निंग मॉडल में ऐतिहासिक मानों को विशेषताओं के रूप में या स्वसहसंबंध के सांख्यिकीय विश्लेषण में उपयोग कर सकते हैं। Pandas एक ही वेक्टरकृत कॉल में लैग विशेषताएँ बनाने के लिए shift() उपलब्ध कराता है।
shift(): मानों को आगे या पीछे ले जाना
Series.shift(n) सभी मानों को नीचे की ओर n स्थानों तक ले जाता है (धनात्मक n लैग बनाता है) और पहली n पंक्तियों को NaN से भरता है। ऋणात्मक n देने पर मान ऊपर की ओर चले जाते हैं (लीड बनती है और भविष्य के मान वर्तमान पंक्ति पर पीछे खिसक जाते हैं)। इंडेक्स अपरिवर्तित रहता है—केवल मानों का स्थान बदलता है।
import pandas as pd
import numpy as np
df = pd.DataFrame(
{'sales': [100, 120, 115, 130, 140, 125]},
index=pd.date_range('2024-01-01', periods=6, freq='D')
)
# Lag-1: yesterday's sales
df['sales_lag1'] = df['sales'].shift(1)
# Lead-1: tomorrow's sales (shifted up)
df['sales_lead1'] = df['sales'].shift(-1)
print(df)कई Lag कॉलम बनाना
मशीन लर्निंग के लिए आमतौर पर आप एक साथ कई lag फीचर बनाते हैं — lag-1, lag-7 (पिछले सप्ताह का यही दिन), और lag-30 (पिछले महीने का यही दिन)। सबसे आसानी से पढ़े जाने वाला तरीका यह है कि इन्हें एक लूप में बनाएँ और प्रत्येक को एक नए कॉलम में असाइन करें। परिणामी DataFrame में मूल Series के साथ उसके सभी lag संस्करण मॉडलिंग के लिए तैयार होते हैं।
for lag in [1, 2, 3, 7]:
df[f'sales_lag{lag}'] = df['sales'].shift(lag)
print(df.columns.tolist())
# ['sales', 'sales_lag1', 'sales_lag2', 'sales_lag3', 'sales_lag7']
# Drop rows with NaN from the largest lag period
df_model = df.dropna()
print('Ready for modelling, shape:', df_model.shape)समय-आधारित Shifting के लिए shift() में freq
पूर्णांकों की संख्या के अनुसार पंक्तियों को shift करने के बजाय, आप freq पैरामीटर का उपयोग करके समय-अंतराल के अनुसार shift कर सकते हैं। df.shift(1, freq='ME') इंडेक्स को एक महीने के अंत तक आगे shift करता है। इससे मान अपनी जगह पर रहते हैं, लेकिन इंडेक्स बदल जाता है। यह दो ऐसी समय Series को संरेखित करने के लिए उपयोगी है जिनमें एक निश्चित समय-अवधि का अंतर हो, और मानों को पुनर्व्यवस्थित करने की आवश्यकता न हो।
monthly = pd.Series(
[100, 120, 115],
index=pd.date_range('2024-01-31', periods=3, freq='ME')
)
# Shift the index forward by 1 month (values stay, index moves)
shifted_index = monthly.shift(1, freq='ME')
print('Original index:', monthly.index.tolist())
print('Shifted index: ', shifted_index.index.tolist())
# Original: [2024-01-31, 2024-02-29, 2024-03-31]
# Shifted: [2024-02-29, 2024-03-31, 2024-04-30]diff(): अवधि-दर-अवधि परिवर्तन
Series.diff(n) किसी मान और उससे n स्थान पहले मौजूद मान के बीच का अंतर निकालता है: x[t] - x[t-n]। इसका उपयोग आमतौर पर दिन-दर-दिन परिवर्तन, सप्ताह-दर-सप्ताह अंतर या वर्ष-दर-वर्ष बदलाव निकालने के लिए किया जाता है। पहली n पंक्तियाँ NaN होती हैं, क्योंकि उनसे घटाने के लिए पिछले मान उपलब्ध नहीं होते।
df['sales_diff1'] = df['sales'].diff(1) # day-over-day change
df['sales_diff7'] = df['sales'].diff(7) # week-over-week change
print(df[['sales', 'sales_diff1']].head())
# sales sales_diff1
# 2024-01-01 100 NaN
# 2024-01-02 120 20.0 <- +20 from yesterday
# 2024-01-03 115 -5.0 <- -5 from yesterdaypct_change(): प्रतिशत परिवर्तन
Series.pct_change(n) सापेक्ष प्रतिशत परिवर्तन निकालता है: (x[t] - x[t-n]) / x[t-n]। यह वित्तीय विश्लेषण (दैनिक रिटर्न), वृद्धि दर की गणना और ऐसी सभी स्थितियों के लिए आवश्यक है जहाँ निरपेक्ष परिवर्तन की तुलना में सापेक्ष परिवर्तन अधिक अर्थपूर्ण हो। प्रतिशत अंक प्राप्त करने के लिए परिणाम को 100 से गुणा करें।
df['pct_chg'] = df['sales'].pct_change().round(3)
df['pct_chg_7d'] = df['sales'].pct_change(7).round(3)
print(df[['sales', 'pct_chg']].head())
# sales pct_chg
# 2024-01-01 100 NaN
# 2024-01-02 120 0.200 <- 20% increase
# 2024-01-03 115 -0.042 <- 4.2% decreaseshift() को अंकगणित के साथ संयोजित करना
व्युत्पन्न समय फीचर निकालने के लिए आप shift() को अंकगणित के साथ संयोजित कर सकते हैं। उदाहरण के लिए: आज के मान और पिछले सप्ताह के मान का अनुपात, किसी निश्चित आरंभ-बिंदु से संचयी योग, या एक वर्ष पहले के मान से अंतर। इन सभी में एक ही तरीका अपनाया जाता है: मूल Series को shift करें और वर्तमान मानों के साथ प्रत्येक तत्व पर अंकगणित करें।
# Week-over-week growth index (today / last week)
df['wow_ratio'] = (df['sales'] / df['sales'].shift(7)).round(3)
# Deviation from 3-day lag
df['dev_3d'] = df['sales'] - df['sales'].shift(3)
# Is today higher than yesterday? (boolean feature)
df['higher_than_yesterday'] = df['sales'] > df['sales'].shift(1)
print(df[['sales', 'wow_ratio', 'higher_than_yesterday']].head())संचयी फीचर के लिए cumsum() और cumprod()
Series.cumsum() पहली पंक्ति से लेकर प्रत्येक पंक्ति तक का चलता हुआ कुल योग निकालता है, जबकि Series.cumprod() संचयी गुणनफल निकालता है। ये संचयी राजस्व, संचयी रिटर्न (चक्रवृद्धि वृद्धि) और वर्ष-से-अब-तक के कुल योग के लिए उपयोगी हैं। इनमें किसी तर्क की आवश्यकता नहीं होती और ये किसी भी संख्यात्मक Series या DataFrame कॉलम पर काम करते हैं।
# Cumulative sales (year-to-date total)
df['ytd_sales'] = df['sales'].cumsum()
# Cumulative product: compound growth factor
returns = pd.Series([0.02, -0.01, 0.03, 0.01, -0.005])
df_ret = pd.DataFrame({'daily_return': returns})
df_ret['compound'] = (1 + df_ret['daily_return']).cumprod() - 1
print(df_ret)मशीन लर्निंग के लिए Lag फीचर
मशीन लर्निंग के लिए समय Series डेटा तैयार करते समय, फीचर इंजीनियरिंग का एक मानक चरण lag फीचर का मैट्रिक्स बनाना है। प्रत्येक कॉलम अलग-अलग पिछले समय-बिंदु पर लक्ष्य चर को दर्शाता है। Lag बनाने के बाद, NaN वाली पंक्तियों को हटाएँ (ये इतिहास उपलब्ध न होने के कारण शुरुआत में दिखाई देती हैं) और समय-क्रम का पालन करते हुए, बिना शफल किए, डेटा को प्रशिक्षण और परीक्षण सेट में बाँटें।
def make_lag_matrix(series, n_lags):
df_lags = pd.DataFrame({'y': series})
for lag in range(1, n_lags + 1):
df_lags[f'lag_{lag}'] = series.shift(lag)
return df_lags.dropna()
lag_df = make_lag_matrix(df['sales'], n_lags=3)
print(lag_df)
# y lag_1 lag_2 lag_3
# ... ... ... ...समूहों के भीतर Shifting
जब आपके डेटा में कई इकाइयाँ हों (जैसे एक DataFrame में कई उत्पाद या क्षेत्र), तो आपको प्रत्येक इकाई के समूह के भीतर अलग-अलग shift निकालना चाहिए। groupby().shift() का उपयोग करने से यह सुनिश्चित होता है कि उत्पाद A की पहली पंक्ति का lag NaN हो, न कि उत्पाद B का अंतिम मान। यह चरण छोड़कर समूहों को मिलाना डेटा लीक होने की एक सामान्य और सूक्ष्म त्रुटि है।
df_multi = pd.DataFrame({
'product': ['A', 'A', 'A', 'B', 'B', 'B'],
'sales': [100, 120, 115, 200, 210, 195]
})
# WRONG: lag crosses product boundary
df_multi['lag_wrong'] = df_multi['sales'].shift(1)
# CORRECT: lag within each product
df_multi['lag_correct'] = df_multi.groupby('product')['sales'].shift(1)
print(df_multi)pct_change के चिह्नों को समझना
धनात्मक pct_change() मान का अर्थ है कि वर्तमान मान पिछले मान से अधिक है; ऋणात्मक मान का अर्थ है कि वह कम है। यदि पिछला मान शून्य हो, तो शून्य से भाग देने की समस्या से सावधान रहें — वर्तमान मान के चिह्न के आधार पर परिणाम NaN या inf हो सकता है। pct_change() के बाद अनंत मानों को साफ़ करने के लिए replace([float('inf'), float('-inf')], float('nan')) का उपयोग करें।
import numpy as np
s = pd.Series([0, 100, 50, 200])
chg = s.pct_change()
print(chg)
# 0 NaN <- no prior value
# 1 inf <- 0 -> 100 (division by zero)
# 2 -0.5 <- 100 -> 50 (-50%)
# 3 3.0 <- 50 -> 200 (+300%)
# Clean infinite values
chg_clean = chg.replace([float('inf'), float('-inf')], float('nan'))
print(chg_clean)त्वरित जाँच
इस पाठ में shifting और lag फीचर के बारे में अपनी समझ जाँचें।
पाठ का पुनरावलोकन
इस पाठ में आपने सीखा: shift(n) मानों को n स्थान नीचे ले जाकर lag फीचर बनाता है; diff(n) अवधि-दर-अवधि निरपेक्ष परिवर्तन निकालता है; pct_change(n) सापेक्ष प्रतिशत परिवर्तन निकालता है; और कई समूहों के साथ काम करते समय डेटा लीक से बचने के लिए groupby().shift() का उपयोग करना आवश्यक है। आगे हम .dt accessor का उपयोग करके समय-संबंधी फीचर निकालेंगे।
एआई शिक्षक के साथ Python सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 30
- पाठ
- 120
अक्सर पूछे जाने वाले प्रश्न
क्या “शिफ्टिंग और लैग फ़ीचर” पाठ निःशुल्क है?
हाँ—“शिफ्टिंग और लैग फ़ीचर” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Pandas & NumPy Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Pandas & NumPy Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“शिफ्टिंग और लैग फ़ीचर” में मैं क्या सीखूँगा?
shift() से लैग और लीड कॉलम बनाएँ, diff() से अवधि-दर-अवधि परिवर्तन निकालें और प्रतिशत परिवर्तन की गणना करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Pandas & NumPy Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Pandas & NumPy Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Pandas & NumPy Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“शिफ्टिंग और लैग फ़ीचर” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Pandas & NumPy Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Pandas & NumPy Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- DatetimeIndex और अवधि-रेंज
- समय-श्रृंखला का पुनः नमूनीकरण
- शिफ्टिंग और लैग फ़ीचर
- समय-संबंधी फ़ीचर निकालना