مرحبا يا هبر!
في هذا المنشور أردت أن أشارككم تجربة استخدام عدة أدوات بيثون لإجراء تحليل مقارن لسوق السيارات المستعملة في أوروبا باستخدام مثال ألمانيا وفرنسا.

من وجهة نظر التنفيذ ، كل شيء سيكون الفانيليا تماما. تعتبر حديقة التقنيات المستخدمة ضرورية إلى حد ما ، لأنها كانت غاية في حد ذاتها - أردت اختبارها.
الخلفية. زارتني فكرة إجراء مثل هذا التحليل مرة واحدة عندما كنت أتصفح موقعًا للإعلانات الفرنسية. من الواضح أنني شعرت أن سيارة سيتروين C3 كانت سيارة فقيرة للغاية ، حيث تنخفض قيمتها بنسبة 20 في المائة سنويًا ، ولكن أوبل كورسا تكاد تكون خالدة ، لذا فإن سعرها لا يتغير مع التقدم في السن (أو سوف ترتفع بشكل جيد رولكس). كانت ملاحظة مضحكة ، بالنظر إلى أن الألمان اعتبروا كورسا في شخص بالغ علامة على الفشل في التنفيذ المهني. وحتى لو كانت هناك نكات عن حقيقة أن أي سيارة تتحول إلى أوبل خلال 10 سنوات. في غياب الغرب الألماني ترابانت ، تم تنفيذ دور Zaporozhets في الفولكلور الألماني من خلال هذه العلامة التجارية المعينة. C3 ، على حد علمي ، ليست ممثلة بشكل خاص في روسيا ، لكن من المفيد أن نعرف عنها أنها الوريث الروحي لل 2 CV الكلاسيكية من صورة العنوان ، السيارة الأسطورية التي فاتتها الإنترنت لبضع سنوات (في الإنتاج قبل عام 1989) وقدمت للسائق تسع حصان مدهش.
لذلك ، ننكب على العمل. من أجل الحصول على إحصاءات ، تحتاج إلى مصدر مع عينة كافية. في ألمانيا ، يعد هذا
autoscout24.de في فرنسا هو الأفضل الذي
واجهته بعدد الإعلانات -
www.lacentrale.fr (توجد النسخة الفرنسية من الكشافة ، لكنها أقل شعبية).
سوف نختار وفقًا للفئة B كأكثر الفئات شعبية والتي نشأ فيها السؤال الأولي (مع إدخال صغير في الفئة C). لجمع البيانات ، سنختار تلك النماذج التي تتوفر لها بيانات على مدار السنوات العشر الماضية ، والتي يوجد منها 1000 إعلان على الأقل في كلا الموقعين. خلاف ذلك ، فإن العينة ستكون صاخبة جدا.
إذا كنت ترغب في الحصول على بيانات صحية عن الشخص - يقدم autoscout
واجهة برمجة تطبيقات RESTful إذا قمت بالتسجيل والحصول على مفتاح.
بالطبع ، لم أفعل ذلك وبدأت في استخراج المدخن - وجهاً لوجه من خلال متصفح مقطوع الرأس.
بدا تعدين المدخن هكذا - استنادًا إلى الفلاتر المرغوبة (الموضحة أدناه) ، فنحن نشكل سلسلة استعلام ،
وننقلها كعنوان إلى متصفح
PhantomJS مقطوع الرأس (منذ أن قمت بتثبيته ، تم تعليقه لسبب ما).
من غير الواضح في هذه المرحلة - أضفت توقع تحميل عنصر مع فئة مميزة ، والتي تحتوي على بيانات عن عدد الخيارات للطلب المقابل.
with io.open("dump.html", "w", encoding="utf-8") as f: f.write(html) try: element = WebDriverWait(browser, 20).until( EC.presence_of_element_located((By.CLASS_NAME, "cl-filters-summary-counter")) )
يتم تغذية html الذي تم إنشاؤه في المتصفح إلى محلل BeautifulSoup ونبحث فيه عن عنصر يحتوي على شكل النتائج التي تم العثور عليها.
value = bsObj.findAll("span", {"class": "cl-filters-summary-counter"})[0].text value = value.replace(u'\xa0', u' ')
كما قد تظن ، فإن الطلب الذي تم إنشاؤه تضمن النموذج ، وهو سعر صغير ونطاق عمري ، أي أنه كان هناك الكثير من الطلبات ، مع عدد الطلبات التي تزيد عن 500 طلب قطع الخادم الاتصال. إذا كنت ترغب في حل المشكلة بشكل جميل ، فمن الأفضل الوصول إلى هذه الخدمات من خلال الوكلاء الذين تم تغييرهم على طول الطريق (وإذا كان لديك مفتاح API ، فلن تحتاج إلى ذلك). على Habré هناك
مقال ذكي عن كيفية العمل من خلال وكيل. لقد قمت بحل المشكلة ذات التقنية المنخفضة - حيث يتبع السعر قانونًا خطيًا مع التقدم في السن ، لذلك تمكنت من تحديد نطاق هذا الخط وقصرت الطلبات على + .- 30-50 في المائة فقط من السعر الخطي ، وأدخلت 10 فترات توقف مؤقتة بين الطلبات. كان هذا كافيا لعدم حظره. استغرق جمع البيانات لنموذج واحد حوالي نصف ساعة ليومض بصمت في وحدة التحكم.
بضع كلمات عن المرشحات. للحصول على اختيار إعلامي ، قمت بتطبيق المرشحات التالية:
- جميع السيارات تأتي في تكوينات الأبواب 4-5 (كورس ، كليو وعدد قليل من النماذج المعروضة لديها 3 خيارات أرخص الباب).
- يتم أخذ جميع السيارات من 4 إلى 5 مقاعد - وهذه ميزة منفصلة عن سابقتها ، لأن Clio و C3 و 308 لديها إصدار Société (Entreprise) وهناك عدد قليل في السوق - هذه سيارات خدمة لجميع كهربائيين وميكانيكيين ، يوجد مربع بدلاً من المقعد الخلفي للغير المرغوب فيه ، وأنها تكلف أقل من بضع كيلو بايت ceteris paribus.
- قوة المحرك تقتصر على 129 حصان. لأنه في هذه الفئة ، تبدأ الإصدارات المشحونة ولا تتوافق الأسعار هناك على الإطلاق مع وضعها المتواضع. إذا كررت Achtung - يستخدم autoscout في العنوان الطاقة ليس بالقدرة الحصانية ، ولكن بالكيلووات.
ليست المحركات وصناديق التروس متخصصة ، ولكن بنسبة 99٪ هم ميكانيكيون ، وفي حالة فرنسا ، يوجد الكثير من الديزل هناك ، وذلك ببساطة لأنه تم الترويج له هناك قبل 10 سنوات من ديزلجيت. والآن يريدون أن يزرعوا الجميع معه ، من غضب مثل هذا التقلب في الأخلاق الحكومية ، والفرنسيون للأسبوع الثاني ينغمسون في اثنين من الملاهي الوطنية المحببة - إضراب وإحراق سيارات.
يتم جمع البيانات ، ووضعها نموذجًا تلو الآخر في ملفات Excel (ما هي البيانات التي لا تتفوق ، أنت ماذا! شكرًا لك
openpyxl - لراحة التبديل). للتصور ، يتم تلخيص جميع البيانات الموجودة على جميع الطرز في ملف CSV واحد.
من أجل التصور ، كنت أرغب في تقديم واجهة ويب بسيطة. من حيث المبدأ ، الإصدار الحالي لا يتطلب خلفية. هناك القليل من البيانات ، والمعالجة بدائية ، ويمكنك تفريغ كل شيء مع JSON طويلة جنبا إلى جنب مع الرسومات ومعالجتها على جانب العميل. لكنني أردت اختبار الخادم مع العين لاستخدامه في وقت لاحق للمهام مع حسابات لا تافهة للغاية. وأنا لا أعرف كيفية استخدام JS ، لذلك يجب أن أعذب نفسي من جانب العميل ، ويمكن أيضًا تثبيت الخادم على بيثون ، نظرًا لوجود أدوات.
لتنفيذ الخادم ، تعذبت بين الخوخه التي كنت العبث بها من قبل وحزمة Plotly + Dash. في عدد من المهام السابقة ، كنت سعيدًا جدًا بخوخه ، خاصةً لأنه يمكن تضمينه في دفتر ملاحظات Jupyter (مع Jupyter Labs ، الأمر ليس بهذه البساطة) وحقيقة أنه من السهل جدًا
تنظيم المكونات التفاعلية داخل دفاتر الملاحظات دون بدء خادم bokeh (). خوخه هي بوابة إلى عالم d3.js لأولئك الذين لا يعرفون كيفية استخدام JS.
لهذه المهمة ، قررت استخدام حزمة Plotly + Dash (الأخيرة هي بوابة إلى العالم التفاعلي لأولئك الذين لا يعرفون كيفية استخدام JS). الخيار أكثر عرضة للمحاولة. كما ترون من
المقارنة - الفرق ليس أساسيا
ننتقل إلى تنفيذ الواجهة.
إننا نقوم بسحب ملف CSV الخاص بنا ، حيث نقوم بدفعه إلى إطارين من البيانات.
من أجل تصميم الصفحة بشكل صحيح واستخدام التصميم المتجاوب ، نقوم بتمكين CSS المحلي.
app = dash.Dash(__name__, static_folder='assets')
بعد ذلك ، نقوم بإنشاء أبسط تخطيط باستخدام جدول واحد من عمودين ، 6 من 12 قياسيًا للتخطيطات التكيفية.
app.layout = html.Div([
يتم تطبيق عناصر التحكم بشكل بسيط للغاية ، من الميزات - يمكن أن يكون هناك العديد من المدخلات ، وطريقة واحدة فقط للخروج (على سبيل المثال ، الرسم البياني الأيسر يقبل البيانات من القائمة المنسدلة ومن شريط التمرير العام ، ولكن عنصر واحد فقط يمكن تحديث ، وهذه هي ميزة Dash ، ستكون هناك حاجة العكازات لتجاوز).
@app.callback(Output('market-app2', 'figure'), [Input('model_pick', 'value'), Input('year-slider', 'value')]) def update_figure_dist(selected_models, year_picked): traces = [] for model in selected_models: traces.append(go.Bar( x=df_filtered.loc[model, year_picked, :].index.values.tolist(), y=df_filtered.loc[model, year_picked, :]['results'].values.tolist(), name=model )) return { 'data': traces, 'layout': go.Layout( xaxis={'title': 'price'}, yaxis={'title': 'offers'}, hovermode='closest', legend=dict(orientation="h", xanchor="center", y=1.2, x=0.5) ) }
واجهة جاهزة -
http://eu-carmarket.herokuapp.com/للبيانات الألمانية ، بين قوسين (DE) لفرنسا (بالفرنسية).
على اليسار نرى أسعارًا للفترة بأكملها في المتوسط خلال كل عام. فيما يلي ، جميع الأسعار باليورو ، وفقًا لقواعد النشر على المواقع الإلكترونية - تشمل الأسعار ضريبة القيمة المضافة. على اليمين يتم توزيع العروض حسب السعر في السنة المحددة. كان التوزيع صاخبة بالنسبة للعديد من الطرز ، لذلك عند بناءه يتم سلاسة على أقرب الجيران مع مجموعة مكونة من 5 عناصر (نظرًا لذلك ، قررت عدم أخذ نماذج بأقل من 1000 إعلان)
إذن ماذا نرى في البيانات؟
الإجابة على سؤال كان الدافع وراء الدراسة - لا ، لا تنخفض قيمة سيارة ستروين بسرعة هائلة مقارنةً بكورسا الخالدة.

الفرق الحاد في الأسعار في عام 2017 ليس هو الانخفاض القوي الرئيسي لسيتروين في السنة الأولى. هذا هو في الواقع ارتفاع الأسعار مع الانتقال إلى جيل جديد. الآن ، بدلاً من التماثل إلى جهاز 2CV Citroen القديم ، فإنهم يشبهون نظير Mini ، مع أقواس متقاطعة لكروس كروس - شباب أنيق وعصري.
إذا كنت تأخذ موديلًا واحدًا ، فإن الفارق في الأسواق الألمانية والفرنسية مروع لأنه غير موجود ، لا في القيم ولا في معدل الاستهلاك (على الرغم من أن السيارة غير المحطمة التي يزيد عمرها عن عامين في فرنسا لا يتم العثور عليها إلا إذا تم تخزينها في مرآب مغلق).



إذا كنت تستقل السوق ، الذي يحظى بشعبية لدى أخصائيي تكنولوجيا المعلومات الروس لنقلهم هولندا ، فأنت بحاجة إلى دفع 20 في المائة للسعر الألماني. على الرغم من حقيقة أنه لا توجد حدود جمركية بين دول أوروبا ، فلن تعمل على نقل سيارة تم شراؤها فقط إذا كانت لا تمر بأشياء شخصية تنتقل مع بواسطتك هذا يتطلب منك أن تعيش في البلد السابق لأكثر من ستة أشهر. خلاف ذلك ، سيتم إزالة جميع المزايا المقصودة منك عند محاولة وضع السيارة على التسجيل.
إذا قارنت بين النماذج في كومة كبيرة ، يمكنك مشاهدة العديد من الملاحظات المثيرة للاهتمام. بعد 10 سنوات ، يتقارب كل شيء إلى نقطة واحدة تقريبًا ، على الرغم من أن انخفاض قيمة بيجو أو مازدا أو سيات هو أقوى من فولكس واجن بولو أو أوبل ميريفا أو سكودا فابيا. نعم ، بعد 10 سنوات ، تصبح أي سيارة أوبل ، ولكن ليس كورسا ، فقط المفضلة مثل C3 تصبح كورسا.

معدل الاستهلاك لا يعتمد بشكل كبير على النموذج. ومن البلاد. انحرافات صغيرة عن التوحيد الخطي العالمي (مثل رينو ميجان
في عام 2016 ، فورد فييستا في عام 2017) هو مجرد تغيير في توليد الطراز.


لأن الاستهلاك في هذه الحالة ليس مفهومًا ماديًا ، فهذا لا يعني أن السيارات ستكون في نفس الحالة. بالفرنسية ، سيكون هناك جوانب متجعد ، وسحجات ، ومصدات مصقولة ، ومرايا ملفوفة في شريط سكوتش ، وإرث على بعد آلاف الكيلومترات مع لعبة لعبة الداما. لكن الفرنسيين مقتنعون أن درجة الإهلاك هي نفسها درجة الألمان وتدفع وفقًا لمعتقداتهم. ولكن لإقناع الألمان لشراء المستخدمة سيارة من أيدي السائقين والميكانيكيين الفرنسيين - هل سيكذبون؟
فيما يتعلق بالأسعار بالمقارنة مع روسيا. هناك بعض المشاكل في حقيقة أن العديد من النماذج الموضحة لا تباع في روسيا. من بين الميزات الشائعة القليلة لكلا السوقين ، يمكنك العثور على بولو الجديد على موقع فولكس واجن (رغم أنه في روسيا سيارة سيدان ، وفي أوروبا هاتشباك). في روسيا ، يكلف من 8300 جديد ، في ألمانيا الجديد من 13500 ، و 8300 سيكون عام 2012 (في جدول خارج هولندا المذكورة - 16200 جديد). يمكن تمثيل مقارنة جيدة في كل مكان كيا ريو: روسيا - 9000 ، ألمانيا - 11950 (الإغراق الواضح ضد النزعة الذاتية الألمانية) ، فرنسا - 13700 ، هولندا - 19950 (Ja-ja ، لاما ونصف لاما كيروشا بسعر فولكس واجن تيغوان / هيونداي توسان / نيسان إكس -Trail: عناق ، البكاء وتذكر كيفية دواسة الدراجة).