اذهب إلى المحتوى

Ali Haidar Ahmad

الأعضاء
  • المساهمات

    1068
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    43

كل منشورات العضو Ali Haidar Ahmad

  1. إجابة سامح رائعة كالعادة.. وبالنسبة لإجابته الأولى أيضاً يمكننا أن نضيف تحسين عليها. بدلاً من أخذ أول IP في قائمة X_FORWARDED_FOR ، أخذ أول واحد ليس في عنوان IP داخلي معروف، حيث أن بعض أجهزة التوجيه لا تحترم البروتوكول، ويمكنك رؤية ips الداخلية باعتبارها القيمة الأولى في القائمة: PRIVATE_IPS_PREFIX = ('10.', '172.', '192.', ) def get_client_ip(request): #request العميل من ال ip الحصول على remote_address = request.META.get('REMOTE_ADDR') #None إذا كانت متوفرةوإلا REMOTE_ADDR لتكون ip تعيين القيمة الافتراضية للـ ip = remote_address #HTTP_X_FORWARDED_FOR من private ليس بروكسي وليس ip حاول الحصول على أول عنوان x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') if x_forwarded_for: proxies = x_forwarded_for.split(',') #الخاص ips إزالة ال while (len(proxies) > 0 and proxies[0].startswith(PRIVATE_IPS_PREFIX)): proxies.pop(0) #الأول الذي ليس خاصاً (من البروكسي) ip أخذ عنوان if len(proxies) > 0: ip = proxies[0] return ip
  2. يمكنك القيام بذلك كالتالي: import numpy as np import pandas as pd # إنشاء داتا فريم ببيانات عشوائية df = pd.DataFrame(np.random.random((10, 2))) df['date'] = pd.date_range('2017-1-1', periods=10, freq='D') df """ 0 1 date 0 0.398304 0.199462 2017-01-01 1 0.298642 0.960583 2017-01-02 2 0.172924 0.955810 2017-01-03 3 0.802121 0.691403 2017-01-04 4 0.584322 0.949568 2017-01-05 5 0.499019 0.667226 2017-01-06 6 0.069219 0.153963 2017-01-07 7 0.951769 0.758855 2017-01-08 8 0.485271 0.415563 2017-01-09 9 0.330080 0.561897 2017-01-10 """ # سنختار البيانات التي تقع ضمن التاريخ # "2017-01-3", "2017-01-6" range = df[df["date"].isin(pd.date_range("2017-01-3", "2017-01-6"))] range """ 0 1 date 2 0.722369 0.145827 2017-01-03 3 0.540575 0.378795 2017-01-04 4 0.341897 0.406917 2017-01-05 5 0.919453 0.810913 2017-01-06 """ أو الحل الأبسط وهو إنشاء استعلام كالتالي: start_date, end_date = "2017-01-3", "2017-01-6" df.query('date >= @start_date and date <= @end_date') """ 0 1 date 2 0.722369 0.145827 2017-01-03 3 0.540575 0.378795 2017-01-04 4 0.341897 0.406917 2017-01-05 5 0.919453 0.810913 2017-01-06 """ أو يمكنك استخدام df.loc بعد أن تحدد له البداية والنهاية كالتالي: start = df[df['date']=='2017-01-03'].index[0] end = df[df['date']=='2017-01-6'].index[0] df.loc[start:end] """ 0 1 date 2 0.722369 0.145827 2017-01-03 3 0.540575 0.378795 2017-01-04 4 0.341897 0.406917 2017-01-05 5 0.919453 0.810913 2017-01-06 """
  3. إضافة للطرق أعلاه.. فلأداء أعلى يفضل استخدام خوارزمية مطابقة السلاسل Jaro-Winkle للقيام بهكذا عمليات، فهي الأفضل من ناحية الأداء والأكثر دقة : import pandas as pd import jellyfish df1 = pd.DataFrame([[1],[2],[3],[4],[5]], index=['one','two','three','four','five'], columns=['number']) df1 """ number one 1 two 2 three 3 four 4 five 5 """ df2 = pd.DataFrame([['a'],['b'],['c'],['d'],['e']], index=['one','too','three','fours','five'], columns=['letter']) df2 """ letter one a too b three c fours d five e """ def get_closest_match(x, list_strings): best_match = None highest_jw = 0 for current_string in list_strings: current_score = jellyfish.jaro_winkler(x, current_string) if(current_score > highest_jw): highest_jw = current_score best_match = current_string return best_match df2.index = df2.index.map(lambda x: get_closest_match(x, df1.index)) df1.join(df2) """ number letter one 1 a two 2 b three 3 c four 4 d five 5 e """
  4. هذا الكود البسيط يكفي: df.columns = [''.join(t) for t in df.columns] df أو: df.columns = ['_'.join(tup).rstrip('_') for tup in df.columns.values] df """ USAF WBAN day month s_CDsum s_CLsum s_CNTsum s_PCsum tempfamax tempfamin year 0 702730 26451 1 1 12.0 0.0 13.0 1.0 30.92 24.98 1993 1 702730 26451 2 1 13.0 0.0 13.0 0.0 32.00 24.98 1993 2 702730 26451 3 1 2.0 10.0 13.0 1.0 23.00 6.98 1993 3 702730 26451 4 1 12.0 0.0 13.0 1.0 10.04 3.92 1993 4 702730 26451 5 1 10.0 0.0 13.0 3.0 19.94 10.94 1993 """ أو بالشكل التالي: mi = df.columns #MultiIndex نقوم باستخلاص ال mi """ MultiIndex([( 'USAF', ''), ( 'WBAN', ''), ( 'day', ''), ('month', ''), ( 's_CD', 'sum'), ( 's_CL', 'sum'), ('s_CNT', 'sum'), ( 's_PC', 'sum'), ('tempf', 'amax'), ('tempf', 'amin'), ( 'year', '')], ) """ # نحولها لقائمة mi.tolist() """ [('USAF', ''), ('WBAN', ''), ('day', ''), ('month', ''), ('s_CD', 'sum'), ('s_CL', 'sum'), ('s_CNT', 'sum'), ('s_PC', 'sum'), ('tempf', 'amax'), ('tempf', 'amin'), ('year', '')] """ # نحولها الآن لفهرس ind = pd.Index([e[0] + e[1] for e in mi.tolist()]) ind # نسندها للأعمدة df.columns = ind df """ USAF WBAN day month s_CDsum s_CLsum s_CNTsum s_PCsum tempfamax tempfamin year 0 702730 26451 1 1 12.0 0.0 13.0 1.0 30.92 24.98 1993 1 702730 26451 2 1 13.0 0.0 13.0 0.0 32.00 24.98 1993 2 702730 26451 3 1 2.0 10.0 13.0 1.0 23.00 6.98 1993 3 702730 26451 4 1 12.0 0.0 13.0 1.0 10.04 3.92 1993 4 702730 26451 5 1 10.0 0.0 13.0 3.0 19.94 10.94 1993 """
  5. المشكلة تحدث بسبب ال GPU وغالباً ما يسببها وجود عمليتين تتنافسان على ال GPU. أي أن هناك عملية ما تستخدم ال GPU الآن. لذا قم بإغلاق الجلسات التفاعلية "interactive sessions" في العمليات الأخرى (إذا كنت تستخدم جوبيتر قم بإعادة تشغيل الكيرنل) أو استخدم الكود التالي لإغلاق الجلسات المحلية الأخرى: if 'session' in locals() and session is not None: print('Close interactive session') session.close() أو يمكنك أن تضبط allow_soft_placement على Trueو gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.3) وبالتالي تحديد نسبة ال GPU التي ستستخدم في الجلسة: gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.3) sess = tf.Session(config=tf.ConfigProto( allow_soft_placement=True, log_device_placement=True))
  6. Express-handlebars: كانت الحزمة الأكثر شعبية منذ عدة سنوات. وتم تأليفها من قبل إريك فيرايولو في مارس 2012. هناك دردشة حية على gitter. وهو مرخص من قبل Yahoo Inc. أحد الاختلافات مقارنة بالحزم الأخرى هو القدرة على استخدام الخطافات Hooks. وبهذه الطريقة يمكنك تجاوز بعض وظائف مثيلات ExpressHandlebars. hps محرك عرض سهل الاستخدام مع نفس الوظائف تقريباً كما هو الحال في Express-handlebars، وهي الأكثر شعبية الآن على Github . ولديها أيضاً إصدارات أكثر ، وتحديثات أكثر تكراراَ ، وتبعيات أقل ، والكثير من المتابعين على Github. وتم تأليفها من قبل دون بارك في يناير 2011. وهو مرخص من قبل (MIT). Express-hbs: هذه الحزمة مكتوبة من قبل مبرمجين في Barc. يمكن استخدامه مع كلا الإصدارين express 3/4 . وهي تتحدث عن دعم i18n وهو أمر جيد ، ولكن من السهل أيضاً دمج i18n في أي مكان آخر ، لذلك لا أقول إنها ميزة.وهو مرخص من قبل (MIT) أيضاً.
  7. يمكنك القيام بذلك بالشكل التالي من خلال إنشاء مساعد helper في Express Handlebars: Handlebars.registerHelper('raw-helper', function(options) { return options.fn(); }); واستخدمه في نموذج hbs الخاص بك عن طريق وضعه في أربع أقواس {{{{ كالتالي: {{{{raw-helper}}}} <div class="container" ng-controller="AppCtrl"> Total Members: {{members.length}} </div> {{{{/raw-helper}}}}
  8. لإيقاف التنفيذ الفوري (الحثيث) نستخدم disable_eager_execution من v1 API حيث نضعها في بداية الكود: import tensorflow as tf tf.compat.v1.disable_eager_execution() أو من خلال tensorflow.python.framework.ops كالتالي: import tensorflow as tf from tensorflow.python.framework.ops import disable_eager_execution disable_eager_execution() a = tf.constant(1) b = tf.constant(2) c = a + b print(c)
  9. لا .. لا تتضمن Keras أي وسيلة لتصدير غراف TensorFlow كملف بامتداد pd، ولكن يمكنك القيام بذلك بنفسك من خلال TensorFlow. وتحديداُ من خلال freeze_graph.py وهي الطريقة "النموذجية" التي يتم القيام بها، حيث: - يجمد حالة الجلسة في بيان مجتزأ. - يقوم بإنشاء graph جديد حيث يتم استبدال عقد المتغيرات بالثوابت التي تأخذ قيمتها الحالية في الجلسة. - سيتم تجزيئ الغراف الجديد بحيث تتم إزالة ال subgraphs غير الضرورية لحساب المخرجات المطلوبة. def freeze_session(session, keep_var_names=None, output_names=None, clear_devices=True): graph = session.graph with graph.as_default(): freeze_var_names = list(set(v.op.name for v in tf.global_variables()).difference(keep_var_names or [])) output_names = output_names or [] output_names += [v.op.name for v in tf.global_variables()] input_graph_def = graph.as_graph_def() if clear_devices: for node in input_graph_def.node: node.device = "" frozen_graph = tf.graph_util.convert_variables_to_constants( session, input_graph_def, output_names, freeze_var_names) return frozen_graph - الوسيط session: جلسة تنسرفلو التي سيتم تجميدها. - keep_var_names قائمة بأسماء المتغيرات التي لا يجب أن بتم تجميدها،وفي حال تم ضبطه على None سيتم تجميد كل المتغيرات في البيان. - output_names:هي قائمة بأسماء العمليات التي تنتج المخرجات التي تريدها. - clear_devices: لتحسين إمكانية النقل يتم ضبطه على True. وبالتالي يمكنك استخدامه كالتالي: from keras import backend as K # قم ببناء نموذجك frozen_graph = freeze_session(K.get_session(),output_names=[out.op.name for out in model.outputs]) ثم يمكنك كتابة البيان في ملف باستخدام tf.train.write_graph: tf.train.write_graph(frozen_graph, "path", "my_model.pb", as_text=False)
  10. أولاً from_tensors تقوم بإنشاء dataset من خلال دمج المدخلات الممررة لها كعنصر واحد (كتلة واحدة) أي مثلاً: data = tf.constant([[4, 5], [1, 7]]) dataset = tf.data.Dataset.from_tensors(data) [x for x in dataset] """ #data لاحظ أن الخرج هو عبارة عن مصفوفة واحدة تمثال ال [<tf.Tensor: shape=(2, 2), dtype=int32, numpy= array([[4, 5], [1, 7]], dtype=int32)>] """ بينما from_tensor_slices تقوم بإنشاء dataset وتعيد عدة عناصر منفصلة بحيث كل عنصر يمثل صف من الإدخال الممرر لها أي: data = tf.constant([[4, 5], [1, 7]]) dataset = tf.data.Dataset.from_tensor_slices(data) [x for x in dataset] """ # لاحظ أن كل سطر من الدخل تم تمثيله بشكل مستقل [<tf.Tensor: shape=(2,), dtype=int32, numpy=array([4, 5], dtype=int32)>, <tf.Tensor: shape=(2,), dtype=int32, numpy=array([1, 7], dtype=int32)>] """ أيضاً هناك اختلاف عندما يكون الدخل هو قائمة، حيث أن from_tensors تقوم بإنشاء tensor ثلاثي الأبعاد أما from_tensor_slices تقوم بدمجهم وتعيد 2D. مثلاً: dataset1 = tf.data.Dataset.from_tensor_slices( [tf.random_uniform([2, 3]), tf.random_uniform([2, 3])]) dataset2 = tf.data.Dataset.from_tensors( [tf.random_uniform([2, 3]), tf.random_uniform([2, 3])]) print(dataset1) # shapes: (2, 3) print(dataset2) # shapes: (2, 2, 3)
  11. يمكنك القيام بذلك بالشكل التالي: # models.py ضمن الملف class Author(models.Model): name = models.CharField(max_length=255) class Book(models.Model): author = models.ForeignKey(Author) title = models.CharField(max_length=255) # هذه هي الطريقة التي تشير بها إلى اسم مفتاح خارجي في جانغو # admin.py ضمن الملف class BookAdmin(admin.ModelAdmin): model = Book list_display = ['title', 'get_name', ] def get_name(self, obj): return obj.author.name #يسمح بفرز ترتيب العمود get_name.admin_order_field = 'author' #إعادة تسمية رأس العمود get_name.short_description = 'Author Name' admin.site.register(Book, BookAdmin)
  12. يمكنك القيام بذلك من خلال الدالة merge لكن في البداية يجب أن تضيف مفتاح لكي تتم عملية الدمج عليه كالتالي: df1['key'] = 0 df2['key'] = 0 df1.merge(df2, how='left',on = 'key').drop(columns=['key']) """ col1 col2 col3 0 1 3 5 1 1 3 6 2 2 4 5 3 2 4 6 """ df1['key'] = 0 df2['key'] = 0 df1.merge(df2, how='left',on = 'key').drop(columns=['key']) """ col1 col2 col3 0 1 3 5 1 1 3 6 2 2 4 5 3 2 4 6 """ # أو df1.merge(df2, how='outer').drop(columns=['key']) # حسبما تريد # لكن بالضرورة يجب أن تضيف مفتاح أو من خلال التابع التالي: import pandas as pd def cartesian(df1, df2): key = 'key' while key in df1.columns or key in df2.columns: key = '_' + key key_d = {key: 0} return pd.merge(df1.assign(**key_d), df2.assign(**key_d), on=key).drop(key, axis=1) cartesian(df1, df2) """ col1 col2 col3 0 1 3 5 1 1 3 6 2 2 4 5 3 2 4 6 """
  13. أيضاً من خلال استخدام الدالة apply كالتالي، وهي الطريقة الأبسط: import pandas as pd df = pd.DataFrame({'Year': ['1', '1','2','2'], 'month': ['june', 'july','june','july']}) df """ Year month 0 1 june 1 1 july 2 2 june 3 2 july """ df.groupby(["Year"])["month"].apply('-'.join) """ Year 1 june-july 2 june-july Name: month, dtype: object """ أو عن طريق استخدام lambda مع الدالة agg كالتالي: df.groupby('Year').agg(lambda x : '-'.join(set(x))) """ month Year 1 july-june 2 july-june """
  14. CharField هو حقل خاص بالسلاسل النصية "string field"، ويستخد للسلاسل صغيرة إلى كبيرة الحجم. وهو مثل حقل السلسلة في C / C ++. و يستخدم CharField بشكل عام لتخزين سلاسل صغيرة مثل الاسم الأول واسم العائلة وما إلى ذلك. أما لتخزين نص أكبر يتم استخدام TextField. أداة النموذج الافتراضية لهذا الحقل هي TextInput. يحتوي CharField على وسيطة إضافية مطلوبة: CharField.max_length أقصى طول للحقل (بعدد المحارف). ويتم فرض هذا ال max_length على مستوى قاعدة البيانات وفي Django’s validation باستخدام MaxLengthValidator. وله الشكل التالي: field_name = models.CharField(max_length=200, **options) كما ذكرت يستخدم CharField لتخزين سلاسل صغيرة الحجم في قاعدة البيانات. يمكننا مثلاً تخزين الاسم الأول واسم العائلة وتفاصيل العنوان وما إلى ذلك. ويجب إعطاء CharField وسيطة max_length لتحديد الحد الأقصى لطول السلسلة المطلوب تخزينها. في ال production server ، بعد نشر تطبيق Django ، تكون المساحة محدودة للغاية. لذلك من الأفضل دائماً استخدام max_length وفقًا لمتطلبات الحقل. TextField عبارة عن حقل نصي كبير من أجل النصوص كبيرة الحجم. ويستخدم TextField بشكل عام لتخزين الفقرات وجميع البيانات النصية الأخرى (يستخدم لتخزين نص كبير في قاعدة البيانات أما في حال أردنا تخزين نص صغير نستخدم charfield). عنصر واجهة المستخدم الافتراضي لهذا الحقل هو TextArea. وله الشكل التالي: field_name = models.TextField( **options) أيضاً تستخدم CharFields عادةً للأشياء القابلة للبحث، مثل إذا كنت تريد البحث عن "one" في السلسلة "one plus two". نظرًا لأن السلسلة النصية تكون أقصر، فإنها تستغرق وقتاً أقل للمحرك للبحث من خلالها. أيضاً فإن أقصى حد لطول السلسلة فيه هو 255.
  15. اعتبارًا من TensorFlow 0.8 ، يمكنك استخدام tf.one_hot للقيام بتحويل ال labels إلى تمثيل ال One-Hot_Encoding. مثال عليها لنفرض أن لديك 4 فئات(قطة 0 ، كلب 1 ، طائر 2 ، إنسان 3) ولدينا عينتان هما (قط و إنسان) أي 0 و 3. import tensorflow.compat.v1 as tf tf.disable_v2_behavior() res = tf.one_hot(indices=[0, 3], depth=4) # نحدد العمق على 4 لأنه لدينا 4 فئات with tf.Session() as sess: print (sess.run(res)) """ [[1. 0. 0. 0.] [0. 0. 0. 1.]] """ بالإضافة إلى ذلك إذا أحببت هناك tf.nn.sparse_softmax_cross_entropy_with_logits، والتي تيح لك حساب الانتروبيا المتقاطعة مباشرة على ال labels (طبعاً Spare Labels) بدلاً من الحاجة إلى تحويلها إلى One-Hot.
  16. الخطأ يشير إلى أن نسخة pip التي قمت بتثبيت protobuf من خلالها قديمة وبالتالي قد تتسبب لك في أخطاء بالتثبيت مثل هذا الخطأ (لاحظ أنه لم يعطيك خطأ عند استيراد ops وإنما فقط عند استيراد label_map_util لذا فغالباً المشكلة إما في نظام إدارة الحزم لديك pip أو أنه حدث خطأ ما أثناء تثبيتها). لذا في الحالتين قم بتنفيذ الأوامر التالية: pip uninstall protobuf python3-protobuf pip install --upgrade pip # لتحديث مدير الحزم pip install --upgrade protobuf
  17. في بعض الاحيان نحتاج لان نطبق شرطا على النتيجة التي حصلنا عليها من تابع التجميع. مثلاً أوجد اسماء الاقسام التي تملك متوسطاً حسابياً لرواتب المدرسين أكبر من 8000 وبالتالي تطبيق where في هكذا استعلام لن يفيدنا شيء لأن where تطبق قبل أن يتم تطبيق تابع التجميع (هنا نقصد التابع avg في مثالنا). وبالتالي ما العمل في هكذا حالة؟؟؟ الحل هو أن نستخدم الشرط اللاحق (جملة having) وهي تشبه where ولكن تعمل بعدها. Where --> (شرط سابق) اولي Having--> (شرط لاحق) متأخر Select.....,function_name(...) Form....... Where..... Group by..... Having نطبق شرط ما على تابع التجميع مثال: اوجد اسماء الاقسام التي يكون متوسط رواتب المدرسين فيها اكبر من 9999 . Select dept_name , avg (salary) from instructor group by dept_name having avg (salary) >9999 ملاحظة1: الواصفات الموجودة في select خارج توابع التجميع يجب أن توجد في جزء group by ملاحظة2: الواصفات الموجودة في الhaving خارج توابع التجميع يجب أن توجد في group by لأنه يتم تنفيذ group by (يتم إيجاد التجميع المطلوب) ثم يتم تطبيق شرط معين موجود في having بالتسلسل. نتيجة : يكون لدينا التسلسل الآتي في حال وجود group by + having : From--> where -->group by--> having -->select
  18. طرق أخرى: من خلال إنشاء مكرر على السلسلة بداخل الدالة map: list(map(''.join, zip(*[iter(s)]*2))) أو من خلال الدالة sliced: from more_itertools import sliced list(sliced(s, 2)) أو بالطريقة التالية من خلال الحلقات: s = '1234567890' n = 2 li=[s[i:i+n] for i in range(0, len(s), n)] li #['12', '34', '56', '78', '90'] للماقارنة بين كل الطرق السابقة: %timeit li=[s[i:i+n] for i in range(0, len(s), n)] %timeit list(map(''.join, zip(*[iter(s)]*2))) # الأفضل %timeit list(sliced(s, 2)) %timeit wrap(s, 2) # الأسوأ %timeit re.findall('\d{2}',s) # الأفضل """ 100000 loops, best of 5: 8.76 µs per loop 100000 loops, best of 5: 4.85 µs per loop 100000 loops, best of 5: 11 µs per loop 10000 loops, best of 5: 110 µs per loop 100000 loops, best of 5: 3.74 µs per loop """
  19. أولاً ماهو ال iterator: المكرر هو كائن يحتوي على عدد قابل للعد من القيم. وهو كائن يمكن التكرار عليه، مما يعني أنه يمكنك المرور على جميع القيم فيه. وبشكل عميق أكثر في Python ، المكرر هو كائن يقوم بتنفيذ بروتوكول المكرر، والذي يتكون من الطريقتين __iter __ () و __next __ (). لدينا مفهومين في بايثون وهما Iterator و Iterable. نعتبر أن ال Lists, tuples, dictionaries,set كائنات قابلة للتكرار وتعتبر حاويات متكررة "iterable containers" يمكنك الحصول على مكرر "Iterator " منها وحتى السلاسل Strings هي كائنات قابلة للتكرار، ويمكنك الحصول على مكرر منها. وجميعهم يمتلكون الطريقة ()iter التي تستخدم للحصول على مكرر Iterator منها: li = ["argentena", "barca", "ali"] iterator = iter(li) print(next(iterator)) print(next(iterator)) print(next(iterator)) """ argentena barca ali """ مثال عن String: li = "argentena" iterator = iter(li) print(next(iterator)) print(next(iterator)) print(next(iterator)) """ a r g """ يمكنك أيضاً المرور على عناصر المكرر من خلال الحلقات مثلاً: li = "argentena" iterator = iter(li) for x in iterator: print(x) """ a r g e n t e n a """ مثال عن tuple: mytuple = ("apple", "banana", "cherry") iterator = iter(mytuple) for x in iterator: print(x) """ apple banana cherry """ أما إذا أردنا إنشاء class كمكرر فيجب علينا تحقيق الطريقتين __iter __ () و __next __ () في الكائن الخاص بك. وكما نعلم جميعاً فإن الكائنات في بايثون تملك دالة (طريقة) تسمى __init __ () ، والتي تتيح لنا القيام بعمليات تهيئة عند إنشاء كائن من الصف. إن الدالة __iter __ () تعمل بشكل مشابه لها، حيث يمكنك القيام بالعمليات (التهيئة وما إلى ذلك) ، ولكن يجب دائماً إرجاع كائن المكرر نفسه. أيضاً تسمح لك الدالة __next __ () بإجراء عمليات، ويجب أن تعيد العنصر التالي في التسلسل.مثال: class num: def __iter__(self): self.i = 1 return self #التي تشير إلى الكائن نفسه self لاحظ أننا قمنا بإرجاع def __next__(self): a = self.i self.i += 1 return a myclass = num() myiter = iter(myclass) print(next(myiter)) print(next(myiter)) print(next(myiter)) print(next(myiter)) """ 1 2 3 4 """ for i in myclass: print(i) if i==7: break """ 1 2 3 4 1 2 3 4 5 6 7 """ في المثال السابق ستستمر حلقة for إلى اللانهاية لو لم نضع break، لذا يمكننا استخدام StopIteration حيث نضيفها في طريقة __next __ () ، كشرط للإنهاء إذا تم التكرار لعدد محدد من المرات: class num: def __iter__(self): self.i = 1 return self #التي تشير إلى الكائن نفسه self لاحظ أننا قمنا بإرجاع def __next__(self): a = self.i self.i += 1 return a def __next__(self): if self.i <= 10: a = self.i self.i += 1 return a else: raise StopIteration myclass = num() for i in myclass: print(i) """ 1 2 3 4 5 6 7 8 9 10 """ هذا كل شيء تحتاجه عن المكررات.
  20. يمكنك استخدام الدالة Integer.toBinaryString، وكل ماعليك فعله هو تمرير العدد العشري لها. مثال: public class MyClass { public static void main(String args[]) { System.out.println("Binary is " + Integer.toBinaryString(100)); System.out.println("Binary is " + Integer.toBinaryString(1)); System.out.println("Binary is " + Integer.toBinaryString(3)); System.out.println("Binary is " + Integer.toBinaryString(5)); /* Binary is 1100100 Binary is 1 Binary is 11 Binary is 101 */ } } كما يمكنك التحويل بين الأنماط المختلفة: Integer.toString(n,8) // decimal to octal Integer.toString(n,2) // decimal to binary Integer.toString(n,16) //decimal to Hex // أي فقط نمرر العدد كوسيط أول ونظام العد كوسيط ثاني //////////////////////////////////////////////////////////////////// public class MyClass { public static void main(String args[]) { System.out.println("Binary is " + Integer.toString(100,2)); /* Binary is 1100100 */ } }
  21. يمكنك تعيين متغيرات environment في ال notebook باستخدام os.environ. حيث يجب أن تقوم بما يلي قبل تهيئة TensorFlow وذلك لقصر TensorFlow على GPU الأول (جعله يستخدم أول Gpu فقط): import os os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID" os.environ["CUDA_VISIBLE_DEVICES"]="0" #وتريد تفعيل عدد محدد منها Gpu في حالة كان لديك 4 وحدات import os os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID" os.environ["CUDA_VISIBLE_DEVICES"]="0,2,3" #هنا Gpu نضع مانريده من ال وبالتالي سيتم قصر تنسرفلو على أول gpu فقط، حيث سيتم إخفاء الثاني عنه، وللتأكد يمكنك استخدام الكود التالي: import notebook_util notebook_util.pick_gpu_lowest_memory() import tensorflow as tf # أو from tensorflow.python.client import device_lib print device_lib.list_local_devices() حيث سيعرضان لك قائمة الأجهزة المرئية (غير المخفية).
  22. وجدت لك تابع رائع ليقوم بذلك بأفضل شكل، مع بعض التعديلات عليه لكي يلائم النسخة الأحدث من بايثون: الوسيط الأول هو مسار الملف أو ExcelWriter موجود مثلاً: '/path/to/file.xlsx' الوسيط الثاني هو الداتافريم المراد حفظه في ال workbook. أما باقي الوسطاء فهي اختيارية. حيث أن الوسيط الثالث هو اسم الشيت التي ستحتوي الداتافريم. الوسيط startrow هو صف الخلية الأيسر العلوي لتفريغ إطار البيانات (افتراضياً يقوم بحساب الصف الأخير في الداتافريم ثم يكتبه في لسطر التالي). أما truncate_sheet يقوم باقتطاع (إزالة وإعادة إنشاء) [اسم_ورقة] قبل كتابة DataFrame إلى ملف Excel . أما resizeColumns يقوم بتغيير حجم جميع الأعمدة بناءً على عرض محتوى الخلية. أما to_excel_kwargs فيمثل الوسائط التي سيتم تمريرها إلى الدالة `DataFrame.to_excel`و يمكن أن تكون على شكل قاموس. وأخيراً na_rep في حالة ضبطه على True سيستبدل قيم nan ب ' '. import pandas as pd def append_df_to_excel(filename, df, sheet_name='Sheet1', startrow=None, startcol=None, truncate_sheet=False, resizeColumns=True, na_rep = 'NA', **to_excel_kwargs): from openpyxl import load_workbook from string import ascii_uppercase from openpyxl.utils import get_column_letter from openpyxl import Workbook # ignore [engine] parameter if it was passed if 'engine' in to_excel_kwargs: to_excel_kwargs.pop('engine') try: f = open(filename) # Do something with the file except IOError: # print("File not accessible") wb = Workbook() ws = wb.active ws.title = sheet_name wb.save(filename) writer = pd.ExcelWriter(filename, engine='openpyxl', mode='a') # Python 2.x: define [FileNotFoundError] exception if it doesn't exist try: FileNotFoundError except NameError: FileNotFoundError = IOError try: # try to open an existing workbook writer.book = load_workbook(filename) # get the last row in the existing Excel sheet # if it was not specified explicitly if startrow is None and sheet_name in writer.book.sheetnames: startrow = writer.book[sheet_name].max_row # truncate sheet if truncate_sheet and sheet_name in writer.book.sheetnames: # index of [sheet_name] sheet idx = writer.book.sheetnames.index(sheet_name) # remove [sheet_name] writer.book.remove(writer.book.worksheets[idx]) # create an empty sheet [sheet_name] using old index writer.book.create_sheet(sheet_name, idx) # copy existing sheets writer.sheets = {ws.title:ws for ws in writer.book.worksheets} except FileNotFoundError: # file does not exist yet, we will create it pass if startrow is None: # startrow = -1 startrow = 0 if startcol is None: startcol = 0 # write out the new sheet df.to_excel(writer, sheet_name, startrow=startrow, startcol=startcol, na_rep=na_rep, **to_excel_kwargs) if resizeColumns: ws = writer.book[sheet_name] def auto_format_cell_width(ws): for letter in range(1,ws.max_column): maximum_value = 0 for cell in ws[get_column_letter(letter)]: val_to_check = len(str(cell.value)) if val_to_check > maximum_value: maximum_value = val_to_check ws.column_dimensions[get_column_letter(letter)].width = maximum_value + 2 auto_format_cell_width(ws) # save the workbook writer.save() مثال: # Create a sample dataframe df = pd.DataFrame({'c1': [22, 4, 93], 'c2': ['red', 'white', 'blue'], 'c3': ['yellow', 'white', 'blue'] }) path = "D:\\data\\df.xlsx" append_df_to_excel(path, df, index=False, startrow=0)
  23. إليك العديد من الطرق: import pandas as pd df = pd.DataFrame({'c1': ['100','DDD','646','XYZ','888'], 'c2': ['AAA','000','999','500','1000'] }) #لنجرب عليها Nan جعل بعض القيم df = df.apply (pd.to_numeric, errors='coerce') df """ c1 c2 0 100.0 NaN 1 NaN 0.0 2 646.0 999.0 3 NaN 500.0 4 888.0 1000.0 """ ############################ استخدام pd.notnull ################################## df[pd.notnull(df['c2'])] """ c1 c2 1 NaN 0.0 2 646.0 999.0 3 NaN 500.0 4 888.0 1000.0 """ ############################# isnull ############################################ df[~df.c2.isnull()] """ c1 c2 1 NaN 0.0 2 646.0 999.0 3 NaN 500.0 4 888.0 1000.0 """ ############################# isnan ########################################## df[~np.isnan(df.c2)] """ c1 c2 1 NaN 0.0 2 646.0 999.0 3 NaN 500.0 4 888.0 1000.0 """ ######################### أو بالشكل العبقري التالي ########################## df.query("c2 == c2") # np.nan==np.nan # False """ c1 c2 1 NaN 0.0 2 646.0 999.0 3 NaN 500.0 4 888.0 1000.0 """ ############################ dropna حل آخر وهو استخدام ########################### df.dropna() #nan ستؤدي لحذف كل صف يحوي قيم """ c1 c2 2 646.0 999.0 4 888.0 1000.0 """ # بعد عملية الحذف سيكون الفهرس مبعثر كما رأينا لذا يجب أن نقوم بإعادة ضيطه # df.reset_index(drop=True) df.dropna(subset=['c2']) # ستؤدي لحذف الصف الأول فقط """ c1 c2 1 NaN 0.0 2 646.0 999.0 3 NaN 500.0 4 888.0 1000.0 """ #على الأقل nan لحذف الصف في حال احتوى على قيمتي df.dropna(thresh=2) # يمكنك تحديد العدد الذي يناسبك #يو how='all' استخدام df["c2"].dropna(how='all')
  24. يمكنك القيام بذلك من خلال الدالة assign كالتالي: import pandas as pd df = pd.DataFrame({'Year': ['2020', '2021'], 'month': ['june', 'july']}) df """ Year month 0 2020 june 1 2021 july """ df = df.assign(period = df.Year.astype(str) + '-' + \ df.month.astype(str)) df """ Year month period 0 2020 june 2020-june 1 2021 july 2021-july """ أو باستخدام الدالة apply وتطبيق lambda على كل سطر من البيانات: import pandas as pd df = pd.DataFrame({'Year': ['2020', '2021'], 'month': ['june', 'july']}) df """ Year month 0 2020 june 1 2021 july """ df['period'] = df[df.columns[0:]].apply( lambda x: '-'.join(x.dropna().astype(str)), axis=1 ) df """ Year month period 0 2020 june 2020-june 1 2021 july 2021-july """
  25. إجابة سامح رائعة، إليك طريقة أخرى بسيطة وسهلة: Q = Query.objects.values('v1','v2','vn') print(Q.query) حيث أنه تم تضمين الاستعلام فعلياً في واجهة برمجة تطبيقات النماذج. وكحل آخر فإن امتدادات Django لها أمر shell_plus مع معامل print-sql : ./manage.py shell_plus --print-sql في django-shell ستتم طباعة جميع الاستعلامات المنفذة، على سبيل المثال: User.objects.get(pk=1) SELECT "auth_user"."id", "auth_user"."password", .. .. "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user" WHERE "auth_user"."id" = 1 Execution time: 0.002466s [Database: default] <User: username> بالنسبة لهذه الطريقة إن لم تعمل معك فيجب أن تقوم بضبط DEBUG = True في ملف settings.py.
×
×
  • أضف...