मुझे आश्चर्य है कि अगर कोई मेरे द्वारा देखे जा रहे कुछ अजीब लूपिंग व्यवहार को समझाने में मदद कर सकता है - यहाँ मेरा कोड है:

कोड के इस हिस्से में सब कुछ काम कर रहा था

# Loop through ref_df and run Isolation Forest models by CID
for row in ref_df.itertuples():
    # Reference CID from ref_df
    ref = row.CID
    # Filter new_df table
    ref_fil = new_df['CID']==ref
    mod_df = []
    mod_df = new_df[ref_fil]
    mod_df = mod_df.copy()

मैंने फिर निम्नलिखित कोड जोड़ा:

    # Add differences between dates to mod_df
    mod_df['InvoiceDate']= pd.to_datetime(mod_df['InvoiceDate']) 
    mod_df = mod_df.sort_values(by=['CID', 'InvoiceDate'])
    prev_dates = mod_df.InvoiceDate.shift().fillna(pd.datetime(2019,10,1))
    ddiff = mod_df.InvoiceDate - prev_dates
    ddiff.name = 'DDiff'
    mod_df = pd.concat((mod_df, ddiff), axis=1, copy=False)
    <Then do something here with mod_df>

यहां बताया गया है कि कोड को कैसे काम करना चाहिए:

  • ref_df पार्टनो (सीआईडी) की सूची के साथ एक संदर्भ डेटाफ्रेम है
  • ref_df . में कोड प्रत्येक सीआईडी ​​के माध्यम से लूप करता है
  • Ref_df CID का उपयोग उसी CID वाले रिकॉर्ड के लिए किसी अन्य डेटाफ़्रेम new_df को फ़िल्टर करने के लिए किया जाता है
  • यह फ़िल्टर अंततः एक डेटाफ़्रेम mod_df बन जाता है
  • यह सब ठीक काम कर रहा था, लूप फ़िल्टर कर रहा था और हर बार लूप होने पर mod_df डेटाफ्रेम बना रहा था
  • आज सुबह मैंने mod_df . में चालान तिथियों के बीच अंतर की गणना करने के लिए अतिरिक्त कोड जोड़ा

मैं mod_df में जो आउटपुट देख रहा हूं वह इस तरह दिखता है:

       CID  InvoiceDate  DDiff   DDiff   DDiff
1005    18  2019-10-02 0 days  1 days  1 days
1720    18  2019-10-03 0 days  1 days  1 days
4187    18  2019-10-09 0 days  6 days  6 days
7263    18  2019-10-16 0 days  7 days  7 days
9476    18  2019-10-19 0 days  3 days  3 days
11923   18  2019-10-24 0 days  5 days  5 days
12626   18  2019-10-25 0 days  1 days  1 days
13361   18  2019-10-28 0 days  3 days  3 days
20446   18  2019-11-08 0 days 11 days 11 days

इसके बारे में अजीब बात यह है कि आउटपुट एक लूप के बाद होता है (कोड में 'ब्रेक' जोड़ा जाता है) कोड mod_df = [] कोड लूप होने पर हर बार mod_df को साफ़ करना चाहिए। मुझे कोई सुराग नहीं है कि mod_df में 3 डीडीआईएफ कॉलम क्यों जोड़े जा रहे हैं? एक लूप के बाद एक DDiff कॉलम होना चाहिए और अगला लूप शुरू होने पर इसे बाकी mod_df से साफ़ कर दिया जाएगा। पहला डीडीआईएफ कॉलम 0 के साथ पॉप्युलेट किया गया है, यह भी अनपेक्षित है।

क्या कोई इस पर प्रकाश डाल सकता है कि यहां क्या हो रहा है?

आपकी मदद के लिए आगे से बहुत - बहुत धन्यवाद....

अनुरोध के रूप में यहाँ ddiff है:

1005     1 days
1720     1 days
4187     6 days
7263     7 days
9476     3 days
11923    5 days
12626    1 days

अनुरोध के अनुसार यहां ref_df है:

          CID  OrderQty InvoiceDate
0          18        25   10/2/2019
1     1000736        40  10/14/2019
2     1015387        35   10/4/2019
3     1020700        20   10/1/2019
4     1038702        45   10/8/2019

CID = 18 वह कुंजी है जिसका उपयोग ऊपर mod_df को फ़िल्टर करने के लिए किया जा रहा है

0
AndyC 14 जून 2020, 19:55

1 उत्तर

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

अंत में, समस्या रेखा मिली:

 mod_df = pd.concat((mod_df, ddiff), axis=1, copy=False)

यहां दूसरे नाम का इस्तेमाल करें..

mod_df_1 = pd.concat((mod_df, ddiff), axis=1, copy=False)

तो, मुद्दा यह था कि आप कितनी बार कोड चलाते हैं, यह DDiff को जोड़ देगा क्योंकि mod_df इसे ddiff के साथ जोड़ रहा है ...

0
Sandeep Kothari 15 जून 2020, 13:17