एक विधि, लूप और सीमित लुकबैक अवधि से परहेज।
import pandas as pd
import numpy as np
>>>df = pd.DataFrame([['1/1/2000', 'Apple', 0.010, 0.75],
['1/1/2000', 'IBM', 0.011, 0.4],
['1/1/2000', 'Google', 0.012, 0.45],
['1/1/2000', 'Nokia', 0.022, 0.81],
['2/1/2000', 'Apple', 0.014, 0.56],
['2/1/2000', 'Google', 0.015, 0.45],
['2/1/2000', 'Nokia', 0.016, 0.55],
['3/1/2000', 'Apple', 0.020, 0.52],
['3/1/2000', 'Google', 0.030, 0.51],
['3/1/2000', 'Nokia', 0.040, 0.47]],
columns=['Date', 'Stock', 'Weight', 'Percentile'])
पहले, पहचान जब शेयरों शुरू करने या बंद कर देंगे अंतिम वजन में पता लगाया जा रहा:
>>>df['bought'] = np.where(df['Percentile'] >= 0.7, 1, np.nan)
>>>df['bought or sold'] = np.where(df['Percentile'] < 0.5, 0, df['bought'])
'1' के साथ खरीदने के लिए एक शेयर का संकेत है, और '0
अपने उदाहरण का उपयोग 'स्वामित्व वाले, बेचने के लिए एक।
इससे, आप यह पहचान सकते हैं कि स्टॉक का स्वामित्व है या नहीं। ध्यान दें कि यह जरूरी है कि पहले से ही dataframe कालक्रम के अनुसार हल हो, अगर किसी भी बिंदु पर आप एक तिथि सूचकांक के बिना एक dataframe पर इसका इस्तेमाल:
>>>df['own'] = df.groupby('Stock')['bought or sold'].fillna(method='ffill').fillna(0)
'ffill'
आगे भरने, खरीद से आगे स्वामित्व की स्थिति के प्रचार और तिथियों को बेचने जाता है। .fillna(0)
डेटाफ्रेम की पूरी तरह से .5 और .7 के बीच बने किसी भी स्टॉक को पकड़ता है। फिर,
>>>df['Final Weight'] = df['own']*df['Weight']
गुणा, गणना अंतिम भार df['own']
पहचान या शून्य होने के साथ, एक और np.where की तुलना में थोड़ा तेज है और एक ही परिणाम देता है।
संपादित करें:
के बाद से गति चिंता का विषय है, एक स्तंभ में सब कुछ कर रही है, के रूप में @cronos ने सुझाव दिया है, मेरे परीक्षणों में 20 पंक्तियों में एक गति को बढ़ावा देने, एक 37% सुधार के आसपास में आ रहा है प्रदान करता है, या 18% 2,000,000 पर। मैं बाद में बड़ा कल्पना कर सकता हूं कि इंटरमीडिएट कॉलम को संग्रहीत करना कुछ प्रकार की मेमोरी-थ्रेशोल्ड को पार करना था या सिस्टम विनिर्देशों में कुछ और शामिल था जिसे मैंने अनुभव नहीं किया था।
यह दिखाई देगा:
>>>df['Final Weight'] = np.where(df['Percentile'] >= 0.7, 1, np.nan)
>>>df['Final Weight'] = np.where(df['Percentile'] < 0.5, 0, df['Final Weight'])
>>>df['Final Weight'] = df.groupby('Stock')['Final Weight'].fillna(method='ffill').fillna(0)
>>>df['Final Weight'] = df['Final Weight']*df['Weight']
या तो इस पद्धति का उपयोग या मध्यवर्ती क्षेत्रों को हटाने परिणाम देना होगा:
>>>df
Date Stock Weight Percentile Final Weight
0 1/1/2000 Apple 0.010 0.75 0.010
1 1/1/2000 IBM 0.011 0.40 0.000
2 1/1/2000 Google 0.012 0.45 0.000
3 1/1/2000 Nokia 0.022 0.81 0.022
4 2/1/2000 Apple 0.014 0.56 0.014
5 2/1/2000 Google 0.015 0.45 0.000
6 2/1/2000 Nokia 0.016 0.55 0.016
7 3/1/2000 Apple 0.020 0.52 0.020
8 3/1/2000 Google 0.030 0.51 0.000
9 3/1/2000 Nokia 0.040 0.47 0.000
आगे सुधार के लिए, मैं स्थापित करने के लिए एक तरह से जोड़ने को देखो चाहते हैं एक प्रारंभिक स्थिति जिसमें शेयरों का स्वामित्व है, उसके बाद डेटाफ्रेम को तोड़ने के बाद छोटे समय सीमा को देखने के लिए। यह इन छोटे dataframes में से एक के अंतर्गत आने वाले समय अवधि के लिए एक प्रारंभिक शर्त जोड़ने, तो
>>>df['Final Weight'] = np.where((df['Percentile'] >= 0.7) | (df['Final Weight'] != 0), 1, np.nan)
तरह
>>>df['Final Weight'] = np.where(df['Percentile'] >= 0.7, 1, np.nan)
बदलते कुछ करने के लिए है कि मान्यता प्राप्त है और प्रचार करने की अनुमति देने के द्वारा किया जा सकता है।
क्या आपके पास हमें दिखाने के लिए कोई प्रयास कोड है? –
कोड मैंने लिखा है यदि पीआईआरएसक्वार्डेस के समान ही उत्तर दिया गया है, हालांकि यह केवल एक दिन पहले देखता है, मैं चाहता हूं कि डेटासेट बड़े पैमाने पर – MysterioProgrammer91