2025, Oct 03 05:34
Plotly लाइन चार्ट गलत दिख रहा है? yfinance MultiIndex के 3 समाधान
Plotly में लाइन चार्ट अपडेट के बाद बिगड़ रहा है? जानें कैसे yfinance के MultiIndex से Series/DF गड़बड़ी होती है, और 3 fixes: कॉलम चुनें, multi_level_index=False
अपडेट के बाद Plotly का लाइन चार्ट अजीब दिख रहा है? संभवतः वजह yfinance का MultiIndex बदलाव है
Jupyter Notebook में एक साधारण-सा Plotly लाइन चार्ट लाइब्रेरी अपडेट के बाद सही काम नहीं कर रहा था। सेटअप बेहद सरल था: yfinance से PETR4.SA के एक साल का डेटा लेना, Close कीमतें चुनना और एक लाइन प्लॉट करना। लेकिन Plotly 6.3.0 और yfinance के हालिया रिलीज़ के साथ, आउटपुट लाइन प्लॉट अब ठीक नहीं दिख रहा था।
यह याद दिलाने के लिए कि API समय के साथ विकसित होती हैं, इन बदलावों के संदर्भ में अक्सर यह बात कही जाती है:
“वित्तीय डेटा प्राप्त करने वाली लोकप्रिय Python लाइब्रेरी YFinance ने अपनी नवीनतम संस्करण 0.2.51 (दिसंबर 2024 में जारी) में महत्वपूर्ण बदलाव पेश किए हैं। इन अपडेट्स ने उपयोगकर्ताओं में कुछ उलझन पैदा की है, लेकिन साथ ही रोचक कार्यात्मक सुधार भी लाए हैं। इस लेख में, हम प्रमुख अपडेट्स, उनसे कैसे निपटें, और व्यावहारिक कोड उदाहरणों पर चर्चा करेंगे।”
समस्या को दोहराने वाला न्यूनतम उदाहरण
नीचे दिया गया स्निपेट डेटा लाता है, इंडेक्स से टाइमज़ोन जानकारी हटाता है और सीधे प्लॉट करने की कोशिश करता है। तर्क सरल है, फिर भी डेटा के आकार (shape) की वजह से चार्ट गलत दिखता है।
import yfinance as yf
import numpy as np
import pandas as pd
import statsmodels.api as smx
from statsmodels.tsa.stattools import coint, adfuller
import plotly.graph_objects as go
px_close = yf.download("PETR4.SA", period="1y")["Close"]
px_close.index = px_close.index.tz_localize(None)
chart = go.Figure()
chart.add_trace(go.Scatter(x=px_close.index, y=px_close))
chart.update_layout(title_text="petr", width=500, height=500)
chart.show()
क्या बदला और प्लॉट गलत क्यों दिख रहा है
समस्या की जड़ यह है कि हालिया संस्करणों में yfinance ने कॉलम्स को MultiIndex में बदल दिया है। एक ही टिकर डाउनलोड करने पर भी लौटाया गया DataFrame अक्सर दो-स्तरीय कॉलम इंडेक्स वाला होता है—ऊपरी स्तर Close जैसे फ़ील्ड का और दूसरा स्तर टिकर सिंबल का। इसका मतलब, अब केवल ["Close"] चुनने पर फ्लैट Series नहीं, बल्कि टिकर-लेबल वाले एक कॉलम के साथ DataFrame मिलता है। इस ऑब्जेक्ट को सीधे Plotly में y के तौर पर देने पर रेंडरिंग अप्रत्याशित हो सकती है।
प्लॉट करने से पहले type और columns देखकर संरचना की जाँच करें:
type(px_close)
px_close.columns
इस बदलाव के साथ आप देखेंगे कि ऑब्जेक्ट DataFrame है और कॉलम्स टिकर-स्तर से जुड़े हैं; यह साधारण एक-आयामी Series नहीं है। समाधान यह है कि Plotly को सही Series दें या पहले कॉलम्स को फ्लैट कर लें।
समाधान 1: टिकर कॉलम को स्पष्ट रूप से चुनें
डाउनलोड का चरण वैसा ही रखें, लेकिन Close के भीतर टिकर कॉलम तक इंडेक्स करें ताकि y-अक्ष को Series मिले। auto_adjust=False जोड़ने से डिफॉल्ट से जुड़ी भविष्य की चेतावनी से बचाव होता है।
import yfinance as yf
import numpy as np
import pandas as pd
import statsmodels.api as smx
from statsmodels.tsa.stattools import coint, adfuller
import plotly.graph_objects as go
close_frame = yf.download("PETR4.SA", period="1y", auto_adjust=False)["Close"]
close_frame.index = close_frame.index.tz_localize(None)
line_fig = go.Figure()
line_fig.add_trace(go.Scatter(x=close_frame.index, y=close_frame["PETR4.SA"]))
line_fig.update_layout(title_text="petr", width=500, height=500)
line_fig.show()
यदि चयन को लेकर शंका है, तो पहले संरचना जल्दी से देख लें:
type(close_frame)
close_frame.columns
यदि कुछ ऐसा दिखे—Index(['PETR4.SA'], name='Ticker')—तो यह पुष्टि करता है कि आप y-सीरीज़ के रूप में close_frame['PETR4.SA'] का उपयोग कर सकते हैं।
समाधान 2: yfinance से पुराने एक-स्तरीय कॉलम मांगें
यदि आप एक टिकर के लिए फ्लैट, पुराने शैली का DataFrame चाहते हैं, तो yfinance अब इसका विकल्प देता है। download कॉल में multi_level_index=False सेट करें और पहले की तरह आगे बढ़ें। यहाँ भी auto_adjust=False FutureWarning से बचाता है।
import yfinance as yf
import numpy as np
import pandas as pd
import statsmodels.api as smx
from statsmodels.tsa.stattools import coint, adfuller
import plotly.graph_objects as go
flat_close = yf.download(
    "PETR4.SA",
    period="1y",
    multi_level_index=False,
    auto_adjust=False
)["Close"]
flat_close.index = flat_close.index.tz_localize(None)
flat_fig = go.Figure()
flat_fig.add_trace(go.Scatter(x=flat_close.index, y=flat_close))
flat_fig.update_layout(title_text="petr", width=500, height=500)
flat_fig.show()
समाधान 3: दूसरा स्तर हटाकर DataFrame फ्लैट करें
आप डिफॉल्ट व्यवहार को रहने दें और फिर टिकर स्तर को हटा दें। फ्लैट करने के बाद Close कॉलम चुनें और प्लॉट करें।
import yfinance as yf
import numpy as np
import pandas as pd
import statsmodels.api as smx
from statsmodels.tsa.stattools import coint, adfuller
import plotly.graph_objects as go
flattened = yf.download("PETR4.SA", period="1y").droplevel(1, axis=1)["Close"]
flattened.index = flattened.index.tz_localize(None)
fixed_fig = go.Figure()
fixed_fig.add_trace(go.Scatter(x=flattened.index, y=flattened))
fixed_fig.update_layout(title_text="petr", width=500, height=500)
fixed_fig.show()
इस समस्या के साथ अक्सर एक और संकेत मिलता है: प्लॉटिंग की विफलता या अजीब विज़ुअल्स का कारण multi-indexed DataFrame हो सकता है। जैसा कि एक संक्षिप्त सार में कहा गया है:
“आपकी त्रुटि निम्नलिखित कोड के कारण हुई ... क्योंकि df multi-indexed है।”
यह जानना क्यों ज़रूरी है
टाइम-सीरीज़ विज़ुअलाइज़ेशन पाइपलाइनें डेटा के आकार में सूक्ष्म बदलावों के प्रति संवेदनशील होती हैं। जब अपस्ट्रीम लाइब्रेरीज़ डिफॉल्ट बदलती हैं—जैसे yfinance ने डाउनलोड के लिए MultiIndex लागू किया या auto_adjust के डिफॉल्ट में बदलाव—तो प्लॉटिंग कोड में छिपी मान्यताएँ उजागर हो जाती हैं। प्लॉट से पहले type और .columns देखकर त्वरित जाँच करना, और डेटा को Plotly तक पहुँचाने से पहले उसका shape सामान्य करना, समय बचाता है और नोटबुक व डैशबोर्ड में बिना शोर के गलत प्लॉट्स से बचाता है।
निष्कर्ष
यदि कोई Plotly चार्ट अपडेट के बाद गलत दिखे, तो पहले इनपुट के shape की जाँच करें। yfinance में कॉलम्स पर MultiIndex होने का मतलब है कि ["Close"] एक Series के बजाय DataFrame लौटा सकता है। या तो टिकर कॉलम को स्पष्ट रूप से चुनें, डाउनलोड करते समय multi_level_index=False माँगें, या प्लॉट करने से पहले अतिरिक्त स्तर हटा दें। साथ ही auto_adjust जैसे आर्ग्युमेंट्स पर नज़र रखने से चेतावनी संदेशों से भी बचा जा सकता है। type(...) और .columns पर कुछ सेकंड देना एक टूटे चार्ट पर सिर खपाने और साफ, सटीक विज़ुअलाइज़ेशन शिप करने के बीच का फर्क बना सकता है।
यह लेख StackOverflow पर प्रश्न (पूछा गया द्वारा user30126350) और Wayne के उत्तर पर आधारित है।